LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwovKioKICogQSBzaW1wbGUgSU1vZHVsZVByb2plY3QgdGhhdCBtYXBzIGEgZm9sZGVyIHdpdGhpbiBhIHByb2plY3QKICogKG9yIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGl0c2VsZikgdG8gdGhlIG1vZHVsZS4KICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0TW9kdWxlIGV4dGVuZHMgTW9kdWxlRGVsZWdhdGUgewoJcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Cglwcm90ZWN0ZWQgSVBhdGggcm9vdDsKCQoJLy8gY2hhbmdlIGxpc3RlbmVycwoJcHJpdmF0ZSB0cmFuc2llbnQgTGlzdCBsaXN0ZW5lcnM7CgoJcHVibGljIFByb2plY3RNb2R1bGUoKSB7CgkJLy8gZG8gbm90aGluZwoJfQoKCXB1YmxpYyBQcm9qZWN0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwoJfQoKCS8qCgkgKiBAc2VlIElNb2R1bGVQcm9qZWN0I2dldFByb2plY3QoKQoJICovCglwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKCQlyZXR1cm4gcHJvamVjdDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVyLgoJICovCglwdWJsaWMgSVBhdGggZ2V0Um9vdEZvbGRlcigpIHsKCQlyZXR1cm4gcm9vdDsKCX0KCgkvKgoJICogQHNlZSBJTW9kdWxlUHJvamVjdCNnZXRNb2R1bGVSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhKQoJICovCgkvKnB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YSBnZXRNb2R1bGVSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPiBnZXRNb2R1bGVSZXNvdXJjZURlbHRhIik7CgkJSVBhdGggcm9vdDIgPSBudWxsOwoJCXRyeSB7CgkJCXJvb3QyID0gZ2V0Um9vdEZvbGRlcigpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkVycm9yIGdldHRpbmcgcm9vdDIiKTsKCQl9CgkJaWYgKHJvb3QyID09IG51bGwpIHsKCQkJcmV0dXJuIGNvbnZlcnRDaGlsZHJlbihkZWx0YSwgbnVsbCk7CgkJfQoJCWNsYXNzIEhlbHBlciB7CgkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEyOwoJCX0KCQlmaW5hbCBIZWxwZXIgaGVscGVyID0gbmV3IEhlbHBlcigpOwoJCWZpbmFsIElQYXRoIHJvb3QzID0gcm9vdDI7CgkJdHJ5IHsKCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CgkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdERlbHRhKSB7CgkJCQkJaWYgKCFoZWxwZXIuZm91bmQgJiYgcm9vdDMuZXF1YWxzKHZpc2l0RGVsdGEuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKSkgewoJCQkJCQloZWxwZXIuZGVsdGEyID0gY29udmVydENoaWxkcmVuKHZpc2l0RGVsdGEsIG51bGwpOwoJCQkJCQloZWxwZXIuZm91bmQgPSB0cnVlOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9KTsKCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBnZXRNb2R1bGVSZXNvdXJjZURlbHRhIik7CgkJCXJldHVybiBoZWxwZXIuZGVsdGEyOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgbW9kdWxlIHJlc291cmNlIGRlbHRhIik7CgkJfQoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIjwgZ2V0TW9kdWxlUmVzb3VyY2VEZWx0YSBudWxsIik7CgkJcmV0dXJuIG51bGw7Cgl9Ki8KCQoJLyoqCgkgKiAKCSAqLwoJLypwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGEgY29udmVydENoaWxkcmVuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJTW9kdWxlRm9sZGVyIHBhcmVudCkgewoJCWludCBmbGFncyA9IGRlbHRhLmdldEtpbmQoKTsKCQlpbnQga2luZCA9IElNb2R1bGVSZXNvdXJjZURlbHRhLk5PX0NIQU5HRTsKCQlpZiAoZmxhZ3MgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCgkJCWtpbmQgPSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRDsKCQllbHNlIGlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQoJCQlraW5kID0gSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKCQllbHNlIGlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKQoJCQlraW5kID0gSU1vZHVsZVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKCQkKCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwoJCQoJCUlNb2R1bGVSZXNvdXJjZSBwdWJSZXNvdXJjZSA9IG51bGw7CgkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKCQkJcHViUmVzb3VyY2UgPSBuZXcgUHJvamVjdE1vZHVsZUZvbGRlcih0aGlzLCBwYXJlbnQsIChJQ29udGFpbmVyKSByZXNvdXJjZSk7CQoJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKCQkJaWYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykKCQkJCXJldHVybiBudWxsOwoJCQlwdWJSZXNvdXJjZSA9IG5ldyBQcm9qZWN0TW9kdWxlRmlsZSh0aGlzLCBwYXJlbnQsIChJRmlsZSkgcmVzb3VyY2UpOwoJCX0KCQkKCQlNb2R1bGVSZXNvdXJjZURlbHRhIGRlcGxveURlbHRhID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEocHViUmVzb3VyY2UsIGtpbmQpOwoJCQoJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CgkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgcHViUmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgY2hpbGREZWx0YSA9IGNvbnZlcnRDaGlsZHJlbihjaGlsZHJlbltpXSwgKElNb2R1bGVGb2xkZXIpIHB1YlJlc291cmNlKTsKCQkJCWlmIChjaGlsZERlbHRhICE9IG51bGwpCgkJCQkJZGVwbG95RGVsdGEuYWRkQ2hpbGQoY2hpbGREZWx0YSk7CgkJCX0KCQl9CgkJcmV0dXJuIGRlcGxveURlbHRhOwoJfSovCgoJLyoKCSAqIEBzZWUgSU1vZHVsZSNnZXRNZW1lbnRvKCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKCX0KCQoJLyoKCSAqIEBzZWUgSU1vZHVsZSNnZXRQdWJsaXNoU3RhdHVzKCkKCSAqLwoJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoKCSAqIEBzZWUgSU1vZHVsZSNnZXRQdWJsaXNoU3RhdHVzKCkKCSAqLwoJcHVibGljIElTdGF0dXMgY2FuUHVibGlzaCgpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKgoJICogQHNlZSBJTW9kdWxlI21lbWJlcnMoKQoJICovCgkvKnB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCUlQYXRoIHJvb3QyID0gbnVsbDsKCQl0cnkgewoJCQlyb290MiA9IGdldFJvb3RGb2xkZXIoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9CgkJdHJ5IHsKCQkJaWYgKHJvb3QyID09IG51bGwgfHwgcm9vdDIuaXNSb290KCkgfHwgcm9vdDIuZXF1YWxzKG5ldyBQYXRoKCIiKSkgfHwgcm9vdDIuZXF1YWxzKG5ldyBQYXRoKCIvIikpKQoJCQkJcmV0dXJuIGdldE1vZHVsZVJlc291cmNlcyhnZXRQcm9qZWN0KCksIG51bGwpOwoJCQkKCQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihyb290Mik7CgkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoZm9sZGVyLCBudWxsKTsKCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKCQkJdGhyb3cgZTsKCQl9Cgl9Ki8KCQoJLypwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlIGdldE1vZHVsZVJlc291cmNlcyhJRmlsZSBmaWxlKSB7CgkJcmV0dXJuIG5ldyBQcm9qZWN0TW9kdWxlRmlsZSh0aGlzLCBudWxsLCBmaWxlKTsKCX0KCglwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TW9kdWxlUmVzb3VyY2VzKElDb250YWluZXIgY29udGFpbmVyLCBJTW9kdWxlRm9sZGVyIHBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCiAJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7CgkgCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewoJIAkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwoJIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKCQkJCQlQcm9qZWN0TW9kdWxlRm9sZGVyIHBkZiA9IG5ldyBQcm9qZWN0TW9kdWxlRm9sZGVyKHRoaXMsIHBhcmVudCwgKElDb250YWluZXIpIHJlc291cmNlKTsJCgkJCQkJbGlzdC5hZGQocGRmKTsKCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewoJCQkJCVByb2plY3RNb2R1bGVGaWxlIHBkZiA9IG5ldyBQcm9qZWN0TW9kdWxlRmlsZSh0aGlzLCBwYXJlbnQsIChJRmlsZSkgcmVzb3VyY2UpOwoJCQkJCWxpc3QuYWRkKHBkZik7CgkJCQl9CgkJCX0KCSAJfQoJIAkKCSAJSU1vZHVsZVJlc291cmNlW10gbW9kdWxlUmVzb3VyY2VzID0gbmV3IElNb2R1bGVSZXNvdXJjZVtsaXN0LnNpemUoKV07CgkgCWxpc3QudG9BcnJheShtb2R1bGVSZXNvdXJjZXMpOwoJIAlyZXR1cm4gbW9kdWxlUmVzb3VyY2VzOwoJfSovCgoJLyoKCSAqIEBzZWUgSU1vZHVsZSNnZXROYW1lKCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSBjdXJyZW50bHkgZXhpc3RzLCBhbmQgZmFsc2UgaWYgaXQgaGFzCgkgKiBiZWVuIGRlbGV0ZWQgb3IgbW92ZWQgYW5kIGlzIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGlzIG1vZHVsZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewoJCXJldHVybiAoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZ2V0UHJvamVjdCgpLmV4aXN0cygpKTsKCX0KCQoJLyoqCgkgKiAKCSAqLwoJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKSkKCQkJcmV0dXJuIGZhbHNlOwoKCQlQcm9qZWN0TW9kdWxlIGRwID0gKFByb2plY3RNb2R1bGUpIG9iajsKCQkvL2lmIChnZXRGYWN0b3J5SWQoKSAhPSBudWxsICYmICFnZXRGYWN0b3J5SWQoKS5lcXVhbHMoZHAuZ2V0RmFjdG9yeUlkKCkpKQoJCS8vCXJldHVybiBmYWxzZTsKCQkJCgkJSVBhdGggcm9vdDIgPSBudWxsOwoJCXRyeSB7CgkJCXJvb3QyID0gZ2V0Um9vdEZvbGRlcigpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQkKCQlJUGF0aCByb290MyA9IG51bGw7CgkJdHJ5IHsKCQkJcm9vdDMgPSBkcC5nZXRSb290Rm9sZGVyKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJCQoJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5lcXVhbHMoZHAuZ2V0UHJvamVjdCgpKSkKCQkJcmV0dXJuIGZhbHNlOwoKCQlpZiAocm9vdDIgPT0gbnVsbCAmJiByb290MyAhPSBudWxsKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKHJvb3QyICE9IG51bGwgJiYgIXJvb3QyLmVxdWFscyhyb290MykpCgkJCXJldHVybiBmYWxzZTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBBZGQgYSBsaXN0ZW5lciBmb3IgdGhlIG1vZHVsZS4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCBhZGRNb2R1bGVMaXN0ZW5lcihJTW9kdWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBZGRpbmcgbW9kdWxlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMpOwoJCgkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQoJCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CgkJZWxzZSBpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKCQkJcmV0dXJuOwoJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIEFkZCBhIGxpc3RlbmVyIGZvciB0aGUgbW9kdWxlLgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZU1vZHVsZUxpc3RlbmVyKElNb2R1bGVMaXN0ZW5lciBsaXN0ZW5lcikgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlbW92aW5nIG1vZHVsZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIGZyb20gIiArIHRoaXMpOwoJCgkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQoJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBGaXJlIGEgbW9kdWxlIGNoYW5nZSBldmVudC4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgZmlyZU1vZHVsZUNoYW5nZUV2ZW50KGJvb2xlYW4gaXNDaGFuZ2UsIElNb2R1bGVbXSBhZGRlZCwgSU1vZHVsZVtdIGNoYW5nZWQsIElNb2R1bGVbXSByZW1vdmVkKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIEZpcmluZyBtb2R1bGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiAoIiArIGlzQ2hhbmdlICsgIikgLT4tIik7CgkKCQlpZiAobGlzdGVuZXJzID09IG51bGwgfHwgbGlzdGVuZXJzLmlzRW1wdHkoKSkKCQkJcmV0dXJuOwoJCgkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOwoJCUlNb2R1bGVMaXN0ZW5lcltdIGRjbCA9IG5ldyBJTW9kdWxlTGlzdGVuZXJbc2l6ZV07CgkJbGlzdGVuZXJzLnRvQXJyYXkoZGNsKTsKCQkKCQlNb2R1bGVFdmVudCBldmVudCA9IG5ldyBNb2R1bGVFdmVudChnZXRNb2R1bGUoKSwgaXNDaGFuZ2UsIGFkZGVkLCBjaGFuZ2VkLCByZW1vdmVkKTsKCQoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCXRyeSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICIgIEZpcmluZyBtb2R1bGUgY2hhbmdlIGV2ZW50IHRvOiAiICsgZGNsW2ldKTsKCQkJCWRjbFtpXS5tb2R1bGVDaGFuZ2VkKGV2ZW50KTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIG1vZHVsZSBjaGFuZ2UgZXZlbnQiLCBlKTsKCQkJfQoJCX0KCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPC0gRG9uZSBmaXJpbmcgbW9kdWxlIGNoYW5nZSBldmVudCAtPC0iKTsKCX0KCQoJLyoqCgkgKiBDYWxsZWQgd2hlbiB0aGUgbGlzdGVuZXIgcGF0aHMgZnJvbSB0aGUgbW9kdWxlIGZhY3RvcnkgY2hhbmdlLgoJICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlY2FjaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZHVsZS4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZXMgb2YgdGhpcyBtb2R1bGUuCgkgKgoJICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdCgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgewoJCXJldHVybiBudWxsOwoJfQp9