ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvVGVzdGluZ0Vudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1Rlc3RpbmdFbnZpcm9ubWVudC5qYXZhCmluZGV4IGFhZDI5ZjcuLmE0NGJjMGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvVGVzdGluZ0Vudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9UZXN0aW5nRW52aXJvbm1lbnQuamF2YQpAQCAtNjUsOSArNjUsOCBAQAogCQkJSVBhdGggcGFja2FnZVBhdGggPSBhZGRQYWNrYWdlKHBhY2thZ2VGcmFnbWVudFJvb3RQYXRoLCBwYWNrYWdlTmFtZSk7CiAKIAkJCXJldHVybiBhZGRCaW5hcnlDbGFzcyhwYWNrYWdlUGF0aCwgY2xhc3NOYW1lLCBjb250ZW50cyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWRkQmluYXJ5Q2xhc3MocGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIGNsYXNzTmFtZSwgY29udGVudHMpOwogCQl9CisJCXJldHVybiBhZGRCaW5hcnlDbGFzcyhwYWNrYWdlRnJhZ21lbnRSb290UGF0aCwgY2xhc3NOYW1lLCBjb250ZW50cyk7CiAJCQkKIAl9CiAJCkBAIC0xMDMsOSArMTAyLDggQEAKIAkJCUlQYXRoIHBhY2thZ2VQYXRoID0gYWRkUGFja2FnZShwYWNrYWdlRnJhZ21lbnRSb290UGF0aCwgcGFja2FnZU5hbWUpOwogCiAJCQlyZXR1cm4gYWRkQ2xhc3MocGFja2FnZVBhdGgsIGNsYXNzTmFtZSwgY29udGVudHMpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFkZENsYXNzKHBhY2thZ2VGcmFnbWVudFJvb3RQYXRoLCBjbGFzc05hbWUsIGNvbnRlbnRzKTsKIAkJfQorCQlyZXR1cm4gYWRkQ2xhc3MocGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIGNsYXNzTmFtZSwgY29udGVudHMpOwogCX0KIAogCS8qKiBBZGRzIGEgcGFja2FnZSB0byB0aGUgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCByb290CkBAIC00NjcsMTAgKzQ2NSwxMCBAQAogCSAqLwogCXB1YmxpYyBJUGF0aCBnZXRQYWNrYWdlUGF0aChJUGF0aCByb290LCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKIAkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKQorCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewogCQkJcmV0dXJuIHJvb3Q7Ci0JCWVsc2UKLQkJCXJldHVybiByb290LmFwcGVuZChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgSVBhdGguU0VQQVJBVE9SKSk7CisJCX0KKwkJcmV0dXJuIHJvb3QuYXBwZW5kKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBJUGF0aC5TRVBBUkFUT1IpKTsKIAl9CiAKIAkvKiogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QKQEAgLTQ3OSwxMCArNDc3LDEwIEBACiAJICovCiAJcHVibGljIElQYXRoIGdldFBhY2thZ2VGcmFnbWVudFJvb3RQYXRoKElQYXRoIHByb2plY3RQYXRoLCBTdHJpbmcgbmFtZSkgewogCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewogCQkJcmV0dXJuIHByb2plY3RQYXRoOwotCQllbHNlCi0JCQlyZXR1cm4gcHJvamVjdFBhdGguYXBwZW5kKG5hbWUpOworCQl9CisJCXJldHVybiBwcm9qZWN0UGF0aC5hcHBlbmQobmFtZSk7CiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9BYnN0cmFjdENvbXBsZXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tcGxldGlvblRlc3QuamF2YQppbmRleCAwMzU3MjM5Li41M2Y1ZGI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tcGxldGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tcGxldGlvblRlc3QuamF2YQpAQCAtMjA1LDkgKzIwNSw4IEBACiAJCQkJCWlmIChmaWVsZCBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7CiAJCQkJCQlwYXJzZXIucGFyc2VCbG9ja1N0YXRlbWVudHMoKEluaXRpYWxpemVyKWZpZWxkLCB0eXBlLCB1bml0KTsKIAkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0VHJ1ZSgiVEJEIiwgZmFsc2UpOyAvLyBmaWVsZCBpbml0aWFsaXplcgogCQkJCQl9CisJCQkJCWFzc2VydFRydWUoIlRCRCIsIGZhbHNlKTsgLy8gZmllbGQgaW5pdGlhbGl6ZXIKIAkJCQl9CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0phdmFkb2NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9KYXZhZG9jVGVzdC5qYXZhCmluZGV4IGJkNDgwMmEuLjlmZTQ0YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0phdmFkb2NUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vSmF2YWRvY1Rlc3QuamF2YQpAQCAtMTEyLDExICsxMTIsMTAgQEAKIAkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNnZXROYW1lKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLmRvY0NvbW1lbnRTdXBwb3J0ID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0JCX0gZWxzZSB7CisJCWlmICh0aGlzLmRvY0NvbW1lbnRTdXBwb3J0ICE9IG51bGwpIHsKIAkJCXJldHVybiBnZXROYW1lUHJlZml4KCkrc3VwZXIuZ2V0TmFtZSgpOwogCQl9CisJCXJldHVybiBzdXBlci5nZXROYW1lKCk7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQpAQCAtMTQyLDkgKzE0MSw4IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzTGlicywgMCwgbmV3Q2xhc3NQYXRocywgMCwgbGVuZ3RoKTsKIAkJCW5ld0NsYXNzUGF0aHNbbGVuZ3RoXSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoemlwRmlsZSkuZ2V0UGF0aCgpOwogCQkJcmV0dXJuIG5ld0NsYXNzUGF0aHM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdENsYXNzUGF0aHMoKTsKIAkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdENsYXNzUGF0aHMoKTsKIAl9CiAJCiAJc3RhdGljIFN0cmluZ1tdIHJlZmVyZW5jZWRDbGFzc2VzID0gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0phdmFkb2NUZXN0TWl4ZWQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0phdmFkb2NUZXN0TWl4ZWQuamF2YQppbmRleCAzMzU1YjhiLi41ZmE3YjMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9KYXZhZG9jVGVzdE1peGVkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vSmF2YWRvY1Rlc3RNaXhlZC5qYXZhCkBAIC0zNSw3ICszNSw3IEBACiAJLy8gQWxsIHNwZWNpZmllZCB0ZXN0cyB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGNsYXNzIGFyZSBza2lwcGVkLi4uCiAJc3RhdGljIHsKIAkJLy8gTmFtZXMgb2YgdGVzdHMgdG8gcnVuOiBjYW4gYmUgInRlc3RCdWdYWFhYIiBvciAiQnVnWFhYWCIpCi0vLwkJdGVzdHNOYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICJCdWc1MzI5MCIgfTsKKy8vCQl0ZXN0c05hbWVzID0gbmV3IFN0cmluZ1tdIHsgIkJ1ZzUxNjA2IiwgIkJ1ZzUxNjA2YSIsICJCdWc1MTYwNmIiLCAiQnVnNTE2MDZjIiAgfTsKIAkJLy8gTnVtYmVycyBvZiB0ZXN0cyB0byBydW46ICJ0ZXN0PG51bWJlcj4iIHdpbGwgYmUgcnVuIGZvciBlYWNoIG51bWJlciBvZiB0aGlzIGFycmF5CiAvLwkJdGVzdHNOdW1iZXJzID0gbmV3IGludFtdIHsgMywgNywgMTAsIDIxIH07CiAJCS8vIFJhbmdlIG51bWJlcnMgb2YgdGVzdHMgdG8gcnVuOiBhbGwgdGVzdHMgYmV0d2VlbiAidGVzdDxmaXJzdD4iIGFuZCAidGVzdDxsYXN0PiIgd2lsbCBiZSBydW4gZm9yIHsgZmlyc3QsIGxhc3QgfQpAQCAtMjQwOCw0ICsyNDA4LDE5MCBAQAogCQkJCSItLS0tLS0tLS0tXG4iCiAJCSk7CiAJfQorCisJLyoqCisJICogVGVzdCBmaXggZm9yIGJ1ZyA2MjgxMjogU29tZSBtYWxmb3JtZWQgamF2YWRvYyB0YWdzIGFyZSBub3QgcmVwb3J0ZWQgYXMgbWFsZm9ybWVkCisJICogQHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjgxMiI+NjI4MTI8L2E+CisJICovCisJcHVibGljIHZvaWQgdGVzdEJ1ZzYyODEyKCkgeworCQlyZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzID0gQ29tcGlsZXJPcHRpb25zLklHTk9SRTsKKwkJcnVuTmVnYXRpdmVUZXN0KAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkiVGVzdC5qYXZhIiwKKwkJCQkiLyoqXG4iICsgCisJCQkJCSIgKiBAc2VlIE9iamVjdCNjbG9uZSgpKVxuIiArIAorCQkJCQkiICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCl9XG4iICsgCisJCQkJCSIgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KSlcbiIgKyAKKwkJCQkJIiAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpeHhcbiIgKyAKKwkJCQkJIiAqL1xuIiArIAorCQkJCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArIAorCQkJCQkifVxuIgorCQkJfSwKKwkJCSItLS0tLS0tLS0tXG4iICsgCisJCQkJIjEuIEVSUk9SIGluIFRlc3QuamF2YSAoYXQgbGluZSAyKVxuIiArIAorCQkJCSIJKiBAc2VlIE9iamVjdCNjbG9uZSgpKVxuIiArIAorCQkJCSIJICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAorCQkJCSJKYXZhZG9jOiBNYWxmb3JtZWQgcmVmZXJlbmNlIChtaXNzaW5nIHNlcGFyYXRvciBhZnRlciBtZXRob2QgcmVmZXJlbmNlIGNsb3NpbmcgYnJhY2UpXG4iICsgCisJCQkJIi0tLS0tLS0tLS1cbiIgKyAKKwkJCQkiMi4gRVJST1IgaW4gVGVzdC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCisJCQkJIgkqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpfVxuIiArIAorCQkJCSIJICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5cbiIgKyAKKwkJCQkiSmF2YWRvYzogTWFsZm9ybWVkIHJlZmVyZW5jZSAobWlzc2luZyBzZXBhcmF0b3IgYWZ0ZXIgbWV0aG9kIHJlZmVyZW5jZSBjbG9zaW5nIGJyYWNlKVxuIiArIAorCQkJCSItLS0tLS0tLS0tXG4iICsgCisJCQkJIjMuIEVSUk9SIGluIFRlc3QuamF2YSAoYXQgbGluZSA0KVxuIiArIAorCQkJCSIJKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KSlcbiIgKyAKKwkJCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXG4iICsgCisJCQkJIkphdmFkb2M6IE1hbGZvcm1lZCByZWZlcmVuY2UgKG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIG1ldGhvZCByZWZlcmVuY2UgY2xvc2luZyBicmFjZSlcbiIgKyAKKwkJCQkiLS0tLS0tLS0tLVxuIiArIAorCQkJCSI0LiBFUlJPUiBpbiBUZXN0LmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKKwkJCQkiCSogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCl4eFxuIiArIAorCQkJCSIJICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXG4iICsgCisJCQkJIkphdmFkb2M6IE1hbGZvcm1lZCByZWZlcmVuY2UgKG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIG1ldGhvZCByZWZlcmVuY2UgY2xvc2luZyBicmFjZSlcbiIgKyAKKwkJCQkiLS0tLS0tLS0tLVxuIgorCQkpOworCX0KKwlwdWJsaWMgdm9pZCB0ZXN0QnVnNjI4MTJhKCkgeworCQlyZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzID0gQ29tcGlsZXJPcHRpb25zLklHTk9SRTsKKwkJcnVuTmVnYXRpdmVUZXN0KAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkiVGVzdC5qYXZhIiwKKwkJCQkiLyoqXG4iICsgCisJCQkJCSIgKiB7QGxpbmsgT2JqZWN0I2Nsb25lKCkpfVxuIiArIAorCQkJCQkiICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX1cbiIgKyAKKwkJCQkJIiAqIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCkpfVxuIiArIAorCQkJCQkiICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KXh4fVxuIiArIAorCQkJCQkiICovXG4iICsgCisJCQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsgCisJCQkJCSJ9XG4iCisJCQl9LAorCQkJIi0tLS0tLS0tLS1cbiIgKyAKKwkJCQkiMS4gRVJST1IgaW4gVGVzdC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCisJCQkJIgkqIHtAbGluayBPYmplY3QjY2xvbmUoKSl9XG4iICsgCisJCQkJIgkgICAgICAgICAgICAgICAgICAgICBeXl5eXG4iICsgCisJCQkJIkphdmFkb2M6IE1hbGZvcm1lZCByZWZlcmVuY2UgKG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIG1ldGhvZCByZWZlcmVuY2UgY2xvc2luZyBicmFjZSlcbiIgKyAKKwkJCQkiLS0tLS0tLS0tLVxuIiArIAorCQkJCSIyLiBFUlJPUiBpbiBUZXN0LmphdmEgKGF0IGxpbmUgNClcbiIgKyAKKwkJCQkiCSoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KSl9XG4iICsgCisJCQkJIgkgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAorCQkJCSJKYXZhZG9jOiBNYWxmb3JtZWQgcmVmZXJlbmNlIChtaXNzaW5nIHNlcGFyYXRvciBhZnRlciBtZXRob2QgcmVmZXJlbmNlIGNsb3NpbmcgYnJhY2UpXG4iICsgCisJCQkJIi0tLS0tLS0tLS1cbiIgKyAKKwkJCQkiMy4gRVJST1IgaW4gVGVzdC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCisJCQkJIgkqIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl4eH1cbiIgKyAKKwkJCQkiCSAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXlxuIiArIAorCQkJCSJKYXZhZG9jOiBNYWxmb3JtZWQgcmVmZXJlbmNlIChtaXNzaW5nIHNlcGFyYXRvciBhZnRlciBtZXRob2QgcmVmZXJlbmNlIGNsb3NpbmcgYnJhY2UpXG4iICsgCisJCQkJIi0tLS0tLS0tLS1cbiIKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IGZpeCBmb3IgYnVnIDUxNjA2OiBbSmF2YWRvY10gQ29tcGlsZXIgc2hvdWxkIGNvbXBsYWluIHdoZW4gdGFnIG5hbWUgaXMgbm90IGNvcnJlY3QKKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNjA2Ij41MTYwNjwvYT4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QnVnNTE2MDYoKSB7CisJCXJlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHMgPSBDb21waWxlck9wdGlvbnMuSUdOT1JFOworCQlydW5OZWdhdGl2ZVRlc3QoCisJCQluZXcgU3RyaW5nW10geworCQkJCSJYLmphdmEiLAorCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCisJCQkJCSIgIC8qKlxuIiArIAorCQkJCQkiICAgKiBAcGFyYW0gYSBhYWFcbiIgKyAKKwkJCQkJIiAgICogQHBhcmFtIGIgYmJiXG4iICsgCisJCQkJCSIgICAqL1xuIiArIAorCQkJCQkiICBwdWJsaWMgdm9pZCBmb28oaW50IGEsIGludCBiKSB7XG4iICsgCisJCQkJCSIgIH1cbiIgKyAKKwkJCQkJIn1cbiIsCisJCQkJIlkuamF2YSIsCisJCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsgCisJCQkJCSIgIC8qKlxuIiArIAorCQkJCQkiICAqICBAcGFyYW0gYSB7QGluaGVyaXREb2N9XG4iICsgCisJCQkJCSIgICAqL1xuIiArIAorCQkJCQkiICBwdWJsaWMgdm9pZCBmb28oaW50IGEsIGludCBiKSB7XG4iICsgCisJCQkJCSIgIH1cbiIgKyAKKwkJCQkJIn1cbiIKKwkJCX0sCisJCQkiLS0tLS0tLS0tLVxuIiArIAorCQkJCSIxLiBFUlJPUiBpbiBZLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKKwkJCQkiCXB1YmxpYyB2b2lkIGZvbyhpbnQgYSwgaW50IGIpIHtcbiIgKyAKKwkJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKKwkJCQkiSmF2YWRvYzogTWlzc2luZyB0YWcgZm9yIHBhcmFtZXRlciBiXG4iICsgCisJCQkJIi0tLS0tLS0tLS1cbiIKKwkJKTsKKwl9CisJcHVibGljIHZvaWQgdGVzdEJ1ZzUxNjA2YSgpIHsKKwkJcmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50cyA9IENvbXBpbGVyT3B0aW9ucy5JR05PUkU7CisJCXJ1bkNvbmZvcm1UZXN0KAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkiWC5qYXZhIiwKKwkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAorCQkJCQkiICAvKipcbiIgKyAKKwkJCQkJIiAgICogQHBhcmFtIGEgYWFhXG4iICsgCisJCQkJCSIgICAqIEBwYXJhbSBiIGJiYlxuIiArIAorCQkJCQkiICAgKi9cbiIgKyAKKwkJCQkJIiAgcHVibGljIHZvaWQgZm9vKGludCBhLCBpbnQgYikge1xuIiArIAorCQkJCQkiICB9XG4iICsgCisJCQkJCSJ9XG4iLAorCQkJCSJZLmphdmEiLAorCQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAorCQkJCQkiICAvKipcbiIgKyAKKwkJCQkJIiAgICoge0Bpbmhlcml0RG9jfVxuIiArIAorCQkJCQkiICAqICBAcGFyYW0gYSBhYWFhYVxuIiArIAorCQkJCQkiICAgKi9cbiIgKyAKKwkJCQkJIiAgcHVibGljIHZvaWQgZm9vKGludCBhLCBpbnQgYikge1xuIiArIAorCQkJCQkiICB9XG4iICsgCisJCQkJCSJ9XG4iCisJCQl9LAorCQkJIiIKKwkJKTsKKwl9CisJcHVibGljIHZvaWQgdGVzdEJ1ZzUxNjA2YigpIHsKKwkJcmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50cyA9IENvbXBpbGVyT3B0aW9ucy5JR05PUkU7CisJCXJ1bkNvbmZvcm1UZXN0KAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkiWC5qYXZhIiwKKwkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAorCQkJCQkiICAvKipcbiIgKyAKKwkJCQkJIiAgICogQHBhcmFtIGEgYWFhXG4iICsgCisJCQkJCSIgICAqIEBwYXJhbSBiIGJiYlxuIiArIAorCQkJCQkiICAgKi9cbiIgKyAKKwkJCQkJIiAgcHVibGljIHZvaWQgZm9vKGludCBhLCBpbnQgYikge1xuIiArIAorCQkJCQkiICB9XG4iICsgCisJCQkJCSJ9XG4iLAorCQkJCSJZLmphdmEiLAorCQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAorCQkJCQkiICAvKipcbiIgKyAKKwkJCQkJIiAgICogVGV4dCBiZWZvcmUgaW5oZXJpdCB0YWdcbiIgKyAKKwkJCQkJIiAgICoge0Bpbmhlcml0RG9jfVxuIiArIAorCQkJCQkiICAqICBAcGFyYW0gYSBhYWFhYVxuIiArIAorCQkJCQkiICAgKi9cbiIgKyAKKwkJCQkJIiAgcHVibGljIHZvaWQgZm9vKGludCBhLCBpbnQgYikge1xuIiArIAorCQkJCQkiICB9XG4iICsgCisJCQkJCSJ9XG4iCisJCQl9CisJCSk7CisJfQorCXB1YmxpYyB2b2lkIHRlc3RCdWc1MTYwNmMoKSB7CisJCXJlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHMgPSBDb21waWxlck9wdGlvbnMuSUdOT1JFOworCQlydW5Db25mb3JtVGVzdCgKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJIlguamF2YSIsCisJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKKwkJCQkJIiAgLyoqXG4iICsgCisJCQkJCSIgICAqIEBwYXJhbSBhIGFhYVxuIiArIAorCQkJCQkiICAgKiBAcGFyYW0gYiBiYmJcbiIgKyAKKwkJCQkJIiAgICovXG4iICsgCisJCQkJCSIgIHB1YmxpYyB2b2lkIGZvbyhpbnQgYSwgaW50IGIpIHtcbiIgKyAKKwkJCQkJIiAgfVxuIiArIAorCQkJCQkifVxuIiwKKwkJCQkiWS5qYXZhIiwKKwkJCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHtcbiIgKyAKKwkJCQkJIiAgLyoqXG4iICsgCisJCQkJCSIgICAqIFRleHQgYmVmb3JlIGluaGVyaXQgdGFnIHtAaW5oZXJpdERvY31cbiIgKyAKKwkJCQkJIiAgKiAgQHBhcmFtIGEgYWFhYWFcbiIgKyAKKwkJCQkJIiAgICovXG4iICsgCisJCQkJCSIgIHB1YmxpYyB2b2lkIGZvbyhpbnQgYSwgaW50IGIpIHtcbiIgKyAKKwkJCQkJIiAgfVxuIiArIAorCQkJCQkifVxuIgorCQkJfQorCQkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0xvb2t1cFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0xvb2t1cFRlc3QuamF2YQppbmRleCA4MDQ1MzUyLi5mMmY3ZGFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Mb29rdXBUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vTG9va3VwVGVzdC5qYXZhCkBAIC0xMCw2ICsxMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwpAQCAtMTQ5Niw3ICsxNDk3LDc4IEBACiAJCX0sCiAJCSJTVUNDRVNTIik7CiB9CisvKgorICogNjI2MzkgLSBjaGVjayB0aGF0IG1pc3NpbmcgbWVtYmVyIHR5cGUgaXMgbm90IG5vdGljZWQgaWYgbm8gZGlyZWN0IGNvbm5lY3Rpb24gd2l0aCBjb21waWxlZCB0eXBlCisgKi8KIHB1YmxpYyB2b2lkIHRlc3QwNDQoKSB7CisJdGhpcy5ydW5Db25mb3JtVGVzdCgKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCSJwL0R1bWJvLmphdmEiLAorCQkJInBhY2thZ2UgcDtcbiIgKworCQkJInB1YmxpYyBjbGFzcyBEdW1ibyB7XG4iICsKKwkJCSIgIHB1YmxpYyBjbGFzcyBDbHlkZSB7IH1cbiIgKworCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCisJCQkiCQkgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCisJCQkiCX1cbiIgKyAKKwkJCSJ9XG4iLAorCQl9LAorCQkiU1VDQ0VTUyIpOworCS8vIGRlbGV0ZSBiaW5hcnkgZmlsZSBEdW1ibyRDbHlkZSAoaS5lLiBzaW11bGF0ZSByZW1vdmluZyBpdCBmcm9tIGNsYXNzcGF0aCBmb3Igc3Vic2VxdWVudCBjb21waWxlKQorCW5ldyBGaWxlKE9VVFBVVF9ESVIsICJwIiArIEZpbGUuc2VwYXJhdG9yICsgIkR1bWJvJENseWRlLmNsYXNzIikuZGVsZXRlKCk7CisJCisJdGhpcy5ydW5Db25mb3JtVGVzdCgKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCSJxL01haW4uamF2YSIsCisJCQkicGFja2FnZSBxO1xuIiArCisJCQkicHVibGljIGNsYXNzIE1haW4gZXh0ZW5kcyBwLkR1bWJvIHtcbiIgKworCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKKwkJCSIJCSAgcC5EdW1ibyBkO1xuIiArCisJCQkiCQkgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCisJCQkiCX1cbiIgKworCQkJIn1cbiIsCisJCX0sCisJCSJTVUNDRVNTIiwKKwkJbnVsbCwKKwkJZmFsc2UsCisJCW51bGwpOworfQorLyoKKyAqIGVuc3VyZSB0aGF0IGNhbiBzdGlsbCBmb3VuZCBiaW5hcnkgbWVtYmVyIHR5cGVzIGF0IGRlcHRoID49MiAoZW5jbG9zaW5nIG5hbWUgRHVtYm8kQ2x5ZGUgJCBGcmVkKQorICovCitwdWJsaWMgdm9pZCB0ZXN0MDQ1KCkgeworCXRoaXMucnVuQ29uZm9ybVRlc3QoCisJCW5ldyBTdHJpbmdbXSB7CisJCQkicC9EdW1iby5qYXZhIiwKKwkJCSJwYWNrYWdlIHA7XG4iICsKKwkJCSJwdWJsaWMgY2xhc3MgRHVtYm8ge1xuIiArCisJCQkiICBwdWJsaWMgY2xhc3MgQ2x5ZGUge1xuIiArCisJCQkiICAJICBwdWJsaWMgY2xhc3MgRnJlZCB7XG4iICsKKwkJCSIJICB9XG4iICsgCisJCQkiCX1cbiIgKyAKKwkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAorCQkJIgkJICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAorCQkJIgl9XG4iICsgCisJCQkifVxuIiwKKwkJfSwKKwkJIlNVQ0NFU1MiKTsKKwkKKwl0aGlzLnJ1bkNvbmZvcm1UZXN0KAorCQluZXcgU3RyaW5nW10geworCQkJInEvTWFpbi5qYXZhIiwKKwkJCSJwYWNrYWdlIHE7XG4iICsKKwkJCSJwdWJsaWMgY2xhc3MgTWFpbiBleHRlbmRzIHAuRHVtYm8ge1xuIiArCisJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKworCQkJIgkJICBwLkR1bWJvLkNseWRlLkZyZWQgZjtcbiIgKworCQkJIgkJICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAorCQkJIgl9XG4iICsKKwkJCSJ9XG4iLAorCQl9LAorCQkiU1VDQ0VTUyIsCisJCW51bGwsCisJCWZhbHNlLAorCQludWxsKTsKK30KK3B1YmxpYyB2b2lkIHRlc3QwNDYoKSB7CiAJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQkiWC5qYXZhIiwgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRGVidWdFdmFsdWF0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRGVidWdFdmFsdWF0aW9uVGVzdC5qYXZhCmluZGV4IDhkNDhmN2YuLjdmOTA4MTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL0RlYnVnRXZhbHVhdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9EZWJ1Z0V2YWx1YXRpb25UZXN0LmphdmEKQEAgLTM1LDI2ICszNSwyNCBAQAogCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDbGFzc0ZpbGVzKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzLCBjaGFyW10gY29kZVNuaXBwZXRDbGFzc05hbWUpIHsKIAkJCWlmIChqZGlTdGFja0ZyYW1lID09IG51bGwpIHsKIAkJCQlyZXR1cm4gc3VwZXIuYWNjZXB0Q2xhc3NGaWxlcyhjbGFzc0ZpbGVzLCBjb2RlU25pcHBldENsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNlbmQgYnV0IGRvbid0IHJ1bgotCQkJCXN1cGVyLmFjY2VwdENsYXNzRmlsZXMoY2xhc3NGaWxlcywgbnVsbCk7Ci0KLQkJCQkvLyBSdW4gaWYgbmVlZGVkCi0JCQkJaWYgKGNvZGVTbmlwcGV0Q2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gamRpU3RhY2tGcmFtZS5ydW4obmV3IFN0cmluZyhjb2RlU25pcHBldENsYXNzTmFtZSkpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJVGFyZ2V0SW50ZXJmYWNlLlJlc3VsdCByZXN1bHQgPSB0YXJnZXQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQlpZiAocmVzdWx0LmRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQkJCQkJCXRoaXMuYWNjZXB0UmVzdWx0KG5ldyBFdmFsdWF0aW9uUmVzdWx0KG51bGwsIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQsIG51bGwsIG51bGwpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhpcy5hY2NlcHRSZXN1bHQobmV3IEV2YWx1YXRpb25SZXN1bHQobnVsbCwgRXZhbHVhdGlvblJlc3VsdC5UX0NPREVfU05JUFBFVCwgcmVzdWx0LmRpc3BsYXlTdHJpbmcsIHJlc3VsdC50eXBlTmFtZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzdWNjZXNzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KIAkJCX0KKwkJCS8vIFNlbmQgYnV0IGRvbid0IHJ1bgorCQkJc3VwZXIuYWNjZXB0Q2xhc3NGaWxlcyhjbGFzc0ZpbGVzLCBudWxsKTsKKworCQkJLy8gUnVuIGlmIG5lZWRlZAorCQkJaWYgKGNvZGVTbmlwcGV0Q2xhc3NOYW1lICE9IG51bGwpIHsKKwkJCQlib29sZWFuIHN1Y2Nlc3MgPSBqZGlTdGFja0ZyYW1lLnJ1bihuZXcgU3RyaW5nKGNvZGVTbmlwcGV0Q2xhc3NOYW1lKSk7CisJCQkJaWYgKHN1Y2Nlc3MpIHsKKwkJCQkJVGFyZ2V0SW50ZXJmYWNlLlJlc3VsdCByZXN1bHQgPSB0YXJnZXQuZ2V0UmVzdWx0KCk7CisJCQkJCWlmIChyZXN1bHQuZGlzcGxheVN0cmluZyA9PSBudWxsKSB7CisJCQkJCQl0aGlzLmFjY2VwdFJlc3VsdChuZXcgRXZhbHVhdGlvblJlc3VsdChudWxsLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCBudWxsLCBudWxsKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLmFjY2VwdFJlc3VsdChuZXcgRXZhbHVhdGlvblJlc3VsdChudWxsLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCByZXN1bHQuZGlzcGxheVN0cmluZywgcmVzdWx0LnR5cGVOYW1lKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHN1Y2Nlc3M7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KIAkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL0pESVN0YWNrRnJhbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL0pESVN0YWNrRnJhbWUuamF2YQppbmRleCBiY2VlYjUzLi5hMjQyNzZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9KRElTdGFja0ZyYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvSkRJU3RhY2tGcmFtZS5qYXZhCkBAIC0xODUsOSArMTg1LDggQEAKIAl0cnkgewogCQlpZiAodGhpcy5icmVha3BvaW50TGluZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewogCQkJcmV0dXJuIHRoaXMuamRpVGhyZWFkLmZyYW1lKDEpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMuamRpVGhyZWFkLmZyYW1lKDApOwogCQl9CisJCXJldHVybiB0aGlzLmpkaVRocmVhZC5mcmFtZSgwKTsKIAl9IGNhdGNoIChJbmNvbXBhdGlibGVUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvVGVzdEFsbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvVGVzdEFsbC5qYXZhCmluZGV4IDNmN2I3YWEuLjllNWJkNTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1Rlc3RBbGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9UZXN0QWxsLmphdmEKQEAgLTM1LDkgKzM1LDggQEAKIAkJdGVzdENsYXNzZXMuYWRkKERlYnVnRXZhbHVhdGlvblRlc3QuY2xhc3MpOwogCQkKIAkJcmV0dXJuIEFic3RyYWN0Q29tcGlsZXJUZXN0LnN1aXRlKFRlc3RBbGwuY2xhc3MuZ2V0TmFtZSgpLCBEZWJ1Z0V2YWx1YXRpb25TZXR1cC5jbGFzcywgdGVzdENsYXNzZXMpOwotCX0gZWxzZSB7Ci0JCS8vIERpc2FibGUgZXZhbHVhdGlvbiB0ZXN0cyBvbiBMaW51eAotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0QWxsLmNsYXNzLmdldE5hbWUoKSk7CiAJfQorCS8vIERpc2FibGUgZXZhbHVhdGlvbiB0ZXN0cyBvbiBMaW51eAorCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RBbGwuY2xhc3MuZ2V0TmFtZSgpKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL3RhcmdldC9Db2RlU25pcHBldENsYXNzTG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvQ29kZVNuaXBwZXRDbGFzc0xvYWRlci5qYXZhCmluZGV4IDdiNTA0ZmUuLmRiYTM0ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL3RhcmdldC9Db2RlU25pcHBldENsYXNzTG9hZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0Q2xhc3NMb2FkZXIuamF2YQpAQCAtMzIsOSArMzIsOCBAQAogCUNsYXNzTG9hZGVyIG15TG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwogCWlmIChteUxvYWRlciA9PSBudWxsKSB7CiAJCXJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBteUxvYWRlci5sb2FkQ2xhc3MobmFtZSk7CiAJfQorCXJldHVybiBteUxvYWRlci5sb2FkQ2xhc3MobmFtZSk7CiB9CiAvKioKICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcy4gSWYgdGhlIGNsYXNzIGlzIGtub3duIHRvIHRoaXMgcnVubmVyLCByZXR1cm5zIGl0LgpAQCAtNDksMTggKzQ4LDE1IEBACiAJCQlDbGFzcyBjbGF6eiA9IG1ha2VDbGFzcyhuYW1lLCByZXNvbHZlKTsKIAkJCWlmIChjbGF6eiA9PSBudWxsKSB7CiAJCQkJdGhyb3cgZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGNsYXp6OwogCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJQ2xhc3MgY2xhenogPSBtYWtlQ2xhc3MobmFtZSwgcmVzb2x2ZSk7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVMb2FkQ2xhc3MobmFtZSk7Ci0JCX0gZWxzZSB7CiAJCQlyZXR1cm4gY2xheno7CiAJCX0KIAl9CisJQ2xhc3MgY2xhenogPSBtYWtlQ2xhc3MobmFtZSwgcmVzb2x2ZSk7CisJaWYgKGNsYXp6ID09IG51bGwpIHsKKwkJcmV0dXJuIGRlbGVnYXRlTG9hZENsYXNzKG5hbWUpOworCX0KKwlyZXR1cm4gY2xheno7CiB9CiAvKioKICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyBlaXRoZXIgZnJvbSB0aGUgc3RvcmVkIGNsYXNzIGRlZmluaXRpb24gb3IgZnJvbSB0aGUgc3lzdGVtLgpAQCAtOTIsMTkgKzg4LDE3IEBACiAJT2JqZWN0IG8gPSB0aGlzLmxvYWRlZENsYXNzZXMuZ2V0KG5hbWUpOwogCWlmIChvID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBDbGFzcykgewotCQkJcmV0dXJuIChDbGFzcykgbzsKLQkJfSBlbHNlIHsKLQkJCWJ5dGVbXSBjbGFzc0RlZmluaXRpb24gPSAoYnl0ZVtdKSBvOwotCQkJQ2xhc3MgY2xhenogPSBkZWZpbmVDbGFzcyhudWxsLCBjbGFzc0RlZmluaXRpb24sIDAsIGNsYXNzRGVmaW5pdGlvbi5sZW5ndGgpOwotCQkJaWYgKHJlc29sdmUpIHsKLQkJCQlyZXNvbHZlQ2xhc3MoY2xhenopOwotCQkJfQotCQkJdGhpcy5sb2FkZWRDbGFzc2VzLnB1dChuYW1lLCBjbGF6eik7Ci0JCQlyZXR1cm4gY2xheno7Ci0JCX0KIAl9CisJaWYgKG8gaW5zdGFuY2VvZiBDbGFzcykgeworCQlyZXR1cm4gKENsYXNzKSBvOworCX0KKwlieXRlW10gY2xhc3NEZWZpbml0aW9uID0gKGJ5dGVbXSkgbzsKKwlDbGFzcyBjbGF6eiA9IGRlZmluZUNsYXNzKG51bGwsIGNsYXNzRGVmaW5pdGlvbiwgMCwgY2xhc3NEZWZpbml0aW9uLmxlbmd0aCk7CisJaWYgKHJlc29sdmUpIHsKKwkJcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKwl9CisJdGhpcy5sb2FkZWRDbGFzc2VzLnB1dChuYW1lLCBjbGF6eik7CisJcmV0dXJuIGNsYXp6OwogfQogLyoqCiAgKiBTdG9yZXMgdGhlIGdpdmVuIGNsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBjbGFzcy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL3RhcmdldC9Db2RlU25pcHBldFJ1bm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0UnVubmVyLmphdmEKaW5kZXggZTY4NGYwYS4uMTRjZmUzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0UnVubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0UnVubmVyLmphdmEKQEAgLTE4Miw2MyArMTgyLDYyIEBACiAJaWYgKGxlbmd0aCA8IDIgfHwgIWFyZ3NbMF0udG9Mb3dlckNhc2UoKS5lcXVhbHMoIi1ldmFscG9ydCIpKSB7CiAJCXByaW50VXNhZ2UoKTsKIAkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCWludCBldmFsUG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBudWxsOwotCQlTdHJpbmcgYm9vdFBhdGggPSBudWxsOwotCQlpbnQgbWFpbkNsYXNzID0gLTE7Ci0JCWZvciAoaW50IGkgPSAyOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsKLQkJCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCItY3NjcCIpKSB7Ci0JCQkJCWlmICgrK2kgPCBsZW5ndGgpIHsKLQkJCQkJCWNsYXNzUGF0aCA9IGFyZ3NbaV07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscygiLWNzYnAiKSkgewotCQkJCQlpZiAoKytpIDwgbGVuZ3RoKSB7Ci0JCQkJCQlib290UGF0aCA9IGFyZ3NbaV07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KKwl9CisJaW50IGV2YWxQb3J0ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKKwlTdHJpbmcgY2xhc3NQYXRoID0gbnVsbDsKKwlTdHJpbmcgYm9vdFBhdGggPSBudWxsOworCWludCBtYWluQ2xhc3MgPSAtMTsKKwlmb3IgKGludCBpID0gMjsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCVN0cmluZyBhcmcgPSBhcmdzW2ldOworCQlpZiAoYXJnLnN0YXJ0c1dpdGgoIi0iKSkgeworCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscygiLWNzY3AiKSkgeworCQkJCWlmICgrK2kgPCBsZW5ndGgpIHsKKwkJCQkJY2xhc3NQYXRoID0gYXJnc1tpXTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludFVzYWdlKCk7CisJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1haW5DbGFzcyA9IGk7Ci0JCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscygiLWNzYnAiKSkgeworCQkJCWlmICgrK2kgPCBsZW5ndGgpIHsKKwkJCQkJYm9vdFBhdGggPSBhcmdzW2ldOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50VXNhZ2UoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KIAkJCX0KLQkJfQotCQl0aGVSdW5uZXIgPSBuZXcgQ29kZVNuaXBwZXRSdW5uZXIoZXZhbFBvcnQsIGNsYXNzUGF0aCwgYm9vdFBhdGgpOwotCQlpZiAobWFpbkNsYXNzID09IC0xKSB7Ci0JCQl0aGVSdW5uZXIuc3RhcnQoKTsKIAkJfSBlbHNlIHsKLQkJCVRocmVhZCBzZXJ2ZXIgPSBuZXcgVGhyZWFkKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdGhlUnVubmVyLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfTsKLQkJCXNlcnZlci5zZXREYWVtb24odHJ1ZSk7Ci0JCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCWludCBtYWluQXJnc0xlbmd0aCA9IGxlbmd0aC1tYWluQ2xhc3MtMTsKLQkJCVN0cmluZ1tdIG1haW5BcmdzID0gbmV3IFN0cmluZ1ttYWluQXJnc0xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIG1haW5DbGFzcysxLCBtYWluQXJncywgMCwgbWFpbkFyZ3NMZW5ndGgpOwotCQkJdHJ5IHsKLQkJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoYXJnc1ttYWluQ2xhc3NdKTsKLQkJCQlNZXRob2QgbWFpbk1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzc30pOwotCQkJCW1haW5NZXRob2QuaW52b2tlKG51bGwsIG5ldyBTdHJpbmdbXVtdIHttYWluQXJnc30pOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQorCQkJbWFpbkNsYXNzID0gaTsKKwkJCWJyZWFrOwogCQl9Ci0JfQkJCisJfQorCXRoZVJ1bm5lciA9IG5ldyBDb2RlU25pcHBldFJ1bm5lcihldmFsUG9ydCwgY2xhc3NQYXRoLCBib290UGF0aCk7CisJaWYgKG1haW5DbGFzcyA9PSAtMSkgeworCQl0aGVSdW5uZXIuc3RhcnQoKTsKKwl9IGVsc2UgeworCQlUaHJlYWQgc2VydmVyID0gbmV3IFRocmVhZCgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0aGVSdW5uZXIuc3RhcnQoKTsKKwkJCX0KKwkJfTsKKwkJc2VydmVyLnNldERhZW1vbih0cnVlKTsKKwkJc2VydmVyLnN0YXJ0KCk7CisJCWludCBtYWluQXJnc0xlbmd0aCA9IGxlbmd0aC1tYWluQ2xhc3MtMTsKKwkJU3RyaW5nW10gbWFpbkFyZ3MgPSBuZXcgU3RyaW5nW21haW5BcmdzTGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weShhcmdzLCBtYWluQ2xhc3MrMSwgbWFpbkFyZ3MsIDAsIG1haW5BcmdzTGVuZ3RoKTsKKwkJdHJ5IHsKKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShhcmdzW21haW5DbGFzc10pOworCQkJTWV0aG9kIG1haW5NZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTsKKwkJCW1haW5NZXRob2QuaW52b2tlKG51bGwsIG5ldyBTdHJpbmdbXVtdIHttYWluQXJnc30pOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KIH0KIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKIAlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIG9yZy5lY2xpcHNlLmpkdC50ZXN0cy5ldmFsLnRhcmdldC5Db2RlU25pcHBldFJ1bm5lciAtZXZhbHBvcnQgPHBvcnROdW1iZXI+IFstb3B0aW9uc10gWzxtYWluQ2xhc3NOYW1lPl0gWzxhcmd1bWVudHM+XSIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvSjlWaXJ0dWFsTWFjaGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvSjlWaXJ0dWFsTWFjaGluZS5qYXZhCmluZGV4IDUxNTFmYTIuLjAxN2VlZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0o5VmlydHVhbE1hY2hpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9KOVZpcnR1YWxNYWNoaW5lLmphdmEKQEAgLTQ3LDE4ICs0NywxNyBAQAogCiB9CiBwcml2YXRlIGJvb2xlYW4gaXNQcm94eVJ1bm5pbmcoKSB7Ci0JaWYgKHRoaXMucHJveHlQcm9jZXNzID09IG51bGwpCisJaWYgKHRoaXMucHJveHlQcm9jZXNzID09IG51bGwpIHsKIAkJcmV0dXJuIGZhbHNlOwotCWVsc2UgewotCQlib29sZWFuIGhhc0V4aXRlZDsKLQkJdHJ5IHsKLQkJCXRoaXMucHJveHlQcm9jZXNzLmV4aXRWYWx1ZSgpOwotCQkJaGFzRXhpdGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWhhc0V4aXRlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaGFzRXhpdGVkOwogCX0KKwlib29sZWFuIGhhc0V4aXRlZDsKKwl0cnkgeworCQl0aGlzLnByb3h5UHJvY2Vzcy5leGl0VmFsdWUoKTsKKwkJaGFzRXhpdGVkID0gdHJ1ZTsKKwl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgeworCQloYXNFeGl0ZWQgPSBmYWxzZTsKKwl9CisJcmV0dXJuICFoYXNFeGl0ZWQ7CiB9CiAvKioKICAqIEBzZWUgTG9jYWxWaXJ0dWFsTWFjaGluZSNzaHV0RG93bgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvTG9jYWxWTUxhdW5jaGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Mb2NhbFZNTGF1bmNoZXIuamF2YQppbmRleCBlODA3YjE1Li5mOGRiNzQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Mb2NhbFZNTGF1bmNoZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Mb2NhbFZNTGF1bmNoZXIuamF2YQpAQCAtNTQsMTggKzU0LDE1IEBACiAJZmluYWwgU3RyaW5nIHZtTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7CiAJaWYgKCJKOSIuZXF1YWxzKHZtTmFtZSkpIHsKIAkJcmV0dXJuIG5ldyBKOVZNTGF1bmNoZXIoKTsKLQl9IGVsc2UgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShVdGlsLmdldEpSRURpcmVjdG9yeSgpICsgIi9saWIvcnQuamFyIik7Ci0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YW5kYXJkVk1MYXVuY2hlcigpOwotCQl9IGVsc2UgewotCQkJaWYgKCJJQk0gSjlTRSBWTSIuZXF1YWxzKHZtTmFtZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpZGVDYXJKOVZNTGF1bmNoZXIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBTaWRlQ2FyVk1MYXVuY2hlcigpOwotCQkJfQotCQl9CiAJfQorCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFV0aWwuZ2V0SlJFRGlyZWN0b3J5KCkgKyAiL2xpYi9ydC5qYXIiKTsKKwlpZiAoZmlsZS5leGlzdHMoKSkgeworCQlyZXR1cm4gbmV3IFN0YW5kYXJkVk1MYXVuY2hlcigpOworCX0KKwlpZiAoIklCTSBKOVNFIFZNIi5lcXVhbHModm1OYW1lKSkgeworCQlyZXR1cm4gbmV3IFNpZGVDYXJKOVZNTGF1bmNoZXIoKTsKKwl9CisJcmV0dXJuIG5ldyBTaWRlQ2FyVk1MYXVuY2hlcigpOwogfQogLyoqCiAgKiBCdWlsZHMgdGhlIGFjdHVhbCBjbGFzcyBwYXRoIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGFzc2VkIHRvIHRoZSBWTS4KQEAgLTE4Nyw5ICsxODQsOCBAQAogcHVibGljIFN0cmluZ1tdIGdldFByb2dyYW1Bcmd1bWVudHMoKSB7CiAJaWYgKHRoaXMuZXZhbFBvcnQgIT0gLTEpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRoaXMucHJvZ3JhbUFyZ3VtZW50czsKIAl9CisJcmV0dXJuIHRoaXMucHJvZ3JhbUFyZ3VtZW50czsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgZG90LXNlcGFyYXRlZCwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1bi4gIApAQCAtMTk5LDkgKzE5NSw4IEBACiBwdWJsaWMgU3RyaW5nIGdldFByb2dyYW1DbGFzcygpIHsKIAlpZiAodGhpcy5ldmFsUG9ydCAhPSAtMSkgewogCQlyZXR1cm4gbnVsbDsKLQl9IGVsc2UgewotCQlyZXR1cm4gdGhpcy5wcm9ncmFtQ2xhc3M7CiAJfQorCXJldHVybiB0aGlzLnByb2dyYW1DbGFzczsKIH0KIC8qKgogICogUmV0dXJucyBhbGwgdGhlIHRhcmdldCBWTXMgdGhhdCBhcmUgcnVubmluZyBhdCB0aGlzIGxhdW5jaGVyJ3MgdGFyZ2V0IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvTG9jYWxWaXJ0dWFsTWFjaGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvTG9jYWxWaXJ0dWFsTWFjaGluZS5qYXZhCmluZGV4IDcwZGYyMjEuLjdmYWI1NzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0xvY2FsVmlydHVhbE1hY2hpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Mb2NhbFZpcnR1YWxNYWNoaW5lLmphdmEKQEAgLTg4LDExICs4OCwxMCBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCWlmIChmaWxlLmRlbGV0ZSgpKSB7CiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcChjb3VudCAqIDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KKwkJCX0KKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKGNvdW50ICogMTAwKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKIAkJCX0KIAkJfQogCQlpZiAoZmlsZS5leGlzdHMoKSkgewpAQCAtMTI5LDggKzEyOCw3IEBACiBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKSB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIHsKIAlpZiAodGhpcy5wcm9jZXNzID09IG51bGwpCiAJCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIlRoZSBWTSBpcyBub3QgcnVubmluZyIpOwotCWVsc2UKLQkJcmV0dXJuIHRoaXMucHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpOworCXJldHVybiB0aGlzLnByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKTsKIH0KIC8qKiAKICAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgCkBAIC0xNTAsOSArMTQ4LDggQEAKIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewogCWlmICh0aGlzLnByb2Nlc3MgPT0gbnVsbCkKIAkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiVGhlIFZNIGlzIG5vdCBydW5uaW5nIik7Ci0JZWxzZQotCQkvLyBXb3JrYXJvdW5kIHByb2JsZW0gd2l0aCBpbnB1dCBzdHJlYW0gb2YgYSBQcm9jZXNzCi0JCXJldHVybiBuZXcgVk1JbnB1dFN0cmVhbSh0aGlzLnByb2Nlc3MsIHRoaXMucHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKKwkvLyBXb3JrYXJvdW5kIHByb2JsZW0gd2l0aCBpbnB1dCBzdHJlYW0gb2YgYSBQcm9jZXNzCisJcmV0dXJuIG5ldyBWTUlucHV0U3RyZWFtKHRoaXMucHJvY2VzcywgdGhpcy5wcm9jZXNzLmdldElucHV0U3RyZWFtKCkpOwogfQogLyoqCiAgKiBSZXR1cm5zIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBpcyBjb25uZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGlucHV0IApAQCAtMTcyLDggKzE2OSw3IEBACiBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewogCWlmICh0aGlzLnByb2Nlc3MgPT0gbnVsbCkKIAkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiVGhlIFZNIGlzIG5vdCBydW5uaW5nIik7Ci0JZWxzZQotCQlyZXR1cm4gdGhpcy5wcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpOworCXJldHVybiB0aGlzLnByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCk7CiB9CiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhcmdldCBWTSBpcyBzdGlsbCBydW5uaW5nLgpAQCAtMTgyLDE4ICsxNzgsMTcgQEAKICAqICAgICAgIGlmIGl0IGlzIHN0aWxsIHJ1bm5pbmcuCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQlpZiAodGhpcy5wcm9jZXNzID09IG51bGwpCisJaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKSB7CiAJCXJldHVybiBmYWxzZTsKLQllbHNlIHsKLQkJYm9vbGVhbiBoYXNFeGl0ZWQ7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByb2Nlc3MuZXhpdFZhbHVlKCk7Ci0JCQloYXNFeGl0ZWQgPSB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgewotCQkJaGFzRXhpdGVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFoYXNFeGl0ZWQ7CiAJfQorCWJvb2xlYW4gaGFzRXhpdGVkOworCXRyeSB7CisJCXRoaXMucHJvY2Vzcy5leGl0VmFsdWUoKTsKKwkJaGFzRXhpdGVkID0gdHJ1ZTsKKwl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgeworCQloYXNFeGl0ZWQgPSBmYWxzZTsKKwl9CisJcmV0dXJuICFoYXNFeGl0ZWQ7CiB9CiAvKioKICAqIFNodXRzIGRvd24gdGhpcyB0YXJnZXQgVk0uIApAQCAtMjEzLDkgKzIwOCw4IEBACiAJfQogCWlmICh0aGlzLmlzUnVubmluZygpKSB7IC8vIGdpdmUgdXAgY2xlYW5pbmcgdGhlIHRhcmdldCBwYXRoIGlmIFZNIGlzIHN0aWxsIHJ1bm5pbmcKIAkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiQ291bGQgbm90IHNodXQgdGhlIFZNIGRvd24iKTsKLQl9IGVsc2UgewotCQl0aGlzLmNsZWFudXBUYXJnZXRQYXRoKCk7CiAJfQorCXRoaXMuY2xlYW51cFRhcmdldFBhdGgoKTsKIH0KIC8qKgogICogV2FpdHMgZm9yIHRoZSBWTSB0byBzaHV0IGRvd24uIFRoaXMgbWV0aG9kIHJldHVybnMgCkBAIC0yMjcsOSArMjIxLDcgQEAKICAqICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQuCiAgKi8KIHB1YmxpYyB2b2lkIHdhaXRGb3JUZXJtaW5hdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKQotCQlyZXR1cm47Ci0JZWxzZQotCQl0aGlzLnByb2Nlc3Mud2FpdEZvcigpOworCWlmICh0aGlzLnByb2Nlc3MgPT0gbnVsbCkgcmV0dXJuOworCXRoaXMucHJvY2Vzcy53YWl0Rm9yKCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9WTUlucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9WTUlucHV0U3RyZWFtLmphdmEKaW5kZXggOTlmOWFiYS4uNDJhY2IzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvVk1JbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL1ZNSW5wdXRTdHJlYW0uamF2YQpAQCAtMzAsMTggKzMwLDE3IEBACiAJdGhpcy5pbnB1dC5jbG9zZSgpOwogfQogcHJpdmF0ZSBib29sZWFuIGlzUnVubmluZygpIHsKLQlpZiAodGhpcy5wcm9jZXNzID09IG51bGwpCisJaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKSB7CiAJCXJldHVybiBmYWxzZTsKLQllbHNlIHsKLQkJYm9vbGVhbiBoYXNFeGl0ZWQ7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByb2Nlc3MuZXhpdFZhbHVlKCk7Ci0JCQloYXNFeGl0ZWQgPSB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgewotCQkJaGFzRXhpdGVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFoYXNFeGl0ZWQ7CiAJfQorCWJvb2xlYW4gaGFzRXhpdGVkOworCXRyeSB7CisJCXRoaXMucHJvY2Vzcy5leGl0VmFsdWUoKTsKKwkJaGFzRXhpdGVkID0gdHJ1ZTsKKwl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgeworCQloYXNFeGl0ZWQgPSBmYWxzZTsKKwl9CisJcmV0dXJuICFoYXNFeGl0ZWQ7CiB9CiBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7CiAJdGhpcy5pbnB1dC5tYXJrKHJlYWRsaW1pdCk7CkBAIC01NSw5ICs1NCw4IEBACiAJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQlpZiAoaXNSdW5uaW5nKCkpIHsKIAkJCXJldHVybiByZWFkKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBlOwogCQl9CisJCXRocm93IGU7CiAJfQogfQogcHVibGljIGludCByZWFkKGJ5dGUgYltdKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCmluZGV4IDRkZjgxMTAuLjk1MzZiMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy91dGlsL1V0aWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEKQEAgLTI0MiwxMSArMjQyLDEwIEBACiAJCQkJCQlidWZmZXIuYXBwZW5kKCJcIiIpOwogCQkJCQl9CiAJCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlwiICsgXG4iKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgYnVmZmVyLmFwcGVuZCgiXHQiKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXCIiKTsKIAkJCQl9CisJCQkJYnVmZmVyLmFwcGVuZCgiXCIgKyBcbiIpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIGJ1ZmZlci5hcHBlbmQoIlx0Iik7CisJCQkJYnVmZmVyLmFwcGVuZCgiXCIiKTsKIAkJCX0gZWxzZSB7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0zODUsMjUgKzM4NCwyMiBAQAogCVN0cmluZyBqcmVEaXIgPSBnZXRKUkVEaXJlY3RvcnkoKTsKIAlpZiAoanJlRGlyID09IG51bGwpICB7CiAJCXJldHVybiBuZXcgU3RyaW5nW10ge307Ci0JfSBlbHNlIHsKLQkJZmluYWwgU3RyaW5nIHZtTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7Ci0JCWlmICgiSjkiLmVxdWFscyh2bU5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgdG9OYXRpdmVQYXRoKGpyZURpciArICIvbGliL2pjbE1heC9jbGFzc2VzLnppcCIpfTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGpyZURpciArICIvbGliL3J0LmphciIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCQkJdG9OYXRpdmVQYXRoKGpyZURpciArICIvbGliL3J0LmphciIpCi0JCQkJfTsJCQkJCi0JCQl9IGVsc2UgewkJCQkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgCi0JCQkJCXRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9jb3JlLmphciIpLAotCQkJCQl0b05hdGl2ZVBhdGgoanJlRGlyICsgIi9saWIvc2VjdXJpdHkuamFyIiksCi0JCQkJCXRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9ncmFwaGljcy5qYXIiKQotCQkJCX07Ci0JCQl9Ci0JCX0KIAl9CisJZmluYWwgU3RyaW5nIHZtTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7CisJaWYgKCJKOSIuZXF1YWxzKHZtTmFtZSkpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9qY2xNYXgvY2xhc3Nlcy56aXAiKX07CisJfQorCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGpyZURpciArICIvbGliL3J0LmphciIpOworCWlmIChmaWxlLmV4aXN0cygpKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geworCQkJdG9OYXRpdmVQYXRoKGpyZURpciArICIvbGliL3J0LmphciIpCisJCX07CQkJCQorCX0KKwlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgCisJCXRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9jb3JlLmphciIpLAorCQl0b05hdGl2ZVBhdGgoanJlRGlyICsgIi9saWIvc2VjdXJpdHkuamFyIiksCisJCXRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9ncmFwaGljcy5qYXIiKQorCX07CiB9CiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhQ2xhc3NMaWJzQXNTdHJpbmcoKSB7CiAJU3RyaW5nW10gY2xhc3NMaWJzID0gZ2V0SmF2YUNsYXNzTGlicygpOwpAQCAtNDM1LDkgKzQzMSw4IEBACiAJU3RyaW5nIGNvbnRhaW5lciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7CiAJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKIAkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRvTmF0aXZlUGF0aChjb250YWluZXIpICsgRmlsZS5zZXBhcmF0b3IgKyBPVVRQVVRfRElSRUNUT1JZOwogCX0KKwlyZXR1cm4gdG9OYXRpdmVQYXRoKGNvbnRhaW5lcikgKyBGaWxlLnNlcGFyYXRvciArIE9VVFBVVF9ESVJFQ1RPUlk7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIG9uIHRoZSBsb2NhbCBob3N0LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdC5qYXZhCmluZGV4IDEzMjc5MjEuLmJjNzM1MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVySmF2YWRvY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlckphdmFkb2NUZXN0LmphdmEKQEAgLTYwLDcgKzYwLDggQEAKIAkvLyBVbmljb2RlIHRlc3RzCiAJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHVuaWNvZGUgPSBmYWxzZTsKIAkvLyBVbml4IHRlc3RzCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHVuaXggPSBmYWxzZTsKKwlmaW5hbCBib29sZWFuIHVuaXg7CisJc3RhdGljIGZpbmFsIFN0cmluZyBVTklYX1NVUFBPUlQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVuaXgiKTsKIAkvLyBEb2MgQ29tbWVudCBzdXBwb3J0CiAJc3RhdGljIGZpbmFsIFN0cmluZyBET0NfQ09NTUVOVF9TVVBQT1JUID0gU3lzdGVtLmdldFByb3BlcnR5KCJkb2Muc3VwcG9ydCIpOwogCWZpbmFsIFN0cmluZyBkb2NDb21tZW50U3VwcG9ydDsKQEAgLTkxLDE1ICs5MiwxNiBAQAogCSAqIEBwYXJhbSBuYW1lCiAJICogQHBhcmFtIHN1cHBvcnQKIAkgKi8KLQlwdWJsaWMgQVNUQ29udmVydGVySmF2YWRvY1Rlc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzdXBwb3J0KSB7CisJcHVibGljIEFTVENvbnZlcnRlckphdmFkb2NUZXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3VwcG9ydCwgU3RyaW5nIHVuaXgpIHsKIAkJc3VwZXIobmFtZSk7CiAJCXRoaXMuZG9jQ29tbWVudFN1cHBvcnQgPSBzdXBwb3J0OworCQl0aGlzLnVuaXggPSAidHJ1ZSIuZXF1YWxzKHVuaXgpOwogCX0KIAkvKioKIAkgKiBAcGFyYW0gbmFtZQogCSAqLwogCXB1YmxpYyBBU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdChTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIEphdmFDb3JlLkVOQUJMRUQpOworCQl0aGlzKG5hbWUsIEphdmFDb3JlLkVOQUJMRUQsIFVOSVhfU1VQUE9SVCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewpAQCAtMTA4LDEwICsxMTAsMTAgQEAKIC8vCQlpZiAoInRydWUiLmVxdWFscyhwYXJhbSkpIHsKIC8vCQkJdW5pY29kZSA9IHRydWU7CiAvLwkJfQotCQlTdHJpbmcgcGFyYW0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVuaXgiKTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHMocGFyYW0pKSB7Ci0JCQl1bml4ID0gdHJ1ZTsKLQkJfQorLy8JCVN0cmluZyBwYXJhbSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidW5peCIpOworLy8JCWlmICgidHJ1ZSIuZXF1YWxzKHBhcmFtKSkgeworLy8JCQl1bml4ID0gdHJ1ZTsKKy8vCQl9CiAJCWlmICh0cnVlKSB7CiAJCQlpZiAoRE9DX0NPTU1FTlRfU1VQUE9SVCA9PSBudWxsKSB7CiAJCQkJYnVpbGRTdWl0ZShzdWl0ZSwgSmF2YUNvcmUuRU5BQkxFRCk7CkBAIC0xMjUsOSArMTI3LDcgQEAKIAogCQkvLyBSdW4gdGVzdCBjYXNlcyBzdWJzZXQKIAkJU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBvbmx5IHN1YnNldCBvZiB0ZXN0cyB3aWxsIGJlIGV4ZWN1dGVkISEhIik7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFTVENvbnZlcnRlckphdmFkb2NUZXN0KCJ0ZXN0QnVnNTE2MDAiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFTVENvbnZlcnRlckphdmFkb2NUZXN0KCJ0ZXN0QnVnNTE2MTciKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFTVENvbnZlcnRlckphdmFkb2NUZXN0KCJ0ZXN0QnVnNTQ0MjQiKSk7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVENvbnZlcnRlckphdmFkb2NUZXN0KCJ0ZXN0QnVnNTE2NjAiKSk7CiAJCXJldHVybiBzdWl0ZTsKIAl9CiAKQEAgLTEzNiw3ICsxMzYsMTUgQEAKIAkJTWV0aG9kW10gbWV0aG9kcyA9IGMuZ2V0TWV0aG9kcygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUQ29udmVydGVySmF2YWRvY1Rlc3QobWV0aG9kc1tpXS5nZXROYW1lKCksIHN1cHBvcnQpKTsKKwkJCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdChtZXRob2RzW2ldLmdldE5hbWUoKSwgc3VwcG9ydCwgVU5JWF9TVVBQT1JUKSk7CisJCQl9CisJCX0KKwkJLy8gd2hlbiB1bml4IHN1cHBvcnQgbm90IHNwZWNpZmllZCwgYWxzbyBydW4gdXNpbmcgdW5peCBmb3JtYXQKKwkJaWYgKFVOSVhfU1VQUE9SVCA9PSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0ZXN0IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdChtZXRob2RzW2ldLmdldE5hbWUoKSwgc3VwcG9ydCwgInRydWUiKSk7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMTQ1LDcgKzE1Myw4IEBACiAJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjZ2V0TmFtZSgpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIkRvYyAiK3RoaXMuZG9jQ29tbWVudFN1cHBvcnQrIiAtICIrc3VwZXIuZ2V0TmFtZSgpOworCQlTdHJpbmcgc3RyVW5peCA9IHRoaXMudW5peCA/ICIgLSBVbml4IiA6ICIiOworCQlyZXR1cm4gIkRvYyAiK3RoaXMuZG9jQ29tbWVudFN1cHBvcnQrc3RyVW5peCsiIC0gIitzdXBlci5nZXROYW1lKCk7CiAJfQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCkBAIC02NzAsOSArNjc5LDggQEAKIAkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclt1XTsKIAkJCVN5c3RlbS5hcnJheWNvcHkodW5pY29kZVNvdXJjZSwgMCwgcmVzdWx0LCAwLCB1KTsKIAkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdW5pY29kZVNvdXJjZTsKIAkJfQorCQlyZXR1cm4gdW5pY29kZVNvdXJjZTsKIAl9CiAKIAkvKgpAQCAtNjk3LDkgKzcwNSw4IEBACiAJCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbdV07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHVuaXhTb3VyY2UsIDAsIHJlc3VsdCwgMCwgdSk7CiAJCQlyZXR1cm4gcmVzdWx0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHVuaXhTb3VyY2U7CiAJCX0KKwkJcmV0dXJuIHVuaXhTb3VyY2U7CiAJfQogCQogCS8qCkBAIC0xMDc4LDggKzEwODUsNDEgQEAKIAkJCQkJTWV0aG9kUmVmIG1ldGhvZFJlZiA9IChNZXRob2RSZWYpIGZyYWdtZW50OwogCQkJCQlwcmV2aW91c0JpbmRpbmcgPSBtZXRob2RSZWYucmVzb2x2ZUJpbmRpbmcoKTsKIAkJCQkJaWYgKHByZXZpb3VzQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCQlhc3N1bWVOb3ROdWxsKHRoaXMucHJlZml4KyIiK21ldGhvZFJlZi5nZXROYW1lKCkrIiBiaW5kaW5nIHdhcyBub3QgZm91bmQhIiwgbWV0aG9kUmVmLmdldE5hbWUoKS5yZXNvbHZlQmluZGluZygpKTsKLQkJCQkJCXZlcmlmeU5hbWVCaW5kaW5ncyhtZXRob2RSZWYuZ2V0UXVhbGlmaWVyKCkpOworCQkJCQkJSUJpbmRpbmcgbWV0aE5hbWVCaW5kaW5nID0gbWV0aG9kUmVmLmdldE5hbWUoKS5yZXNvbHZlQmluZGluZygpOworCQkJCQkJTmFtZSBtZXRob2RRdWFsaWZpZXIgPSBtZXRob2RSZWYuZ2V0UXVhbGlmaWVyKCk7CisJCQkJCQkvLyBUT0RPIChmcmVkZXJpYykgUmVwbGFjZSB0aGUgdHdvIGZvbGxvd2luZyBsaW5lcyBieSBjb21tZW50ZWQgYmxvY2sgd2hlbiBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNjUwIHdpbGwgYmUgZml4ZWQKKwkJCQkJCWFzc3VtZU5vdE51bGwodGhpcy5wcmVmaXgrIiIrbWV0aG9kUmVmLmdldE5hbWUoKSsiIGJpbmRpbmcgd2FzIG5vdCBmb3VuZCEiLG1ldGhOYW1lQmluZGluZyk7CisJCQkJCQl2ZXJpZnlOYW1lQmluZGluZ3MobWV0aG9kUXVhbGlmaWVyKTsKKwkJCQkJCS8qCisJCQkJCQlpZiAobWV0aG9kUXVhbGlmaWVyID09IG51bGwpIHsKKwkJCQkJCQlpZiAobWV0aE5hbWVCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJCQkJY2hhciBmaXJzdENoYXIgPSBtZXRob2RSZWYuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5jaGFyQXQoMCk7CisJCQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoZmlyc3RDaGFyKSkgeworCQkJCQkJCQkJLy8gYXNzdW1lIHRoYXQgc2VsZWN0b3Igc3RhcnRpbmcgd2l0aCB1cHBlcmNhc2UgaXMgZm9yIGNvbnN0cnVjdG9yID0+IHNpZ25hbCB0aGF0IGJpbmRpbmcgaXMgbnVsbAorCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMucHJlZml4KyJCaW5kaW5nIGZvciBzZWxlY3RvciBvZiAgJyIrbWV0aG9kUmVmKyInIGlzIG51bGwuIik7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAobWV0aE5hbWVCaW5kaW5nLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kUmVmLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpKSB7IC8vIGJpbmRpbmcgaXMgbm90IG51bGwgb25seSBmb3IgY29uc3RydWN0b3IKKwkJCQkJCQkJCWFzc3VtZU5vdE51bGwodGhpcy5wcmVmaXgrIiIrbWV0aG9kUmVmLmdldE5hbWUoKSsiIGJpbmRpbmcgd2FzIG5vdCBmb3VuZCEiLG1ldGhOYW1lQmluZGluZyk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlhc3N1bWVOdWxsKHRoaXMucHJlZml4KyIiK21ldGhvZFJlZi5nZXROYW1lKCkrIiBiaW5kaW5nIHNob3VsZCBiZSBudWxsISIsIG1ldGhOYW1lQmluZGluZyk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVNpbXBsZU5hbWUgbWV0aG9kU2ltcGxlVHlwZSA9IG51bGw7CisJCQkJCQkJaWYgKG1ldGhvZFF1YWxpZmllci5pc1F1YWxpZmllZE5hbWUoKSkgeworCQkJCQkJCQltZXRob2RTaW1wbGVUeXBlID0gKChRdWFsaWZpZWROYW1lKW1ldGhvZFF1YWxpZmllcikuZ2V0TmFtZSgpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCW1ldGhvZFNpbXBsZVR5cGUgPSAoU2ltcGxlTmFtZSkgbWV0aG9kUXVhbGlmaWVyOworCQkJCQkJCX0KKwkJCQkJCQlpZiAobWV0aG9kU2ltcGxlVHlwZS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1ldGhvZFJlZi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKSkgeyAvLyBiaW5kaW5nIGlzIG5vdCBudWxsIG9ubHkgZm9yIGNvbnN0cnVjdG9yCisJCQkJCQkJCWFzc3VtZU5vdE51bGwodGhpcy5wcmVmaXgrIiIrbWV0aG9kUmVmLmdldE5hbWUoKSsiIGJpbmRpbmcgd2FzIG5vdCBmb3VuZCEiLG1ldGhOYW1lQmluZGluZyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJYXNzdW1lTnVsbCh0aGlzLnByZWZpeCsiIittZXRob2RSZWYuZ2V0TmFtZSgpKyIgYmluZGluZyBzaG91bGQgYmUgbnVsbCEiLCBtZXRoTmFtZUJpbmRpbmcpOworCQkJCQkJCX0KKwkJCQkJCQl2ZXJpZnlOYW1lQmluZGluZ3MobWV0aG9kUmVmLmdldFF1YWxpZmllcigpKTsKKwkJCQkJCX0KKwkJCQkJCSovCiAJCQkJCQlJdGVyYXRvciBwYXJhbWV0ZXJzID0gbWV0aG9kUmVmLnBhcmFtZXRlcnMoKS5saXN0SXRlcmF0b3IoKTsKIAkJCQkJCXdoaWxlIChwYXJhbWV0ZXJzLmhhc05leHQoKSkgewogCQkJCQkJCU1ldGhvZFJlZlBhcmFtZXRlciBwYXJhbSA9IChNZXRob2RSZWZQYXJhbWV0ZXIpIHBhcmFtZXRlcnMubmV4dCgpOwpAQCAtMTIwOCw3ICsxMjQ4LDkgQEAKIAkJCWlmIChsZW5ndGggPiAwKSB7CiAJCQkJcHJvYmxlbXMuYXBwZW5kKCIgIC0gIit0aGlzLnByZWZpeCtsZW5ndGgrIiBwcm9ibGVtczoiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXByb2JsZW1zLmFwcGVuZCgiCSsgIitwcm9ibGVtc0xpc3RbaV0pOworCQkJCQlwcm9ibGVtcy5hcHBlbmQoIgkrICIpOworCQkJCQlwcm9ibGVtcy5hcHBlbmQocHJvYmxlbXNMaXN0W2ldKTsKKwkJCQkJcHJvYmxlbXMuYXBwZW5kKCJcbiIpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTg0Niw2ICsxODg4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCB0ZXN0QnVnNTMwNzUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgInNyYyIsICJqYXZhZG9jLnRlc3RCdWc1MzA3NSIsICJYLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorCQlib29sZWFuIHBiID0gdGhpcy5wYWNrYWdlQmluZGluZzsKIAkJdGhpcy5wYWNrYWdlQmluZGluZyA9IGZhbHNlOwogCQlDb21waWxhdGlvblVuaXQgY29tcGlsVW5pdCA9IHZlcmlmeUNvbW1lbnRzKHVuaXQpOwogCQlpZiAodGhpcy5kb2NDb21tZW50U3VwcG9ydC5lcXVhbHMoSmF2YUNvcmUuRU5BQkxFRCkpIHsKQEAgLTE4NTcsNiArMTkwMCw3IEBACiAJCQl0YWdFbGVtZW50ID0gKFRhZ0VsZW1lbnQpIGRvY0NvbW1lbnQudGFncygpLmdldCgxKTsKIAkJCWFzc3VtZUVxdWFscygiV3JvbmcgdGFnIHR5cGUhIiwgVGFnRWxlbWVudC5UQUdfTElOS1BMQUlOLCB0YWdFbGVtZW50LmdldFRhZ05hbWUoKSk7CiAJCX0KKwkJdGhpcy5wYWNrYWdlQmluZGluZyA9IHBiOwogCX0KIAogCS8qKgpAQCAtMTkxOSw0ICsxOTYzLDE1MiBAQAogCQl9CiAJCXRoaXMuc3RvcE9uRmFpbHVyZSA9IHRydWU7CiAJfQorCisJLyoqCisJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzMDQ0CisJICovCisJcHVibGljIHZvaWQgdGVzdEJ1ZzYzMDQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXZlcmlmeUNvbW1lbnRzKCJ0ZXN0QnVnNjMwNDQiKTsKKwl9CisKKwkvKioKKwkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTE2NjAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QnVnNTE2NjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhpcy5zdG9wT25GYWlsdXJlID0gZmFsc2U7CisJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICJzcmMiLCAiamF2YWRvYy50ZXN0QnVnNTE2NjAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKKwkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbFVuaXQgPSB2ZXJpZnlDb21tZW50cyh1bml0KTsKKwkJaWYgKHRoaXMuZG9jQ29tbWVudFN1cHBvcnQuZXF1YWxzKEphdmFDb3JlLkVOQUJMRUQpKSB7CisJCQlTdHJpbmdbXSB0YWdOYW1lcyA9IHsKKwkJCQkiQGVqYiIsCisJCQkJIkBlamJcImJlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ1wiIiwKKwkJCQkiQGVqYiIsCisJCQkJIkBlamIiLAorCQkJCSJAZWpiIiwKKwkJCQkiQGVqYiIsCisJCQkJIkBlamIoYmVhbiIsCisJCQkJIkBlamIpYmVhbiIsCisJCQkJIkBlamIqYmVhbiIsCisJCQkJIkBlamIrYmVhbiIsCisJCQkJIkBlamIsYmVhbiIsCisJCQkJIkBlamIiLAorCQkJCSJAZWpiLmJlYW4iLAorCQkJCSJAZWpiL2JlYW4iLAorCQkJCSJAZWpiIiwKKwkJCQkiQGVqYjtiZWFuIiwKKwkJCQkiQGVqYiIsCisJCQkJIkBlamI9YmVhbiIsCisJCQkJIkBlamIiLAorCQkJCSJAZWpiP2JlYW4iLAorCQkJCSJAZWpiQGJlYW4iLAorCQkJCSJAZWpiW2JlYW4iLAorCQkJCSJAZWpiXFxiZWFuIiwKKwkJCQkiQGVqYl1iZWFuIiwKKwkJCQkiQGVqYl5iZWFuIiwKKwkJCQkiQGVqYmBiZWFuIiwKKwkJCQkiQGVqYntiZWFuIiwKKwkJCQkiQGVqYnxiZWFuIiwKKwkJCQkiQGVqYiIsCisJCQkJIkBlamJ+YmVhbiIsCisJCQkJIkBlamKmYmVhbiIsCisJCQkJIkBlamKnYmVhbiIsCisJCQkJIkBlamKoYmVhbiIsCisJCQkJIkBlamKpYmVhbiIsCisJCQkJIkBlamKrYmVhbiIsCisJCQkJIkBlamKsYmVhbiIsCisJCQkJIkBlamKtYmVhbiIsCisJCQkJIkBlamKuYmVhbiIsCisJCQkJIkBlamKvYmVhbiIsCisJCQkJIkBlamKwYmVhbiIsCisJCQkJIkBlamKxYmVhbiIsCisJCQkJIkBlamKyYmVhbiIsCisJCQkJIkBlamKzYmVhbiIsCisJCQkJIkBlamK0YmVhbiIsCisJCQkJIkBlamK2YmVhbiIsCisJCQkJIkBlamK3YmVhbiIsCisJCQkJIkBlamK4YmVhbiIsCisJCQkJIkBlamK5YmVhbiIsCisJCQkJIkBlamK7YmVhbiIsCisJCQkJIkBlamK8YmVhbiIsCisJCQkJIkBlamK9YmVhbiIsCisJCQkJIkBlamK+YmVhbiIsCisJCQkJIkBlamK/YmVhbiIsCisJCQkJIkBlamLXYmVhbiIsCisJCQkJIkBlamL3YmVhbiIsCisJCQkJIkB1bmtub3duIgorCQkJfTsKKwkJCVN0cmluZ1tdIHRhZ1RleHRzID0geworCQkJCSIhYmVhbiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnIScgKHZhbD0zMykgaW4gdGFnIG5hbWUiLAorCQkJCSInICh2YWw9MzQpIGluIHRhZyBuYW1lIiwKKwkJCQkiI2JlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJyMnICh2YWw9MzUpIGluIHRhZyBuYW1lIiwKKwkJCQkiJWJlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJyUnICh2YWw9MzcpIGluIHRhZyBuYW1lIiwKKwkJCQkiJmJlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJyYnICh2YWw9MzgpIGluIHRhZyBuYW1lIiwKKwkJCQkiJ2JlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJycnICh2YWw9MzkpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICcoJyAodmFsPTQwKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnKScgKHZhbD00MSkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJyonICh2YWw9NDIpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICcrJyAodmFsPTQzKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnLCcgKHZhbD00NCkgaW4gdGFnIG5hbWUiLAorCQkJCSItYmVhbiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnLScgKHZhbD00NSkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJy4nICh2YWw9NDYpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICcvJyAodmFsPTQ3KSBpbiB0YWcgbmFtZSIsCisJCQkJIjpiZWFuIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICc6JyAodmFsPTU4KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnOycgKHZhbD01OSkgaW4gdGFnIG5hbWUiLAorCQkJCSI8YmVhbiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnPCcgKHZhbD02MCkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJz0nICh2YWw9NjEpIGluIHRhZyBuYW1lIiwKKwkJCQkiPmJlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJz4nICh2YWw9NjIpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICc/JyAodmFsPTYzKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnQCcgKHZhbD02NCkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ1snICh2YWw9OTEpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICdcXCcgKHZhbD05MikgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ10nICh2YWw9OTMpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICdeJyAodmFsPTk0KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnYCcgKHZhbD05NikgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ3snICh2YWw9MTIzKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnfCcgKHZhbD0xMjQpIGluIHRhZyBuYW1lIiwKKwkJCQkifWJlYW4gdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ30nICh2YWw9MTI1KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnficgKHZhbD0xMjYpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICemJyAodmFsPTE2NikgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ6cnICh2YWw9MTY3KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnqCcgKHZhbD0xNjgpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICepJyAodmFsPTE2OSkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ6snICh2YWw9MTcxKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnrCcgKHZhbD0xNzIpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICetJyAodmFsPTE3MykgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ64nICh2YWw9MTc0KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnrycgKHZhbD0xNzUpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICewJyAodmFsPTE3NikgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ7EnICh2YWw9MTc3KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnsicgKHZhbD0xNzgpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICezJyAodmFsPTE3OSkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ7QnICh2YWw9MTgwKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnticgKHZhbD0xODIpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICe3JyAodmFsPTE4MykgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ7gnICh2YWw9MTg0KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnuScgKHZhbD0xODUpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICe7JyAodmFsPTE4NykgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ7wnICh2YWw9MTg4KSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAnvScgKHZhbD0xODkpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICe+JyAodmFsPTE5MCkgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBub24tamF2YSBpZCBjaGFyYWN0ZXIgJ78nICh2YWw9MTkxKSBpbiB0YWcgbmFtZSIsCisJCQkJIiB0ZXN0IG5vbi1qYXZhIGlkIGNoYXJhY3RlciAn1ycgKHZhbD0yMTUpIGluIHRhZyBuYW1lIiwKKwkJCQkiIHRlc3Qgbm9uLWphdmEgaWQgY2hhcmFjdGVyICf3JyAodmFsPTI0NykgaW4gdGFnIG5hbWUiLAorCQkJCSIgdGVzdCBqYXZhIGlkIgorCQkJfTsKKwkJCUNvbW1lbnQgY29tbWVudCA9IChDb21tZW50KSBjb21waWxVbml0LmdldENvbW1lbnRMaXN0KCkuZ2V0KDApOworCQkJYXNzdW1lVHJ1ZSh0aGlzLnByZWZpeCsiQ29tbWVudCBzaG91bGQgYmUgYSBqYXZhZG9jIGNvbW1lbnQgIiwgY29tbWVudC5pc0RvY0NvbW1lbnQoKSk7CisJCQlKYXZhZG9jIGRvY0NvbW1lbnQgPSAoSmF2YWRvYykgY29tbWVudDsKKwkJCWludCBzaXplID0gZG9jQ29tbWVudC50YWdzKCkuc2l6ZSgpOworCQkJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgeworCQkJCVRhZ0VsZW1lbnQgdGFnRWxlbWVudCA9IChUYWdFbGVtZW50KSBkb2NDb21tZW50LnRhZ3MoKS5nZXQoaSk7CisJCQkJYXNzdW1lRXF1YWxzKCJXcm9uZyB0YWcgbmFtZSBmb3I6Iit0YWdFbGVtZW50LCB0YWdOYW1lc1tpXSwgdGFnRWxlbWVudC5nZXRUYWdOYW1lKCkpOworCQkJCWFzc3VtZUVxdWFscygiV3JvbmcgZnJhZ21lbnRzIHNpemUgZm9yIDoiK3RhZ0VsZW1lbnQsIDEsIHRhZ0VsZW1lbnQuZnJhZ21lbnRzKCkuc2l6ZSgpKTsKKwkJCQlBU1ROb2RlIGZyYWdtZW50ID0gKEFTVE5vZGUpIHRhZ0VsZW1lbnQuZnJhZ21lbnRzKCkuZ2V0KDApOworCQkJCWFzc3VtZUVxdWFscygiV3JvbmcgZnJhZ21lbnRzIHR5cGUgZm9yIDoiK3RhZ0VsZW1lbnQsIEFTVE5vZGUuVEVYVF9FTEVNRU5ULCBmcmFnbWVudC5nZXROb2RlVHlwZSgpKTsKKwkJCQlUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCA9IChUZXh0RWxlbWVudCkgZnJhZ21lbnQ7CisJCQkJYXNzdW1lRXF1YWxzKCJXcm9uZyB0ZXh0IGZvciB0YWchIiwgdGFnVGV4dHNbaV0sIHRleHRFbGVtZW50LmdldFRleHQoKSk7CisJCQl9CisJCX0KKwkJdGhpcy5zdG9wT25GYWlsdXJlID0gdHJ1ZTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVE1hdGNoZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVE1hdGNoZXJUZXN0LmphdmEKaW5kZXggOGNjYTQ4ZC4uYTZjY2U1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RNYXRjaGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUTWF0Y2hlclRlc3QuamF2YQpAQCAtMjUyLDkgKzI1Miw4IEBACiAJCQl0aGlzLnN1cGVyTWF0Y2hSZXN1bHQgPSBtYXRjaFJlc3VsdDsKIAkJCWlmIChzdXBlck1hdGNoKSB7CiAJCQkJcmV0dXJuIHRoaXMuc3VwZXJNYXRjaFJlc3VsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMucmVzdWx0OwogCQkJfQorCQkJcmV0dXJuIHRoaXMucmVzdWx0OwogCQl9CiAKIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQ29udmVydGVyVGVzdFNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhCmluZGV4IDBhMWE0NmEuLjBmYWFlNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQ29udmVydGVyVGVzdFNldHVwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9Db252ZXJ0ZXJUZXN0U2V0dXAuamF2YQpAQCAtNjEsMTUgKzYxLDE0IEBACiAJCQlpZiAoIWpjbERpci5ta2RpcigpKSB7CiAJCQkJLy9ta2RpciBmYWlsZWQKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSAiICsgamNsRGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvL2NvcHkgdGhlIHR3byBmaWxlcyB0byB0aGUgSkNMIGRpcmVjdG9yeQotCQkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbiA9Ci0JCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiY29udmVydGVySmNsTWluLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29weShyZXNvdXJjZUpDTE1pbiwgamNsTWluKTsKLQkJCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW5zcmMgPQotCQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImNvbnZlcnRlckpjbE1pbnNyYy56aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7CiAJCQl9CisJCQkvL2NvcHkgdGhlIHR3byBmaWxlcyB0byB0aGUgSkNMIGRpcmVjdG9yeQorCQkJamF2YS5pby5GaWxlIHJlc291cmNlSkNMTWluID0KKwkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImNvbnZlcnRlckpjbE1pbi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJY29weShyZXNvdXJjZUpDTE1pbiwgamNsTWluKTsKKwkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbnNyYyA9CisJCQkJbmV3IGphdmEuaW8uRmlsZShyZXNvdXJjZUpDTERpciArIHNlcGFyYXRvciArICJjb252ZXJ0ZXJKY2xNaW5zcmMuemlwIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7CiAJCX0gZWxzZSB7CiAJCQkvL2NoZWNrIHRoYXQgdGhlIHR3byBmaWxlcywgamNsTWluLmphciBhbmQgamNsTWluc3JjLnppcCBhcmUgcHJlc2VudAogCQkJLy9jb3B5IGVpdGhlciBmaWxlIHRoYXQgaXMgbWlzc2luZyBvciBsZXNzIHJlY2VudCB0aGFuIHRoZSBvbmUgaW4gd29ya3NwYWNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZm9ybWF0dGVyL0Zvcm1hdHRlclJlZ3Jlc3Npb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2Zvcm1hdHRlci9Gb3JtYXR0ZXJSZWdyZXNzaW9uVGVzdHMuamF2YQppbmRleCA4NTViNDFhLi5lNjA3NGEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZm9ybWF0dGVyL0Zvcm1hdHRlclJlZ3Jlc3Npb25UZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9mb3JtYXR0ZXIvRm9ybWF0dGVyUmVncmVzc2lvblRlc3RzLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkJCXJldHVybiBuZXcgU3VpdGUoRm9ybWF0dGVyUmVncmVzc2lvblRlc3RzLmNsYXNzKTsKIAkJfQogCQlqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEZvcm1hdHRlclJlZ3Jlc3Npb25UZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBGb3JtYXR0ZXJSZWdyZXNzaW9uVGVzdHMoInRlc3Q0OTkiKSk7ICAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3QobmV3IEZvcm1hdHRlclJlZ3Jlc3Npb25UZXN0cygidGVzdDUwMCIpKTsgIC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIHN1aXRlOwogCX0KIApAQCAtMjYwLDkgKzI2MCw4IEBACiAJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlLCBhc3ROb2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIDEsIGFzdE5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpICsgYXN0Tm9kZS5nZXRMZW5ndGgoKSAtIDEpKTsKIAkJaWYgKHJlc3VsdC5lbmRzV2l0aCgiXFxuIikpIHsKIAkJCXJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDIpICsgTElORV9TRVBBUkFUT1I7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwogCQl9CisJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKQEAgLTY0NTYsNCArNjQ1NSwxMSBAQAogCQlEZWZhdWx0Q29kZUZvcm1hdHRlciBjb2RlRm9ybWF0dGVyID0gbmV3IERlZmF1bHRDb2RlRm9ybWF0dGVyKHByZWZlcmVuY2VzKTsKIAkJcnVuVGVzdChjb2RlRm9ybWF0dGVyLCAidGVzdDQ5OSIsICJBLmphdmEiLCBDb2RlRm9ybWF0dGVyLktfQ09NUElMQVRJT05fVU5JVCwgdHJ1ZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQorCisJcHVibGljIHZvaWQgdGVzdDUwMCgpIHsKKwkJTWFwIG9wdGlvbnMgPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5nZXREZWZhdWx0U2V0dGluZ3MoKTsKKwkJRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zIHByZWZlcmVuY2VzID0gbmV3IERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucyhvcHRpb25zKTsKKwkJRGVmYXVsdENvZGVGb3JtYXR0ZXIgY29kZUZvcm1hdHRlciA9IG5ldyBEZWZhdWx0Q29kZUZvcm1hdHRlcihwcmVmZXJlbmNlcyk7CisJCXJ1blRlc3QoY29kZUZvcm1hdHRlciwgInRlc3Q1MDAiLCAiQS5qYXZhIiwgQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQsIGZhbHNlKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0Fic3RyYWN0SmF2YU1vZGVsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9BYnN0cmFjdEphdmFNb2RlbFRlc3RzLmphdmEKaW5kZXggMWM5NGYwNS4uN2UwNDI4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0Fic3RyYWN0SmF2YU1vZGVsVGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQWJzdHJhY3RKYXZhTW9kZWxUZXN0cy5qYXZhCkBAIC0xNTksNyArMTU5LDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTZWFyY2hSZXN1bHRzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIE9iamVjdCBjb2xsZWN0b3IpIHsKIAkJU3RyaW5nIGFjdHVhbCA9IGNvbGxlY3Rvci50b1N0cmluZygpOwogCQlpZiAoIWV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5kaXNwbGF5U3RyaW5nKGFjdHVhbCwgMikpOworCQkJU3lzdGVtLm91dC5wcmludChkaXNwbGF5U3RyaW5nKGFjdHVhbCwgMikpOwogCQkJU3lzdGVtLm91dC5wcmludGxuKCIsIik7CiAJCX0KIAkJYXNzZXJ0RXF1YWxzKApAQCAtMTk2LDcgKzE5NiwxMiBAQAogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKLQkJCQlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnQpZWxlbWVudHNbaV0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsKKwkJCQlKYXZhRWxlbWVudCBlbGVtZW50ID0gKEphdmFFbGVtZW50KWVsZW1lbnRzW2ldOworCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKKwkJCQkJYnVmZmVyLmFwcGVuZCgiPG51bGw+Iik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnVmZmVyLmFwcGVuZChlbGVtZW50LnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsKKwkJCQl9CiAJCQkJaWYgKGkgIT0gbGVuZ3RoLTEpIGJ1ZmZlci5hcHBlbmQoIlxuIik7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC03MjksOSArNzM0LDggQEAKIAkJSVBhY2thZ2VGcmFnbWVudCBwa2c9IGdldFBhY2thZ2VGcmFnbWVudChwcm9qZWN0TmFtZSwgcm9vdFBhdGgsIHBhY2thZ2VOYW1lKTsKIAkJaWYgKHBrZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwa2cuZ2V0Q2xhc3NGaWxlKGNsYXNzTmFtZSk7CiAJCX0KKwkJcmV0dXJuIHBrZy5nZXRDbGFzc0ZpbGUoY2xhc3NOYW1lKTsKIAl9CiAJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAoSUNvbXBpbGF0aW9uVW5pdClKYXZhQ29yZS5jcmVhdGUoZ2V0RmlsZShwYXRoKSk7CkBAIC03NDQsOSArNzQ4LDggQEAKIAkJSVBhY2thZ2VGcmFnbWVudCBwa2c9IGdldFBhY2thZ2VGcmFnbWVudChwcm9qZWN0TmFtZSwgcm9vdFBhdGgsIHBhY2thZ2VOYW1lKTsKIAkJaWYgKHBrZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KGN1TmFtZSk7CiAJCX0KKwkJcmV0dXJuIHBrZy5nZXRDb21waWxhdGlvblVuaXQoY3VOYW1lKTsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQgaW4gdGhlIGdpdmVuIHByb2plY3QsIHJvb3QsIGFuZApAQCAtNzU2LDkgKzc1OSw4IEBACiAJCUlQYWNrYWdlRnJhZ21lbnQgcGtnPSBnZXRQYWNrYWdlRnJhZ21lbnQocHJvamVjdE5hbWUsIHJvb3RQYXRoLCBwYWNrYWdlTmFtZSk7CiAJCWlmIChwa2cgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGtnLmdldENvbXBpbGF0aW9uVW5pdHMoKTsKIAkJfQorCQlyZXR1cm4gcGtnLmdldENvbXBpbGF0aW9uVW5pdHMoKTsKIAl9CiAJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0Rm9yKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAJCkBAIC03OTcsOSArNzk5LDggQEAKIAkJCWlmIChkZWx0YSAhPSBudWxsKSB7CiAJCQkJaWYgKHJldHVybkZpcnN0KSB7CiAJCQkJCXJldHVybiBkZWx0YTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBkZWx0YTsKIAkJCQl9CisJCQkJcmVzdWx0ID0gZGVsdGE7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTg1MSw5ICs4NTIsOCBAQAogCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybiBudWxsOwogCQlpZiAoZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewogCQkJcmV0dXJuIChJTG9jYWxWYXJpYWJsZSllbGVtZW50c1swXTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwogCQl9CisJCXJldHVybiBudWxsOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBmcmFnbWVudCBpbiB0aGUgZ2l2ZW4gcHJvamVjdCBhbmQgcm9vdCwgb3IKQEAgLTg2NSw5ICs4NjUsOCBAQAogCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3ROYW1lLCByb290UGF0aCk7CiAJCWlmIChyb290ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKIAkJfQorCQlyZXR1cm4gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBmcmFnbWVudCByb290IGluIHRoZSBnaXZlbiBwcm9qZWN0LCBvcgpAQCAtOTUwLDEyICs5NDksMTIgQEAKIAkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZSgKIAkJCQlkaXNwbGF5U3RyaW5nLnRvQ2hhckFycmF5KCksIAogCQkJCWdldEV4dGVybmFsSkNMUGF0aCgpLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSwgCi0JCQkJKCJcIisgIGdldEV4dGVybmFsSkNMUGF0aCgpICtcIiIpLnRvQ2hhckFycmF5KCkpOworCQkJCSgiXCIrIGdldEV4dGVybmFsSkNMUGF0aCgpICsgXCIiKS50b0NoYXJBcnJheSgpKTsKIAkJdG9EaXNwbGF5ID0gCiAJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoCiAJCQkJdG9EaXNwbGF5LCAKIAkJCQlnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKS50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIAotCQkJCSgiXCIrICBnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKSArXCIiKS50b0NoYXJBcnJheSgpKTsKKwkJCQkoIlwiKyBnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKSArIFwiIikudG9DaGFyQXJyYXkoKSk7CiAJCXJldHVybiBuZXcgU3RyaW5nKHRvRGlzcGxheSk7CiAJfQogCXB1YmxpYyBieXRlW10gcmVhZChqYXZhLmlvLkZpbGUgZmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewpAQCAtOTg0LDE5ICs5ODMsMTcgQEAKIAkKIAkJaWYgKGRlbHRhID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKS5lcXVhbHMoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZGVsdGE7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUphdmFFbGVtZW50RGVsdGEgY2hpbGQ9IHNlYXJjaEZvckRlbHRhKGVsZW1lbnQsIGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKVtpXSk7Ci0JCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKS5lcXVhbHMoZWxlbWVudCkpIHsKKwkJCXJldHVybiBkZWx0YTsKKwkJfQorCQlmb3IgKGludCBpPSAwOyBpIDwgZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnREZWx0YSBjaGlsZD0gc2VhcmNoRm9yRGVsdGEoZWxlbWVudCwgZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpW2ldKTsKKwkJCWlmIChjaGlsZCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGNoaWxkOwogCQkJfQogCQl9CisJCXJldHVybiBudWxsOwogCX0KIAlwcm90ZWN0ZWQgdm9pZCBzZWFyY2goSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBsaW1pdFRvLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCkBAIC0xMDUyLDE1ICsxMDQ5LDE0IEBACiAJCQlpZiAoIWpjbERpci5ta2RpcigpKSB7CiAJCQkJLy9ta2RpciBmYWlsZWQKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSAiICsgamNsRGlyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9jb3B5IHRoZSB0d28gZmlsZXMgdG8gdGhlIEpDTCBkaXJlY3RvcnkKLQkJCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW4gPQotCQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImpjbE1pbi5qYXIiKTsKLQkJCQljb3B5KHJlc291cmNlSkNMTWluLCBqY2xNaW4pOwotCQkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbnNyYyA9Ci0JCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiamNsTWluc3JjLnppcCIpOwotCQkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7CiAJCQl9CisJCQkvL2NvcHkgdGhlIHR3byBmaWxlcyB0byB0aGUgSkNMIGRpcmVjdG9yeQorCQkJamF2YS5pby5GaWxlIHJlc291cmNlSkNMTWluID0KKwkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImpjbE1pbi5qYXIiKTsKKwkJCWNvcHkocmVzb3VyY2VKQ0xNaW4sIGpjbE1pbik7CisJCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW5zcmMgPQorCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiamNsTWluc3JjLnppcCIpOworCQkJY29weShyZXNvdXJjZUpDTE1pbnNyYywgamNsTWluc3JjKTsKIAkJfSBlbHNlIHsKIAkJCS8vY2hlY2sgdGhhdCB0aGUgdHdvIGZpbGVzLCBqY2xNaW4uamFyIGFuZCBqY2xNaW5zcmMuemlwIGFyZSBwcmVzZW50CiAJCQkvL2NvcHkgZWl0aGVyIGZpbGUgdGhhdCBpcyBtaXNzaW5nIG9yIGxlc3MgcmVjZW50IHRoYW4gdGhlIG9uZSBpbiB3b3Jrc3BhY2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9DbGFzc3BhdGhUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzcGF0aFRlc3RzLmphdmEKaW5kZXggMWM3ZjVjZS4uZTQ0Njc2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzcGF0aFRlc3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzcGF0aFRlc3RzLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAlyZXR1cm4gYnVpbGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotLy8JcmV0dXJuIGJ1aWxkVGVzdFN1aXRlKENsYXNzcGF0aFRlc3RzLmNsYXNzLCAidGVzdENsYXNzcGF0aFZhbGlkYXRpb24iLCBudWxsKTsKKwkvL3JldHVybiBidWlsZFRlc3RTdWl0ZShDbGFzc3BhdGhUZXN0cy5jbGFzcywgInRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMDIiLCBudWxsKTsKIH0KIHByb3RlY3RlZCB2b2lkIGFzc2VydEN5Y2xlTWFya2VycyhJSmF2YVByb2plY3QgcHJvamVjdCwgSUphdmFQcm9qZWN0W10gcCwgaW50W10gZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCXdhaXRGb3JBdXRvQnVpbGQoKTsKQEAgLTE1OTIsNiArMTU5Miw3MSBAQAogCX0KIH0KIC8qKgorICogNjI3MTMgLSBjaGVjayBuZXN0ZWQgb3V0cHV0IGZvbGRlciBkZXRlY3Rpb24KKyAqLworcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24zOSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl0cnkgeworCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7CisJCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOworCQorCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMl07CisJCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKKwkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QIiksIG5ldyBJUGF0aFtde25ldyBQYXRoKCJ0ZXN0LyIpfSwgbmV3IFBhdGgoIi9QL2Jpbi90ZXN0IikpOworCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aCsxXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC90ZXN0IiksIG5ldyBJUGF0aFtde30sIG5ldyBQYXRoKCIvUC9iaW4iKSk7CisJCQorCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJCisJCWFzc2VydFN0YXR1cygKKwkJCSJDYW5ub3QgbmVzdCBvdXRwdXQgZm9sZGVyIFwnUC9iaW4vdGVzdFwnIGluc2lkZSBvdXRwdXQgZm9sZGVyIFwnUC9iaW5cJy4iLAorCQkJc3RhdHVzKTsKKwl9IGZpbmFsbHkgeworCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKKwl9Cit9CisvKioKKyAqIDYyNzEzIC0gdmFyaWF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uNDAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOworCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKKwkKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzJdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7CisJCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUCIpLCBuZXcgSVBhdGhbXXtuZXcgUGF0aCgidGVzdC8iKX0sIG5ldyBQYXRoKCIvUC9iaW4iKSk7CisJCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoKzFdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QL3Rlc3QiKSwgbmV3IElQYXRoW117fSwgbmV3IFBhdGgoIi9QL2Jpbi90ZXN0IikpOworCQkKKwkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisJCQorCQlhc3NlcnRTdGF0dXMoCisJCQkiQ2Fubm90IG5lc3Qgb3V0cHV0IGZvbGRlciBcJ1AvYmluL3Rlc3RcJyBpbnNpZGUgb3V0cHV0IGZvbGRlciBcJ1AvYmluXCcuIiwKKwkJCXN0YXR1cyk7CisJfSBmaW5hbGx5IHsKKwkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7CisJfQorfQorLyoqCisgKiA2MjcxMyAtIHZhcmlhdGlvbgorICovCitwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjQxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRyeSB7CisJCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCisJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKKwkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOworCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1Avc3JjIiksIG5ldyBJUGF0aFtde30sIG5ldyBQYXRoKCIvUC8iKSk7CisJCQorCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJCisJCWFzc2VydFN0YXR1cygKKwkJCSJDYW5ub3QgbmVzdCBcJ1Avc3JjXCcgaW5zaWRlIG91dHB1dCBmb2xkZXIgXCdQL1wnLiIsCisJCQlzdGF0dXMpOworCX0gZmluYWxseSB7CisJCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOworCX0KK30KKy8qKgogICogU2V0dGluZyB0aGUgY2xhc3NwYXRoIHdpdGggdHdvIGVudHJpZXMgc3BlY2lmeWluZyB0aGUgc2FtZSBwYXRoCiAgKiBzaG91bGQgZmFpbC4KICAqLwpAQCAtMjEzNCw3ICsyMTk5LDcgQEAKIAl9CiB9CiAvKioKLSAqIEVuc3VyZSB0aGF0IHJlYWRpbmcgYW4gZW1wdHkgY3VzdG9tIHB1dHB1dCBmcm9tIHRoZSAuY2xhc3NwYXRoIHJldHVybnMgYSBub24tbnVsbCBvdXRwdXQgbG9jYXRpb24uCisgKiBFbnN1cmUgdGhhdCByZWFkaW5nIGFuIGVtcHR5IGN1c3RvbSBvdXRwdXQgZnJvbSB0aGUgLmNsYXNzcGF0aCByZXR1cm5zIGEgbm9uLW51bGwgb3V0cHV0IGxvY2F0aW9uLgogICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgMjg1MzEgQ2xhc3NwYXRoIEVudHJ5OiBPdXRwdXQgZm9sZGVyIGNhbiBub3QgYmUgc2V0IHRvIHByb2plY3QpCiAgKi8KIHB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlDdXN0b21PdXRwdXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29kZUNvcnJlY3Rpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvZGVDb3JyZWN0aW9uVGVzdHMuamF2YQppbmRleCBhN2EyZTExLi5kY2VkYjljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29kZUNvcnJlY3Rpb25UZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db2RlQ29ycmVjdGlvblRlc3RzLmphdmEKQEAgLTEwMSwzMiArMTAxLDMxIEBACiAJCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TWV0aG9kMSIpKTsKIAkJCiAJCXJldHVybiBzdWl0ZTsKLQl9IGVsc2UgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEZpZWxkVHlwZTEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGRUeXBlMiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RGaWVsZFR5cGUzIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdExvY2FsVmFyaWFibGVUeXBlMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0SW1wb3J0MSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RJbXBvcnQyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEltcG9ydDMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0U3VwZXJDbGFzczEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0U3VwZXJDbGFzczIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0U3VwZXJJbnRlcmZhY2UxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFN1cGVySW50ZXJmYWNlMiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RFeGNlcHRpb24xIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEV4Y2VwdGlvbjIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TWV0aG9kMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RNZXRob2QyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEZpZWxkMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RGaWVsZDIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TG9jYWxWYXJpYWJsZTEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0QXJndW1lbnQxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFJldHVyblR5cGUxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFJldHVyblR5cGUyIikpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwogCX0KKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEZpZWxkVHlwZTEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RGaWVsZFR5cGUyIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGRUeXBlMyIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdExvY2FsVmFyaWFibGVUeXBlMSIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdExvY2FsVmFyaWFibGVUeXBlMiIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEltcG9ydDEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RJbXBvcnQyIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0SW1wb3J0MyIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFN1cGVyQ2xhc3MxIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0U3VwZXJDbGFzczIiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RTdXBlckludGVyZmFjZTEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RTdXBlckludGVyZmFjZTIiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RFeGNlcHRpb24xIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RXhjZXB0aW9uMiIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdE1ldGhvZDEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RNZXRob2QyIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGQxIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGQyIikpOworCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TG9jYWxWYXJpYWJsZTEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RBcmd1bWVudDEiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RSZXR1cm5UeXBlMSIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFJldHVyblR5cGUyIikpOworCisJcmV0dXJuIHN1aXRlOwogfQogcHVibGljIHZvaWQgdGVzdENvcnJlY3RGaWVsZFR5cGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db3B5TW92ZVRlc3RzLmphdmEKaW5kZXggZWE5MGUwZi4uYzhlYjNlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlVGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29weU1vdmVUZXN0cy5qYXZhCkBAIC0xNjQsOSArMTY0LDggQEAKIAkJCQkJaWYgKG5hbWUuZXF1YWxzKG9yaWdpbmFsLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpKSB7CiAJCQkJCQkvL21ldGhvZCBpcyBhIGNvbnN0cnVjdG9yCiAJCQkJCQlyZXR1cm4gKChJVHlwZSkgY29udGFpbmVyKS5nZXRNZXRob2QoY29udGFpbmVyLmdldEVsZW1lbnROYW1lKCksICgoSU1ldGhvZCkgb3JpZ2luYWwpLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuICgoSVR5cGUpIGNvbnRhaW5lcikuZ2V0TWV0aG9kKG5hbWUsICgoSU1ldGhvZCkgb3JpZ2luYWwpLmdldFBhcmFtZXRlclR5cGVzKCkpOwogCQkJCQl9CisJCQkJCXJldHVybiAoKElUeXBlKSBjb250YWluZXIpLmdldE1ldGhvZChuYW1lLCAoKElNZXRob2QpIG9yaWdpbmFsKS5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKIAkJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRCA6CiAJCQkJCXJldHVybiAoKElUeXBlKSBjb250YWluZXIpLmdldEZpZWxkKG5hbWUpOwogCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEUgOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0RlZmF1bHRKYXZhRWxlbWVudENvbXBhcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9EZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yLmphdmEKaW5kZXggOWFkMGYyNS4uNzVkYzMyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0RlZmF1bHRKYXZhRWxlbWVudENvbXBhcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRGVmYXVsdEphdmFFbGVtZW50Q29tcGFyYXRvci5qYXZhCkBAIC0xNzIsMzAgKzE3MiwyNiBAQAogCQkJCX0KIAkJCQlpZiAoRmxhZ3MuaXNTdGF0aWMobWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkpKSB7CiAJCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbU1RBVElDX01FVEhPRF9DQVRFR09SWV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tNRVRIT0RfQ0FURUdPUlldOwogCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5jYXRlZ29yaWVzW01FVEhPRF9DQVRFR09SWV07CiAJCQljYXNlIEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04gOgogCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwogCQkJCWlmIChGbGFncy5pc1N0YXRpYyhmaWVsZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpKSkgewogCQkJCQlyZXR1cm4gdGhpcy5jYXRlZ29yaWVzW1NUQVRJQ19GSUVMRF9DQVRFR09SWV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tGSUVMRF9DQVRFR09SWV07CiAJCQkJfQorCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbRklFTERfQ0FURUdPUlldOwogCQkJY2FzZSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04gOgogCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwogCQkJCWlmIChGbGFncy5pc1N0YXRpYyh0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkpKSB7CiAJCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbU1RBVElDX1RZUEVfQ0FURUdPUlldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbVFlQRV9DQVRFR09SWV07CiAJCQkJfQorCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbVFlQRV9DQVRFR09SWV07CiAJCQljYXNlIEFTVE5vZGUuSU5JVElBTElaRVIgOgogCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBub2RlOwogCQkJCWlmIChGbGFncy5pc1N0YXRpYyhpbml0aWFsaXplci5nZXRNb2RpZmllcnMoKSkpIHsKIAkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tTVEFUSUNfSU5JVElBTElaRVJfQ0FURUdPUlldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbSU5JVElBTElaRVJfQ0FURUdPUlldOwogCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5jYXRlZ29yaWVzW0lOSVRJQUxJWkVSX0NBVEVHT1JZXTsKIAkJfQogCQlyZXR1cm4gMDsKIAl9CkBAIC0yOTEsOSArMjg3LDggQEAKIAlwcml2YXRlIFN0cmluZyBidWlsZFNpZ25hdHVyZShOYW1lIG5hbWUpIHsKIAkJaWYgKG5hbWUuaXNTaW1wbGVOYW1lKCkpIHsKIAkJCXJldHVybiAoKFNpbXBsZU5hbWUpIG5hbWUpLmdldElkZW50aWZpZXIoKTsKLQkJfSBlbHNlIHsKLQkJCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBuYW1lOwotCQkJcmV0dXJuIGJ1aWxkU2lnbmF0dXJlKHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCkpICsgIi4iICsgYnVpbGRTaWduYXR1cmUocXVhbGlmaWVkTmFtZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCiAJCX0KKwkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIG5hbWU7CisJCXJldHVybiBidWlsZFNpZ25hdHVyZShxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpKSArICIuIiArIGJ1aWxkU2lnbmF0dXJlKHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YUVsZW1lbnREZWx0YVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YUVsZW1lbnREZWx0YVRlc3RzLmphdmEKaW5kZXggOThhZWIxMy4uYzZiZDY0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFFbGVtZW50RGVsdGFUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhRWxlbWVudERlbHRhVGVzdHMuamF2YQpAQCAtMTM1LDYgKzEzNSw3IEBACiAJc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0QWRkQ3VJbkRlZmF1bHRQa2cyIikpOwogCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE1vdmVDdUluRW5jbG9zaW5nUGtnIikpOwogCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdENvbXBpbGF0aW9uVW5pdFJlbW92ZUFuZEFkZCIpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRDdUFmdGVyUHJvamVjdE9wZW4iKSk7CiAJCiAJLy8gY29tbWl0L3NhdmUgd29ya2luZyBjb3BpZXMKIAlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RNb2RpZnlNZXRob2RCb2R5QW5kU2F2ZSIpKTsKQEAgLTI3Nyw2ICsyNzgsNDMgQEAKIAl9CiB9CiAvKgorICogQWRkIGN1IGFmdGVyIG9wZW5pbmcgaXRzIHByb2plY3QKKyAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIDU2ODcwIGNvcGllZCBmaWxlIG5vdCBzaG93biBpbiBwYWNrYWdlIGV4cGxvcmVyIC8gamF2YSBicm93c2VyIFtjY3BdKQorICovCitwdWJsaWMgdm9pZCB0ZXN0QWRkQ3VBZnRlclByb2plY3RPcGVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRyeSB7CisJCUlKYXZhUHJvamVjdCBwMSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKKwkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOworCQl0aGlzLmNyZWF0ZUZpbGUoIlAyL3NyYy9YLmphdmEiLAorCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKworCQkJIn0iKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IHAyLmdldFByb2plY3QoKTsKKwkJcHJvamVjdC5jbG9zZShudWxsKTsKKwkJCisJCS8vIGludmFsaWRhdGUgcm9vdHMKKwkJcDEuc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7fSwgbnVsbCk7CisJCQorCQkvLyBvcGVuIHByb2plY3QKKwkJcHJvamVjdC5vcGVuKG51bGwpOworCQkKKwkJdGhpcy5zdGFydERlbHRhcygpOworCQl0aGlzLmNyZWF0ZUZpbGUoIlAyL3NyYy9ZLmphdmEiLAorCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKworCQkJIn0iKTsKKwkJYXNzZXJ0RGVsdGFzKAorCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKKwkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArCisJCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArCisJCQkiCQk8ZGVmYXVsdD5bKl06IHtDSElMRFJFTn1cbiIgKworCQkJIgkJCVkuamF2YVsrXToge30iCisJCSk7CisJfSBmaW5hbGx5IHsKKwkJdGhpcy5zdG9wRGVsdGFzKCk7CisJCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKKwkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOworCX0KK30KKy8qCiAgKiBBZGQgdGhlIC5jbGFzc3BhdGggZmlsZSB0byBhIEphdmEgcHJvamVjdCB0aGF0IHdhcyBtaXNzaW5nIGl0LgogICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI2MTI4IHBhY2thZ2VzIGRvbid0IGFwcGVhciBpbiBwYWNrYWdlIGV4cGxvcmVyIHZpZXcpCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhU2VhcmNoSmF2YWRvY1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YVNlYXJjaEphdmFkb2NUZXN0cy5qYXZhCmluZGV4IDYzNDc5MzguLjkxYjQzMmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhU2VhcmNoSmF2YWRvY1Rlc3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hKYXZhZG9jVGVzdHMuamF2YQpAQCAtOTIsNyArOTIsNiBAQAogCX0KIAogCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFN1aXRlKFRlc3RTdWl0ZSBzdWl0ZSwgU3RyaW5nIHN1cHBvcnQpIHsKLS8vCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoIkRvYyAiK3N1cHBvcnQpOwogCQkvLyBUZXN0cyBvbiB0eXBlIGRlY2xhcmF0aW9ucwogCQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoSmF2YWRvY1Rlc3RzKCJ0ZXN0SmF2YWRvY1R5cGVEZWNsYXJhdGlvbiIsIHN1cHBvcnQpKTsKIAkJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaEphdmFkb2NUZXN0cygidGVzdEphdmFkb2NUeXBlRGVjbGFyYXRpb25XaXRoSmF2YWRvYyIsIHN1cHBvcnQpKTsKQEAgLTE1NCw4ICsxNTMsNiBAQAogCQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoSmF2YWRvY1Rlc3RzKCJ0ZXN0QnVnNDk5OTRjb25zdHJ1Y3RvciIsIHN1cHBvcnQpKTsKIAkJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaEphdmFkb2NUZXN0cygidGVzdEJ1ZzU0OTYyIikpOwogCQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoSmF2YWRvY1Rlc3RzKCJ0ZXN0QnVnNTQ5NjJxdWFsaWZpZWQiKSk7Ci0JCQotLy8JCXJldHVybiBzdWl0ZTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0xNzQsNyArMTcxLDYgQEAKIAkJCQkJYnVmZmVyLmFwcGVuZCh0b2tlbik7CiAJCQkJfQogCQkJfQotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TmFtZSgpKyIgLSBFeHBlY3RlZDogIitidWZmZXIudG9TdHJpbmcoKSk7CiAJCQlzdXBlci5hc3NlcnRTZWFyY2hSZXN1bHRzKG1lc3NhZ2UsIGJ1ZmZlci50b1N0cmluZygpLCBjb2xsZWN0b3IpOwogCQl9CiAJfQpAQCAtMjEyLDIyICsyMDgsMTggQEAKIAl9CiAJcHVibGljIHZvaWQgdGVzdEphdmFkb2NUeXBlRGVjbGFyYXRpb25XaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiajEiLCAiSmF2YWRvY1NlYXJjaGVkLmphdmEiKS5nZXRUeXBlKCJKYXZhZG9jU2VhcmNoZWQiKTsKLS8vCQl0cnkgewotCQkJc2V0SmF2YWRvY09wdGlvbnMoKTsKLQkJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQkJc2VhcmNoKAotCQkJCQl0eXBlLCAKLQkJCQkJREVDTEFSQVRJT05TLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jU2VhcmNoZWQuamF2YSBqMS5KYXZhZG9jU2VhcmNoZWQgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0giLAotCQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKKwkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7CisJCXNlYXJjaCgKKwkJCQl0eXBlLCAKKwkJCQlERUNMQVJBVElPTlMsCisJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQkJCXJlc3VsdAorCQkJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkJInNyYy9qMS9KYXZhZG9jU2VhcmNoZWQuamF2YSBqMS5KYXZhZG9jU2VhcmNoZWQgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0giLAorCQkJCXJlc3VsdCk7CiAJfQogCiAJLyoKQEAgLTI2NiwyMiArMjU4LDE4IEBACiAJcHVibGljIHZvaWQgdGVzdEphdmFkb2NGaWVsZERlY2xhcmF0aW9uV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImoxIiwgIkphdmFkb2NTZWFyY2hlZC5qYXZhIikuZ2V0VHlwZSgiSmF2YWRvY1NlYXJjaGVkIik7CiAJCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImphdmFkb2NTZWFyY2hlZFZhciIpOwotLy8JCXRyeSB7Ci0JCQlzZXRKYXZhZG9jT3B0aW9ucygpOwotCQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCQlzZWFyY2goCi0JCQkJCWZpZWxkLCAKLQkJCQkJREVDTEFSQVRJT05TLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jU2VhcmNoZWQuamF2YSBqMS5KYXZhZG9jU2VhcmNoZWQuamF2YWRvY1NlYXJjaGVkVmFyIFtqYXZhZG9jU2VhcmNoZWRWYXJdIEVYQUNUX01BVENIIiwKLQkJCQkJcmVzdWx0KTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlyZXNldFByb2plY3RPcHRpb25zKCk7Ci0vLwkJfQorCQlzZXRKYXZhZG9jT3B0aW9ucygpOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJZmllbGQsIAorCQkJCURFQ0xBUkFUSU9OUywKKwkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCisJCQkJcmVzdWx0CisJCQkJKTsKKwkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKKwkJCQkic3JjL2oxL0phdmFkb2NTZWFyY2hlZC5qYXZhIGoxLkphdmFkb2NTZWFyY2hlZC5qYXZhZG9jU2VhcmNoZWRWYXIgW2phdmFkb2NTZWFyY2hlZFZhcl0gRVhBQ1RfTUFUQ0giLAorCQkJCXJlc3VsdCk7CiAJfQogCiAJLyoKQEAgLTMzNSw0MyArMzIzLDM1IEBACiAJfQogCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jTWV0aG9kRGVjbGFyYXRpb25XaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiajEiLCAiSmF2YWRvY1NlYXJjaGVkLmphdmEiKS5nZXRUeXBlKCJKYXZhZG9jU2VhcmNoZWQiKTsKLS8vCQl0cnkgewotCQkJc2V0SmF2YWRvY09wdGlvbnMoKTsKLQkJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImphdmFkb2NTZWFyY2hlZE1ldGhvZCIsIG51bGwpOwotCQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCQlzZWFyY2goCi0JCQkJCW1ldGhvZCwgCi0JCQkJCURFQ0xBUkFUSU9OUywKLQkJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJCQlyZXN1bHQKLQkJCQkJKTsKLQkJCWFzc2VydFNlYXJjaFJlc3VsdHMoCi0JCQkJCSJzcmMvajEvSmF2YWRvY1NlYXJjaGVkLmphdmEgdm9pZCBqMS5KYXZhZG9jU2VhcmNoZWQuamF2YWRvY1NlYXJjaGVkTWV0aG9kKCkgW2phdmFkb2NTZWFyY2hlZE1ldGhvZF0gRVhBQ1RfTUFUQ0giLAotCQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImphdmFkb2NTZWFyY2hlZE1ldGhvZCIsIG51bGwpOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJbWV0aG9kLCAKKwkJCQlERUNMQVJBVElPTlMsCisJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQkJCXJlc3VsdAorCQkJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkJInNyYy9qMS9KYXZhZG9jU2VhcmNoZWQuamF2YSB2b2lkIGoxLkphdmFkb2NTZWFyY2hlZC5qYXZhZG9jU2VhcmNoZWRNZXRob2QoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSCIsCisJCQkJcmVzdWx0KTsKIAl9CiAJcHVibGljIHZvaWQgdGVzdEphdmFkb2NNZXRob2RBcmdEZWNsYXJhdGlvbldpdGhKYXZhZG9jKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJqMSIsICJKYXZhZG9jU2VhcmNoZWQuamF2YSIpLmdldFR5cGUoIkphdmFkb2NTZWFyY2hlZCIpOwotLy8JCXRyeSB7Ci0JCQlzZXRKYXZhZG9jT3B0aW9ucygpOwotCQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiamF2YWRvY1NlYXJjaGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLQkJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQkJc2VhcmNoKAotCQkJCQltZXRob2QsIAotCQkJCQlERUNMQVJBVElPTlMsCi0JCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCQkJcmVzdWx0Ci0JCQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCQkic3JjL2oxL0phdmFkb2NTZWFyY2hlZC5qYXZhIHZvaWQgajEuSmF2YWRvY1NlYXJjaGVkLmphdmFkb2NTZWFyY2hlZE1ldGhvZChTdHJpbmcpIFtqYXZhZG9jU2VhcmNoZWRNZXRob2RdIEVYQUNUX01BVENIIiwKLQkJCQkJcmVzdWx0KTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlyZXNldFByb2plY3RPcHRpb25zKCk7Ci0vLwkJfQorCQlzZXRKYXZhZG9jT3B0aW9ucygpOworCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJqYXZhZG9jU2VhcmNoZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJbWV0aG9kLCAKKwkJCQlERUNMQVJBVElPTlMsCisJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQkJCXJlc3VsdAorCQkJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkJInNyYy9qMS9KYXZhZG9jU2VhcmNoZWQuamF2YSB2b2lkIGoxLkphdmFkb2NTZWFyY2hlZC5qYXZhZG9jU2VhcmNoZWRNZXRob2QoU3RyaW5nKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSCIsCisJCQkJcmVzdWx0KTsKIAl9CiAKIAkvKgpAQCAtNDI4LDYxICs0MDgsNTMgQEAKIAl9CiAJcHVibGljIHZvaWQgdGVzdEphdmFkb2NUeXBlUmVmZXJlbmNlV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImoxIiwgIkphdmFkb2NTZWFyY2hlZC5qYXZhIikuZ2V0VHlwZSgiSmF2YWRvY1NlYXJjaGVkIik7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJCXNlYXJjaCgKLQkJCQkJdHlwZSwgCi0JCQkJCVJFRkVSRU5DRVMsCi0JCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCQkJcmVzdWx0Ci0JCQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbajEuSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKLQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIrCi0JCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtqMS5KYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iKwotCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKLQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIrCi0JCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIIiwKLQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKKwkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7CisJCXNlYXJjaCgKKwkJCQl0eXBlLCAKKwkJCQlSRUZFUkVOQ0VTLAorCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCQlyZXN1bHQKKwkJCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtqMS5KYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iICsgCisJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKKwkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iICsgCisJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbajEuSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSCIsCisJCQlyZXN1bHQpOwogCX0KIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YWRvY1R5cGVTdHJpbmdSZWZlcmVuY2VXaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQl0cnkgewotCQkJc2V0SmF2YWRvY09wdGlvbnMoKTsKLQkJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQkJc2VhcmNoKAotCQkJCQkiSmF2YWRvY1NlYXJjaGVkIiwgCi0JCQkJCVRZUEUsCi0JCQkJCVJFRkVSRU5DRVMsCi0JCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCQkJcmVzdWx0Ci0JCQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKLQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIrCi0JCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iKwotCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKLQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIrCi0JCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIIiwKLQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKKwkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7CisJCXNlYXJjaCgKKwkJCQkiSmF2YWRvY1NlYXJjaGVkIiwgCisJCQkJVFlQRSwKKwkJCQlSRUZFUkVOQ0VTLAorCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCQlyZXN1bHQKKwkJCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iICsgCisJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKKwkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIXG4iICsgCisJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIisKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSCIsCisJCQlyZXN1bHQpOwogCX0KIAogCS8qCkBAIC01MjQsNDQgKzQ5NiwzNiBAQAogCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jRmllbGRSZWZlcmVuY2VXaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiajEiLCAiSmF2YWRvY1NlYXJjaGVkLmphdmEiKS5nZXRUeXBlKCJKYXZhZG9jU2VhcmNoZWQiKTsKIAkJSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgiamF2YWRvY1NlYXJjaGVkVmFyIik7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJCXNlYXJjaCgKLQkJCQkJZmllbGQsIAotCQkJCQlSRUZFUkVOQ0VTLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRWYXJdIFBPVEVOVElBTF9NQVRDSFxuIiArIAotCQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZFZhcl0gRVhBQ1RfTUFUQ0giLAotCQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKKwkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7CisJCXNlYXJjaCgKKwkJCQlmaWVsZCwgCisJCQkJUkVGRVJFTkNFUywKKwkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCisJCQkJcmVzdWx0CisJCQkJKTsKKwkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKKwkJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZFZhcl0gUE9URU5USUFMX01BVENIXG4iICsgCisJCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRWYXJdIEVYQUNUX01BVENIIiwKKwkJCQlyZXN1bHQpOwogCX0KIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YWRvY0ZpZWxkU3RyaW5nUmVmZXJlbmNlV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJCXNlYXJjaCgKLQkJCQkJImphdmFkb2NTZWFyY2hlZFZhciIsIAotCQkJCQlGSUVMRCwKLQkJCQkJUkVGRVJFTkNFUywKLQkJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJCQlyZXN1bHQKLQkJCQkJKTsKLQkJCWFzc2VydFNlYXJjaFJlc3VsdHMoCi0JCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkVmFyXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZFZhcl0gUE9URU5USUFMX01BVENIXG4iICsgCi0JCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkVmFyXSBFWEFDVF9NQVRDSCIsCi0JCQkJCXJlc3VsdCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJcmVzZXRQcm9qZWN0T3B0aW9ucygpOwotLy8JCX0KKwkJc2V0SmF2YWRvY09wdGlvbnMoKTsKKwkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOworCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKKwkJc2VhcmNoKAorCQkJCSJqYXZhZG9jU2VhcmNoZWRWYXIiLCAKKwkJCQlGSUVMRCwKKwkJCQlSRUZFUkVOQ0VTLAorCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCQlyZXN1bHQKKwkJCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkVmFyXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkVmFyXSBQT1RFTlRJQUxfTUFUQ0hcbiIgKyAKKwkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZFZhcl0gRVhBQ1RfTUFUQ0giLAorCQkJCXJlc3VsdCk7CiAJfQogCiAJLyoKQEAgLTYxOCw2NiArNTgyLDU0IEBACiAJfQogCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jTWV0aG9kUmVmZXJlbmNlV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImoxIiwgIkphdmFkb2NTZWFyY2hlZC5qYXZhIikuZ2V0VHlwZSgiSmF2YWRvY1NlYXJjaGVkIik7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJqYXZhZG9jU2VhcmNoZWRNZXRob2QiLCBudWxsKTsKLQkJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQkJc2VhcmNoKAotCQkJCQltZXRob2QsIAotCQkJCQlSRUZFUkVOQ0VTLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRNZXRob2RdIFBPVEVOVElBTF9NQVRDSFxuIiArIAotCQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZE1ldGhvZF0gRVhBQ1RfTUFUQ0giLAotCQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImphdmFkb2NTZWFyY2hlZE1ldGhvZCIsIG51bGwpOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJbWV0aG9kLCAKKwkJCQlSRUZFUkVOQ0VTLAorCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCQlyZXN1bHQKKwkJCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBQT1RFTlRJQUxfTUFUQ0hcbiIgKyAKKwkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZE1ldGhvZF0gRVhBQ1RfTUFUQ0giLAorCQkJCXJlc3VsdCk7CiAJfQogCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jTWV0aG9kQXJnUmVmZXJlbmNlV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImoxIiwgIkphdmFkb2NTZWFyY2hlZC5qYXZhIikuZ2V0VHlwZSgiSmF2YWRvY1NlYXJjaGVkIik7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJqYXZhZG9jU2VhcmNoZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotCQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCQlzZWFyY2goCi0JCQkJCW1ldGhvZCwgCi0JCQkJCVJFRkVSRU5DRVMsCi0JCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCQkJcmVzdWx0Ci0JCQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZE1ldGhvZF0gRVhBQ1RfTUFUQ0giLAotCQkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImphdmFkb2NTZWFyY2hlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7CisJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKKwkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7CisJCXNlYXJjaCgKKwkJCQltZXRob2QsIAorCQkJCVJFRkVSRU5DRVMsCisJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQkJCXJlc3VsdAorCQkJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRNZXRob2RdIEVYQUNUX01BVENIIiwKKwkJCQlyZXN1bHQpOwogCX0KIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YWRvY01ldGhvZFN0cmluZ1JlZmVyZW5jZVdpdGhKYXZhZG9jKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCXRyeSB7Ci0JCQlzZXRKYXZhZG9jT3B0aW9ucygpOwotCQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCQlzZWFyY2goCi0JCQkJCSJqYXZhZG9jU2VhcmNoZWRNZXRob2QiLCAKLQkJCQkJTUVUSE9ELAotCQkJCQlSRUZFUkVOQ0VTLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jSW52YWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY0ludmFsaWRSZWYuaW52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRNZXRob2RdIEVYQUNUX01BVENIXG4iICsgCi0JCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW2phdmFkb2NTZWFyY2hlZE1ldGhvZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKLQkJCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtqYXZhZG9jU2VhcmNoZWRNZXRob2RdIEVYQUNUX01BVENIIiwKLQkJCQkJcmVzdWx0KTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlyZXNldFByb2plY3RPcHRpb25zKCk7Ci0vLwkJfQorCQlzZXRKYXZhZG9jT3B0aW9ucygpOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJImphdmFkb2NTZWFyY2hlZE1ldGhvZCIsIAorCQkJCU1FVEhPRCwKKwkJCQlSRUZFUkVOQ0VTLAorCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCQlyZXN1bHQKKwkJCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbamF2YWRvY1NlYXJjaGVkTWV0aG9kXSBFWEFDVF9NQVRDSCIsCisJCQkJcmVzdWx0KTsKIAl9CiAKIAkvKgpAQCAtNzMyLDY0ICs2ODQsNzAgQEAKIAl9CiAJcHVibGljIHZvaWQgdGVzdEphdmFkb2NDb25zdHJ1Y3RvclJlZmVyZW5jZVdpdGhKYXZhZG9jKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJqMSIsICJKYXZhZG9jU2VhcmNoZWQuamF2YSIpLmdldFR5cGUoIkphdmFkb2NTZWFyY2hlZCIpOwotLy8JCXRyeSB7Ci0JCQlzZXRKYXZhZG9jT3B0aW9ucygpOwotCQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiSmF2YWRvY1NlYXJjaGVkIiwgbnVsbCk7Ci0JCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJCXNlYXJjaCgKLQkJCQkJbWV0aG9kLCAKLQkJCQkJUkVGRVJFTkNFUywKLQkJCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJCQlyZXN1bHQKLQkJCQkJKTsKLQkJCWFzc2VydFNlYXJjaFJlc3VsdHMoCi0JCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSCIsCi0JCQkJCXJlc3VsdCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJcmVzZXRQcm9qZWN0T3B0aW9ucygpOwotLy8JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdEphdmFkb2NDb25zdHJ1Y3RvckFyZ1JlZmVyZW5jZVdpdGhKYXZhZG9jKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJqMSIsICJKYXZhZG9jU2VhcmNoZWQuamF2YSIpLmdldFR5cGUoIkphdmFkb2NTZWFyY2hlZCIpOwotLy8JCXRyeSB7Ci0JCQlzZXRKYXZhZG9jT3B0aW9ucygpOwotCQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiSmF2YWRvY1NlYXJjaGVkIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLQkJCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQkJc2VhcmNoKAotCQkJCQltZXRob2QsIAotCQkJCQlSRUZFUkVOQ0VTLAotCQkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQkJCXJlc3VsdAotCQkJCQkpOwotCQkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKLQkJCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIIiwKLQkJCQkJcmVzdWx0KTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlyZXNldFByb2plY3RPcHRpb25zKCk7Ci0vLwkJfQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YWRvY0NvbnN0cnVjdG9yU3RyaW5nUmVmZXJlbmNlV2l0aEphdmFkb2MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJCXNlYXJjaCgKLQkJCQkiSmF2YWRvY1NlYXJjaGVkIiwgCi0JCQkJQ09OU1RSVUNUT1IsCisJCXNldEphdmFkb2NPcHRpb25zKCk7CisJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoIkphdmFkb2NTZWFyY2hlZCIsIG51bGwpOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQkJbWV0aG9kLCAKIAkJCQlSRUZFUkVOQ0VTLAogCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKIAkJCQlyZXN1bHQKLQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCSJzcmMvajEvSmF2YWRvY0ludmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NJbnZhbGlkUmVmLmludmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAotCQkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCiAJCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIIiwKIAkJCQlyZXN1bHQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlc2V0UHJvamVjdE9wdGlvbnMoKTsKLS8vCQl9CisJfQorCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jQ29uc3RydWN0b3JBcmdSZWZlcmVuY2VXaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiajEiLCAiSmF2YWRvY1NlYXJjaGVkLmphdmEiKS5nZXRUeXBlKCJKYXZhZG9jU2VhcmNoZWQiKTsKKwkJc2V0SmF2YWRvY09wdGlvbnMoKTsKKwkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiSmF2YWRvY1NlYXJjaGVkIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKKwkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOworCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKKwkJc2VhcmNoKAorCQkJCW1ldGhvZCwgCisJCQkJUkVGRVJFTkNFUywKKwkJCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCisJCQkJcmVzdWx0CisJCQkJKTsKKwkJYXNzZXJ0U2VhcmNoUmVzdWx0cygKKwkJCQkic3JjL2oxL0phdmFkb2NWYWxpZFJlZi5qYXZhIHZvaWQgajEuSmF2YWRvY1ZhbGlkUmVmLnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0giLAorCQkJCXJlc3VsdCk7CisJfQorCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jQ29uc3RydWN0b3JTdHJpbmdSZWZlcmVuY2VXaXRoSmF2YWRvYygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJc2V0SmF2YWRvY09wdGlvbnMoKTsKKwkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOworCQlyZXN1bHQuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKKwkJc2VhcmNoKAorCQkJIkphdmFkb2NTZWFyY2hlZCIsIAorCQkJQ09OU1RSVUNUT1IsCisJCQlSRUZFUkVOQ0VTLAorCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQkJcmVzdWx0CisJCSk7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkic3JjL2oxL0phdmFkb2NJbnZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jSW52YWxpZFJlZi5pbnZhbGlkKCkgW0phdmFkb2NTZWFyY2hlZF0gRVhBQ1RfTUFUQ0hcbiIgKyAKKwkJCSJzcmMvajEvSmF2YWRvY1ZhbGlkUmVmLmphdmEgdm9pZCBqMS5KYXZhZG9jVmFsaWRSZWYudmFsaWQoKSBbSmF2YWRvY1NlYXJjaGVkXSBFWEFDVF9NQVRDSFxuIiArIAorCQkJInNyYy9qMS9KYXZhZG9jVmFsaWRSZWYuamF2YSB2b2lkIGoxLkphdmFkb2NWYWxpZFJlZi52YWxpZCgpIFtKYXZhZG9jU2VhcmNoZWRdIEVYQUNUX01BVENIIiwKKwkJCXJlc3VsdCk7CisJfQorCisJLyoqCisJICogTWV0aG9kIHJlZmVyZW5jZSB0aHJvdWdoIGFycmF5IHRlc3QuCisJICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdIREEyVjogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBkb2luZyBhIHNlYXJjaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUmVmZXJlbmNlVGhyb3VnaEFycmF5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJKYXZhU2VhcmNoIiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJqYXZhLmxhbmciLCAiT2JqZWN0LmNsYXNzIikuZ2V0VHlwZSgpOworCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJlcXVhbHMiLCBuZXcgU3RyaW5nW10geyAiUU9iamVjdDsiIH0pOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXNlYXJjaCgKKwkJCW1ldGhvZCwgCisJCQlSRUZFUkVOQ0VTLCAKKwkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCXJlc3VsdENvbGxlY3Rvcik7CisJCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCQkic3JjL0UuamF2YSBPYmplY3QgRS5mb28oKSBbY2xvbmUoKV0iLAorCQkJcmVzdWx0Q29sbGVjdG9yKTsKIAl9CiAKIAkvKioKQEAgLTc5OSwyMyArNzU3LDE5IEBACiAJICovCiAJcHVibGljIHZvaWQgdGVzdEJ1ZzQ3OTA5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJqMyIsICJZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0vLwkJdHJ5IHsKLQkJCXNldEphdmFkb2NPcHRpb25zKCk7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJZIiwgbmV3IFN0cmluZ1tdIHsgIkkiIH0pOwotCQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQkJcmVzdWx0LnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCQlzZWFyY2goCi0JCQkJbWV0aG9kLCAKLQkJCQlSRUZFUkVOQ0VTLAotCQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCQlyZXN1bHQKLQkJCSk7Ci0JCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAotCQkJCSJ0ZXN0NDc5MDkuamFyIHZvaWQgajMuWC5iYXIoKSBFWEFDVF9NQVRDSCIsCi0JCQkJcmVzdWx0KTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlyZXNldFByb2plY3RPcHRpb25zKCk7Ci0vLwkJfQorCQlzZXRKYXZhZG9jT3B0aW9ucygpOworCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJZIiwgbmV3IFN0cmluZ1tdIHsgIkkiIH0pOworCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJCXJlc3VsdC5zaG93QWNjdXJhY3kgPSB0cnVlOworCQlzZWFyY2goCisJCQltZXRob2QsIAorCQkJUkVGRVJFTkNFUywKKwkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKKwkJCXJlc3VsdAorCQkpOworCQlhc3NlcnRTZWFyY2hSZXN1bHRzKAorCQkJInRlc3Q0NzkwOS5qYXIgdm9pZCBqMy5YLmJhcigpIEVYQUNUX01BVENIIiwKKwkJCXJlc3VsdCk7CiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hUZXN0cy5qYXZhCmluZGV4IDAzNWE0MDIuLjliODk0NTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhU2VhcmNoVGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YVNlYXJjaFRlc3RzLmphdmEKQEAgLTQ1LDIzICs0NSwyNyBAQAogCQl0cnkgewogCQkJaWYgKHJlc3VsdHMubGVuZ3RoKCkgPiAwKSByZXN1bHRzLmFwcGVuZCgiXG4iKTsKIAkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG1hdGNoLmdldFJlc291cmNlKCk7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwogCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JCQkJSUphdmFFbGVtZW50IHJvb3QgPSBlbGVtZW50OwotCQkJCXdoaWxlIChyb290ICE9IG51bGwgJiYgIShyb290IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpKSB7Ci0JCQkJCXJvb3QgPSByb290LmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBrZ0ZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClyb290OwotCQkJCQlpZiAocGtnRnJhZ21lbnRSb290LmlzRXh0ZXJuYWwoKSkgewotCQkJCQkJcmVzdWx0cy5hcHBlbmQocGtnRnJhZ21lbnRSb290LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0cy5hcHBlbmQocGtnRnJhZ21lbnRSb290LmdldFBhdGgoKSk7CisJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgeworCQkJCQlJSmF2YUVsZW1lbnQgcm9vdCA9IGVsZW1lbnQ7CisJCQkJCXdoaWxlIChyb290ICE9IG51bGwgJiYgIShyb290IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpKSB7CisJCQkJCQlyb290ID0gcm9vdC5nZXRQYXJlbnQoKTsKIAkJCQkJfQorCQkJCQlpZiAocm9vdCAhPSBudWxsKSB7CisJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwa2dGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdDsKKwkJCQkJCWlmIChwa2dGcmFnbWVudFJvb3QuaXNFeHRlcm5hbCgpKSB7CisJCQkJCQkJcmVzdWx0cy5hcHBlbmQocGtnRnJhZ21lbnRSb290LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXN1bHRzLmFwcGVuZChwa2dGcmFnbWVudFJvb3QuZ2V0UGF0aCgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdHMuYXBwZW5kKHBhdGgpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0cy5hcHBlbmQocGF0aCk7CisJCQkJcmVzdWx0cy5hcHBlbmQoZWxlbWVudC5nZXRQYXRoKCkpOwogCQkJfQogCQkJaWYgKHRoaXMuc2hvd1Byb2plY3QpIHsKIAkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKQEAgLTI5NSw2ICsyOTksNyBAQAogCS8vIHBhY2thZ2UgZGVjbGFyYXRpb24KIAlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVQYWNrYWdlRGVjbGFyYXRpb24iKSk7CiAJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VmFyaW91c1BhY2thZ2VEZWNsYXJhdGlvbnMiKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0UGFja2FnZURlY2xhcmF0aW9uIikpOwogCQogCS8vIHBhY2thZ2UgcmVmZXJlbmNlCiAJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlUGFja2FnZVJlZmVyZW5jZSIpKTsKQEAgLTQyNiw2ICs0MzEsNyBAQAogCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlNCIpKTsKIAlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZFJlZmVyZW5jZTUiKSk7CiAJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RmllbGRSZWZlcmVuY2U2IikpOworCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlNyIpKTsKIAlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZFJlZmVyZW5jZUluSW5uZXJDbGFzcyIpKTsKIAlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZFJlZmVyZW5jZUluQW5vbnltb3VzQ2xhc3MiKSk7CiAJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RmllbGRSZWZlcmVuY2VUaHJvdWdoU3ViY2xhc3MiKSk7CkBAIC0xMTU5LDYgKzExNjUsMjQgQEAKIAkJcmVzdWx0Q29sbGVjdG9yKTsKIH0KIC8qKgorICogRmllbGQgcmVmZXJlbmNlIHRlc3QuCisgKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNjEwMTcgUmVmYWN0b3JpbmcgLSB0ZXN0IGNhc2UgdGhhdCByZXN1bHRzIGluIHVuY29tcGlsYWJsZSBzb3VyY2UpCisgKi8KK3B1YmxpYyB2b2lkIHRlc3RGaWVsZFJlZmVyZW5jZTcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiczUiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOworCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImIiKTsKKwkKKwlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7CisJc2VhcmNoKAorCQlmaWVsZCwgCisJCVJFRkVSRU5DRVMsIAorCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCisJCXJlc3VsdENvbGxlY3Rvcik7CisJYXNzZXJ0U2VhcmNoUmVzdWx0cygKKwkJInNyYy9zNS9BLmphdmEgdm9pZCBzNS5BLm1ldGhvZCgpIFtiXSIsCisJCXJlc3VsdENvbGxlY3Rvcik7Cit9CisvKioKICAqIEZpZWxkIHJlZmVyZW5jZSBpbiBhbm9ueW1vdXMgY2xhc3MgdGVzdC4KICAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSIDFHTDEyWEU6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgZmllbGQgcmVmZXJlbmNlcyBpbiBpbm5lciBjbGFzcykKICAqLwpAQCAtMjA3OSw2ICsyMTAzLDIyIEBACiAJCXJlc3VsdENvbGxlY3Rvcik7CiB9CiAvKioKKyAqIFBhY2thZ2UgZGVjbGFyYXRpb24gdGVzdC4KKyAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA2MjY5OCBOUEUgd2hpbGUgc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbiBvZiBiaW5hcnkgcGFja2FnZSkKKyAqLworcHVibGljIHZvaWQgdGVzdFBhY2thZ2VEZWNsYXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAiamF2YS5sYW5nIik7CisJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOworCXNlYXJjaCgKKwkJcGtnLCAKKwkJREVDTEFSQVRJT05TLCAKKwkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAorCQlyZXN1bHRDb2xsZWN0b3IpOworCWFzc2VydFNlYXJjaFJlc3VsdHMoCisJCWdldEV4dGVybmFsSkNMUGF0aCgpICsgIiBqYXZhLmxhbmciLAorCQlyZXN1bHRDb2xsZWN0b3IpOworfQorLyoqCiAgKiBQYWNrYWdlIHJlZmVyZW5jZSB0ZXN0LgogICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdLOTBINDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBwYWNrYWdlIHJlZmVyZW5jZSkKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL01vZGlmeWluZ1Jlc291cmNlVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Nb2RpZnlpbmdSZXNvdXJjZVRlc3RzLmphdmEKaW5kZXggZTE1Njg4MC4uMWNkZjllNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL01vZGlmeWluZ1Jlc291cmNlVGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cy5qYXZhCkBAIC0yMjIsMjUgKzIyMiwyMSBAQAogCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZvbGRlcihwYXRoKSk7CiAJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKIAkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudCgiIik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudDsKIAkJfQotCX0gZWxzZSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QocGF0aCk7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0KS5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOworCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudDsKIAl9CisJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdChwYXRoKTsKKwlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdCkuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsKIH0KIHByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBwYXRoKSB7CiAJaWYgKHBhdGguaW5kZXhPZignLycsIDEpICE9IC0xKSB7IC8vIGlmIHBhdGggYXMgbW9yZSB0aGFuIG9uZSBzZWdtZW50CiAJCWlmIChwYXRoLmVuZHNXaXRoKCIuamFyIikpIHsKIAkJCXJldHVybiAgKElQYWNrYWdlRnJhZ21lbnRSb290KUphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZpbGUocGF0aCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdClKYXZhQ29yZS5jcmVhdGUodGhpcy5nZXRGb2xkZXIocGF0aCkpOwogCQl9Ci0JfSBlbHNlIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdChwYXRoKTsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QpOworCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnRSb290KUphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZvbGRlcihwYXRoKSk7CiAJfQorCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QocGF0aCk7CisJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QpOwogfQogcHJvdGVjdGVkIFN0cmluZyBnZXRTb3J0ZWRCeVByb2plY3REZWx0YXMoKSB7CiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9OYW1lTG9va3VwVGVzdHMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvTmFtZUxvb2t1cFRlc3RzMi5qYXZhCmluZGV4IDU3ODlhMzMuLjcxOGMxMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9OYW1lTG9va3VwVGVzdHMyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL05hbWVMb29rdXBUZXN0czIuamF2YQpAQCAtNDIsOCArNDIsOCBAQAogfQogcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2VGcmFnbWVudFJvb3RBbmRQYWNrYWdlRnJhbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYzEifSwgImJpbiIpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOworCQlJSmF2YVByb2plY3QgcDEgPSBjcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMxIn0sICJiaW4iKTsKKwkJSUphdmFQcm9qZWN0IHAyID0gY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7CiAJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IAogCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKIAkJCQlKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkobmV3IFBhdGgoIi9QMSIpKQpAQCAtNTksNyArNTksNyBAQAogCQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDEvc3JjMiIpKQogCQkJfTsKIAkJcDEuc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aDIsIG51bGwpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AxL3NyYzIvcDEiKTsKKwkJY3JlYXRlRm9sZGVyKCIvUDEvc3JjMi9wMSIpOwogCQkKIAkJcmVzID0gZ2V0TmFtZUxvb2t1cCgoSmF2YVByb2plY3QpcDIpLmZpbmRQYWNrYWdlRnJhZ21lbnRzKCJwMSIsIGZhbHNlKTsKIAkJYXNzZXJ0VHJ1ZSgKQEAgLTY5LDE0ICs2OSwxNCBAQAogCQkJcmVzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJwMSIpKTsKIAogCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOworCQlkZWxldGVQcm9qZWN0KCJQMSIpOworCQlkZWxldGVQcm9qZWN0KCJQMiIpOwogCX0KIH0KIHB1YmxpYyB2b2lkIHRlc3RBZGRQYWNrYWdlRnJhZ21lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMxIn0sICJiaW4iKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKKwkJY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjMSJ9LCAiYmluIik7CisJCUlKYXZhUHJvamVjdCBwMiA9IGNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSAKIAkJCW5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7CiAJCQkJSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KG5ldyBQYXRoKCIvUDEiKSkKQEAgLTg2LDcgKzg2LDcgQEAKIAkJSVBhY2thZ2VGcmFnbWVudFtdIHJlcyA9IGdldE5hbWVMb29rdXAoKEphdmFQcm9qZWN0KXAyKS5maW5kUGFja2FnZUZyYWdtZW50cygicDEiLCBmYWxzZSk7CiAJCWFzc2VydFRydWUoIlNob3VsZCBnZXQgbm8gcGFja2FnZSBmcmFnbWVudCIsIHJlcyA9PSBudWxsKTsKIAkJCi0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjMS9wMSIpOworCQljcmVhdGVGb2xkZXIoIi9QMS9zcmMxL3AxIik7CiAJCQogCQlyZXMgPSBnZXROYW1lTG9va3VwKChKYXZhUHJvamVjdClwMikuZmluZFBhY2thZ2VGcmFnbWVudHMoInAxIiwgZmFsc2UpOwogCQlhc3NlcnRUcnVlKApAQCAtOTYsOCArOTYsOCBAQAogCQkJcmVzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJwMSIpKTsKIAogCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOworCQlkZWxldGVQcm9qZWN0KCJQMSIpOworCQlkZWxldGVQcm9qZWN0KCJQMiIpOwogCX0KIH0KIC8qCkBAIC0xMDYsOCArMTA2LDggQEAKICAqLwogcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2VGcmFnbWVudDIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJdHJ5IHsKLQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KWNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKKwkJY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKIAkJCiAJCUlQYWNrYWdlRnJhZ21lbnRbXSBwa2dzID0gZ2V0TmFtZUxvb2t1cChwcm9qZWN0KS5maW5kUGFja2FnZUZyYWdtZW50cygicDEiLCBmYWxzZSk7CiAJCWFzc2VydEVsZW1lbnRzRXF1YWwoCkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJCSJwMSBbaW4gc3JjIFtpbiBQXV0iLAogCQkJcGtncyk7CiAJCQotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7CisJCWNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7CiAJCiAJCXBrZ3MgPSBnZXROYW1lTG9va3VwKHByb2plY3QpLmZpbmRQYWNrYWdlRnJhZ21lbnRzKCJwMiIsIGZhbHNlKTsKIAkJYXNzZXJ0RWxlbWVudHNFcXVhbCgKQEAgLTEyMyw3ICsxMjMsMjUgQEAKIAkJCSJwMiBbaW4gc3JjIFtpbiBQXV0iLAogCQkJcGtncyk7CiAJfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7CisJCWRlbGV0ZVByb2plY3QoIlAiKTsKKwl9Cit9CisvKgorICogRmluZCBhIGRlZmF1bHQgcGFja2FnZSBmcmFnbWVudCBpbiBhIG5vbi1kZWZhdWx0IHJvb3QgYnkgaXRzIHBhdGguCisgKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNjMyNDUgZmluZFBhY2thZ2VGcmFnbWVudCB3b24ndCByZXR1cm4gZGVmYXVsdCBwYWNrYWdlKQorICovCitwdWJsaWMgdm9pZCB0ZXN0RmluZERlZmF1bHRQYWNrYWdlRnJhZ21lbnRJbk5vbkRlZmF1bHRSb290KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRyeSB7CisJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOworCQkKKwkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXROYW1lTG9va3VwKHByb2plY3QpLmZpbmRQYWNrYWdlRnJhZ21lbnQobmV3IFBhdGgoIi9QL3NyYyIpKTsKKwkJYXNzZXJ0RWxlbWVudHNFcXVhbCgKKwkJCSJEaWRuJ3QgZmluZCBkZWZhdWx0IHBhY2thZ2UiLAorCQkJIjxkZWZhdWx0PiBbaW4gc3JjIFtpbiBQXV0iLAorCQkJbmV3IElKYXZhRWxlbWVudFtdIHtwa2d9KTsKKwkJCisJfSBmaW5hbGx5IHsKKwkJZGVsZXRlUHJvamVjdCgiUCIpOwogCX0KIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nRXhwcmVzc2lvbnNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ0V4cHJlc3Npb25zVGVzdC5qYXZhCmluZGV4IDBiODE0MDAuLmI3ZjEzNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nRXhwcmVzc2lvbnNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdFeHByZXNzaW9uc1Rlc3QuamF2YQpAQCAtMzUsMTEgKzM1LDEwIEBACiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogCQlpZiAodHJ1ZSkgewogCQkJcmV0dXJuIGFsbFRlc3RzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKLQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ0V4cHJlc3Npb25zVGVzdCgidGVzdFRoaXNFeHByZXNzaW9uIikpOwotCQkJcmV0dXJuIHN1aXRlOwogCQl9CisJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdFeHByZXNzaW9uc1Rlc3QoInRlc3RUaGlzRXhwcmVzc2lvbiIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nSW5zZXJ0Qm91bmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ0luc2VydEJvdW5kVGVzdC5qYXZhCmluZGV4IDZiMDhhYmQuLmZiYjFiOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nSW5zZXJ0Qm91bmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdJbnNlcnRCb3VuZFRlc3QuamF2YQpAQCAtNDEsMTEgKzQxLDEwIEBACiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogCQlpZiAodHJ1ZSkgewogCQkJcmV0dXJuIGFsbFRlc3RzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKLQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ0luc2VydEJvdW5kVGVzdCgidGVzdFJlbW92ZTMiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ0luc2VydEJvdW5kVGVzdCgidGVzdFJlbW92ZTMiKSk7CisJCXJldHVybiBzdWl0ZTsKIAl9CiAJCiAJcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBuZXdNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdKYXZhZG9jVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdKYXZhZG9jVGVzdC5qYXZhCmluZGV4IGRlYTllZmEuLmRjZmIyOWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nSmF2YWRvY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ0phdmFkb2NUZXN0LmphdmEKQEAgLTM3LDExICszNywxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKGZhbHNlKSB7CiAJCQlyZXR1cm4gYWxsVGVzdHMoKTsKLQkJfSBlbHNlIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOwotCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUUmV3cml0aW5nSmF2YWRvY1Rlc3QoInRlc3RNb3ZlVGFncyIpKTsKLQkJCXJldHVybiBzdWl0ZTsKIAkJfQorCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKKwkJc3VpdGUuYWRkVGVzdChuZXcgQVNUUmV3cml0aW5nSmF2YWRvY1Rlc3QoInRlc3RNb3ZlVGFncyIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyYW1OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01ldGhvZERlY2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01ldGhvZERlY2xUZXN0LmphdmEKaW5kZXggYWU2NGQyOC4uMmVlODU3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdNZXRob2REZWNsVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTWV0aG9kRGVjbFRlc3QuamF2YQpAQCAtMzcsMTEgKzM3LDEwIEBACiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogCQlpZiAodHJ1ZSkgewogCQkJcmV0dXJuIGFsbFRlc3RzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKLQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01ldGhvZERlY2xUZXN0KCJ0ZXN0TWV0aG9kRGVjbENoYW5nZXMiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01ldGhvZERlY2xUZXN0KCJ0ZXN0TWV0aG9kRGVjbENoYW5nZXMiKSk7CisJCXJldHVybiBzdWl0ZTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xDaGFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01vdmVDb2RlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdNb3ZlQ29kZVRlc3QuamF2YQppbmRleCBiY2E3OWM5Li5mY2JhZTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01vdmVDb2RlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTW92ZUNvZGVUZXN0LmphdmEKQEAgLTM3LDExICszNywxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKGZhbHNlKSB7CiAJCQlyZXR1cm4gYWxsVGVzdHMoKTsKLQkJfSBlbHNlIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOwotCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUUmV3cml0aW5nTW92ZUNvZGVUZXN0KCJ0ZXN0Q29weU11bHRpcGxlTm9kZXMiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01vdmVDb2RlVGVzdCgidGVzdENvcHlNdWx0aXBsZU5vZGVzIikpOworCQlyZXR1cm4gc3VpdGU7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1N0YXRlbWVudHNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1N0YXRlbWVudHNUZXN0LmphdmEKaW5kZXggM2Y4NjY1Yi4uYWM5MmM4YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdTdGF0ZW1lbnRzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nU3RhdGVtZW50c1Rlc3QuamF2YQpAQCAtMzYsMTcgKzM2LDEyIEBACiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogCQlpZiAoZmFsc2UpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdTdGF0ZW1lbnRzVGVzdCgidGVzdEluc2VydDIiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ1N0YXRlbWVudHNUZXN0KCJ0ZXN0SW5zZXJ0MiIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KLQkKIAotCQotCi0JCiAJcHVibGljIHZvaWQgdGVzdEluc2VydDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSVBhY2thZ2VGcmFnbWVudCBwYWNrMT0gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJ0ZXN0MSIsIGZhbHNlLCBudWxsKTsKIAkJLyogZm9vKCk6IGFwcGVuZCBhIHJldHVybiBzdGF0ZW1lbnQgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nVHJhY2tpbmdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1RyYWNraW5nVGVzdC5qYXZhCmluZGV4IGM3ZTFlYmUuLjcyNGNiMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nVHJhY2tpbmdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUcmFja2luZ1Rlc3QuamF2YQpAQCAtMzksMTEgKzM5LDEwIEBACiAJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogCQlpZiAodHJ1ZSkgewogCQkJcmV0dXJuIGFsbFRlc3RzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKLQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ1RyYWNraW5nVGVzdCgidGVzdE5hbWVzV2l0aFBsYWNlaG9sZGVyIikpOwotCQkJcmV0dXJuIHN1aXRlOwogCQl9CisJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdUcmFja2luZ1Rlc3QoInRlc3ROYW1lc1dpdGhQbGFjZWhvbGRlciIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TmFtZXNXaXRoRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1R5cGVEZWNsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUeXBlRGVjbFRlc3QuamF2YQppbmRleCAxMWRkNDlmLi43MWIzODU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1R5cGVEZWNsVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nVHlwZURlY2xUZXN0LmphdmEKQEAgLTM3LDExICszNywxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdUeXBlRGVjbFRlc3QoInRlc3RWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ1R5cGVEZWNsVGVzdCgidGVzdFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkJCiAJcHVibGljIHZvaWQgdGVzdFR5cGVEZWNsQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9Tb3VyY2VNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvU291cmNlTW9kaWZpZXJUZXN0LmphdmEKaW5kZXggOTliZDYyZi4uNzk3YTA4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9Tb3VyY2VNb2RpZmllclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL1NvdXJjZU1vZGlmaWVyVGVzdC5qYXZhCkBAIC0zOCwxMSArMzgsMTAgQEAKIAlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAJCWlmICh0cnVlKSB7CiAJCQlyZXR1cm4gYWxsVGVzdHMoKTsKLQkJfSBlbHNlIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOwotCQkJc3VpdGUuYWRkVGVzdChuZXcgU291cmNlTW9kaWZpZXJUZXN0KCJ0ZXN0Q29sbGFwc2VkVGFyZ2V0Tm9kZXMyIikpOwotCQkJcmV0dXJuIHN1aXRlOwogCQl9CisJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBTb3VyY2VNb2RpZmllclRlc3QoInRlc3RDb2xsYXBzZWRUYXJnZXROb2RlczIiKSk7CisJCXJldHVybiBzdWl0ZTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUluZGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdDb3B5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ0NvcHlUZXN0LmphdmEKaW5kZXggMzdlODBmNC4uZWQ4M2YwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ0NvcHlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ0NvcHlUZXN0LmphdmEKQEAgLTM0LDExICszNCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdDb3B5VGVzdCgidGVzdDAwMDkiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01vZGlmeWluZ0NvcHlUZXN0KCJ0ZXN0MDAwOSIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0MDAwMSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ0luc2VydFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdJbnNlcnRUZXN0LmphdmEKaW5kZXggZWU2NTQzOC4uODViMTk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ0luc2VydFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9tb2RpZnlpbmcvQVNUUmV3cml0aW5nTW9kaWZ5aW5nSW5zZXJ0VGVzdC5qYXZhCkBAIC0zMywxMSArMzMsMTAgQEAKIAlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAJCWlmICh0cnVlKSB7CiAJCQlyZXR1cm4gYWxsVGVzdHMoKTsKLQkJfSBlbHNlIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOwotCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUUmV3cml0aW5nTW9kaWZ5aW5nSW5zZXJ0VGVzdCgidGVzdDAwMDkiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01vZGlmeWluZ0luc2VydFRlc3QoInRlc3QwMDA5IikpOworCQlyZXR1cm4gc3VpdGU7CiAJfQogCS8qKgogCSAqIGluc2VydCBhIG5ldyBpbXBvcnQgZGVjbGFyYXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdNb3ZlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ01vdmVUZXN0LmphdmEKaW5kZXggMWZmZDExNC4uODhjMmUxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ01vdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ01vdmVUZXN0LmphdmEKQEAgLTM0LDExICszNCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdNb3ZlVGVzdCgidGVzdDAwMDkiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01vZGlmeWluZ01vdmVUZXN0KCJ0ZXN0MDAwOSIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0MDAwMSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ090aGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ090aGVyVGVzdC5qYXZhCmluZGV4IDY0OGFhODMuLjkyNzRhZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdPdGhlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9tb2RpZnlpbmcvQVNUUmV3cml0aW5nTW9kaWZ5aW5nT3RoZXJUZXN0LmphdmEKQEAgLTM0LDExICszNCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdPdGhlclRlc3QoInRlc3QwMDA5IikpOwotCQkJcmV0dXJuIHN1aXRlOwogCQl9CisJCVRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFN1aXRlKCJvbmUgdGVzdCIpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdPdGhlclRlc3QoInRlc3QwMDA5IikpOworCQlyZXR1cm4gc3VpdGU7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3QwMDAwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9tb2RpZnlpbmcvQVNUUmV3cml0aW5nTW9kaWZ5aW5nUmVtb3ZlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1JlbW92ZVRlc3QuamF2YQppbmRleCBiYzVhNzhiLi5mNmUxNGVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9tb2RpZnlpbmcvQVNUUmV3cml0aW5nTW9kaWZ5aW5nUmVtb3ZlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdSZW1vdmVUZXN0LmphdmEKQEAgLTM0LDExICszNCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdSZW1vdmVUZXN0KCJ0ZXN0MDAwOSIpKTsKLQkJCXJldHVybiBzdWl0ZTsKIAkJfQorCQlUZXN0U3VpdGUgc3VpdGU9IG5ldyBTdWl0ZSgib25lIHRlc3QiKTsKKwkJc3VpdGUuYWRkVGVzdChuZXcgQVNUUmV3cml0aW5nTW9kaWZ5aW5nUmVtb3ZlVGVzdCgidGVzdDAwMDkiKSk7CisJCXJldHVybiBzdWl0ZTsKIAl9CiAJCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdSZXBsYWNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1JlcGxhY2VUZXN0LmphdmEKaW5kZXggOTkwODFhYS4uNTQxMTkxMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1JlcGxhY2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1JlcGxhY2VUZXN0LmphdmEKQEAgLTM0LDExICszNCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJaWYgKHRydWUpIHsKIAkJCXJldHVybiBhbGxUZXN0cygpOwotCQl9IGVsc2UgewotCQkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7Ci0JCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RSZXdyaXRpbmdNb2RpZnlpbmdSZXBsYWNlVGVzdCgidGVzdDAwMDkiKSk7Ci0JCQlyZXR1cm4gc3VpdGU7CiAJCX0KKwkJVGVzdFN1aXRlIHN1aXRlPSBuZXcgU3VpdGUoIm9uZSB0ZXN0Iik7CisJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFJld3JpdGluZ01vZGlmeWluZ1JlcGxhY2VUZXN0KCJ0ZXN0MDAwOSIpKTsKKwkJcmV0dXJuIHN1aXRlOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0MDAwMSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9yZXdyaXRlL21vZGlmeWluZy9BU1RSZXdyaXRpbmdNb2RpZnlpbmdUZXN0LmphdmEKaW5kZXggYTVkOWM5My4uNzQyMzQwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvbW9kaWZ5aW5nL0FTVFJld3JpdGluZ01vZGlmeWluZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcmV3cml0ZS9tb2RpZnlpbmcvQVNUUmV3cml0aW5nTW9kaWZ5aW5nVGVzdC5qYXZhCkBAIC0xNDcsMTEgKzE0NywxMCBAQAogCQkJCQkJCWJ1ZmZlci5hcHBlbmQoImJ1Zi5hcHBlbmQoXCIiKTsKIAkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgiXCIpO1xuIik7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSBidWZmZXIuYXBwZW5kKCJcdCIpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiYnVmLmFwcGVuZChcIiIpOwogCQkJCQl9CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlwiKTtcbiIpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSBidWZmZXIuYXBwZW5kKCJcdCIpOworCQkJCQlidWZmZXIuYXBwZW5kKCJidWYuYXBwZW5kKFwiIik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9zcmMvamF2YWRvYy90ZXN0QnVnNTE0NzgvWDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvc3JjL2phdmFkb2MvdGVzdEJ1ZzUxNDc4L1gxLmphdmEKaW5kZXggZmQ3YmRmZC4uYjEwYzI4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9zcmMvamF2YWRvYy90ZXN0QnVnNTE0NzgvWDEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3NyYy9qYXZhZG9jL3Rlc3RCdWc1MTQ3OC9YMS5qYXZhCkBAIC0zLDUgKzMsNSBAQAogICoge0Bpbmhlcml0RG9jfQogICogQGRlcHJlY2F0ZWQKICAqLwotcHVibGljIGNsYXNzIFggeworcHVibGljIGNsYXNzIFgxIHsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvc3JjL2phdmFkb2MvdGVzdEJ1ZzUxNDc4L1gyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3NyYy9qYXZhZG9jL3Rlc3RCdWc1MTQ3OC9YMi5qYXZhCmluZGV4IGQ2MDNiYjguLjM4MjY4M2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvc3JjL2phdmFkb2MvdGVzdEJ1ZzUxNDc4L1gyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9zcmMvamF2YWRvYy90ZXN0QnVnNTE0NzgvWDIuamF2YQpAQCAtMiw1ICsyLDUgQEAKIC8qKgogICoge0Bpbmhlcml0RG9jfQogICovCi1wdWJsaWMgY2xhc3MgWCB7CitwdWJsaWMgY2xhc3MgWDIgewogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9zcmMvamF2YWRvYy90ZXN0QnVnNTE0NzgvWDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvc3JjL2phdmFkb2MvdGVzdEJ1ZzUxNDc4L1gzLmphdmEKaW5kZXggYzdhYjFiZi4uOGYxYzkyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9zcmMvamF2YWRvYy90ZXN0QnVnNTE0NzgvWDMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3NyYy9qYXZhZG9jL3Rlc3RCdWc1MTQ3OC9YMy5qYXZhCkBAIC0yLDUgKzIsNSBAQAogLyoqCiAgKiBAZGVwcmVjYXRlZAogICovCi1wdWJsaWMgY2xhc3MgWCB7CitwdWJsaWMgY2xhc3MgWDMgewogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9KRFRDb21waWxlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvSkRUQ29tcGlsZXJBZGFwdGVyLmphdmEKaW5kZXggNDJiZTQ3OS4uODhlNmQ3ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9KRFRDb21waWxlckFkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0pEVENvbXBpbGVyQWRhcHRlci5qYXZhCkBAIC0yMzgsMTIgKzIzOCwxMiBAQAogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGRlcHJlY2F0aW9uKSB7Ci0JCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItd2FybjphbGxEZXByZWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItd2FybjorYWxsRGVwcmVjYXRpb24iKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0gZWxzZSB7CiAJCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItd2FybjotYWxsRGVwcmVjYXRpb24sZGVwcmVjYXRpb24iKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQlpZiAoY29tcGlsZXJBcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItd2Fybjpjb25zdHJ1Y3Rvck5hbWUscGFja2FnZURlZmF1bHRNZXRob2QsbWFza2VkQ2F0Y2hCbG9ja3MsdW51c2VkSW1wb3J0cyxzdGF0aWNSZWNlaXZlciIpOyAvLyROT04tTkxTLTEkCisJCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItd2FybjorY29uc3RydWN0b3JOYW1lLHBhY2thZ2VEZWZhdWx0TWV0aG9kLG1hc2tlZENhdGNoQmxvY2tzLHVudXNlZEltcG9ydHMsc3RhdGljUmVjZWl2ZXIiKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCX0KIAkgICAgICAgIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL01haW4uamF2YQppbmRleCAxNzk5OTZiLi4xOWU5YzFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEKQEAgLTcwMiw5ICs3MDIsMTAgQEAKIAkJCQkJZGlzYWJsZVdhcm5pbmdzKCk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KLQkJCQlpZiAobGVuZ3RoIDwgNikKKwkJCQlpZiAobGVuZ3RoIDw9IDYpIHsKIAkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKIAkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWRXYXJuaW5nQ29uZmlndXJhdGlvbiIsIHdhcm5pbmdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KIAkJCQlpbnQgd2FyblRva2VuU3RhcnQ7CiAJCQkJYm9vbGVhbiBpc0VuYWJsaW5nOwogCQkJCXN3aXRjaCAod2FybmluZ09wdGlvbi5jaGFyQXQoNikpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAppbmRleCA0MzI2ZmVjLi5lYmVkY2Y4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCkBAIC0xNTksNyArMTU5LDcgQEAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4wUkMxIEJ1aWxkIC0gP3RoIE1heSAyMDA0CitFY2xpcHNlIFNESyAzLjBSQzEgQnVpbGQgLSAyNnRoIE1heSAyMDA0IC0gMy4wIFJFTEVBU0UgQ0FORElEQVRFIDEKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDM0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQzNCI+Y3ZzPC9hPikuCiA8aDI+CkBAIC0xNjgsNiArMTY4LDQ2IEBACiA8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2ODcwIj41Njg3MDwvYT4KK2NvcGllZCBmaWxlIG5vdCBzaG93biBpbiBwYWNrYWdlIGV4cGxvcmVyIC8gamF2YSBicm93c2VyIFtjY3BdIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNzQ4Ij42Mzc0ODwvYT4KK1R5cGUgSGllcmFyY2h5OiBudWxsIHBvaW50ZXIgd2hlbiBwcmVzc2luZyBGNCBvbiBMaXN0Q2VsbFJlbmRlcmVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4ODM5Ij4zODgzOTwvYT4KK29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lciB0aHJvd3MgdGhvdXNhbmRzIG9mIEV4Y2VwdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Mjg2OSI+NjI4Njk8L2E+CitbbmF2aWdhdGlvbl0gJ0dvIHRvIE5leHQgQW5ub3RhdGlvbicgZG9lc24ndCBmaW5kIG5leHQgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Mzg3MSI+NjM4NzE8L2E+CitVc2luZyBNOSwgLXdhcm46IG9wdGlvbiBjcmFzaGVzIHRoZSBiYXRjaCBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNDM0Ij42MzQzNDwvYT4KK05QRSBkdXJpbmcgY2hlY2tvdXQvYnVpbGQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjI3MzciPjYyNzM3PC9hPgorQ29kZSBmb3JtYXR0ZXIgZG9lc24ndCB3b3JrIG9uIHNvbWUgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjYzOSI+NjI2Mzk8L2E+CitbMS41XSBDaGVldGFoIGFuZCBleHRlbmRpbmcgVmVjdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjI3NjkiPjYyNzY5PC9hPgorSmF2YWRvYyBlcnJvcnMgaW4gMjAwNDA1MTgwODE2Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjI5NTIiPjYyOTUyPC9hPgorQW50IGFkYXB0ZXIgYmVoYXZpb3IgaXMgYSBsaXR0bGUgc3RyYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNzA0Ij42MjcwNDwvYT4KK1VzaW5nIDA1MTgwODE2LCAvL3RvdG8gaXMgYSB0YXNrIGlmIC8vdG90byBpcyBhIHRhc2sgdGFnLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNjYwIj41MTY2MDwvYT4KK1tET00vQVNUXSBBU1QucGFyc2UqIHNob3VsZCBoYW5kbGUgYWxsIGxlZ2FsIGRvYyB0YWdzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTE2MDYiPjUxNjA2PC9hPgorSmF2YWRvYyAtIHtAaW5oZXJpdERvY30gc2hvdWxkIGJlIGluZWZmaWNpZW50IHdoZW4gbm90IGluIGZpcnN0IHRleHQgZWxlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNzEzIj42MjcxMzwvYT4KK3Nob3VsZCBub3QgYmUgYWJsZSB0byBuZXN0IG91dHB1dCBmb2xkZXJzIFtidWlsZCBwYXRoXQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzMjQ1Ij42MzI0NTwvYT4KK2ZpbmRQYWNrYWdlRnJhZ21lbnQgd29uJ3QgcmV0dXJuIGRlZmF1bHQgcGFja2FnZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjY5OCI+NjI2OTg8L2E+CitOUEUgd2hpbGUgc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbiBvZiBiaW5hcnkgcGFja2FnZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTAxNyI+NjEwMTc8L2E+CitSZWZhY3RvcmluZyAtIHRlc3QgY2FzZSB0aGF0IHJlc3VsdHMgaW4gdW5jb21waWxhYmxlIHNvdXJjZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzA0NCI+NjMwNDQ8L2E+CitSZWZlcmVuY2UgdG8gYSBjb25zdHJ1Y3RvciBpbnNpZGUgYSBqYXZhZG9jIHNob3VsZCBwb2ludCB0byBhIHR5cGUgYmluZGluZyBhbmQgbm90IGEgY29uc3RydWN0b3IgYmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyODEyIj42MjgxMjwvYT4KK1NvbWUgbWFsZm9ybWVkIGphdmFkb2MgdGFncyBhcmUgbm90IHJlcG9ydGVkIGFzIG1hbGZvcm1lZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyODEwIj42MjgxMDwvYT4KK0RlYWRsb2NrIHdoZW4gY2xvc2luZyBlZGl0b3JzIGFuZCBzYXZlIAogCiAKIDxhIG5hbWU9InZfNDMzIj48L2E+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25TY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25TY2FubmVyLmphdmEKaW5kZXggNWUyN2QxZi4uYzRmMGZhNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uU2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YQpAQCAtODUsNiArODUsOSBAQAogICovCiBwdWJsaWMgYm9vbGVhbiBnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkgewogCisJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuc291cmNlLmxlbmd0aCkgLy8gaGFuZGxlIHRoZSBvYnZpb3VzIGNhc2UgdXBmcm9udAorCQlyZXR1cm4gZmFsc2U7CisKIAlpbnQgdGVtcCA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCXRyeSB7CiAJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhCmluZGV4IGMyNGExNjUuLjA1ZTM3MDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEKQEAgLTMyNiwxNiArMzI2LDE0IEBACiAJLy8gT3BlbkJsb2NrIDo6PSAkZW1wdHkKIAogCXN1cGVyLmNvbnN1bWVPcGVuQmxvY2soKTsKLQl0cnkgewotCQlibG9ja1N0YXJ0c1tyZWFsQmxvY2tQdHJdID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkvL3JlYWxCbG9ja1B0ciBpcyBjb3JyZWN0IAotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBibG9ja1N0YXJ0cy5sZW5ndGg7Ci0JCWludCBvbGRTdGFja1tdID0gYmxvY2tTdGFydHM7Ci0JCWJsb2NrU3RhcnRzID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgYmxvY2tTdGFydHMsIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJYmxvY2tTdGFydHNbcmVhbEJsb2NrUHRyXSA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmJsb2NrU3RhcnRzLmxlbmd0aDsKKwlpZiAodGhpcy5yZWFsQmxvY2tQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuYmxvY2tTdGFydHMsIDAsCisJCQl0aGlzLmJsb2NrU3RhcnRzID0gbmV3IGludFtzdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJdGhpcy5ibG9ja1N0YXJ0c1t0aGlzLnJlYWxCbG9ja1B0cl0gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpIHsKIAkvLyBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSAncGFja2FnZScgTmFtZQpAQCAtMTI3MywyMSArMTI3MSwxOSBAQAogCXRoaXMucHJldmlvdXNLaW5kID0gMDsKIAl0aGlzLnByZXZpb3VzSW5mbyA9IDA7CiAJCi0JdHJ5IHsKLQkJdGhpcy5lbGVtZW50UHRyKys7Ci0JCXRoaXMuZWxlbWVudEtpbmRTdGFja1t0aGlzLmVsZW1lbnRQdHJdID0ga2luZDsKLQkJdGhpcy5lbGVtZW50SW5mb1N0YWNrW3RoaXMuZWxlbWVudFB0cl0gPSBpbmZvOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmVsZW1lbnRLaW5kU3RhY2subGVuZ3RoOwotCQlpbnQgb2xkRWxlbWVudFN0YWNrW10gPSB0aGlzLmVsZW1lbnRLaW5kU3RhY2s7Ci0JCWludCBvbGRFbGVtZW50SW5mb1N0YWNrW10gPSB0aGlzLmVsZW1lbnRJbmZvU3RhY2s7Ci0JCXRoaXMuZWxlbWVudEtpbmRTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07Ci0JCXRoaXMuZWxlbWVudEluZm9TdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2xkRWxlbWVudFN0YWNrLCAwLCB0aGlzLmVsZW1lbnRLaW5kU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbGVtZW50SW5mb1N0YWNrLCAwLCB0aGlzLmVsZW1lbnRJbmZvU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5lbGVtZW50S2luZFN0YWNrW3RoaXMuZWxlbWVudFB0cl0gPSBraW5kOwotCQl0aGlzLmVsZW1lbnRJbmZvU3RhY2tbdGhpcy5lbGVtZW50UHRyXSA9IGluZm87CisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5lbGVtZW50S2luZFN0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmVsZW1lbnRQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZWxlbWVudEtpbmRTdGFjaywgMCwKKwkJCXRoaXMuZWxlbWVudEtpbmRTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmVsZW1lbnRJbmZvU3RhY2ssIDAsCisJCQl0aGlzLmVsZW1lbnRJbmZvU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmVsZW1lbnRLaW5kU3RhY2tbdGhpcy5lbGVtZW50UHRyXSA9IGtpbmQ7CisJdGhpcy5lbGVtZW50SW5mb1N0YWNrW3RoaXMuZWxlbWVudFB0cl0gPSBpbmZvOwogfQogcHVibGljIHZvaWQgcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCkgewogCWlmKGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lQcm9ibGVtLmphdmEKaW5kZXggMGM3ZTAwOC4uZmFmY2JjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JUHJvYmxlbS5qYXZhCkBAIC04MjYsNiArODI2LDggQEAKIAkvKiogQHNpbmNlIDMuMCAqLwogCWludCBKYXZhZG9jVW50ZXJtaW5hdGVkSW5saW5lVGFnID0gSmF2YWRvYyArIEludGVybmFsICsgNTEyOwogCS8qKiBAc2luY2UgMy4wICovCisJaW50IEphdmFkb2NNYWxmb3JtZWRTZWVSZWZlcmVuY2UgPSBKYXZhZG9jICsgSW50ZXJuYWwgKyA1MTM7CisJLyoqIEBzaW5jZSAzLjAgKi8KIAlpbnQgSmF2YWRvY01lc3NhZ2VQcmVmaXggPSBJbnRlcm5hbCArIDUxNTsKIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29tcGlsZXIuamF2YQppbmRleCBlMzM1MTA0Li45MmM4NWRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29tcGlsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpAQCAtMTg3LDYgKzE4Nyw4IEBACiAJCQkJCSJjb21waWxhdGlvbi5sb2FkQmluYXJ5IiAsIC8vJE5PTi1OTFMtMSQKIAkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJCW5ldyBTdHJpbmcoYmluYXJ5VHlwZS5nZXROYW1lKCkpfSkpOworLy8JCQluZXcgRXhjZXB0aW9uKCJUUkFDRSBCSU5BUlkiKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisvLwkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogCQl9CiAJCWxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCA3NmIzMmZjLi41NzdiNjdhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTYyNSw3ICs2MjUsNiBAQAogCQkJfQogCQl9CiAKLQkJUmVmZXJlbmNlQmluZGluZ1tdIGRlZmF1bHRIYW5kbGVkRXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW10geyBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpfTsgLy8gdG9sZXJhdGUgYW55IGtpbmQgb2YgZXhjZXB0aW9uCiAJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6ZXJDb250ZXh0ID0gbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgaW5pdGlhbGl6ZXJTY29wZSk7CiAJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0ID0gbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgc3RhdGljSW5pdGlhbGl6ZXJTY29wZSk7CiAJCUZsb3dJbmZvIG5vblN0YXRpY0ZpZWxkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5kaXNjYXJkRmllbGRJbml0aWFsaXphdGlvbnMoKTsKQEAgLTYzNyw3ICs2MzYsNyBAQAogCQkJCQkvKmlmIChmaWVsZC5pc0ZpZWxkKCkpewogCQkJCQkJc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LmhhbmRsZWRFeGNlcHRpb25zID0gTm9FeGNlcHRpb25zOyAvLyBubyBleGNlcHRpb24gaXMgYWxsb3dlZCBqbHM4LjMuMgogCQkJCQl9IGVsc2UgeyovCi0JCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dC5oYW5kbGVkRXhjZXB0aW9ucyA9IGRlZmF1bHRIYW5kbGVkRXhjZXB0aW9uczsgLy8gdG9sZXJhdGUgdGhlbSBhbGwsIGFuZCByZWNvcmQgdGhlbQorCQkJCQlzdGF0aWNJbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBBbnlFeGNlcHRpb247IC8vIHRvbGVyYXRlIHRoZW0gYWxsLCBhbmQgcmVjb3JkIHRoZW0KIAkJCQkJLyp9Ki8KIAkJCQkJc3RhdGljRmllbGRJbmZvID0KIAkJCQkJCWZpZWxkLmFuYWx5c2VDb2RlKApAQCAtNjU0LDcgKzY1Myw3IEBACiAJCQkJCS8qaWYgKGZpZWxkLmlzRmllbGQoKSl7CiAJCQkJCQlpbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7IC8vIG5vIGV4Y2VwdGlvbiBpcyBhbGxvd2VkIGpsczguMy4yCiAJCQkJCX0gZWxzZSB7Ki8KLQkJCQkJCWluaXRpYWxpemVyQ29udGV4dC5oYW5kbGVkRXhjZXB0aW9ucyA9IGRlZmF1bHRIYW5kbGVkRXhjZXB0aW9uczsgLy8gdG9sZXJhdGUgdGhlbSBhbGwsIGFuZCByZWNvcmQgdGhlbQorCQkJCQkJaW5pdGlhbGl6ZXJDb250ZXh0LmhhbmRsZWRFeGNlcHRpb25zID0gQW55RXhjZXB0aW9uOyAvLyB0b2xlcmF0ZSB0aGVtIGFsbCwgYW5kIHJlY29yZCB0aGVtCiAJCQkJCS8qfSovCiAJCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9CiAJCQkJCQlmaWVsZC5hbmFseXNlQ29kZShpbml0aWFsaXplclNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIG5vblN0YXRpY0ZpZWxkSW5mbyk7CkBAIC04ODMsNyArODgyLDcgQEAKIAkJfQogCQl0cnkgewogCQkJaWYgKCh0aGlzLmJpdHMgJiBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrTUFTSykgIT0gMCkgewotCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5kb2N1bWVudGVkRW1wdHlCbG9jayh0aGlzLmJvZHlTdGFydC0xLCB0aGlzLmJvZHlFbmQrMSk7CisJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrKHRoaXMuYm9keVN0YXJ0LTEsIHRoaXMuYm9keUVuZCk7CiAJCQl9CiAJCQl0aGlzLm1heEZpZWxkQ291bnQgPSAwOwogCQkJaW50IGxhc3RWaXNpYmxlRmllbGRJRCA9IC0xOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKaW5kZXggYzNmNmI1NS4uMzQwNzgxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93Q29udGV4dC5qYXZhCkBAIC05NSw3ICs5NSwxMCBAQAogCQkJCQkJZm9yIChpbnQgcmFpc2VkSW5kZXggPSAwOyByYWlzZWRJbmRleCA8IHJhaXNlZENvdW50OyByYWlzZWRJbmRleCsrKSB7CiAJCQkJCQkJVHlwZUJpbmRpbmcgcmFpc2VkRXhjZXB0aW9uOwogCQkJCQkJCWlmICgocmFpc2VkRXhjZXB0aW9uID0gcmFpc2VkRXhjZXB0aW9uc1tyYWlzZWRJbmRleF0pICE9IG51bGwpIHsKLQkJCQkJCQkJc3dpdGNoIChTY29wZS5jb21wYXJlVHlwZXMocmFpc2VkRXhjZXB0aW9uLCBjYXVnaHRFeGNlcHRpb24pKSB7CisJCQkJCQkJICAgIGludCBzdGF0ZSA9IGNhdWdodEV4Y2VwdGlvbiA9PSBudWxsIAorCQkJCQkJCSAgICAJPyBFcXVhbE9yTW9yZVNwZWNpZmljIC8qIGFueSBleGNlcHRpb24gKi8KKwkJCQkJCQkgICAgICAgIDogU2NvcGUuY29tcGFyZVR5cGVzKHJhaXNlZEV4Y2VwdGlvbiwgY2F1Z2h0RXhjZXB0aW9uKTsKKwkJCQkJCQkJc3dpdGNoIChzdGF0ZSkgewogCQkJCQkJCQkJY2FzZSBFcXVhbE9yTW9yZVNwZWNpZmljIDoKIAkJCQkJCQkJCQlleGNlcHRpb25Db250ZXh0LnJlY29yZEhhbmRsaW5nRXhjZXB0aW9uKAogCQkJCQkJCQkJCQljYXVnaHRFeGNlcHRpb24sCkBAIC0yMTMsNyArMjE2LDEwIEBACiAJCQkJCQljYXVnaHRJbmRleCA8IGNhdWdodENvdW50OwogCQkJCQkJY2F1Z2h0SW5kZXgrKykgewogCQkJCQkJUmVmZXJlbmNlQmluZGluZyBjYXVnaHRFeGNlcHRpb24gPSBjYXVnaHRFeGNlcHRpb25zW2NhdWdodEluZGV4XTsKLQkJCQkJCXN3aXRjaCAoU2NvcGUuY29tcGFyZVR5cGVzKHJhaXNlZEV4Y2VwdGlvbiwgY2F1Z2h0RXhjZXB0aW9uKSkgeworCQkJCQkgICAgaW50IHN0YXRlID0gY2F1Z2h0RXhjZXB0aW9uID09IG51bGwgCisJCQkJCSAgICAJPyBFcXVhbE9yTW9yZVNwZWNpZmljIC8qIGFueSBleGNlcHRpb24gKi8KKwkJCQkJICAgICAgICA6IFNjb3BlLmNvbXBhcmVUeXBlcyhyYWlzZWRFeGNlcHRpb24sIGNhdWdodEV4Y2VwdGlvbik7CQkJCQkJCisJCQkJCQlzd2l0Y2ggKHN0YXRlKSB7CiAJCQkJCQkJY2FzZSBFcXVhbE9yTW9yZVNwZWNpZmljIDoKIAkJCQkJCQkJZXhjZXB0aW9uQ29udGV4dC5yZWNvcmRIYW5kbGluZ0V4Y2VwdGlvbigKIAkJCQkJCQkJCWNhdWdodEV4Y2VwdGlvbiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YQppbmRleCA4OGIzMTFiLi44ODYyYmVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeVR5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhCkBAIC0xMzYsNiArMTM2LDExIEBACiB9CiAKIHZvaWQgY2FjaGVQYXJ0c0Zyb20oSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgYm9vbGVhbiBuZWVkRmllbGRzQW5kTWV0aG9kcykgeworCQorCS8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZm9yIHN1cGVyLWludGVyZmFjZXMgZWFybHksIGluIGNhc2Ugc29tZSBhYm9ydGluZyBjb21waWxhdGlvbiBlcnJvciBvY2N1cnMsCisJLy8gYW5kIHN0aWxsIHdhbnQgdG8gdXNlIGJpbmFyaWVzIHBhc3NlZCB0aGF0IHBvaW50IChlLmcuIHR5cGUgaGllcmFyY2h5IHJlc29sdmVyLCBzZWUgYnVnIDYzNzQ4KS4KKwl0aGlzLnN1cGVySW50ZXJmYWNlcyA9IE5vU3VwZXJJbnRlcmZhY2VzOworCQogCS8vIG5lZWQgZW5jbG9zaW5nIHR5cGUgdG8gYWNjZXNzIHR5cGUgdmFyaWFibGVzCiAJY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lID0gYmluYXJ5VHlwZS5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpOwogCWlmIChlbmNsb3NpbmdUeXBlTmFtZSAhPSBudWxsKSB7CkBAIC01MjcsNiArNTMyLDI0IEBACiAJfQogCXJldHVybiBudWxsOwogfQorLyoqCisgKiAgUmV3cml0ZSBvZiBkZWZhdWx0IGdldE1lbWJlclR5cGUgdG8gYXZvaWQgcmVzb2x2aW5nIGVhZ2VybHkgYWxsIG1lbWJlciB0eXBlcyB3aGVuIG9uZSBpcyByZXF1ZXN0ZWQKKyAqLworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZ2V0TWVtYmVyVHlwZShjaGFyW10gdHlwZU5hbWUpIHsKKwlmb3IgKGludCBpID0gdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykgeworCSAgICBSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSB0aGlzLm1lbWJlclR5cGVzW2ldOworCSAgICBpZiAobWVtYmVyVHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQljaGFyW10gbmFtZSA9IG1lbWJlclR5cGUuc291cmNlTmFtZTsgLy8gc291cmNlIG5hbWUgaXMgcXVhbGlmaWVkIHdpdGggZW5jbG9zaW5nIHR5cGUgbmFtZQorCQkJaW50IHByZWZpeExlbmd0aCA9IHRoaXMuY29tcG91bmROYW1lW3RoaXMuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLmxlbmd0aCArIDE7IC8vIGVuY2xvc2luZyQKKwkJCWlmIChuYW1lLmxlbmd0aCA9PSAocHJlZml4TGVuZ3RoICsgdHlwZU5hbWUubGVuZ3RoKSkgLy8gZW5jbG9zaW5nICQgdHlwZU5hbWUKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyh0eXBlTmFtZSwgbmFtZSwgcHJlZml4TGVuZ3RoLCB0cnVlKSkgLy8gb25seSBjaGVjayB0cmFpbGluZyBwb3J0aW9uCisJCQkJCXJldHVybiB0aGlzLm1lbWJlclR5cGVzW2ldID0gcmVzb2x2ZVR5cGUobWVtYmVyVHlwZSwgdGhpcy5lbnZpcm9ubWVudCwgZmFsc2UpOyAvLyBubyByYXcgY29udmVyc2lvbiBmb3Igbm93CisJICAgIH0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSkpIHsKKwkgICAgICAgIHJldHVybiBtZW1iZXJUeXBlOworCSAgICB9CisJfQorCXJldHVybiBudWxsOworfQogLy8gTk9URTogdGhlIHJldHVybiB0eXBlLCBhcmcgJiBleGNlcHRpb24gdHlwZXMgb2YgZWFjaCBtZXRob2Qgb2YgYSBiaW5hcnkgdHlwZSBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKIAogcHVibGljIE1ldGhvZEJpbmRpbmdbXSBnZXRNZXRob2RzKGNoYXJbXSBzZWxlY3RvcikgewpAQCAtNTU1LDYgKzU3OCwxMSBAQAogCX0KIAlyZXR1cm4gTm9NZXRob2RzOwogfQorcHVibGljIGJvb2xlYW4gaGFzTWVtYmVyVHlwZXMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoID4gMDsKK30KKy8vIE5PVEU6IG1lbWJlciB0eXBlcyBvZiBiaW5hcnkgdHlwZXMgYXJlIHJlc29sdmVkIHdoZW4gbmVlZGVkCisKIHB1YmxpYyBUeXBlVmFyaWFibGVCaW5kaW5nIGdldFR5cGVWYXJpYWJsZShjaGFyW10gdmFyaWFibGVOYW1lKSB7CiAJVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IHN1cGVyLmdldFR5cGVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOwogCXJlc29sdmVUeXBlc0Zvcih2YXJpYWJsZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NsYXNzU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2xhc3NTY29wZS5qYXZhCmluZGV4IDIwZWM0ODYuLjdmNGEwYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2xhc3NTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2xhc3NTY29wZS5qYXZhCkBAIC01MzcsNyArNTM3LDcgQEAKIAkJZG8gewogCQkJaWYgKChjdXJyZW50VHlwZS50YWdCaXRzICYgSGFzTm9NZW1iZXJUeXBlcykgIT0gMCkKIAkJCQlicmVhazsgLy8gYWxyZWFkeSBrbm93IGl0IGhhcyBubyBpbmhlcml0ZWQgbWVtYmVyIHR5cGVzLCBjYW4gc3RvcCBsb29raW5nIHVwCi0JCQlpZiAoY3VycmVudFR5cGUubWVtYmVyVHlwZXMoKSAhPSBOb01lbWJlclR5cGVzKQorCQkJaWYgKGN1cnJlbnRUeXBlLmhhc01lbWJlclR5cGVzKCkpIC8vIGF2b2lkIHJlc29sdmluZyBtZW1iZXIgdHlwZXMgZWFnZXJseQogCQkJCXJldHVybjsgLy8gaGFzIG1lbWJlciB0eXBlcwogCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKIAkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CkBAIC03MzYsNyArNzM2LDEyIEBACiAJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5SGFzUHJvYmxlbXMoc291cmNlVHlwZSk7CiAJCX0KIAkJY29ubmVjdE1lbWJlclR5cGVzKCk7Ci0JCWNoZWNrRm9ySW5oZXJpdGVkTWVtYmVyVHlwZXMoc291cmNlVHlwZSk7CisJCXRyeSB7CisJCQljaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKHNvdXJjZVR5cGUpOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCWUudXBkYXRlQ29udGV4dChyZWZlcmVuY2VDb250ZXh0LCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CisJCQl0aHJvdyBlOworCQl9CiAJfQogCQogCXByaXZhdGUgdm9pZCBjb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SZWZlcmVuY2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1JlZmVyZW5jZUJpbmRpbmcuamF2YQppbmRleCAwNTEyOTk5Li5jMzc4NmM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1JlZmVyZW5jZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1JlZmVyZW5jZUJpbmRpbmcuamF2YQpAQCAtMzk4LDYgKzM5OCw5IEBACiBwdWJsaWMgUGFja2FnZUJpbmRpbmcgZ2V0UGFja2FnZSgpIHsKIAlyZXR1cm4gZlBhY2thZ2U7CiB9CitwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJUeXBlcygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CiBwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZyBnZXRUeXBlVmFyaWFibGUoY2hhcltdIHZhcmlhYmxlTmFtZSkgewogCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlcygpOwogCWZvciAoaW50IGkgPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsgLS1pID49IDA7KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhCmluZGV4IDFkY2NjMTQuLjUwZjYzYzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVCaW5kaW5nLmphdmEKQEAgLTYzOCwyMSArNjM4LDIxIEBACiB9CiAKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMoKSB7Ci0JcmV0dXJuIG1lbWJlclR5cGVzOworCXJldHVybiB0aGlzLm1lbWJlclR5cGVzOwogfQogcHVibGljIEZpZWxkQmluZGluZyBnZXRVcGRhdGVkRmllbGRCaW5kaW5nKEZpZWxkQmluZGluZyB0YXJnZXRGaWVsZCwgUmVmZXJlbmNlQmluZGluZyBuZXdEZWNsYXJpbmdDbGFzcykgewogCi0JaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCkgewotCQlzeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsKSB7CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwWzRdOwogCX0KLQlpZiAoc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdID09IG51bGwpIHsKLQkJc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CisJaWYgKHRoaXMuc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdID09IG51bGwpIHsKKwkJdGhpcy5zeW50aGV0aWNzW1JFQ0VJVkVSX1RZUEVfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIAl9CiAKLQlIYXNodGFibGUgZmllbGRNYXAgPSAoSGFzaHRhYmxlKSBzeW50aGV0aWNzW1JFQ0VJVkVSX1RZUEVfRU1VTF0uZ2V0KHRhcmdldEZpZWxkKTsKKwlIYXNodGFibGUgZmllbGRNYXAgPSAoSGFzaHRhYmxlKSB0aGlzLnN5bnRoZXRpY3NbUkVDRUlWRVJfVFlQRV9FTVVMXS5nZXQodGFyZ2V0RmllbGQpOwogCWlmIChmaWVsZE1hcCA9PSBudWxsKSB7CiAJCWZpZWxkTWFwID0gbmV3IEhhc2h0YWJsZSg1KTsKLQkJc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdLnB1dCh0YXJnZXRGaWVsZCwgZmllbGRNYXApOworCQl0aGlzLnN5bnRoZXRpY3NbUkVDRUlWRVJfVFlQRV9FTVVMXS5wdXQodGFyZ2V0RmllbGQsIGZpZWxkTWFwKTsKIAl9CiAJRmllbGRCaW5kaW5nIHVwZGF0ZWRGaWVsZCA9IChGaWVsZEJpbmRpbmcpIGZpZWxkTWFwLmdldChuZXdEZWNsYXJpbmdDbGFzcyk7CiAJaWYgKHVwZGF0ZWRGaWVsZCA9PSBudWxsKXsKQEAgLTY2NCwxOCArNjY0LDE4IEBACiAKIHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldFVwZGF0ZWRNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmcgdGFyZ2V0TWV0aG9kLCBSZWZlcmVuY2VCaW5kaW5nIG5ld0RlY2xhcmluZ0NsYXNzKSB7CiAKLQlpZiAoc3ludGhldGljcyA9PSBudWxsKSB7Ci0JCXN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFs0XTsKKwlpZiAodGhpcy5zeW50aGV0aWNzID09IG51bGwpIHsKKwkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CiAJfQotCWlmIChzeW50aGV0aWNzW1JFQ0VJVkVSX1RZUEVfRU1VTF0gPT0gbnVsbCkgewotCQlzeW50aGV0aWNzW1JFQ0VJVkVSX1RZUEVfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKKwlpZiAodGhpcy5zeW50aGV0aWNzW1JFQ0VJVkVSX1RZUEVfRU1VTF0gPT0gbnVsbCkgeworCQl0aGlzLnN5bnRoZXRpY3NbUkVDRUlWRVJfVFlQRV9FTVVMXSA9IG5ldyBIYXNoTWFwKDUpOwogCX0KIAogCiAJSGFzaHRhYmxlIG1ldGhvZE1hcCA9IChIYXNodGFibGUpIHN5bnRoZXRpY3NbUkVDRUlWRVJfVFlQRV9FTVVMXS5nZXQodGFyZ2V0TWV0aG9kKTsKIAlpZiAobWV0aG9kTWFwID09IG51bGwpIHsKIAkJbWV0aG9kTWFwID0gbmV3IEhhc2h0YWJsZSg1KTsKLQkJc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdLnB1dCh0YXJnZXRNZXRob2QsIG1ldGhvZE1hcCk7CisJCXRoaXMuc3ludGhldGljc1tSRUNFSVZFUl9UWVBFX0VNVUxdLnB1dCh0YXJnZXRNZXRob2QsIG1ldGhvZE1hcCk7CiAJfQogCU1ldGhvZEJpbmRpbmcgdXBkYXRlZE1ldGhvZCA9IChNZXRob2RCaW5kaW5nKSBtZXRob2RNYXAuZ2V0KG5ld0RlY2xhcmluZ0NsYXNzKTsKIAlpZiAodXBkYXRlZE1ldGhvZCA9PSBudWxsKXsKQEAgLTY4NCw3ICs2ODQsOSBAQAogCX0KIAlyZXR1cm4gdXBkYXRlZE1ldGhvZDsKIH0KLQorcHVibGljIGJvb2xlYW4gaGFzTWVtYmVyVHlwZXMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoID4gMDsKK30KIC8vIE5PVEU6IHRoZSByZXR1cm4gdHlwZSwgYXJnICYgZXhjZXB0aW9uIHR5cGVzIG9mIGVhY2ggbWV0aG9kIG9mIGEgc291cmNlIHR5cGUgYXJlIHJlc29sdmVkIHdoZW4gbmVlZGVkCiBwdWJsaWMgTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMoKSB7CiAJaWYgKChtb2RpZmllcnMgJiBBY2NVbnJlc29sdmVkKSA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YQppbmRleCBjMGUwNTQ5Li4yNDAzMjg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YQpAQCAtNzksNiArNzksNyBAQAogCS8vIE1ldGhvZCBjb2xsZWN0aW9ucwogCWZpbmFsIFR5cGVCaW5kaW5nW10gTm9QYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nWzBdOwogCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmdbXSBOb0V4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1swXTsKKwlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nW10gQW55RXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7IG51bGwgfTsgLy8gc3BlY2lhbCBoYW5kbGVyIGZvciBhbGwgZXhjZXB0aW9ucwogCS8vIFR5cGUgY29sbGVjdGlvbnMKIAlmaW5hbCBGaWVsZEJpbmRpbmdbXSBOb0ZpZWxkcyA9IG5ldyBGaWVsZEJpbmRpbmdbMF07CiAJZmluYWwgTWV0aG9kQmluZGluZ1tdIE5vTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nWzBdOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9BYnN0cmFjdENvbW1lbnRQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RDb21tZW50UGFyc2VyLmphdmEKaW5kZXggOTE1MjUzYy4uYmJhNGQzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9BYnN0cmFjdENvbW1lbnRQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tbWVudFBhcnNlci5qYXZhCkBAIC0xNjAsOCArMTYwLDggQEAKIAkJCQlzd2l0Y2ggKG5leHRDaGFyYWN0ZXIpIHsKIAkJCQkJY2FzZSAnQCcgOgogCQkJCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQkJCQkJLy8gU3RhcnQgdGFnIHBhcnNpbmcgb25seSBpZiB3ZSBhcmUgb24gbGluZSBiZWdpbm5pbmcgb3IgYXQgaW5saW5lIHRhZyBiZWdpbm5pbmcKLQkJCQkJCWlmICghdGhpcy5saW5lU3RhcnRlZCB8fCBwcmV2aW91c0NoYXIgPT0gJ3snKSB7CisJCQkJCQkvLyBTdGFydCB0YWcgcGFyc2luZyBvbmx5IGlmIHdlIGhhdmUgYSBqYXZhIGlkZW50aWZpZXIgc3RhcnQgY2hhcmFjdGVyIGFuZCBpZiB3ZSBhcmUgb24gbGluZSBiZWdpbm5pbmcgb3IgYXQgaW5saW5lIHRhZyBiZWdpbm5pbmcKKwkJCQkJCWlmICgoIXRoaXMubGluZVN0YXJ0ZWQgfHwgcHJldmlvdXNDaGFyID09ICd7JykgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChwZWVrQ2hhcigpKSkgewogCQkJCQkJCXRoaXMubGluZVN0YXJ0ZWQgPSB0cnVlOwogCQkJCQkJCWlmICh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKIAkJCQkJCQkJdGhpcy5pbmxpbmVUYWdTdGFydGVkID0gZmFsc2U7CkBAIC0xODksMTIgKzE4OSw0NyBAQAogCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuaW5kZXgsIHRoaXMuZW5kQ29tbWVudCk7CiAJCQkJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7IC8vIGZsdXNoIHRva2VuIGNhY2hlIGF0IGxpbmUgYmVnaW4KIAkJCQkJCQl0cnkgewotCQkJCQkJCQlpbnQgdGsgPSByZWFkVG9rZW5BbmRDb25zdW1lKCk7Ci0JCQkJCQkJCXRoaXMudGFnU291cmNlU3RhcnQgPSB0aGlzLmtpbmQgPT0gQ09NUElMX1BBUlNFUiA/IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkgOiBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCQlpbnQgdG9rZW4gPSByZWFkVG9rZW5BbmRDb25zdW1lKCk7CisJCQkJCQkJCXRoaXMudGFnU291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwogCQkJCQkJCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOwotCQkJCQkJCQlzd2l0Y2ggKHRrKSB7CisJCQkJCQkJCWNoYXJbXSB0YWcgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsgLy8gZmlyc3QgdG9rZW4gaXMgZWl0aGVyIGFuIGlkZW50aWZpZXIgb3IgYSBrZXl3b3JkCisJCQkJCQkJCWlmICh0aGlzLmtpbmQgPT0gRE9NX1BBUlNFUikgeworCQkJCQkJCQkJLy8gRm9yIERPTSBwYXJzZXIsIHRyeSB0byBnZXQgdGFnIG5hbWUgb3RoZXIgdGhhbiBqYXZhIGlkZW50aWZpZXIKKwkJCQkJCQkJCS8vIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTY2MCkKKwkJCQkJCQkJCWludCB0ayA9IHRva2VuOworCQkJCQkJCQkJaW50IGxlID0gdGhpcy5saW5lRW5kOworCQkJCQkJCQkJY2hhciBwYyA9IHBlZWtDaGFyKCk7CisJCQkJCQkJCQl0YWdOYW1lVG9rZW46IHdoaWxlICh0ayAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKKwkJCQkJCQkJCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQkJCQkJCXRva2VuID0gdGs7CisJCQkJCQkJCQkJLy8gISwgIiwgIywgJSwgJiwgJywgLSwgOiwgPCwgPgorCQkJCQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHBjKSkgYnJlYWs7CisJCQkJCQkJCQkJc3dpdGNoIChwYykgeworCQkJCQkJCQkJCQljYXNlICd9JzoKKwkJCQkJCQkJCQkJY2FzZSAnISc6CisJCQkJCQkJCQkJCWNhc2UgJyMnOgorCQkJCQkJCQkJCQljYXNlICclJzoKKwkJCQkJCQkJCQkJY2FzZSAnJic6CisJCQkJCQkJCQkJCWNhc2UgJ1wnJzoKKwkJCQkJCQkJCQkJY2FzZSAnOic6CisJCQkJCQkJCQkJCWNhc2UgJy0nOgorCQkJCQkJCQkJCQljYXNlICc8JyA6CisJCQkJCQkJCQkJCWNhc2UgJz4nOgorCQkJCQkJCQkJCQkJYnJlYWsgdGFnTmFtZVRva2VuOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl0ayA9IHJlYWRUb2tlbkFuZENvbnN1bWUoKTsKKwkJCQkJCQkJCQlwYyA9IHBlZWtDaGFyKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy50YWdTb3VyY2VFbmQtdGhpcy50YWdTb3VyY2VTdGFydCsxOworCQkJCQkJCQkJdGFnID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zb3VyY2UsIHRoaXMudGFnU291cmNlU3RhcnQsIHRhZywgMCwgbGVuZ3RoKTsKKwkJCQkJCQkJCXRoaXMuaW5kZXggPSB0aGlzLnRhZ1NvdXJjZUVuZCsxOworCQkJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMudGFnU291cmNlRW5kKzE7CisJCQkJCQkJCQl0aGlzLnRhZ1NvdXJjZVN0YXJ0ID0gcHJldmlvdXNQb3NpdGlvbjsKKwkJCQkJCQkJCXRoaXMubGluZUVuZCA9IGxlOworCQkJCQkJCQl9CisJCQkJCQkJCXN3aXRjaCAodG9rZW4pIHsKIAkJCQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciA6Ci0JCQkJCQkJCQkJY2hhcltdIHRhZyA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwogCQkJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0YWcsIFRBR19ERVBSRUNBVEVEKSkgewogCQkJCQkJCQkJCQl0aGlzLmRlcHJlY2F0ZWQgPSB0cnVlOwogCQkJCQkJCQkJCQlpZiAodGhpcy5raW5kID09IERPTV9QQVJTRVIpIHsKQEAgLTIwMyw3ICsyMzgsMTIgQEAKIAkJCQkJCQkJCQkJCXZhbGlkID0gdHJ1ZTsKIAkJCQkJCQkJCQkJfQogCQkJCQkJCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGFnLCBUQUdfSU5IRVJJVERPQykpIHsKLQkJCQkJCQkJCQkJdGhpcy5pbmhlcml0ZWQgPSB0cnVlOworCQkJCQkJCQkJCQkvLyBpbmhpYml0cyBpbmhlcml0ZWQgZmxhZyB3aGVuIHRhZ3MgaGF2ZSBiZWVuIGFscmVhZHkgc3RvcmVkCisJCQkJCQkJCQkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNjA2CisJCQkJCQkJCQkJCS8vIE5vdGUgdGhhdCBmb3IgRE9NX1BBUlNFUiwgbm9kZXMgc3RhY2sgbWF5IGJlIG5vdCBlbXB0eSBldmVuIG5vICdAJyB0YWcKKwkJCQkJCQkJCQkJLy8gd2FzIGVuY291bnRlcmVkIGluIGNvbW1lbnQuIEJ1dCBpdCBjYW5ub3QgYmUgdGhlIGNhc2UgZm9yIENPTVBJTEVSX1BBUlNFUgorCQkJCQkJCQkJCQkvLyBhbmQgc28gaXMgZW5vdWdoIGFzIGl0IGlzIG9ubHkgdGhpcyBwYXJzZXIgd2hpY2ggc2lnbmFscyB0aGUgbWlzc2luZyB0YWcgd2FybmluZ3MuLi4KKwkJCQkJCQkJCQkJdGhpcy5pbmhlcml0ZWQgPSB0aGlzLmFzdFB0cj09LTE7CiAJCQkJCQkJCQkJCWlmICh0aGlzLmtpbmQgPT0gRE9NX1BBUlNFUikgewogCQkJCQkJCQkJCQkJdmFsaWQgPSBwYXJzZVRhZygpOwogCQkJCQkJCQkJCQl9IGVsc2UgewpAQCAtMjUxLDcgKzI5MSw3IEBACiAJCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCQlkZWZhdWx0OgogCQkJCQkJCQkJCWlmICh0aGlzLmtpbmQgPT0gRE9NX1BBUlNFUikgewotCQkJCQkJCQkJCQlzd2l0Y2ggKHRrKSB7CisJCQkJCQkJCQkJCXN3aXRjaCAodG9rZW4pIHsKIAkJCQkJCQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYWJzdHJhY3Q6CiAJCQkJCQkJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWFzc2VydDoKIAkJCQkJCQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYm9vbGVhbjoKQEAgLTQyMiw3ICs0NjIsNyBAQAogCQkJcmV0dXJuIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOwogCQl9CiAJfQotCQorCiAJLyoKIAkgKiBQYXJzZSBhcmd1bWVudCBpbiBAc2VlIHRhZyBtZXRob2QgcmVmZXJlbmNlCiAJICovCkBAIC00MzMsNiArNDczLDcgQEAKIAkJaW50IGlUb2tlbiA9IDA7CiAJCWNoYXJbXSBhcmdOYW1lID0gbnVsbDsKIAkJTGlzdCBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKKwkJaW50IHN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKIAkJCiAJCS8vIFBhcnNlIGFyZ3VtZW50cyBkZWNsYXJhdGlvbiBpZiBtZXRob2QgcmVmZXJlbmNlCiAJCW5leHRBcmcgOiB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbikgewpAQCAtNDUzLDYgKzQ5NCwxMSBAQAogCQkJfQogCQkJaWYgKHR5cGVSZWYgPT0gbnVsbCkgewogCQkJCWlmIChmaXJzdEFyZyAmJiB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOKSB7CisJCQkJCWNoYXIgcGMgPSBwZWVrQ2hhcigpOworCQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UocGMpICYmICghdGhpcy5pbmxpbmVUYWdTdGFydGVkIHx8IHBjICE9ICd9JykpIHsKKwkJCQkJCWlmICh0aGlzLnNvdXJjZVBhcnNlciAhPSBudWxsKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWFsZm9ybWVkU2VlUmVmZXJlbmNlKHN0YXJ0LCB0aGlzLmxpbmVFbmQpOworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KIAkJCQkJdGhpcy5saW5lU3RhcnRlZCA9IHRydWU7CiAJCQkJCXJldHVybiBjcmVhdGVNZXRob2RSZWZlcmVuY2UocmVjZWl2ZXIsIG51bGwpOwogCQkJCX0KQEAgLTUxNiw2ICs1NjIsMTEgQEAKIAkJCQljb25zdW1lVG9rZW4oKTsKIAkJCQlpVG9rZW4rKzsKIAkJCX0gZWxzZSBpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOKSB7CisJCQkJY2hhciBwYyA9IHBlZWtDaGFyKCk7CisJCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHBjKSAmJiAoIXRoaXMuaW5saW5lVGFnU3RhcnRlZCB8fCBwYyAhPSAnfScpKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZVBhcnNlciAhPSBudWxsKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWFsZm9ybWVkU2VlUmVmZXJlbmNlKHN0YXJ0LCB0aGlzLmxpbmVFbmQpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CiAJCQkJLy8gQ3JlYXRlIG5ldyBhcmd1bWVudAogCQkJCU9iamVjdCBhcmd1bWVudCA9IGNyZWF0ZUFyZ3VtZW50UmVmZXJlbmNlKG5hbWUsIGRpbSwgdHlwZVJlZiwgZGltUG9zaXRpb25zLCBhcmdOYW1lUG9zKTsKIAkJCQlhcmd1bWVudHMuYWRkKGFyZ3VtZW50KTsKQEAgLTg3NywzNiArOTI4LDI5IEBACiAJICovCiAJcHJvdGVjdGVkIHZvaWQgcHVzaElkZW50aWZpZXIoYm9vbGVhbiBuZXdMZW5ndGgpIHsKIAotCQl0cnkgewotCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbKyt0aGlzLmlkZW50aWZpZXJQdHJdID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7Ci0JCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPSAoKChsb25nKSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbikgPDwgMzIpCi0JCQkJCSsgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLy0tLXN0YWNrIHJlYWxsYW9jYXRpb24gKGlkZW50aWZpZXJQdHIgaXMgY29ycmVjdCktLS0KLQkJCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuaWRlbnRpZmllclN0YWNrLmxlbmd0aDsKLQkJCWNoYXJbXVtdIG9sZFN0YWNrID0gdGhpcy5pZGVudGlmaWVyU3RhY2s7Ci0JCQl0aGlzLmlkZW50aWZpZXJTdGFjayA9IG5ldyBjaGFyW29sZFN0YWNrTGVuZ3RoICsgMTBdW107Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLmlkZW50aWZpZXJTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKLQkJCS8vIGlkZW50aWZpZXIgcG9zaXRpb24gc3RhY2sKLQkJCWxvbmdbXSBvbGRQb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrOwotCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjayA9IG5ldyBsb25nW29sZFN0YWNrTGVuZ3RoICsgMTBdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRQb3MsIDAsIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA9ICgoKGxvbmcpIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKSA8PCAzMikKLQkJCQkJKyAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmlkZW50aWZpZXJTdGFjay5sZW5ndGg7CisJCWlmICgrK3RoaXMuaWRlbnRpZmllclB0ciA+PSBzdGFja0xlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmlkZW50aWZpZXJTdGFjaywgMCwKKwkJCQl0aGlzLmlkZW50aWZpZXJTdGFjayA9IG5ldyBjaGFyW3N0YWNrTGVuZ3RoICsgMTBdW10sIDAsCisJCQkJc3RhY2tMZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAwLAorCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2sgPSBuZXcgbG9uZ1tzdGFja0xlbmd0aCArIDEwXSwgMCwKKwkJCQlzdGFja0xlbmd0aCk7CiAJCX0KKwkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOworCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPSAoKChsb25nKSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbikgPDwgMzIpICsgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIAogCQlpZiAobmV3TGVuZ3RoKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrWysrdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IDE7Ci0JCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkvKiAtLS1zdGFjayByZWFsbG9jYXRpb24gKGlkZW50aWZpZXJMZW5ndGhQdHIgaXMgY29ycmVjdCktLS0gKi8KLQkJCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjay5sZW5ndGg7Ci0JCQkJaW50IG9sZFN0YWNrW10gPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjazsKLQkJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAxMF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdID0gMTsKKwkJCXN0YWNrTGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2subGVuZ3RoOworCQkJaWYgKCsrdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2ssIDAsCisJCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIDEwXSwgMCwKKwkJCQkJc3RhY2tMZW5ndGgpOwogCQkJfQorCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IDE7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdKys7CiAJCX0KQEAgLTkyMywyNyArOTY3LDI1IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQl0cnkgewotCQkJdGhpcy5hc3RTdGFja1srK3RoaXMuYXN0UHRyXSA9IG5vZGU7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5hc3RTdGFjay5sZW5ndGg7Ci0JCQlPYmplY3RbXSBvbGRTdGFjayA9IHRoaXMuYXN0U3RhY2s7Ci0JCQl0aGlzLmFzdFN0YWNrID0gbmV3IE9iamVjdFtvbGRTdGFja0xlbmd0aCArIEFzdFN0YWNrSW5jcmVtZW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkU3RhY2ssIDAsIHRoaXMuYXN0U3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJCXRoaXMuYXN0UHRyID0gb2xkU3RhY2tMZW5ndGg7Ci0JCQl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9IG5vZGU7CisJCWludCBzdGFja0xlbmd0aCA9IHRoaXMuYXN0U3RhY2subGVuZ3RoOworCQlpZiAoKyt0aGlzLmFzdFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmFzdFN0YWNrLCAwLAorCQkJCXRoaXMuYXN0U3RhY2sgPSBuZXcgT2JqZWN0W3N0YWNrTGVuZ3RoICsgQXN0U3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJCXN0YWNrTGVuZ3RoKTsKKwkJCXRoaXMuYXN0UHRyID0gc3RhY2tMZW5ndGg7CiAJCX0KKwkJdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPSBub2RlOwogCiAJCWlmIChuZXdMZW5ndGgpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5hc3RMZW5ndGhTdGFja1srK3RoaXMuYXN0TGVuZ3RoUHRyXSA9IDE7Ci0JCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrLmxlbmd0aDsKLQkJCQlpbnRbXSBvbGRQb3MgPSB0aGlzLmFzdExlbmd0aFN0YWNrOwotCQkJCXRoaXMuYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgQXN0U3RhY2tJbmNyZW1lbnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUG9zLCAwLCB0aGlzLmFzdExlbmd0aFN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCQkJdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0cl0gPSAxOworCQkJc3RhY2tMZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrLmxlbmd0aDsKKwkJCWlmICgrK3RoaXMuYXN0TGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJdGhpcy5hc3RMZW5ndGhTdGFjaywgMCwKKwkJCQkJdGhpcy5hc3RMZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBBc3RTdGFja0luY3JlbWVudF0sIDAsCisJCQkJCXN0YWNrTGVuZ3RoKTsKIAkJCX0KKwkJCXRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdID0gMTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdKys7CiAJCX0KQEAgLTk2NSwxMCArMTAwNywzNCBAQAogCX0KIAogCS8qCisJICogUmV0dXJuIGN1cnJlbnQgY2hhcmFjdGVyIHdpdGhvdXQgbW92ZSBpbmRleCBwb3NpdGlvbi4KKwkgKi8KKwlwcml2YXRlIGNoYXIgcGVla0NoYXIoKSB7CisJCWludCBpZHggPSB0aGlzLmluZGV4OworCQljaGFyIGMgPSB0aGlzLnNvdXJjZVtpZHgrK107CisJCWlmIChjID09ICdcXCcgJiYgdGhpcy5zb3VyY2VbaWR4XSA9PSAndScpIHsKKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWlkeCsrOworCQkJd2hpbGUgKHRoaXMuc291cmNlW2lkeF0gPT0gJ3UnKQorCQkJCWlkeCsrOworCQkJaWYgKCEoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUodGhpcy5zb3VyY2VbaWR4KytdKSkgPiAxNSB8fCBjMSA8IDApCisJCQkJCXx8ICgoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHRoaXMuc291cmNlW2lkeCsrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZSh0aGlzLnNvdXJjZVtpZHgrK10pKSA+IDE1IHx8IGMzIDwgMCkgfHwgKChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUodGhpcy5zb3VyY2VbaWR4KytdKSkgPiAxNSB8fCBjNCA8IDApKSkgeworCQkJCWMgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGM7CisJfQorCisJLyoKIAkgKiBQdXNoIGEgdGhyb3dzIHR5cGUgcmVmIGluIGFzdCBub2RlIHN0YWNrLgogCSAqLwogCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHB1c2hUaHJvd05hbWUoT2JqZWN0IHR5cGVSZWYsIGJvb2xlYW4gcmVhbCk7CiAKKwkvKgorCSAqIFJlYWQgY3VycmVudCBjaGFyYWN0ZXIgYW5kIG1vdmUgaW5kZXggcG9zaXRpb24uCisJICogV2FybmluZzogc2Nhbm5lciBwb3NpdGlvbiBpcyB1bmNoYW5nZWQgdXNpbmcgdGhpcyBtZXRob2QhCisJICovCiAJcHJvdGVjdGVkIGNoYXIgcmVhZENoYXIoKSB7CiAJCiAJCWNoYXIgYyA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL0phdmFkb2NQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCmluZGV4IDc1YzY1NWMuLjcwYmI0ZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCkBAIC0zMDcsMTUgKzMwNywxNCBAQAogCQkJCQlpZiAodGhpcy5pbnZQYXJhbXNQdHIgPT0gLTFsKSB7CiAJCQkJCQl0aGlzLmludlBhcmFtc1N0YWNrID0gbmV3IEphdmFkb2NTaW5nbGVOYW1lUmVmZXJlbmNlWzEwXTsKIAkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5pbnZQYXJhbXNTdGFja1srK3RoaXMuaW52UGFyYW1zUHRyXSA9IG5hbWVSZWY7Ci0JCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pbnZQYXJhbXNTdGFjay5sZW5ndGg7Ci0JCQkJCQlKYXZhZG9jU2luZ2xlTmFtZVJlZmVyZW5jZVtdIG9sZFN0YWNrID0gdGhpcy5pbnZQYXJhbXNTdGFjazsKLQkJCQkJCXRoaXMuaW52UGFyYW1zU3RhY2sgPSBuZXcgSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2Vbb2xkU3RhY2tMZW5ndGggKyBBc3RTdGFja0luY3JlbWVudF07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLmludlBhcmFtc1N0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCQkJCQl0aGlzLmludlBhcmFtc1N0YWNrW3RoaXMuaW52UGFyYW1zUHRyXSA9IG5hbWVSZWY7CisJCQkJCWludCBzdGFja0xlbmd0aCA9IHRoaXMuaW52UGFyYW1zU3RhY2subGVuZ3RoOworCQkJCQlpZiAoKyt0aGlzLmludlBhcmFtc1B0ciA+PSBzdGFja0xlbmd0aCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQl0aGlzLmludlBhcmFtc1N0YWNrLCAwLAorCQkJCQkJCXRoaXMuaW52UGFyYW1zU3RhY2sgPSBuZXcgSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2Vbc3RhY2tMZW5ndGggKyBBc3RTdGFja0luY3JlbWVudF0sIDAsCisJCQkJCQkJc3RhY2tMZW5ndGgpOwogCQkJCQl9CisJCQkJCXRoaXMuaW52UGFyYW1zU3RhY2tbdGhpcy5pbnZQYXJhbXNQdHJdID0gbmFtZVJlZjsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhCmluZGV4IGE3MzA1ODkuLjlmYjBkZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQpAQCAtMzk0MCwxNyArMzk0MCwxOSBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU5lc3RlZFR5cGUoKSB7CiAJLy8gTmVzdGVkVHlwZSA6Oj0gJGVtcHR5Ci0JdGhpcy5uZXN0ZWRUeXBlKys7Ci0JdHJ5IHsKLQkJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSA9IDA7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCS8vZXhjZXB0IGluIHRlc3QncyBjYXNlcywgaXQgc2hvdWxkIG5ldmVyIHJhaXNlCi0JCWludCBvbGRMID0gdGhpcy5uZXN0ZWRNZXRob2QubGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubmVzdGVkTWV0aG9kICwgMCwgKHRoaXMubmVzdGVkTWV0aG9kID0gbmV3IGludFtvbGRMICsgMzBdKSwgMCwgb2xkTCk7Ci0JCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0gPSAwOwotCQkvLyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzQ291bnRlciBhcyB3ZWxsLiBJdCBoYXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzaXplIG9mIHRoZSB0aGlzLm5lc3RlZE1ldGhvZCBjb2xsZWN0aW9uCi0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy52YXJpYWJsZXNDb3VudGVyLCAwLCAodGhpcy52YXJpYWJsZXNDb3VudGVyID0gbmV3IGludFtvbGRMICsgMzBdKSwgMCwgb2xkTCk7CisJaW50IGxlbmd0aCA9IHRoaXMubmVzdGVkTWV0aG9kLmxlbmd0aDsKKwlpZiAoKyt0aGlzLm5lc3RlZFR5cGUgPj0gbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLm5lc3RlZE1ldGhvZCwgMCwKKwkJCXRoaXMubmVzdGVkTWV0aG9kID0gbmV3IGludFtsZW5ndGggKyAzMF0sIDAsCisJCQlsZW5ndGgpOworCQkvLyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgdmFyaWFibGVzQ291bnRlciBhcyB3ZWxsLiBJdCBoYXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzaXplIG9mIHRoZSBuZXN0ZWRNZXRob2QgY29sbGVjdGlvbgorCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy52YXJpYWJsZXNDb3VudGVyLCAwLAorCQkJdGhpcy52YXJpYWJsZXNDb3VudGVyID0gbmV3IGludFtsZW5ndGggKyAzMF0sIDAsCisJCQlsZW5ndGgpOwogCX0KKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdID0gMDsKIAl0aGlzLnZhcmlhYmxlc0NvdW50ZXJbdGhpcy5uZXN0ZWRUeXBlXSA9IDA7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpIHsKQEAgLTQwMTUsMTYgKzQwMTcsMTQgQEAKIAkvLyBPcGVuQmxvY2sgOjo9ICRlbXB0eQogCiAJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwotCXRyeSB7Ci0JCXRoaXMucmVhbEJsb2NrU3RhY2tbKyt0aGlzLnJlYWxCbG9ja1B0cl0gPSAwOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkvL3RoaXMucmVhbEJsb2NrUHRyIGlzIGNvcnJlY3QgCi0JCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMucmVhbEJsb2NrU3RhY2subGVuZ3RoOwotCQlpbnQgb2xkU3RhY2tbXSA9IHRoaXMucmVhbEJsb2NrU3RhY2s7Ci0JCXRoaXMucmVhbEJsb2NrU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLnJlYWxCbG9ja1N0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCXRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHJdID0gMDsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLnJlYWxCbG9ja1N0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLnJlYWxCbG9ja1B0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5yZWFsQmxvY2tTdGFjaywgMCwKKwkJCXRoaXMucmVhbEJsb2NrU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyXSA9IDA7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uKCkgewogCS8vIFBhY2thZ2VEZWNsYXJhdGlvbiA6Oj0gJ3BhY2thZ2UnIE5hbWUgJzsnCkBAIC04MTIxLDE1ICs4MTIxLDE0IEBACiAJdGhpcy5zdGF0ZVN0YWNrVG9wID0gLTE7CiAJdGhpcy5jdXJyZW50VG9rZW4gPSBnZXRGaXJzdFRva2VuKCk7CiAJUHJvY2Vzc1Rlcm1pbmFscyA6IGZvciAoOzspIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3RhY2tbKyt0aGlzLnN0YXRlU3RhY2tUb3BdID0gYWN0OwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuc3RhY2subGVuZ3RoOwotCQkJaW50IG9sZFN0YWNrW10gPSB0aGlzLnN0YWNrOwotCQkJdGhpcy5zdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLnN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCQl0aGlzLnN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSBhY3Q7CisJCWludCBzdGFja0xlbmd0aCA9IHRoaXMuc3RhY2subGVuZ3RoOworCQlpZiAoKyt0aGlzLnN0YXRlU3RhY2tUb3AgPj0gc3RhY2tMZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5zdGFjaywgMCwKKwkJCQl0aGlzLnN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwKKwkJCQlzdGFja0xlbmd0aCk7CiAJCX0KKwkJdGhpcy5zdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gYWN0OwogCiAJCWFjdCA9IHRBY3Rpb24oYWN0LCB0aGlzLmN1cnJlbnRUb2tlbik7CiAJCWlmIChhY3QgPT0gRVJST1JfQUNUSU9OIHx8IHRoaXMucmVzdGFydFJlY292ZXJ5KSB7CkBAIC04NTQ1LDE2NyArODU0NCwxNzUgQEAKIHByb3RlY3RlZCB2b2lkIHB1c2hJZGVudGlmaWVyKCkgewogCS8qcHVzaCB0aGUgY29uc3VtZVRva2VuIG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrLgogCUluY3JlYXNlIHRoZSB0b3RhbCBudW1iZXIgb2YgaWRlbnRpZmllciBpbiB0aGUgc3RhY2suCi0JdGhpcy5pZGVudGlmaWVyUHRyIHBvaW50cyBvbiB0aGUgbmV4dCB0b3AgKi8KKwlpZGVudGlmaWVyUHRyIHBvaW50cyBvbiB0aGUgbmV4dCB0b3AgKi8KIAotCXRyeSB7Ci0JCXRoaXMuaWRlbnRpZmllclN0YWNrWysrdGhpcy5pZGVudGlmaWVyUHRyXSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwotCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPSAKLQkJCSgoKGxvbmcpIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKSA8PCAzMikgKyAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJLyotLS1zdGFjayByZWFsbGFvY2F0aW9uICh0aGlzLmlkZW50aWZpZXJQdHIgaXMgY29ycmVjdCktLS0qLwotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmlkZW50aWZpZXJTdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssIDAsIHRoaXMuaWRlbnRpZmllclN0YWNrID0gbmV3IGNoYXJbb2xkU3RhY2tMZW5ndGggKyAyMF1bXSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQkvKmlkZW50aWZpZXIgcG9zaXRpb24gc3RhY2sqLwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIDAsIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2sgPSBuZXcgbG9uZ1tvbGRTdGFja0xlbmd0aCArIDIwXSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPSAKLQkJCSgoKGxvbmcpIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKSA8PCAzMikgKyAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmlkZW50aWZpZXJTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5pZGVudGlmaWVyUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmlkZW50aWZpZXJTdGFjaywgMCwKKwkJCXRoaXMuaWRlbnRpZmllclN0YWNrID0gbmV3IGNoYXJbc3RhY2tMZW5ndGggKyAyMF1bXSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIDAsCisJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrID0gbmV3IGxvbmdbc3RhY2tMZW5ndGggKyAyMF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CiAJfQorCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKKwl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPQorCQkoKChsb25nKSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbikgPDwgMzIpICsgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsgCiAKLQl0cnkgewotCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1srK3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gPSAxOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkvKi0tLXN0YWNrIHJlYWxsb2NhdGlvbiAodGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyIGlzIGNvcnJlY3QpLS0tKi8KLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2subGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrLCAwLCB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAxMF0sIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IDE7CisJc3RhY2tMZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIDEwXSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9Ci0KKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdID0gMTsKIH0KIHByb3RlY3RlZCB2b2lkIHB1c2hJZGVudGlmaWVyKGludCBmbGFnKSB7CiAJLypwdXNoIGEgc3BlY2lhbCBmbGFnIG9uIHRoZSBzdGFjayA6CiAJLXplcm8gc3RhbmRzIGZvciBvcHRpb25hbCBOYW1lCiAJLW5lZ2F0aXZlIG51bWJlciBmb3IgZGlyZWN0IHJlZiB0byBiYXNlIHR5cGVzLgotCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciBwb2ludHMgb24gdGhlIHRvcCAqLworCWlkZW50aWZpZXJMZW5ndGhQdHIgcG9pbnRzIG9uIHRoZSB0b3AgKi8KIAotCXRyeSB7Ci0JCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrWysrdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGZsYWc7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCS8qLS0tc3RhY2sgcmVhbGxhb2NhdGlvbiAodGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyIGlzIGNvcnJlY3QpLS0tKi8KLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2subGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrLCAwLCB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAxMF0sIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGZsYWc7CisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2ssIDAsCisJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyAxMF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CiAJfQotCisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGZsYWc7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25Bc3RMZW5ndGhTdGFjayhpbnQgcG9zKSB7Ci0JdHJ5IHsKLQkJdGhpcy5hc3RMZW5ndGhTdGFja1srK3RoaXMuYXN0TGVuZ3RoUHRyXSA9IHBvczsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hc3RMZW5ndGhTdGFjaywgMCwgdGhpcy5hc3RMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0cl0gPSBwb3M7CisKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmFzdExlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5hc3RMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXSA9IHBvczsKIH0KIHByb3RlY3RlZCB2b2lkIHB1c2hPbkFzdFN0YWNrKEFTVE5vZGUgbm9kZSkgewogCS8qYWRkIGEgbmV3IG9iaiBvbiB0b3Agb2YgdGhlIGFzdCBzdGFjawotCXRoaXMuYXN0UHRyIHBvaW50cyBvbiB0aGUgdG9wKi8KKwlhc3RQdHIgcG9pbnRzIG9uIHRoZSB0b3AqLwogCi0JdHJ5IHsKLQkJdGhpcy5hc3RTdGFja1srK3RoaXMuYXN0UHRyXSA9IG5vZGU7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuYXN0U3RhY2subGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXN0U3RhY2ssIDAsIHRoaXMuYXN0U3RhY2sgPSBuZXcgQVNUTm9kZVtvbGRTdGFja0xlbmd0aCArIEFzdFN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmFzdFB0ciA9IG9sZFN0YWNrTGVuZ3RoOwotCQl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9IG5vZGU7CisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5hc3RTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5hc3RQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuYXN0U3RhY2ssIDAsCisJCQl0aGlzLmFzdFN0YWNrID0gbmV3IEFTVE5vZGVbc3RhY2tMZW5ndGggKyBBc3RTdGFja0luY3JlbWVudF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CisJCXRoaXMuYXN0UHRyID0gc3RhY2tMZW5ndGg7CiAJfQorCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0gbm9kZTsKIAotCXRyeSB7Ci0JCXRoaXMuYXN0TGVuZ3RoU3RhY2tbKyt0aGlzLmFzdExlbmd0aFB0cl0gPSAxOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmFzdExlbmd0aFN0YWNrLCAwLCB0aGlzLmFzdExlbmd0aFN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIEFzdFN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXSA9IDE7CisJc3RhY2tMZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmFzdExlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5hc3RMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgQXN0U3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXSA9IDE7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25FeHByZXNzaW9uU3RhY2soRXhwcmVzc2lvbiBleHByKSB7CiAKLQl0cnkgewotCQl0aGlzLmV4cHJlc3Npb25TdGFja1srK3RoaXMuZXhwcmVzc2lvblB0cl0gPSBleHByOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkvL3RoaXMuZXhwcmVzc2lvblB0ciBpcyBjb3JyZWN0IAotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmV4cHJlc3Npb25TdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHByZXNzaW9uU3RhY2ssIDAsIHRoaXMuZXhwcmVzc2lvblN0YWNrICA9IG5ldyBFeHByZXNzaW9uW29sZFN0YWNrTGVuZ3RoICsgRXhwcmVzc2lvblN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gZXhwcjsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmV4cHJlc3Npb25TdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5leHByZXNzaW9uUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgMCwKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrID0gbmV3IEV4cHJlc3Npb25bc3RhY2tMZW5ndGggKyBFeHByZXNzaW9uU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gZXhwcjsKIAotCXRyeSB7Ci0JCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrWysrdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyXSA9IDE7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFjaywgMCwgdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgRXhwcmVzc2lvblN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHJdID0gMTsKKwlzdGFja0xlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrLCAwLAorCQkJdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgRXhwcmVzc2lvblN0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyXSA9IDE7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjayhpbnQgcG9zKSB7Ci0JdHJ5IHsKLQkJdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbKyt0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHJdID0gcG9zOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2ssIDAsIHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHJdID0gcG9zOworCisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2ssIDAsCisJCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CiAJfQorCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0cl0gPSBwb3M7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25HZW5lcmljc1N0YWNrKEFTVE5vZGUgbm9kZSkgewogCS8qYWRkIGEgbmV3IG9iaiBvbiB0b3Agb2YgdGhlIGdlbmVyaWNzIHN0YWNrCi0JdGhpcy5nZW5lcmljc1B0ciBwb2ludHMgb24gdGhlIHRvcCovCisJZ2VuZXJpY3NQdHIgcG9pbnRzIG9uIHRoZSB0b3AqLwogCi0JdHJ5IHsKLQkJdGhpcy5nZW5lcmljc1N0YWNrWysrdGhpcy5nZW5lcmljc1B0cl0gPSBub2RlOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzU3RhY2subGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgMCwgdGhpcy5nZW5lcmljc1N0YWNrID0gbmV3IEFTVE5vZGVbb2xkU3RhY2tMZW5ndGggKyBHZW5lcmljc1N0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmdlbmVyaWNzUHRyID0gb2xkU3RhY2tMZW5ndGg7Ci0JCXRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXSA9IG5vZGU7CisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5nZW5lcmljc1N0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmdlbmVyaWNzUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmdlbmVyaWNzU3RhY2ssIDAsCisJCQl0aGlzLmdlbmVyaWNzU3RhY2sgPSBuZXcgQVNUTm9kZVtzdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl0gPSBub2RlOwogCi0JdHJ5IHsKLQkJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrWysrdGhpcy5nZW5lcmljc0xlbmd0aFB0cl0gPSAxOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2subGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjaywgMCwgdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXSA9IDE7CisJc3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBHZW5lcmljc1N0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdID0gMTsKIH0KIHByb3RlY3RlZCB2b2lkIHB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayhpbnQgcG9zKSB7Ci0JdHJ5IHsKLQkJdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2tbKyt0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHJdID0gcG9zOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2ssIDAsICh0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBHZW5lcmljc1N0YWNrSW5jcmVtZW50XSksIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyXSA9IHBvczsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHJdID0gcG9zOwogfQogcHJvdGVjdGVkIHZvaWQgcHVzaE9uR2VuZXJpY3NMZW5ndGhTdGFjayhpbnQgcG9zKSB7Ci0JdHJ5IHsKLQkJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrWysrdGhpcy5nZW5lcmljc0xlbmd0aFB0cl0gPSBwb3M7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjay5sZW5ndGg7Ci0JCWludFtdIG9sZFBvcyA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjazsKLQkJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBvcywgMCwgdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXSA9IHBvczsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjaywgMCwKKwkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBHZW5lcmljc1N0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdID0gcG9zOwogfQogcHJvdGVjdGVkIHZvaWQgcHVzaE9uSW50U3RhY2soaW50IHBvcykgewotCXRyeSB7Ci0JCXRoaXMuaW50U3RhY2tbKyt0aGlzLmludFB0cl0gPSBwb3M7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCS8vdGhpcy5pbnRQdHIgaXMgY29ycmVjdCAKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pbnRTdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pbnRTdGFjaywgMCwgdGhpcy5pbnRTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0cl0gPSBwb3M7CisKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmludFN0YWNrLmxlbmd0aDsKKwlpZiAoKyt0aGlzLmludFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5pbnRTdGFjaywgMCwKKwkJCXRoaXMuaW50U3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOwogCX0KKwl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyXSA9IHBvczsKIH0KIHByb3RlY3RlZCB2b2lkIHB1c2hPblJlYWxCbG9ja1N0YWNrKGludCBpKXsKLQl0cnkgewotCQl0aGlzLnJlYWxCbG9ja1N0YWNrWysrdGhpcy5yZWFsQmxvY2tQdHJdID0gaTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJLy90aGlzLnJlYWxCbG9ja1B0ciBpcyBjb3JyZWN0IAotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLnJlYWxCbG9ja1N0YWNrLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnJlYWxCbG9ja1N0YWNrLCAwLCB0aGlzLnJlYWxCbG9ja1N0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyXSA9IGk7CisJCisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5yZWFsQmxvY2tTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5yZWFsQmxvY2tQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMucmVhbEJsb2NrU3RhY2ssIDAsCisJCQl0aGlzLnJlYWxCbG9ja1N0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJdGhpcy5yZWFsQmxvY2tTdGFja1t0aGlzLnJlYWxCbG9ja1B0cl0gPSBpOwogfQogcHVibGljIHZvaWQgcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCkgewogCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudCAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCmluZGV4IDI0MTg1YTkuLmExMTVhZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCkBAIC0yMDUsNiArMjA1LDcgQEAKIH0KIAogLy8gY2hlY2ggcHJlc2VuY2Ugb2YgdGFzazogdGFncworLy8gVE9ETyAoZnJlZGVyaWMpIHNlZSBpZiB3ZSBuZWVkIHRvIHRha2UgdW5pY29kZSBjaGFyYWN0ZXJzIGludG8gYWNjb3VudC4uLgogcHVibGljIHZvaWQgY2hlY2tUYXNrVGFnKGludCBjb21tZW50U3RhcnQsIGludCBjb21tZW50RW5kKSB7CiAJY2hhcltdIHNyYyA9IHRoaXMuc291cmNlOwogCQpAQCAtMjE0LDggKzIxNSw5IEBACiAJCXJldHVybjsKIAl9CiAJaW50IGZvdW5kVGFza0luZGV4ID0gdGhpcy5mb3VuZFRhc2tDb3VudDsKLQljaGFyIHByZXZpb3VzID0gY29tbWVudFN0YXJ0PT0wID8gMCA6IHRoaXMuc291cmNlW2NvbW1lbnRTdGFydC0xXTsKLQluZXh0Q2hhciA6IGZvciAoaW50IGkgPSBjb21tZW50U3RhcnQ7IGkgPCBjb21tZW50RW5kICYmIGkgPCB0aGlzLmVvZlBvc2l0aW9uOyBpKyspIHsKKwljaGFyIHByZXZpb3VzID0gc3JjW2NvbW1lbnRTdGFydCsxXTsgLy8gc2hvdWxkIGJlICcqJyBvciAnLycKKwluZXh0Q2hhciA6IGZvciAoCisJCWludCBpID0gY29tbWVudFN0YXJ0ICsgMjsgaSA8IGNvbW1lbnRFbmQgJiYgaSA8IHRoaXMuZW9mUG9zaXRpb247IGkrKykgewogCQljaGFyW10gdGFnID0gbnVsbDsKIAkJY2hhcltdIHByaW9yaXR5ID0gbnVsbDsKIAkJLy8gY2hlY2sgZm9yIHRhZyBvY2N1cnJlbmNlIG9ubHkgaWYgbm90IGFtYmlndW91cyB3aXRoIGphdmFkb2MgdGFnCkBAIC0yMzQsNyArMjM2LDggQEAKIAkKIAkJCQlmb3IgKGludCB0ID0gMDsgdCA8IHRhZ0xlbmd0aDsgdCsrKSB7CiAJCQkJCWNoYXIgc2MsIHRjOwotCQkJCQlpZiAoKGkrdCkgPj0gdGhpcy5lb2ZQb3NpdGlvbikgY29udGludWUgbmV4dFRhZzsKKwkJCQkJaW50IHggPSBpK3Q7CisJCQkJCWlmICh4ID49IHRoaXMuZW9mUG9zaXRpb24gfHwgeCA+PSBjb21tZW50RW5kKSBjb250aW51ZSBuZXh0VGFnOwogCQkJCQlpZiAoKHNjID0gc3JjW2kgKyB0XSkgIT0gKHRjID0gdGFnW3RdKSkgeyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZSBjaGVjawogCQkJCQkJaWYgKHRoaXMuaXNUYXNrQ2FzZVNlbnNpdGl2ZSB8fCAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNjKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGMpKSkgeyAJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjawogCQkJCQkJCWNvbnRpbnVlIG5leHRUYWc7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCmluZGV4IDFmMDZiMzcuLmMyNWMzMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCkBAIC01MzksNiArNTM5LDcgQEAKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jRHVwbGljYXRlUmV0dXJuVGFnOgogCQljYXNlIElQcm9ibGVtLkphdmFkb2NJbnZhbGlkVGhyb3dzQ2xhc3M6CiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0ludmFsaWRTZWVSZWZlcmVuY2U6CisJCWNhc2UgSVByb2JsZW0uSmF2YWRvY01hbGZvcm1lZFNlZVJlZmVyZW5jZToKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jSW52YWxpZFNlZUhyZWY6CiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0ludmFsaWRTZWVBcmdzOgogCQljYXNlIElQcm9ibGVtLkphdmFkb2NJbnZhbGlkVGFnOgpAQCAtMjY2OCw2ICsyNjY5LDkgQEAKIAkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiAJfQogfQorcHVibGljIHZvaWQgamF2YWRvY01hbGZvcm1lZFNlZVJlZmVyZW5jZShpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwl0aGlzLmhhbmRsZShJUHJvYmxlbS5KYXZhZG9jTWFsZm9ybWVkU2VlUmVmZXJlbmNlLCBOb0FyZ3VtZW50LCBOb0FyZ3VtZW50LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIGphdmFkb2NNaXNzaW5nKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgaW50IG1vZGlmaWVycyl7CiAJYm9vbGVhbiBvdmVycmlkaW5nID0gKG1vZGlmaWVycyAmIChDb21waWxlck1vZGlmaWVycy5BY2NJbXBsZW1lbnRpbmcrQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykpICE9IDA7CiAJYm9vbGVhbiByZXBvcnQgPSAodGhpcy5vcHRpb25zLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nSmF2YWRvY0NvbW1lbnRzKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vbWVzc2FnZXMucHJvcGVydGllcwppbmRleCBkNjY5MDg3Li44Mjk1YTM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTM4NSw2ICszODUsNyBAQAogNTEwID0gVGhlIHR5cGUgezB9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQogNTExID0gezB9IGlzIGFuIGFtYmlndW91cyBtZXRob2QgcmVmZXJlbmNlIG9yIGlzIG5vdCBhIGZpZWxkCiA1MTIgPSBNaXNzaW5nIGNsb3NpbmcgYnJhY2UgZm9yIGlubGluZSB0YWcKKzUxMyA9IE1hbGZvcm1lZCByZWZlcmVuY2UgKG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIG1ldGhvZCByZWZlcmVuY2UgY2xvc2luZyBicmFjZSkKIDUxNSA9IEphdmFkb2M6IAogCiAjIyMgR0VORVJJQ1MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNULmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVC5qYXZhCmluZGV4IDc1NGVmYTguLjE4OWZiMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNULmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1QuamF2YQpAQCAtMTAxNSw3ICsxMDE1LDcgQEAKIAkvKioKIAkgKiBTZXRzIGRlZmF1bHQgbm9kZSBmbGFncyBvZiBuZXcgbm9kZXMgb2YgdGhpcyBBU1QuCiAJICogCi0JICogQHBhcmFtIGRlZmF1bHQgbm9kZSBmbGFncyBvZiBuZXcgbm9kZXMgb2YgdGhpcyBBU1QKKwkgKiBAcGFyYW0gZmxhZyBub2RlIGZsYWdzIG9mIG5ldyBub2RlcyBvZiB0aGlzIEFTVAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAl2b2lkIHNldERlZmF1bHROb2RlRmxhZyhpbnQgZmxhZykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RDb252ZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUQ29udmVydGVyLmphdmEKaW5kZXggYTk0MzkxMS4uOTViNGM1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RDb252ZXJ0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhCkBAIC0yNjY5LDIzICsyNjY5LDI1IEBACiAJCQkJaW50IHN0YXJ0ID0gbmFtZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCQkJLy8gZ2V0IGNvbXBpbGVyIG5vZGUgYW5kIHJlY29yZCBub2RlcwogCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBjb21waWxlck5vZGUgPSBqYXZhZG9jLmdldE5vZGVTdGFydGluZ0F0KHN0YXJ0KTsKKwkJCQkvLyByZWNvcmQgbm9kZXMKIAkJCQlpZiAoY29tcGlsZXJOb2RlICE9IG51bGwpIHsKLQkJCQkJcmVjb3JkTm9kZXMobmFtZSwgY29tcGlsZXJOb2RlKTsKIAkJCQkJcmVjb3JkTm9kZXMobWV0aG9kUmVmLCBjb21waWxlck5vZGUpOwotCQkJCX0KLQkJCQkvLyBSZXBsYWNlIHF1YWxpZmllciB0byBoYXZlIGFsbCBub2RlcyByZWNvcmRlZAotCQkJCWlmIChtZXRob2RSZWYuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgeworCQkJCQkvLyBnZXQgdHlwZSByZWYKIAkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBudWxsOwogCQkJCQlpZiAoY29tcGlsZXJOb2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKIAkJCQkJCXR5cGVSZWYgPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKWNvbXBpbGVyTm9kZSkudHlwZTsKKwkJCQkJCWlmICh0eXBlUmVmICE9IG51bGwpIHJlY29yZE5vZGVzKG5hbWUsIHR5cGVSZWYpOwogCQkJCQl9IAogCQkJCQllbHNlIGlmIChjb21waWxlck5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2NNZXNzYWdlU2VuZCkgewogCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSmF2YWRvY01lc3NhZ2VTZW5kKWNvbXBpbGVyTm9kZSkucmVjZWl2ZXI7CiAJCQkJCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSkgewogCQkJCQkJCXR5cGVSZWYgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlKSBleHByZXNzaW9uOwogCQkJCQkJfQorCQkJCQkJLy8gVE9ETyAoZnJlZGVyaWMpIHJlbW92ZSBmb2xsb3dpbmcgbGluZSB0byBmaXggYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjY1MAorCQkJCQkJcmVjb3JkTm9kZXMobmFtZSwgY29tcGlsZXJOb2RlKTsKIAkJCQkJfQotCQkJCQlpZiAodHlwZVJlZiAhPSBudWxsKSB7CisJCQkJCS8vIHJlY29yZCBuYW1lIGFuZCBxdWFsaWZpZXIKKwkJCQkJaWYgKHR5cGVSZWYgIT0gbnVsbCAmJiBtZXRob2RSZWYuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgewogCQkJCQkJcmVjb3JkTmFtZShtZXRob2RSZWYuZ2V0UXVhbGlmaWVyKCksIHR5cGVSZWYpOwogCQkJCQl9CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE5vZGUuamF2YQppbmRleCAxMmMxY2ZhLi5iYTMwMzNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE5vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE5vZGUuamF2YQpAQCAtMTUzMCw3ICsxNTMwLDYgQEAKIAkgKiA8L3VsPgogCSAqIAogCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUKIAkgKiBnaXZlbiBwcm9wZXJ0eSwgb3IgaWYgdGhlIGdpdmVuIHByb3BlcnR5IGNhbm5vdCBiZSBzZXQKIAkgKiBAc2luY2UgMy4wCkBAIC0yMzAwLDggKzIyOTksOCBAQAogCSAqIG1ldGhvZCB1c2VzIG9iamVjdCBpZGVudGl0eSAoPT0pLiBVc2UgPGNvZGU+c3VidHJlZU1hdGNoPC9jb2RlPiB0bwogCSAqIGNvbXBhcmUgdHdvIHN1YnRyZWVzIGZvciBlcXVhbGl0eS4KIAkgKiAKLQkgKiBAcGFyYW0gb2JqIHtAaW5oZXJpdGRvY30KLQkgKiBAcmV0dXJuIHtAaW5oZXJpdGRvY30KKwkgKiBAcGFyYW0gb2JqIHtAaW5oZXJpdERvY30KKwkgKiBAcmV0dXJuIHtAaW5oZXJpdERvY30KIAkgKiBAc2VlICNzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFBhcnNlci5qYXZhCmluZGV4IDljYTQxYWYuLmE3YTVkOWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RQYXJzZXIuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogICogPGxpPlNvdXJjZSBzdHJpbmcgZnJvbSB7QGxpbmsgI3NldFNvdXJjZShjaGFyW10pIGNoYXJbXX0sCiAgKiB7QGxpbmsgI3NldFNvdXJjZShJQ29tcGlsYXRpb25Vbml0KSBJQ29tcGlsYXRpb25Vbml0fSwKICAqIG9yIHtAbGluayAjc2V0U291cmNlKElDbGFzc0ZpbGUpIElDbGFzc0ZpbGV9LCBhbmQgbGltaXRlZAotICogdG8gYSBzcGVjaWZpZWQge0BsaW5rcGxhaW4gI3NldFNvdXJjZVJhbmdlKGludCxpbnQpIHN1YnJhbmdlLjwvbGk+CisgKiB0byBhIHNwZWNpZmllZCB7QGxpbmtwbGFpbiAjc2V0U291cmNlUmFuZ2UoaW50LGludCkgc3VicmFuZ2V9LjwvbGk+CiAgKiA8bGk+V2hldGhlciB7QGxpbmtwbGFpbiAjc2V0UmVzb2x2ZUJpbmRpbmdzKGJvb2xlYW4pIGJpbmRpbmdzfSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KICAqIDxsaT5XaGljaCB7QGxpbmtwbGFpbiAjc2V0V29ya2luZ0NvcHlPd25lcihXb3JraW5nQ29weU93bmVyKQogICogd29ya2luZyBzZXQgb3duZXJ9IHRvIHVzZSB3aGVuIHJlc29sdmluZyBiaW5kaW5ncykuPC9saT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmphdmEKaW5kZXggZTk2MTFjZS4uZDRlOTBkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKICAqIDwvcHJlPgogICogPHA+CiAgKiBOb3RlIHRoYXQgYW5ub3RhdGlvbiB0eXBlIG1lbWJlciBkZWNsYXJhdGlvbnMgYXJlIG9ubHkgbWVhbmluZ2Z1bCBhcwotICogZWxlbWVudHMgb2Yge0BsaW5rIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24jbWVtYmVycyBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLm1lbWJlcnN9LgorICogZWxlbWVudHMgb2Yge0BsaW5rIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24jYm9keURlY2xhcmF0aW9ucygpfS4KICAqIDwvcD4KICAqIDxwPgogICogV2hlbiBhIEphdmFkb2MgY29tbWVudCBpcyBwcmVzZW50LCB0aGUgc291cmNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQppbmRleCAzODkyNTUzLi4zOWQ3OTQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKQEAgLTE1LDcgKzE1LDcgQEAKICAqIEEgY2hpbGQgbGlzdCBwcm9wZXJ0eSBpcyBvbmUgd2hvc2UgdmFsdWUgaXMgYSBsaXN0IG9mCiAgKiB7QGxpbmsgQVNUTm9kZX0uCiAgKiAKLSAqIEBzZWUgQVNUTm9kZSNnZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNnZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcikKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGlsZFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGlsZFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmluZGV4IDE0NmM2MWEuLmE1OGVjNWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKQEAgLTE1LDggKzE1LDggQEAKICAqIEEgY2hpbGQgcHJvcGVydHkgaXMgb25lIHdob3NlIHZhbHVlIGlzIGFuCiAgKiB7QGxpbmsgQVNUTm9kZX0uCiAgKiAKLSAqIEBzZWUgQVNUTm9kZSNnZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKQotICogQHNlZSBBU1ROb2RlI3NldFN0cnVjdHVyYWxQcm9wZXJ0eShTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IsT2JqZWN0KQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNnZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcikKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUjc2V0U3RydWN0dXJhbFByb3BlcnR5KFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IsIE9iamVjdCkKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQppbmRleCBhNzUwODg4Li41MTI5NGU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCSAqIFNldHMgdGhlIHR5cGUgaW5zdGFudGlhdGVkIGluIHRoaXMgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24KIAkgKiBleHByZXNzaW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogCi0JICogQHBhcmFtIG5hbWUgdGhlIG5ldyB0eXBlCisJICogQHBhcmFtIHR5cGUgdGhlIG5ldyB0eXBlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXQuamF2YQppbmRleCBiYzFlOTJhLi4yZjg3ZGRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTM4MSw3ICszODEsNyBAQAogCSAqIDwvdWw+CiAJICogPC9wPgogCSAqIDxwPgotCSAqIEVhY2ggY2FsbCB0byB7QGxpbmsgQVNUUGFyc2VyI2NyZWF0ZUFTVChJUHJvZ3Jlc3NNb25pdG9yKX0gd2l0aCBhIHJlcXVlc3QgZm9yIGJpbmRpbmdzCisJICogRWFjaCBjYWxsIHRvIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKX0gd2l0aCBhIHJlcXVlc3QgZm9yIGJpbmRpbmdzCiAJICogZ2l2ZXMgcmlzZSB0byBzZXBhcmF0ZSB1bml2ZXJzZSBvZiBiaW5kaW5nIG9iamVjdHMuIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zCiAJICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB0aGUgYmluZGluZyBvYmplY3QgY29tZXMgZnJvbSBhIGRpZmZlcmVudCBBU1QuCiAJICogVXNlIDxjb2RlPmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcuZ2V0S2V5KCkpPC9jb2RlPiB3aGVuIHRoZSBiaW5kaW5nIGNvbWVzCkBAIC04MzcsNyArODM3LDcgQEAKIAkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgdGFibGUgb2YgZm9ybWF0dGVyIG9wdGlvbnMKIAkgKiAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pOwogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgc3RhbmRhcmQgZ2xvYmFsIG9wdGlvbnMKLQkgKiB7QGxpbmsgSmF2YUNvcmUjZ2V0T3B0aW9ucygpIEphdmFDb3JlLmdldE9wdGlvbnMoKX0uCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI2dldE9wdGlvbnMoKSBKYXZhQ29yZS5nZXRPcHRpb25zKCl9LgogCSAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2VzIHRvIHRoZQogCSAqIGRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlY29yZGVkIEFTVCBtb2RpZmljYXRpb25zCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IHBhc3NlZCBpcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQppbmRleCAwNGMzNjAxLi5mOGY5NDA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GYWxzZUxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcGxpY2l0RG9jVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2NGaWVsZFJlZmVyZW5jZTsKQEAgLTM1Myw2ICszNTQsOSBAQAogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgewogCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbiA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbikgbm9kZTsKIAkJCXJldHVybiBnZXRNZXRob2RCaW5kaW5nKGFsbG9jYXRpb24uYmluZGluZyk7CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEltcGxpY2l0RG9jVHlwZVJlZmVyZW5jZSkgeworCQkJSW1wbGljaXREb2NUeXBlUmVmZXJlbmNlIGltcGxpY2l0UmVmID0gKEltcGxpY2l0RG9jVHlwZVJlZmVyZW5jZSkgbm9kZTsKKwkJCXJldHVybiBnZXRUeXBlQmluZGluZyhpbXBsaWNpdFJlZi5yZXNvbHZlZFR5cGUpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YQppbmRleCAzMTJlNWQ4Li5jODk5NTE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQmluZGluZy5qYXZhCkBAIC0xNzIsOCArMTcyLDggQEAKIAkgKiBub3QgYmUgZGlmZmVyZW50OyBpbiB0aGVzZSBjYXNlcywgdGhlIGNsaWVudCBzaG91bGQgY29tcGFyZSBiaW5kaW5ncwogCSAqIHZpYSB0aGVpciBiaW5kaW5nIGtleXMgKDxjb2RlPmdldEtleTwvY29kZT4pIGlmIGF2YWlsYWJsZS4KIAkgKiAKLQkgKiBAcGFyYW0gb2JqIHtAaW5oZXJpdGRvY30KLQkgKiBAcmV0dXJuIHtAaW5oZXJpdGRvY30KKwkgKiBAcGFyYW0gb2JqIHtAaW5oZXJpdERvY30KKwkgKiBAcmV0dXJuIHtAaW5oZXJpdERvY30KIAkgKiBAc2VlICNnZXRLZXkoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmluZGV4IDMyMmQ3ZjMuLjE0YWQxYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpAQCAtMTcsOCArMTcsOCBAQAogICogb3Igc29tZSBzaW1wbGUgdmFsdWUgdHlwZSAoc3VjaCBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9yCiAgKiA8Y29kZT5JbmZpeEV4cHJlc3Npb24uT3BlcmF0b3I8L2NvZGU+KS4KICAqIAotICogQHNlZSBBU1ROb2RlI2dldFN0cnVjdHVyYWxQcm9wZXJ0eShTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpCi0gKiBAc2VlIEFTVE5vZGUjc2V0U3RydWN0dXJhbFByb3BlcnR5KFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcixPYmplY3QpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlI2dldFN0cnVjdHVyYWxQcm9wZXJ0eShTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNzZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciwgT2JqZWN0KQogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmluZGV4IDVjNDg2ZGYuLjJjMDRiZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCkBAIC04Miw3ICs4Miw3IEBACiAJCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgYSBzaW1wbGUgcHJvcGVydHkKLQkgKiAoaW5zdGFuY2Ugb2Yge0BsaW5rIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcikuCisJICogKGluc3RhbmNlIG9mIHtAbGluayBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3J9LgogCSAqIAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbXBsZSBwcm9wZXJ0eSwgYW5kIAogCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTkzLDcgKzkzLDcgQEAKIAkKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBhIGNoaWxkIHByb3BlcnR5Ci0JICogKGluc3RhbmNlIG9mIHtAbGluayBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcikuCisJICogKGluc3RhbmNlIG9mIHtAbGluayBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcn0uCiAJICogCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2hpbGQgcHJvcGVydHksIGFuZCAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBhIGNoaWxkIGxpc3QgcHJvcGVydHkKLQkgKiAoaW5zdGFuY2Ugb2Yge0BsaW5rIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcikuCisJICogKGluc3RhbmNlIG9mIHtAbGluayBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3J9LgogCSAqIAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGNoaWxkIGxpc3QgcHJvcGVydHksIGFuZCAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RhZ0VsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGFnRWxlbWVudC5qYXZhCmluZGV4IGIzZmI2Y2MuLmI1YzZkNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGFnRWxlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGFnRWxlbWVudC5qYXZhCkBAIC0zMDAsNyArMzAwLDcgQEAKIAkgKiBUaGUgZnJhZ21lbnRzIGNvdmVyIGV2ZXJ5dGhpbmcgZm9sbG93aW5nIHRoZSB0YWcgbmFtZQogCSAqIChvciBldmVyeXRoaW5nIGlmIHRoZXJlIGlzIG5vIHRhZyBuYW1lKSwgYW5kIGdlbmVyYWxseSBvbWl0CiAJICogZW1iZWRkZWQgbGluZSBicmVha3MgKGFuZCBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gbmV3IGxpbmVzLAotCSAqIGluY2x1ZGluZyBhbnkgbGVhZGluZyAiJmFzdDsiKS4ge0BsaW5rIFRhZ0VsZW1lbnR9CisJICogaW5jbHVkaW5nIGFueSBsZWFkaW5nICImYXN0OyIpLiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRhZ0VsZW1lbnR9CiAJICogbm9kZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRhZyBlbGVtZW50cyAoZS5nLiwgIkBsaW5rIikKIAkgKiBuZXN0ZWQgd2l0aGluIHRoaXMgdGFnIGVsZW1lbnQuIAogCSAqIDwvcD4KQEAgLTMxMywxMCArMzEzLDEwIEBACiAJICogVGFnRWxlbWVudCB3aXRoIHRhZyBuYW1lICJAcGFyYW0iOwogCSAqIDIgZnJhZ21lbnRzOiBTaW1wbGVOYW1lICgiYXJncyIpLCBUZXh0RWxlbWVudAogCSAqICgiIHRoZSBwcm9ncmFtIGFyZ3VtZW50cyIpPC9saT4KLQkgKiA8bGk+IkByZXR1cm4gU2VlIHtAbGluayAjZm9vIGZvb30gaW5zdGVhZC4iIC0gCisJICogPGxpPiJAcmV0dXJuIFNlZSB7JiM2NDtsaW5rICNmb28gZm9vfSBpbnN0ZWFkLiIgLSAKIAkgKiBUYWdFbGVtZW50IHdpdGggdGFnIG5hbWUgIkByZXR1cm4iOwogCSAqIDMgZnJhZ21lbnRzOiBUZXh0RWxlbWVudCAoIlNlZSAiKSwKLQkgKiBUYWdFbGVtZW50IChmb3IgIkBsaW5rICNmb28gZm9vIiksCisJICogVGFnRWxlbWVudCAoZm9yICImIzY0O2xpbmsgI2ZvbyBmb28iKSwKIAkgKiBUZXh0RWxlbWVudCAoIiBpbnN0ZWFkLiIpPC9saT4KIAkgKiA8L3VsPgogCSAqIFRoZSB1c2Ugb2YgTmFtZSwgTWV0aG9kUmVmLCBhbmQgTWVtYmVyUmVmIG5vZGVzIHdpdGhpbgpAQCAtMzI3LDcgKzMyNyw3IEBACiAJICogQWRkaW5nIGFuZCByZW1vdmluZyBub2RlcyBmcm9tIHRoaXMgbGlzdCBhZmZlY3RzIHRoaXMgbm9kZQogCSAqIGR5bmFtaWNhbGx5LiBUaGUgbm9kZXMgaW4gdGhpcyBsaXN0IG1heSBiZSBvZiB2YXJpb3VzCiAJICogdHlwZXMsIGluY2x1ZGluZyB7QGxpbmsgVGV4dEVsZW1lbnR9LCAKLQkgKiB7QGxpbmsgVGFnRWxlbWVudH0sIHtAbGluayBOYW1lfSwgCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UYWdFbGVtZW50fSwge0BsaW5rIE5hbWV9LCAKIAkgKiB7QGxpbmsgTWVtYmVyUmVmfSwgYW5kIHtAbGluayBNZXRob2RSZWZ9LgogCSAqIENsaWVudHMgc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBsaXN0IG9mIHR5cGVzIG1heSBncm93IGluCiAJICogdGhlIGZ1dHVyZSwgYW5kIHdyaXRlIHRoZWlyIGNvZGUgdG8gZGVhbCB3aXRoIHVuZXhwZWN0ZWQKQEAgLTM1MSw3ICszNTEsNyBAQAogCSAqICJAc2VlIiBhcmUgb25seSBtZWFuaW5nZnVsIGFzIHRvcC1sZXZlbCB0YWdzLgogCSAqIDxwPgogCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kcyBjaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIHBhcmVudAotCSAqIG9mIHRoaXMgbm9kZSBpcyBvZiB0eXBlIHtAbGluayBUYWdFbGVtZW50KX0uCisJICogb2YgdGhpcyBub2RlIGlzIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UYWdFbGVtZW50fS4KIAkgKiA8L3A+CiAJICogCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaXMgYSBuZXN0ZWQgdGFnIGVsZW1lbnQsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Mb2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvTG9jYXRpb24uamF2YQppbmRleCBmZjg2NWM5Li5lZjE5MmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Mb2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0xvY2F0aW9uLmphdmEKQEAgLTI0LDkgKzI0LDEwIEBACiAJcHVibGljIGJvb2xlYW4gbmVlZFNwYWNlOwogCXB1YmxpYyBib29sZWFuIHBlbmRpbmdTcGFjZTsKIAlwdWJsaWMgaW50IG5sc1RhZ0NvdW50ZXI7CisJcHVibGljIGludCBsYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCiAJLy8gY2h1bmsgbWFuYWdlbWVudAotCXB1YmxpYyBpbnQgbGFzdE51bWJlck9mTmV3TGluZXM7CQorCXB1YmxpYyBpbnQgbGFzdE51bWJlck9mTmV3TGluZXM7CiAJCiAJLy8gZWRpdHMgbWFuYWdlbWVudAogCWludCBlZGl0c0luZGV4OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvU2NyaWJlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9TY3JpYmUuamF2YQppbmRleCAyYzQwNGRlLi5iOTUxZGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9TY3JpYmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9TY3JpYmUuamF2YQpAQCAtMjkxLDExICsyOTEsMTMgQEAKIAkKIAlwdWJsaWMgdm9pZCBlbnRlckFsaWdubWVudChBbGlnbm1lbnQgYWxpZ25tZW50KXsKIAkJYWxpZ25tZW50LmVuY2xvc2luZyA9IHRoaXMuY3VycmVudEFsaWdubWVudDsKKwkJYWxpZ25tZW50LmxvY2F0aW9uLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmZvcm1hdHRlci5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCQl0aGlzLmN1cnJlbnRBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CiAJfQogCiAJcHVibGljIHZvaWQgZW50ZXJNZW1iZXJBbGlnbm1lbnQoQWxpZ25tZW50IGFsaWdubWVudCkgewogCQlhbGlnbm1lbnQuZW5jbG9zaW5nID0gdGhpcy5tZW1iZXJBbGlnbm1lbnQ7CisJCWFsaWdubWVudC5sb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKIAkJdGhpcy5tZW1iZXJBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CiAJfQogCkBAIC0zMDksNyArMzExLDcgQEAKIAkJCXRocm93IG5ldyBBYm9ydEZvcm1hdHRpbmcoImNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGFsaWdubWVudDogIithbGlnbm1lbnQpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gYWxpZ25tZW50LmxvY2F0aW9uLm91dHB1dEluZGVudGF0aW9uTGV2ZWw7Ci0JCQkKKwkJdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGFsaWdubWVudC5sb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwkKIAkJaWYgKGRpc2NhcmRBbGlnbm1lbnQpeyAKIAkJCXRoaXMuY3VycmVudEFsaWdubWVudCA9IGFsaWdubWVudC5lbmNsb3Npbmc7CiAJCX0KQEAgLTMyNSw2ICszMjcsNyBAQAogCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZygiY291bGQgbm90IGZpbmQgbWF0Y2hpbmcgYWxpZ25tZW50OiAiK2FsaWdubWVudCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBjdXJyZW50LmxvY2F0aW9uLm91dHB1dEluZGVudGF0aW9uTGV2ZWw7CisJCXRoaXMuZm9ybWF0dGVyLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBhbGlnbm1lbnQubG9jYXRpb24ubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydDsJCiAJCXRoaXMubWVtYmVyQWxpZ25tZW50ID0gY3VycmVudC5lbmNsb3Npbmc7CiAJfQogCQpAQCAtMTI2MSw3ICsxMjY0LDYgQEAKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5jdXJyZW50QWxpZ25tZW50LmxvY2F0aW9uLmlucHV0T2Zmc2V0LCB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24pOwogCQkvLyBjbGVhbiBhbGlnbm1lbnQgY2h1bmtLaW5kIHNvIGl0IHdpbGwgdGhpbmsgaXQgaXMgYSBuZXcgY2h1bmsgYWdhaW4KIAkJdGhpcy5jdXJyZW50QWxpZ25tZW50LmNodW5rS2luZCA9IDA7Ci0JCXRoaXMuZm9ybWF0dGVyLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSAtMTsKIAl9CiAKIAl2b2lkIHJlZG9NZW1iZXJBbGlnbm1lbnQoQWxpZ25tZW50RXhjZXB0aW9uIGUpewpAQCAtMTI3MCw3ICsxMjcyLDYgQEAKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5tZW1iZXJBbGlnbm1lbnQubG9jYXRpb24uaW5wdXRPZmZzZXQsIHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbik7CiAJCS8vIGNsZWFuIGFsaWdubWVudCBjaHVua0tpbmQgc28gaXQgd2lsbCB0aGluayBpdCBpcyBhIG5ldyBjaHVuayBhZ2FpbgogCQl0aGlzLm1lbWJlckFsaWdubWVudC5jaHVua0tpbmQgPSAwOwotCQl0aGlzLmZvcm1hdHRlci5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gLTE7CiAJfQogCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CkBAIC0xMjkzLDYgKzEyOTQsNyBAQAogCQlpZiAodGhpcy5lZGl0c0luZGV4ID4gMCkgewogCQkJdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXggLSAxXSA9IGxvY2F0aW9uLnRleHRFZGl0OwogCQl9CisJCXRoaXMuZm9ybWF0dGVyLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBsb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCX0KIAogCXByaXZhdGUgdm9pZCByZXNpemUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKaW5kZXggY2VmYjhkYy4uNDcwZTUxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc3BhdGhDb250YWluZXIuamF2YQpAQCAtNzgsMTMgKzc4LDEzIEBACiAJICogPHVsPgogCSAqIDxsaT57QGxpbmsgSmF2YUNvcmUjbmV3TGlicmFyeUVudHJ5KElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pfSBhbmQgdmFyaWFudHM8L2xpPgogCSAqIDxsaT57QGxpbmsgSmF2YUNvcmUjbmV3UHJvamVjdEVudHJ5KElQYXRoLCBib29sZWFuKX0gYW5kIHZhcmlhbnRzPC9saT4KLQkgKiA8bGk+e0BsaW5rIEphdmFDb3JlI2NyZWF0ZShJV29ya3NwYWNlUm9vdCk8L2xpPgotCSAqIDxsaT57QGxpbmsgSmF2YUNvcmUjY3JlYXRlKElQcm9qZWN0KTwvbGk+Ci0JICogPGxpPntAbGluayBJSmF2YU1vZGVsI2dldEphdmFQcm9qZWN0cygpPC9saT4KLQkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNnZXRSYXdDbGFzc3BhdGgoKTwvbGk+Ci0JICogPGxpPntAbGluayBJSmF2YVByb2plY3QjcmVhZFJhd0NsYXNzcGF0aCgpPC9saT4KLQkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNnZXRPdXRwdXRMb2NhdGlvbigpPC9saT4KLQkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNyZWFkT3V0cHV0TG9jYXRpb24oKTwvbGk+CisJICogPGxpPntAbGluayBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QpfTwvbGk+CisJICogPGxpPntAbGluayBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpfTwvbGk+CisJICogPGxpPntAbGluayBJSmF2YU1vZGVsI2dldEphdmFQcm9qZWN0cygpfTwvbGk+CisJICogPGxpPntAbGluayBJSmF2YVByb2plY3QjZ2V0UmF3Q2xhc3NwYXRoKCl9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNyZWFkUmF3Q2xhc3NwYXRoKCl9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNnZXRPdXRwdXRMb2NhdGlvbigpfTwvbGk+CisJICogPGxpPntAbGluayBJSmF2YVByb2plY3QjcmVhZE91dHB1dExvY2F0aW9uKCl9PC9saT4KIAkgKiA8bGk+SmF2YSBlbGVtZW50IG9wZXJhdGlvbnMgbWFya2VkIGFzICJoYW5kbGUtb25seSI8L2xpPgogCSAqIDwvdWw+CiAJICogVGhlIGVmZmVjdHMgb2YgdXNpbmcgb3RoZXIgSmF2YSBtb2RlbCBBUElzIGFyZSB1bnNwZWNpZmllZC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21waWxhdGlvblVuaXQuamF2YQppbmRleCA2MWM4MDg4Li43YWRmYzhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC01MTgsNyArNTE4LDcgQEAKICAqIDwvcD4KICAqCiAgKiBAcGFyYW0gYXN0TGV2ZWwgZWl0aGVyIHtAbGluayAjTk9fQVNUfSBpZiBubyBBU1QgaXMgd2FudGVkLAotICogb3IgdGhlIHtAbGlua3BsYWluIEFTVCNBU1QoaW50KSBBU1QgQVBJIGxldmVsfSBvZiB0aGUgQVNUIGlmIG9uZSBpcyB3YW50ZWQKKyAqIG9yIHRoZSB7QGxpbmtwbGFpbiBBU1QjbmV3QVNUKGludCkgQVNUIEFQSSBsZXZlbH0gb2YgdGhlIEFTVCBpZiBvbmUgaXMgd2FudGVkCiAgKiBAcGFyYW0gZm9yY2VQcm9ibGVtRGV0ZWN0aW9uIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHByb2JsZW0gc2hvdWxkIGJlIAogICogICByZWNvbXB1dGVkIGV2ZW4gaWYgdGhlIHNvdXJjZSBoYXNuJ3QgY2hhbmdlZAogICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1NpZ25hdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKaW5kZXggNjNlNGQ0Ny4uNDA4YmE1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKQEAgLTQ0NSw3ICs0NDUsNyBAQAogICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMKICAqIEBwYXJhbSByZXR1cm5UeXBlIHRoZSByZXR1cm4gdHlwZSBzaWduYXR1cmUKICAqIEByZXR1cm4gdGhlIGVuY29kZWQgbWV0aG9kIHNpZ25hdHVyZQotICogQHNlZSBTaWduYXR1cmUjY3JlYXRlTWV0aG9kU2lnbmF0dXJlKFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmdbXSkKKyAqIEBzZWUgU2lnbmF0dXJlI2NyZWF0ZU1ldGhvZFNpZ25hdHVyZShjaGFyW11bXSwgY2hhcltdKQogICovCiBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVNZXRob2RTaWduYXR1cmUoU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMsIFN0cmluZyByZXR1cm5UeXBlKSB7CiAJaW50IHBhcmFtZXRlclR5cGVzTGVudGggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lDb2RlU25pcHBldFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YQppbmRleCBjMTE0ZGU4Li42OGUyYzkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lDb2RlU25pcHBldFJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUNvZGVTbmlwcGV0UmVxdWVzdG9yLmphdmEKQEAgLTIyLDggKzIyLDggQEAKICAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBwcm92aWRlIGEgYnJpZGdlIGEgcnVubmluZyBKYXZhIFZNLgogICogPC9wPgogICoKLSAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I2V2YWx1YXRlQ29kZVNuaXBwZXQoU3RyaW5nLCBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCi0gKiBAc2VlIElFdmFsdWF0aW9uQ29udGV4dCNldmFsdWF0ZUNvZGVTbmlwcGV0KFN0cmluZywgU3RyaW5nW10sIFN0cmluZ1tdLCBpbnRbXSwgSVR5cGUsIGJvb2xlYW4sIGJvb2xlYW4sIElDb2RlU25pcHBldFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcikKKyAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I2V2YWx1YXRlQ29kZVNuaXBwZXQoU3RyaW5nLCBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorICogQHNlZSBJRXZhbHVhdGlvbkNvbnRleHQjZXZhbHVhdGVDb2RlU25pcHBldChTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmdbXSwgaW50W10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlLCBib29sZWFuLCBib29sZWFuLCBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDb2RlU25pcHBldFJlcXVlc3RvciB7CiAJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCmluZGV4IDMxNzUwMmMuLjMxN2E2MjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKiBSZXR1cm5zIHRoZSBtb2RpZmllciBmbGFncyBmb3IgdGhpcyBpbXBvcnQuIFRoZSBmbGFncyBjYW4gYmUgZXhhbWluZWQgdXNpbmcgY2xhc3MKICAqIDxjb2RlPkZsYWdzPC9jb2RlPi4gT25seSB0aGUgc3RhdGljIGZsYWcgaXMgbWVhbmluZ2Z1bCBmb3IgaW1wb3J0IGRlY2xhcmF0aW9ucy4KICAqIEByZXR1cm4gdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIGltcG9ydAotICogQHNlZSBGbGFncworICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFncwogICogQHNpbmNlIDMuMAogICovCiBpbnQgZ2V0RmxhZ3MoKTsKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KICAqIDwvcD4KICAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MgZm9yIHRoaXMgaW1wb3J0Ci0gKiBAc2VlIEZsYWdzCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzCiAgKiBAc2luY2UgMy4wCiAgKi8KIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YQppbmRleCA3MzQzYTQxLi5iZGQ4MmZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb2RlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29kZUF0dHJpYnV0ZS5qYXZhCkBAIC05OCw5ICs5OCw2IEBACiAJCiAJLyoqCiAJICogRGVmaW5lIGEgSmF2YSBvcGNvZGVzIHdhbGtlci4gQWxsIGFjdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIHZpc2l0b3IuCi0JICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRpc2Fzc2VtYmxlIG91dHB1dAotCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIFRoZSBsaW5lIHNlcGFyYXRvciB1c2VkIHRvIHB1dCBlYWNoIG9wY29kZSBvbiBpdHMgb3duIGxpbmUKLQkgKiBAcGFyYW0gdGFiTnVtYmVyIHRoZSBudW1iZXIgb2YgaW5kZW50YXRpb24gKFNQQUNFIG9yIFRBQikKIAkgKiBAcGFyYW0gdmlzaXRvciBUaGUgdmlzaXRvciB0byB1c2UgdG8gd2FsayB0aGUgb3Bjb2Rlcy4KIAkgKiAKIAkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIG9wY29kZXMgY29udGFpbiBpbnZhbGlkIGJ5dGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEKaW5kZXggZjY5ZmYyOS4uMWUxNGU4NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Eb2N1bWVudEVsZW1lbnRQYXJzZXIuamF2YQpAQCAtMTMwMSwxNiArMTMwMSwxNCBAQAogfQogcHJvdGVjdGVkIHZvaWQgcHVzaE9uSW50QXJyYXlTdGFjayhpbnRbXSBwb3NpdGlvbnMpIHsKIAotCXRyeSB7Ci0JCWludEFycmF5U3RhY2tbKytpbnRBcnJheVB0cl0gPSBwb3NpdGlvbnM7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCS8vaW50UHRyIGlzIGNvcnJlY3QgCi0JCWludCBvbGRTdGFja0xlbmd0aCA9IGludEFycmF5U3RhY2subGVuZ3RoOwotCQlpbnQgb2xkU3RhY2tbXVtdID0gaW50QXJyYXlTdGFjazsKLQkJaW50QXJyYXlTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF1bXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgaW50QXJyYXlTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyXSA9IHBvc2l0aW9uczsKKwlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmludEFycmF5U3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuaW50QXJyYXlQdHIgPj0gc3RhY2tMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuaW50QXJyYXlTdGFjaywgMCwKKwkJCXRoaXMuaW50QXJyYXlTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF1bXSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKIAl9CisJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0cl0gPSBwb3NpdGlvbnM7CiB9CiBwcm90ZWN0ZWQgdm9pZCByZXNldE1vZGlmaWVycygpIHsKIAlzdXBlci5yZXNldE1vZGlmaWVycygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEKaW5kZXggMDkwZWE0Ni4uMmVhZTM2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCkBAIC03OTcsMjYgKzc5NywyOSBAQAogCQkJCQkJfQogCQkJCQkJCiAJCQkJCQkvLyBlbnN1cmUgY3VzdG9tIG91dHB1dCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggb3RoZXIgb3V0cHV0cwotCQkJCQkJaW50IGluZGV4OwotCQkJCQkJCiAJCQkJCQkvLyBjaGVjayBleGFjdCBtYXRjaAotCQkJCQkJaWYgKChpbmRleCA9IFV0aWwuaW5kZXhPZk1hdGNoaW5nUGF0aChjdXN0b21PdXRwdXQsIG91dHB1dExvY2F0aW9ucywgb3V0cHV0Q291bnQpKSAhPSAtMSkgeworCQkJCQkJaWYgKFV0aWwuaW5kZXhPZk1hdGNoaW5nUGF0aChjdXN0b21PdXRwdXQsIG91dHB1dExvY2F0aW9ucywgb3V0cHV0Q291bnQpICE9IC0xKSB7CiAJCQkJCQkJY29udGludWU7IC8vIGFscmVhZHkgZm91bmQKIAkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gY2hlY2sgbmVzdGluZwotCQkJCQkJaWYgKChpbmRleCA9IFV0aWwuaW5kZXhPZkVuY2xvc2luZ1BhdGgoY3VzdG9tT3V0cHV0LCBvdXRwdXRMb2NhdGlvbnMsIG91dHB1dENvdW50KSkgIT0gLTEpIHsKLQkJCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJCQkvLyBjdXN0b20gb3V0cHV0IGlzIG5lc3RlZCBpbiBwcm9qZWN0J3Mgb3V0cHV0OiBuZWVkIHRvIGNoZWNrIGlmIGFsbCBzb3VyY2UgZW50cmllcyBoYXZlIGEgY3VzdG9tCi0JCQkJCQkJCS8vIG91dHB1dCBiZWZvcmUgY29tcGxhaW5pbmcKLQkJCQkJCQkJaWYgKHBvdGVudGlhbE5lc3RlZE91dHB1dCA9PSBudWxsKSBwb3RlbnRpYWxOZXN0ZWRPdXRwdXQgPSBjdXN0b21PdXRwdXQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluT3V0cHV0IiwgY3VzdG9tT3V0cHV0Lm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIG91dHB1dExvY2F0aW9uc1tpbmRleF0ubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQorCQkJCQkJLy8gYWNjdW11bGF0ZSBhbGwgb3V0cHV0cywgd2lsbCBjaGVjayBuZXN0aW5nIG9uY2UgYWxsIGF2YWlsYWJsZSAodG8gaGFuZGxlIG9yZGVyaW5nIGlzc3VlcykKIAkJCQkJCW91dHB1dExvY2F0aW9uc1tvdXRwdXRDb3VudCsrXSA9IGN1c3RvbU91dHB1dDsKIAkJCQkJfQotCQkJfQkKKwkJCX0KKwkJfQorCQkvLyBjaGVjayBuZXN0aW5nIGFjcm9zcyBvdXRwdXQgbG9jYXRpb25zCisJCWZvciAoaW50IGkgPSAxIC8qbm8gY2hlY2sgZm9yIGRlZmF1bHQgb3V0cHV0Ki8gOyBpIDwgb3V0cHV0Q291bnQ7IGkrKykgeworCQkgICAgSVBhdGggY3VzdG9tT3V0cHV0ID0gb3V0cHV0TG9jYXRpb25zW2ldOworCQkgICAgaW50IGluZGV4OworCQkJLy8gY2hlY2sgbmVzdGluZworCQkJaWYgKChpbmRleCA9IFV0aWwuaW5kZXhPZkVuY2xvc2luZ1BhdGgoY3VzdG9tT3V0cHV0LCBvdXRwdXRMb2NhdGlvbnMsIG91dHB1dENvdW50KSkgIT0gLTEgJiYgaW5kZXggIT0gaSkgeworCQkJCWlmIChpbmRleCA9PSAwKSB7CisJCQkJCS8vIGN1c3RvbSBvdXRwdXQgaXMgbmVzdGVkIGluIHByb2plY3QncyBvdXRwdXQ6IG5lZWQgdG8gY2hlY2sgaWYgYWxsIHNvdXJjZSBlbnRyaWVzIGhhdmUgYSBjdXN0b20KKwkJCQkJLy8gb3V0cHV0IGJlZm9yZSBjb21wbGFpbmluZworCQkJCQlpZiAocG90ZW50aWFsTmVzdGVkT3V0cHV0ID09IG51bGwpIHBvdGVudGlhbE5lc3RlZE91dHB1dCA9IGN1c3RvbU91dHB1dDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0T3V0cHV0SW5PdXRwdXQiLCBjdXN0b21PdXRwdXQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb25zW2luZGV4XS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CiAJCX0JCiAJCS8vIGFsbG93IGN1c3RvbSBvdXRwdXQgbmVzdGluZyBpbiBwcm9qZWN0J3Mgb3V0cHV0IGlmIGFsbCBzb3VyY2UgZW50cmllcyBoYXZlIGEgY3VzdG9tIG91dHB1dAogCQlpZiAoc291cmNlRW50cnlDb3VudCA8PSBvdXRwdXRDb3VudC0xKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YQppbmRleCAzY2Y5MzIyLi42MjFmYjQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc29yLmphdmEKQEAgLTQyMCw2ICs0MjAsNyBAQAogCQkJCQkJCQkJdGhpcy5yZW1vdmVGcm9tUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7CiAJCQkJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlUGVyUHJvamVjdEluZm8oamF2YVByb2plY3QpOwogCQkJCQkJCQl9CisJCQkJCQkJCXRoaXMuc3RhdGUucm9vdHNBcmVTdGFsZSA9IHRydWU7CiAJCQkJCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSAhPSAwKSB7CiAJCQkJCQkJCWJvb2xlYW4gd2FzSmF2YVByb2plY3QgPSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZmluZEphdmFQcm9qZWN0KHByb2plY3QpICE9IG51bGw7CiAJCQkJCQkJCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCk7CkBAIC0xNTM2LDEwICsxNTM3LDExIEBACiAJCQl9CiAJCX0KIAotCQlKYXZhRWxlbWVudERlbHRhIGVsZW1lbnREZWx0YSA9IGN1cnJlbnREZWx0YSgpLmZpbmQoZWxlbWVudCk7CisJCUphdmFFbGVtZW50RGVsdGEgY3VycmVudCA9IGN1cnJlbnREZWx0YSgpOworCQlKYXZhRWxlbWVudERlbHRhIGVsZW1lbnREZWx0YSA9IGN1cnJlbnQuZmluZChlbGVtZW50KTsKIAkJaWYgKGVsZW1lbnREZWx0YSA9PSBudWxsKSB7Ci0JCQljdXJyZW50RGVsdGEoKS5jaGFuZ2VkKGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7Ci0JCQllbGVtZW50RGVsdGEgPSBjdXJyZW50RGVsdGEoKS5maW5kKGVsZW1lbnQpOworCQkJLy8gZG9uJ3QgdXNlIGZpbmQgYWZ0ZXIgY3JlYXRpbmcgdGhlIGRlbHRhIGFzIGl0IGNhbiBiZSBudWxsIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNDM0KQorCQkJZWxlbWVudERlbHRhID0gY3VycmVudC5jaGFuZ2VkKGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7CiAJCX0KIAkJZWxlbWVudERlbHRhLmFkZFJlc291cmNlRGVsdGEoZGVsdGEpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YQppbmRleCBmNjBhNTljLi5lYTNkMmE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhCkBAIC0yMjQsMTAgKzIyNCwxMSBAQAogICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKICAqIGFuZCB0aGVuIGEgY2hhbmdlIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KICAqLwotcHVibGljIHZvaWQgY2hhbmdlZChJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGNoYW5nZUZsYWcpIHsKK3B1YmxpYyBKYXZhRWxlbWVudERlbHRhIGNoYW5nZWQoSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBjaGFuZ2VGbGFnKSB7CiAJSmF2YUVsZW1lbnREZWx0YSBjaGFuZ2VkRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShlbGVtZW50KTsKIAljaGFuZ2VkRGVsdGEuY2hhbmdlZChjaGFuZ2VGbGFnKTsKIAlpbnNlcnREZWx0YVRyZWUoZWxlbWVudCwgY2hhbmdlZERlbHRhKTsKKwlyZXR1cm4gY2hhbmdlZERlbHRhOwogfQogLyoqCiAgKiBNYXJrIHRoaXMgZGVsdGEgYXMgYSBjb250ZW50IGNoYW5nZWQgZGVsdGEuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEKaW5kZXggODA0ZTBhOC4uMjU4M2NlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE1hbmFnZXIuamF2YQpAQCAtNzQyLDQ2ICs3NDIsNDkgQEAKIAkgKiBhbmQgcmVnaXN0ZXIgaXQuCiAJICogQ2xvc2UgdGhlIHdvcmtpbmcgY29weSwgaXRzIGJ1ZmZlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHNoYXJlZCB3b3JraW5nIGNvcHkgdGFibGUuCiAJICogSWdub3JlIGlmIG5vIHBlci13b3JraW5nIGNvcHkgaW5mbyBleGlzdGVkLgotCSAqIE5PVEU6IGl0IG11c3QgYmUgc3luY2hyb25pemVkIGFzIGl0IG1heSBpbnRlcmFjdCB3aXRoIHRoZSBlbGVtZW50IGluZm8gY2FjaGUgKGlmIHVzZUNvdW50IGlzIGRlY3JlbWVudGVkIHRvIDApLCBzZWUgYnVnIDUwNjY3LgorCSAqIE5PVEU6IGl0IG11c3QgTk9UIGJlIHN5bmNocm9uaXplZCBhcyBpdCBtYXkgaW50ZXJhY3Qgd2l0aCB0aGUgZWxlbWVudCBpbmZvIGNhY2hlIChpZiB1c2VDb3VudCBpcyBkZWNyZW1lbnRlZCB0byAwKSwgc2VlIGJ1ZyA1MDY2Ny4KIAkgKiBSZXR1cm5zIHRoZSBuZXcgdXNlIGNvdW50IChvciAtMSBpZiBpdCBkaWRuJ3QgZXhpc3QpLgogCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRpc2NhcmRQZXJXb3JraW5nQ29weUluZm8oQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IGRpc2NhcmRQZXJXb3JraW5nQ29weUluZm8oQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCS8vIGNyZWF0ZSB0aGUgZGVsdGEgYnVpbGRlciAodGhpcyByZW1lbWJlcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgd29ya2luZyBjb3B5KQorCQkvLyBvdXRzaWRlIHRoZSBwZXJXb3JraW5nQ29weUluZm9zIGxvY2sgKHNlZSBidWcgNTA2NjcpCisJCUphdmFFbGVtZW50RGVsdGFCdWlsZGVyIGRlbHRhQnVpbGRlciA9IG51bGw7CisJCWlmICh3b3JraW5nQ29weS5pc1ByaW1hcnkoKSkgeworCQkJZGVsdGFCdWlsZGVyID0gbmV3IEphdmFFbGVtZW50RGVsdGFCdWlsZGVyKHdvcmtpbmdDb3B5KTsKKwkJfQorCQlQZXJXb3JraW5nQ29weUluZm8gaW5mbyA9IG51bGw7CiAJCXN5bmNocm9uaXplZCh0aGlzLnBlcldvcmtpbmdDb3B5SW5mb3MpIHsKIAkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIgPSB3b3JraW5nQ29weS5vd25lcjsKIAkJCU1hcCB3b3JraW5nQ29weVRvSW5mb3MgPSAoTWFwKXRoaXMucGVyV29ya2luZ0NvcHlJbmZvcy5nZXQob3duZXIpOwogCQkJaWYgKHdvcmtpbmdDb3B5VG9JbmZvcyA9PSBudWxsKSByZXR1cm4gLTE7CiAJCQkKLQkJCVBlcldvcmtpbmdDb3B5SW5mbyBpbmZvID0gKFBlcldvcmtpbmdDb3B5SW5mbyl3b3JraW5nQ29weVRvSW5mb3MuZ2V0KHdvcmtpbmdDb3B5KTsKKwkJCWluZm8gPSAoUGVyV29ya2luZ0NvcHlJbmZvKXdvcmtpbmdDb3B5VG9JbmZvcy5nZXQod29ya2luZ0NvcHkpOwogCQkJaWYgKGluZm8gPT0gbnVsbCkgcmV0dXJuIC0xOwogCQkJCiAJCQlpZiAoLS1pbmZvLnVzZUNvdW50ID09IDApIHsKLQkJCQkvLyBjcmVhdGUgdGhlIGRlbHRhIGJ1aWxkZXIgKHRoaXMgcmVtZW1iZXJzIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIHdvcmtpbmcgY29weSkKLQkJCQlKYXZhRWxlbWVudERlbHRhQnVpbGRlciBkZWx0YUJ1aWxkZXIgPSBudWxsOwotCQkJCWlmICh3b3JraW5nQ29weS5pc1ByaW1hcnkoKSkgewotCQkJCQlkZWx0YUJ1aWxkZXIgPSBuZXcgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIod29ya2luZ0NvcHkpOwotCQkJCX0KLQogCQkJCS8vIHJlbW92ZSBwZXIgd29ya2luZyBjb3B5IGluZm8KIAkJCQl3b3JraW5nQ29weVRvSW5mb3MucmVtb3ZlKHdvcmtpbmdDb3B5KTsKIAkJCQlpZiAod29ya2luZ0NvcHlUb0luZm9zLmlzRW1wdHkoKSkgewogCQkJCQl0aGlzLnBlcldvcmtpbmdDb3B5SW5mb3MucmVtb3ZlKG93bmVyKTsKIAkJCQl9Ci0KLQkJCQkvLyByZW1vdmUgaW5mb3MgKyBjbG9zZSBidWZmZXIgKHNpbmNlIG5vIGxvbmdlciB3b3JraW5nIGNvcHkpCi0JCQkJcmVtb3ZlSW5mb0FuZENoaWxkcmVuKHdvcmtpbmdDb3B5KTsKLQkJCQl3b3JraW5nQ29weS5jbG9zZUJ1ZmZlcigpOwotCi0JCQkJLy8gY29tcHV0ZSB0aGUgZGVsdGEgaWYgbmVlZGVkIGFuZCByZWdpc3RlciBpdCBpZiB0aGVyZSBhcmUgY2hhbmdlcwotCQkJCWlmIChkZWx0YUJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQlkZWx0YUJ1aWxkZXIuYnVpbGREZWx0YXMoKTsKLQkJCQkJaWYgKChkZWx0YUJ1aWxkZXIuZGVsdGEgIT0gbnVsbCkgJiYgKGRlbHRhQnVpbGRlci5kZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkpIHsKLQkJCQkJCWdldERlbHRhUHJvY2Vzc29yKCkucmVnaXN0ZXJKYXZhTW9kZWxEZWx0YShkZWx0YUJ1aWxkZXIuZGVsdGEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQogCQkJfQotCQkJcmV0dXJuIGluZm8udXNlQ291bnQ7CiAJCX0KKwkJaWYgKGluZm8udXNlQ291bnQgPT0gMCkgeyAvLyBpbmZvIGNhbm5vdCBiZSBudWxsIGhlcmUgKGNoZWNrIHdhcyBkb25lIGFib3ZlKQorCQkJLy8gcmVtb3ZlIGluZm9zICsgY2xvc2UgYnVmZmVyIChzaW5jZSBubyBsb25nZXIgd29ya2luZyBjb3B5KQorCQkJLy8gb3V0c2lkZSB0aGUgcGVyV29ya2luZ0NvcHlJbmZvcyBsb2NrIChzZWUgYnVnIDUwNjY3KQorCQkJcmVtb3ZlSW5mb0FuZENoaWxkcmVuKHdvcmtpbmdDb3B5KTsKKwkJCXdvcmtpbmdDb3B5LmNsb3NlQnVmZmVyKCk7CisKKwkJCS8vIGNvbXB1dGUgdGhlIGRlbHRhIGlmIG5lZWRlZCBhbmQgcmVnaXN0ZXIgaXQgaWYgdGhlcmUgYXJlIGNoYW5nZXMKKwkJCWlmIChkZWx0YUJ1aWxkZXIgIT0gbnVsbCkgeworCQkJCWRlbHRhQnVpbGRlci5idWlsZERlbHRhcygpOworCQkJCWlmICgoZGVsdGFCdWlsZGVyLmRlbHRhICE9IG51bGwpICYmIChkZWx0YUJ1aWxkZXIuZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApKSB7CisJCQkJCWdldERlbHRhUHJvY2Vzc29yKCkucmVnaXN0ZXJKYXZhTW9kZWxEZWx0YShkZWx0YUJ1aWxkZXIuZGVsdGEpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5mby51c2VDb3VudDsKIAl9CiAJCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YQppbmRleCAyZTYwZmY5Li40NzIwZDFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0LmphdmEKQEAgLTk5OSw3ICs5OTksNyBAQAogCS8qCiAJICogbm9uIHBhdGggY2Fub25pY2FsaXppbmcgdmVyc2lvbgogCSAqLwotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQwKElQYXRoIHBhdGgpIAorCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50MChJUGF0aCBwYXRoKSAKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKIAkJTmFtZUxvb2t1cCBsb29rdXAgPSBuZXdOYW1lTG9va3VwKChXb3JraW5nQ29weU93bmVyKW51bGwvKm5vIG5lZWQgdG8gbG9vayBhdCB3b3JraW5nIGNvcGllcyBmb3IgcGtncyovKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YQppbmRleCA5NzI3OGQ4Li5kYzAyMzRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZUxvb2t1cC5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwpAQCAtMjQ4LDEwICsyNDcsMTAgQEAKIAkJCWlmIChmcm9tRmFjdG9yeSA9PSBudWxsKSB7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9Ci0JCQlpZiAoZnJvbUZhY3RvcnkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBmcm9tRmFjdG9yeTsKLQkJCX0gZWxzZQotCQkJCWlmIChmcm9tRmFjdG9yeSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgeworCQkJc3dpdGNoIChmcm9tRmFjdG9yeS5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKKwkJCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBmcm9tRmFjdG9yeTsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CiAJCQkJCS8vIGRlZmF1bHQgcGFja2FnZSBpbiBhIGRlZmF1bHQgcm9vdAogCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBmcm9tRmFjdG9yeTsKIAkJCQkJdHJ5IHsKQEAgLTI3Miw3ICsyNzEsMTAgQEAKIAkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkJCXJldHVybiBudWxsOwogCQkJCQl9Ci0JCQkJfQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnRSb290KWZyb21GYWN0b3J5KS5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQppbmRleCBjNzViM2NmLi4zMzdiYTljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQpAQCAtNzU2LDggKzc1NiwxMiBAQAogfQogcHVibGljIGJvb2xlYW4gc3ViT3JTdXBlck9mRm9jdXMoUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZykgewogCWlmICh0aGlzLmZvY3VzVHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gYWNjZXB0IGFsbCB0eXBlcyAoY2FzZSBvZiBoaWVyYXJjaHkgaW4gYSByZWdpb24pCi0JaWYgKHRoaXMuc3ViVHlwZU9mVHlwZSh0aGlzLmZvY3VzVHlwZSwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsKLQlpZiAoIXRoaXMuc3VwZXJUeXBlc09ubHkgJiYgdGhpcy5zdWJUeXBlT2ZUeXBlKHR5cGVCaW5kaW5nLCB0aGlzLmZvY3VzVHlwZSkpIHJldHVybiB0cnVlOworCXRyeSB7CisJCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUodGhpcy5mb2N1c1R5cGUsIHR5cGVCaW5kaW5nKSkgcmV0dXJuIHRydWU7CisJCWlmICghdGhpcy5zdXBlclR5cGVzT25seSAmJiB0aGlzLnN1YlR5cGVPZlR5cGUodHlwZUJpbmRpbmcsIHRoaXMuZm9jdXNUeXBlKSkgcmV0dXJuIHRydWU7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCS8vIHVucmVzb2x2ZWQgc3VwZXJjbGFzcy9zdXBlcmludGVyZmFjZSAtPiBpZ25vcmUKKwl9CiAJcmV0dXJuIGZhbHNlOwogfQogcHJpdmF0ZSBib29sZWFuIHN1YlR5cGVPZlR5cGUoUmVmZXJlbmNlQmluZGluZyBzdWJUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbW1lbnRSZWNvcmRlclBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db21tZW50UmVjb3JkZXJQYXJzZXIuamF2YQppbmRleCAyYzg0MTRlLi5jOTI2NTgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbW1lbnRSZWNvcmRlclBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29tbWVudFJlY29yZGVyUGFyc2VyLmphdmEKQEAgLTIzNCwyMiArMjM0LDE5IEBACiAJCQlpbnQgc2Nhbm5lclN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbaV08MCA/IC10aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXSA6IHRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzW2ldOwogCQkJaW50IGNvbW1lbnRTdGFydCA9IHRoaXMuY29tbWVudFB0ciA9PSAtMSA/IC0xIDogKHRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdPDAgPyAtdGhpcy5jb21tZW50U3RhcnRzW3RoaXMuY29tbWVudFB0cl0gOiB0aGlzLmNvbW1lbnRTdGFydHNbdGhpcy5jb21tZW50UHRyXSk7CiAJCQlpZiAoY29tbWVudFN0YXJ0ID09IC0xIHx8ICBzY2FubmVyU3RhcnQgPiBjb21tZW50U3RhcnQpIHsKLQkJCQl0cnkgewotCQkJCQl0aGlzLmNvbW1lbnRQdHIrKzsKLQkJCQkJdGhpcy5jb21tZW50U3RhcnRzW3RoaXMuY29tbWVudFB0cl0gPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXTsKLQkJCQkJdGhpcy5jb21tZW50U3RvcHNbdGhpcy5jb21tZW50UHRyXSA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbaV07Ci0JCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoaXMuY29tbWVudFB0ciBpcyBzdGlsbCBjb3JyZWN0IAotCQkJCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmNvbW1lbnRTdGFydHMubGVuZ3RoOwotCQkJCQlpbnQgb2xkQ29tbWVudFN0YXJ0c1tdID0gdGhpcy5jb21tZW50U3RhcnRzOwotCQkJCQl0aGlzLmNvbW1lbnRTdGFydHMgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgQ29tbWVudEluY3JlbWVudF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29tbWVudFN0YXJ0cywgMCwgdGhpcy5jb21tZW50U3RhcnRzLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCQkJCXRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbaV07Ci0JCQkJCWludCBvbGRDb21tZW50U3RvcHNbXSA9IHRoaXMuY29tbWVudFN0b3BzOwotCQkJCQl0aGlzLmNvbW1lbnRTdG9wcyA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBDb21tZW50SW5jcmVtZW50XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShvbGRDb21tZW50U3RvcHMsIDAsIHRoaXMuY29tbWVudFN0b3BzLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCQkJCXRoaXMuY29tbWVudFN0b3BzW3RoaXMuY29tbWVudFB0cl0gPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2ldOworCQkJCWludCBzdGFja0xlbmd0aCA9IHRoaXMuY29tbWVudFN0YXJ0cy5sZW5ndGg7CisJCQkJaWYgKCsrdGhpcy5jb21tZW50UHRyID49IHN0YWNrTGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQl0aGlzLmNvbW1lbnRTdGFydHMsIDAsCisJCQkJCQl0aGlzLmNvbW1lbnRTdGFydHMgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgQ29tbWVudEluY3JlbWVudF0sIDAsCisJCQkJCQlzdGFja0xlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQl0aGlzLmNvbW1lbnRTdG9wcywgMCwKKwkJCQkJCXRoaXMuY29tbWVudFN0b3BzID0gbmV3IGludFtzdGFja0xlbmd0aCArIENvbW1lbnRJbmNyZW1lbnRdLCAwLAorCQkJCQkJc3RhY2tMZW5ndGgpOwogCQkJCX0KKwkJCQl0aGlzLmNvbW1lbnRTdGFydHNbdGhpcy5jb21tZW50UHRyXSA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzW2ldOworCQkJCXRoaXMuY29tbWVudFN0b3BzW3RoaXMuY29tbWVudFB0cl0gPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2ldOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9QdWJsaWNTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQppbmRleCAwYjk4ZGQ3Li42NzEzYjQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQpAQCAtMjA4LDggKzIwOCw5IEBACiAJCXJldHVybjsKIAl9CiAJaW50IGZvdW5kVGFza0luZGV4ID0gdGhpcy5mb3VuZFRhc2tDb3VudDsKLQljaGFyIHByZXZpb3VzID0gY29tbWVudFN0YXJ0PT0wID8gMCA6IHRoaXMuc291cmNlW2NvbW1lbnRTdGFydC0xXTsKLQluZXh0Q2hhciA6IGZvciAoaW50IGkgPSBjb21tZW50U3RhcnQ7IGkgPCBjb21tZW50RW5kICYmIGkgPCB0aGlzLmVvZlBvc2l0aW9uOyBpKyspIHsKKwljaGFyIHByZXZpb3VzID0gc3JjW2NvbW1lbnRTdGFydCsxXTsgLy8gc2hvdWxkIGJlICcqJyBvciAnLycKKwluZXh0Q2hhciA6IGZvciAoCisJCWludCBpID0gY29tbWVudFN0YXJ0ICsgMjsgaSA8IGNvbW1lbnRFbmQgJiYgaSA8IHRoaXMuZW9mUG9zaXRpb247IGkrKykgewogCQljaGFyW10gdGFnID0gbnVsbDsKIAkJY2hhcltdIHByaW9yaXR5ID0gbnVsbDsKIAkJLy8gY2hlY2sgZm9yIHRhZyBvY2N1cnJlbmNlIG9ubHkgaWYgbm90IGFtYmlndW91cyB3aXRoIGphdmFkb2MgdGFnCkBAIC0yMjgsNyArMjI5LDggQEAKIAkKIAkJCQlmb3IgKGludCB0ID0gMDsgdCA8IHRhZ0xlbmd0aDsgdCsrKSB7CiAJCQkJCWNoYXIgc2MsIHRjOwotCQkJCQlpZiAoKGkrdCkgPj0gdGhpcy5lb2ZQb3NpdGlvbikgY29udGludWUgbmV4dFRhZzsKKwkJCQkJaW50IHggPSBpK3Q7CisJCQkJCWlmICh4ID49IHRoaXMuZW9mUG9zaXRpb24gfHwgeCA+PSBjb21tZW50RW5kKSBjb250aW51ZSBuZXh0VGFnOwogCQkJCQlpZiAoKHNjID0gc3JjW2kgKyB0XSkgIT0gKHRjID0gdGFnW3RdKSkgeyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZSBjaGVjawogCQkJCQkJaWYgKHRoaXMuaXNUYXNrQ2FzZVNlbnNpdGl2ZSB8fCAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNjKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGMpKSkgeyAJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjawogCQkJCQkJCWNvbnRpbnVlIG5leHRUYWc7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbC5qYXZhCmluZGV4IDg5NzEyNjYuLjU4ZjY3MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbC5qYXZhCkBAIC04NjcsMTUgKzg2NywyMiBAQAogCX0KIAkKIAkJLyoKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJndW1lbnQgcGF0aHMgd2hpY2ggaXMgc3RyaWN0bHkgZW5jbG9zaW5nIHRoZSBwYXRoIHRvIGNoZWNrCisJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1vc3Qgc3BlY2lmaWMgYXJndW1lbnQgcGF0aHMgd2hpY2ggaXMgc3RyaWN0bHkgZW5jbG9zaW5nIHRoZSBwYXRoIHRvIGNoZWNrCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkVuY2xvc2luZ1BhdGgoSVBhdGggY2hlY2tlZFBhdGgsIElQYXRoW10gcGF0aHMsIGludCBwYXRoQ291bnQpIHsKIAorCSAgICBpbnQgYmVzdE1hdGNoID0gLTEsIGJlc3RMZW5ndGggPSAtMTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoQ291bnQ7IGkrKyl7CiAJCQlpZiAocGF0aHNbaV0uZXF1YWxzKGNoZWNrZWRQYXRoKSkgY29udGludWU7Ci0JCQlpZiAocGF0aHNbaV0uaXNQcmVmaXhPZihjaGVja2VkUGF0aCkpIHJldHVybiBpOworCQkJaWYgKHBhdGhzW2ldLmlzUHJlZml4T2YoY2hlY2tlZFBhdGgpKSB7CisJCQkgICAgaW50IGN1cnJlbnRMZW5ndGggPSBwYXRoc1tpXS5zZWdtZW50Q291bnQoKTsKKwkJCSAgICBpZiAoY3VycmVudExlbmd0aCA+IGJlc3RMZW5ndGgpIHsKKwkJCSAgICAgICAgYmVzdExlbmd0aCA9IGN1cnJlbnRMZW5ndGg7CisJCQkgICAgICAgIGJlc3RNYXRjaCA9IGk7CisJCQkgICAgfQorCQkJfQogCQl9Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIGJlc3RNYXRjaDsKIAl9CiAJCiAJLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFNjb3BlLmphdmEKaW5kZXggNDllYjAzZS4uNWFhNTRhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFNjb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFNjb3BlLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKICAqIAogICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2NvcGUgY29udGFpbnMgYW55IDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMKICAqIEBkZXByZWNhdGVkIFVzZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSkKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lI2NyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSl9CiAgKiB3aXRoIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYmluYXJpZXMgaW5zdGVhZC4KICAqLwogYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKCk7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAqIAogICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocwogICogQGRlcHJlY2F0ZWQgVXNlCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZSNjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pKQorICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKX0KICAqIHdpdGggYSBKYXZhIHByb2plY3QgaW5zdGVhZC4KICAqLwogYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMoKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogICogCiAgKiBAcGFyYW0gaW5jbHVkZXNCaW5hcmllcyB3aGV0aGVyIHRoaXMgc2NvcGUgY29udGFpbnMgYW55IDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMKICAqIEBkZXByZWNhdGVkIFVzZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSkKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lI2NyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSl9CiAgKiB3aXRoIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYmluYXJpZXMgaW5zdGVhZC4KICAqLwogcHVibGljIHZvaWQgc2V0SW5jbHVkZXNCaW5hcmllcyhib29sZWFuIGluY2x1ZGVzQmluYXJpZXMpOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgKiAKICAqIEBwYXJhbSBpbmNsdWRlc0NsYXNzcGF0aHMgd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIGNsYXNzcGF0aHMKICAqIEBkZXByZWNhdGVkIFVzZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSkKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lI2NyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSl9CiAgKiB3aXRoIGEgSmF2YSBwcm9qZWN0IGluc3RlYWQuCiAgKi8KIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaERvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaERvY3VtZW50LmphdmEKaW5kZXggZmFiODc3OC4uNWNkYTY2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hEb2N1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRG9jdW1lbnQuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogCS8qKgogCSAqIEFkZHMgdGhlIGdpdmVuIGluZGV4IGVudHJ5IChjYXRlZ29yeSBhbmQga2V5KSBjb21pbmcgZnJvbSB0aGlzCiAJICogZG9jdW1lbnQgdG8gdGhlIGluZGV4LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tCi0JICoge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50I2luZGV4RG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBpbmRleFBhdGgpLgorCSAqIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCNpbmRleERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggaW5kZXhQYXRoKX0uCiAJICogCiAJICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSBvZiB0aGUgaW5kZXggZW50cnkKIAkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGluZGV4IGVudHJ5CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkvKioKIAkgKiBSZW1vdmVzIGFsbCBpbmRleCBlbnRyaWVzIGZyb20gdGhlIGluZGV4IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuCiAJICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSAKLQkgKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQjaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGluZGV4UGF0aCkuCisJICoge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50I2luZGV4RG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBpbmRleFBhdGgpfS4KIAkgKi8KIAlwdWJsaWMgdm9pZCByZW1vdmVBbGxJbmRleEVudHJpZXMoKSB7CiAJCXN1cGVyLnJlbW92ZUFsbEluZGV4RW50cmllcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmluZGV4IGRlNDk3YTYuLmI3ZjFlZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhcnRpY2lwYW50LmphdmEKQEAgLTEwOCw3ICsxMDgsNyBAQAogCS8qKgogCSAqIEluZGV4ZXMgdGhlIGdpdmVuIGRvY3VtZW50IGluIHRoZSBnaXZlbiBpbmRleC4gQSBzZWFyY2ggcGFydGljaXBhbnQKIAkgKiBhc2tlZCB0byBpbmRleCBhIGRvY3VtZW50IHNob3VsZCBwYXJzZSBpdCBhbmQgY2FsbCAKLQkgKiB7QGxpbmsgI2FkZEluZGV4RW50cnkoY2hhcltdLCBjaGFyW10sIFNlYXJjaERvY3VtZW50KX0gYXMgbWFueSB0aW1lcyBhcworCSAqIHtAbGluayBTZWFyY2hEb2N1bWVudCNhZGRJbmRleEVudHJ5KGNoYXJbXSwgY2hhcltdKX0gYXMgbWFueSB0aW1lcyBhcwogCSAqIG5lZWRlZCB0byBhZGQgaW5kZXggZW50cmllcyB0byB0aGUgaW5kZXguIElmIGRlbGVnYXRpbmcgdG8gYW5vdGhlcgogCSAqIHBhcnRpY2lwYW50LCBpdCBzaG91bGQgdXNlIHRoZSBvcmlnaW5hbCBpbmRleCBsb2NhdGlvbiAoYW5kIG5vdCB0aGUKIAkgKiBkZWxlZ2F0ZWUncyBvbmUpLiBJbiB0aGUgcGFydGljdWxhciBjYXNlIG9mIGRlbGVnYXRpbmcgdG8gdGhlIGRlZmF1bHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkTG9jYXRvci5qYXZhCmluZGV4IDhjZjcxZmIuLjY1YzUxYmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRMb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZExvY2F0b3IuamF2YQpAQCAtMjU5LDggKzI1OSwxMCBAQAogCQlpbnQgbGFzdERvdCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBiaW5kaW5nTmFtZSk7CiAJCWlmIChsYXN0RG90ID4gLTEpCiAJCQliaW5kaW5nTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoYmluZGluZ05hbWUsIGxhc3REb3QrMSwgYmluZGluZ05hbWUubGVuZ3RoKTsKLQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5uYW1lLCBiaW5kaW5nTmFtZSkpCi0JCQlyZXR1cm4gbWF0Y2hGaWVsZChmaWVsZEJpbmRpbmcsIGZhbHNlKTsKKwkJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5uYW1lLCBiaW5kaW5nTmFtZSkpIHsKKwkJCWludCBsZXZlbCA9IG1hdGNoRmllbGQoZmllbGRCaW5kaW5nLCBmYWxzZSk7CisJCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgcmV0dXJuIGxldmVsOworCQl9CiAJfSAKIAlpbnQgb3RoZXJNYXggPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlck1heDsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YQppbmRleCAwMTliNWY0Li4wNDkwZmY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEKQEAgLTg5MSw5ICs4OTEsOCBAQAogCX0gZWxzZSBpZiAoc2VhcmNoUGF0dGVybiBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4pIHsKIAkJSUphdmFFbGVtZW50IGZvY3VzID0gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pIHNlYXJjaFBhdHRlcm4pLmZvY3VzOwogCQlpZiAoZm9jdXMgIT0gbnVsbCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZm9jdXMuZ2V0UmVzb3VyY2UoKTsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gcGFydGljaXBhbnQuZ2V0RG9jdW1lbnQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCXRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2ggPSBuZXcgUG9zc2libGVNYXRjaCh0aGlzLCByZXNvdXJjZSwgbnVsbCwgZG9jdW1lbnQpOworCQkJU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJ0aWNpcGFudC5nZXREb2N1bWVudChmb2N1cy5nZXRQYXRoKCkudG9TdHJpbmcoKSk7CisJCQl0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoID0gbmV3IFBvc3NpYmxlTWF0Y2godGhpcywgZm9jdXMuZ2V0UmVzb3VyY2UoKSwgbnVsbCwgZG9jdW1lbnQpOwogCQkJaWYgKGVuY2xvc2VzKGZvY3VzKSkgewogCQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gbmV3RGVjbGFyYXRpb25NYXRjaChmb2N1cywgU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSwgLTEsIC0xKTsKIAkJCQlyZXBvcnQobWF0Y2gpOwo=