LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLyoqCiAqIAogKiAKICogQHBsYW5uZWRmb3IgMS4wCiAqLwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Cglwcm90ZWN0ZWQgc3RhdGljIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwoJCglwcm90ZWN0ZWQgc3RhdGljIExpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwoKCXByb3RlY3RlZCBMaXN0IGFkZGVkOwoJcHJvdGVjdGVkIExpc3QgcmVtb3ZlZDsKCgkvLyBtYXAgZnJvbSBJUHJvamVjdCB0byBJTW9kdWxlW10KCXByb3RlY3RlZCBmaW5hbCBNYXAgcHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwoJcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKCgkvKioKCSAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLgoJICovCglwdWJsaWMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSgpIHsKCQlzdXBlcigpOwoJCQoJCWZhY3Rvcmllcy5hZGQodGhpcyk7CgkJCgkJYWRkTGlzdGVuZXIoKTsKCX0KCgoJLyoqCgkgKiBDYWNoZSBhbnkgcHJlZXhpc3RpbmcgbW9kdWxlLgoJICogVE9ETzogV2hlbi93aGVyZSBpcyB0aGlzIGNhbGxlZD8KCSAqLwoJcHJvdGVjdGVkIHZvaWQgY2FjaGVNb2R1bGVzKCkgewoJCWNhY2hlTW9kdWxlcyh0cnVlKTsKCX0KCgoJLyoqCgkgKiBDYWNoZSBhbnkgcHJlZXhpc3RpbmcgbW9kdWxlLgoJICogVE9ETzogV2hlbi93aGVyZSBpcyB0aGlzIGNhbGxlZD8KCSAqLwoJcHJvdGVjdGVkIHZvaWQgY2FjaGVNb2R1bGVzKGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsgCgkJdHJ5IHsKCQkJSVByb2plY3RbXSBwcm9qZWN0czIgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKCQkJaW50IHNpemUgPSBwcm9qZWN0czIubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJLy9UcmFjZS50cmFjZSgiY2FjaGluZzogIiArIHRoaXMgKyAiICIgKyBwcm9qZWN0c1tpXSArICIgIiArIGlzVmFsaWRNb2R1bGUocHJvamVjdHNbaV0pKTsKCQkJCWlmKCFwcm9qZWN0czJbaV0uaXNBY2Nlc3NpYmxlKCkpCgkJCQkJcmVtb3ZlTW9kdWxlcyhwcm9qZWN0czJbaV0pOwoJCQkJZWxzZSBpZiAoZm9yY2VVcGRhdGUgfHwgbmVlZHNVcGRhdGluZyhwcm9qZWN0czJbaV0pICYmIChpc1ZhbGlkTW9kdWxlKHByb2plY3RzMltpXSkpKSB7CgkJCQkJYWRkTW9kdWxlcyhwcm9qZWN0czJbaV0pOwoJCQkJfSAKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhY2hpbmcgbW9kdWxlcyIsIGUpOwoJCX0gZmluYWxseSB7CgkJCWluaXRpYWxpemVkID0gdHJ1ZTsKCQl9Cgl9CgoJcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNVcGRhdGluZyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoKCS8qKgoJICogUmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KCSAqIAoJICogQHJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIG1vZHVsZXMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBvciBudWxsCgkgKiBpZiB0aGlzIGZhY3RvcnkgZG9lcyBub3QgaGF2ZSBhIG1vZHVsZSBmb3IgdGhlIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHJldHVybiBhbiBhcnJheSBvZiBtb2R1bGVzLgoJICovCglwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCXRyeSB7CgkJCXJldHVybiAoSU1vZHVsZVtdKSBwcm9qZWN0cy5nZXQocHJvamVjdCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogQWRkIGEgcmVzb3VyY2UgbGlzdGVuZXIgdG8gdGhlIHdvcmtzcGFjZS4KCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZExpc3RlbmVyKCkgewoJCWlmIChsaXN0ZW5lciAhPSBudWxsKQoJCQlyZXR1cm47CgoJCWxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewoJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGxpc3RlbmVyIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlOiAiICsgZXZlbnQuZ2V0VHlwZSgpICsgIiAtPi0iKTsKCQkJCXRyeSB7CgkJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwoJCQkJCQoJCQkJCS8vaWYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUyB8fCBkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSkKCQkJCQkvLwlyZXR1cm47CgkJCQkKCQkJCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgdmlzaXRvckRlbHRhKSB7CgkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB2aXNpdG9yRGVsdGEuZ2V0UmVzb3VyY2UoKTsKCQkJCQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAicmVzb3VyY2U6ICIgKyByZXNvdXJjZSk7CgkKCQkJCQkJCS8vIG9ubHkgcmVzcG9uZCBjaGFuZ2VzIHdpdGhpbiBwcm9qZWN0cwoJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewoJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwoJCQkJCQkJCWhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UocHJvamVjdCwgdmlzaXRvckRlbHRhKTsKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRQcm9qZWN0KCkgIT0gbnVsbCkgewoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0gZWxzZQoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2UiLCBlKTsKCQkJCX0KCQkJCWZpcmVHbG9iYWxFdmVudHMoKTsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2UgLTwtIik7CgkJCX0KCQl9OwoJCQoJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Cgl9CgkKCS8qKgoJICogSGFuZGxlIGNoYW5nZXMgdG8gYSBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVHbG9iYWxQcm9qZWN0Q2hhbmdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJLy8gaGFuZGxlIHByb2plY3QgbGV2ZWwgY2hhbmdlcwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGZhY3RvcnkgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkvL1RyYWNlLnRyYWNlKCJGaXJpbmcgdG86ICIgKyBmYWN0b3J5KTsKCQkJZmFjdG9yeS5oYW5kbGVQcm9qZWN0Q2hhbmdlKHByb2plY3QsIGRlbHRhKTsKCQl9CgkJCgkJLy8gaGFuZGxlIGludGVybmFsIHVwZGF0ZXMKCQlpdGVyYXRvciA9IGZhY3Rvcmllcy5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBmYWN0b3J5ID0gKFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIGl0ZXJhdG9yLm5leHQoKTsKCQkJLy9UcmFjZS50cmFjZSgiRmlyaW5nIHRvOiAiICsgZmFjdG9yeSk7CgkJCWZhY3RvcnkuaGFuZGxlUHJvamVjdEludGVybmFsQ2hhbmdlKHByb2plY3QsIGRlbHRhKTsKCQl9Cgl9CgkKCS8qKgoJICogRmlyZSB0aGUgYWNjdW11bGF0ZWQgbW9kdWxlIGZhY3RvcnkgZXZlbnRzLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmlyZUdsb2JhbEV2ZW50cygpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJGaXJpbmcgZ2xvYmFsIG1vZHVsZSBldmVudCIpOwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGZhY3RvcnkgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQlmYWN0b3J5LnVwZGF0ZVByb2plY3RzKCk7CgkJfQoJfQoKCS8qKgoJICogVGVtcG9yYXJ5IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBwcm9qZWN0IG1vZHVsZXMgYXJlIHVwZGF0ZWQuCgkgKi8KCXByaXZhdGUgdm9pZCB1cGRhdGVQcm9qZWN0cygpIHsKCQlJTW9kdWxlW10gbW9kdWxlczIgPSBnZXRNb2R1bGVzKCk7CgkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlpZiAobW9kdWxlczJbaV0gaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKQoJCQkJCSgoUHJvamVjdE1vZHVsZSkgbW9kdWxlczJbaV0pLnVwZGF0ZSgpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogSGFuZGxlIGNoYW5nZXMgdG8gYSBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCgkgKi8KCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9qZWN0Q2hhbmdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJaWYoIWluaXRpYWxpemVkKQoJCQljYWNoZU1vZHVsZXMoZmFsc2UpOwoJCWlmIChwcm9qZWN0cy5jb250YWluc0tleShwcm9qZWN0KSkgewoJCQkvLyBhbHJlYWR5IGEgbW9kdWxlCgkJCWlmICgoKGRlbHRhLmdldEtpbmQoKSAmICBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAhPSAwKSB8fCAhaXNWYWxpZE1vZHVsZShwcm9qZWN0KSkgewoJCQkJcmVtb3ZlTW9kdWxlcyhwcm9qZWN0KTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIG5vdCBhIG1vZHVsZQoJCQlpZiAoaXNWYWxpZE1vZHVsZShwcm9qZWN0KSkgewoJCQkJYWRkTW9kdWxlcyhwcm9qZWN0KTsKCQkJfQoJCX0KCX0KCQoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RJbnRlcm5hbENoYW5nZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCWZpbmFsIElQYXRoW10gcGF0aHMgPSBnZXRMaXN0ZW5lclBhdGhzKCk7CgkJaWYgKHBhdGhzICE9IG51bGwpIHsKCQkJZmluYWwgSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRNb2R1bGVzKHByb2plY3QpOwoJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlmaW5hbCBJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbaV07CgkJCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpIHsKCQkJCQkJLy8gY2hlY2sgZm9yIGxpc3RlbmVyIHBhdGhzCgkJCQkJCWZpbmFsIGludCBzaXplID0gcGF0aHMubGVuZ3RoOwoJCQkJCQljbGFzcyBUZW1wIHsKCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCQlmaW5hbCBUZW1wIHRlbXAgPSBuZXcgVGVtcCgpOwoJCQkJCQl0cnkgewoJCQkJCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CgkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgdmlzaXRvckRlbHRhKSB7CgkJCQkJCQkJCWlmICh0ZW1wLmZvdW5kKQoJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCQlJUGF0aCBwYXRoID0gdmlzaXRvckRlbHRhLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKCQkJCQkJCQkJCgkJCQkJCQkJCWJvb2xlYW4gcHJlZml4ID0gZmFsc2U7CgkJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZSAmJiAhdGVtcC5mb3VuZDsgaisrKSB7CgkJCQkJCQkJCQlpZiAocGF0aHNbal0uZXF1YWxzKHBhdGgpKQoJCQkJCQkJCQkJCXRlbXAuZm91bmQgPSB0cnVlOwoJCQkJCQkJCQkJZWxzZSBpZiAocGF0aC5pc1ByZWZpeE9mKHBhdGhzW2pdKSkKCQkJCQkJCQkJCQlwcmVmaXggPSB0cnVlOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmICh0ZW1wLmZvdW5kKSB7CgkJCQkJCQkJCQkoKFByb2plY3RNb2R1bGUpIG1vZHVsZSkudXBkYXRlKCk7CgkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQkJCX0gZWxzZSBpZiAocHJlZml4KQoJCQkJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNlYXJjaGluZyBmb3IgbGlzdGVuaW5nIHBhdGhzIiwgZSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBBZGQgYSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqLwoJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJCgkJSU1vZHVsZVtdIG1vZHVsZXMgPSBjcmVhdGVNb2R1bGVzKHByb2plY3QpOwoJCWlmIChtb2R1bGVzID09IG51bGwgfHwgbW9kdWxlcy5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCXByb2plY3RzLnB1dChwcm9qZWN0LCBtb2R1bGVzKTsKCQlhZGRlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJYWRkZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QobW9kdWxlcykpOwoJfQoKCS8qKgoJICogUmVtb3ZlIHRoZSBtb2R1bGVzIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKi8KCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCQoJCXRyeSB7CgkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKElNb2R1bGVbXSkgcHJvamVjdHMuZ2V0KHByb2plY3QpOwoJCQkKCQkJcHJvamVjdHMucmVtb3ZlKHByb2plY3QpOwoJCQlpZiAocmVtb3ZlZCA9PSBudWxsKQoJCQkJcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJCWlmKG1vZHVsZXMgPT0gbnVsbCkKCQkJCXJldHVybjsKCQkJcmVtb3ZlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb2R1bGVzKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHByb2plY3QiLCBlKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgbWF5IGNvbnRhaW4gbW9kdWxlcyBvZiB0aGUgY29ycmVjdCB0eXBlLgoJICogVGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBtYXkgY29udGFpbiBtb2R1bGVzLCBhbmQKCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBkZWZpbml0ZWx5IGRvZXMgbm90CgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWRNb2R1bGUoSVByb2plY3QgcHJvamVjdCk7CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBtb2R1bGVzIGZvciBhIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjcmVhdGUgbW9kdWxlcyBmb3IKCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCgkgKiBmb3Igc3RhdGUgY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLgoJICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCgkgKgoJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCgkgKi8KCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7CgkJcmV0dXJuIG51bGw7Cgl9Cn0=