LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci8qKgogKiAKICogQHBsYW5uZWRmb3IgMS4wCiAqLwpwdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXNvdXJjZURlbHRhIHsKCS8qKgoJICogS2luZCBjb25zdGFudCAodmFsdWUgMCkgZm9yIG5vIGNoYW5nZS4KCSAqIAoJICogQHNlZSAjZ2V0S2luZCgpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7CgoJLyoqCgkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYWRkZWQgcmVzb3VyY2VzLgoJICogCgkgKiBAc2VlICNnZXRLaW5kKCkKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURERUQgPSAxOwoKCS8qKgoJICogS2luZCBjb25zdGFudCAodmFsdWUgMikgZm9yIGNoYW5nZWQgcmVzb3VyY2VzLgoJICogCgkgKiBAc2VlICNnZXRLaW5kKCkKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDI7CgoJLyoqCgkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAzKSBmb3IgcmVtb3ZlZCByZXNvdXJjZXMuCgkgKiAKCSAqIEBzZWUgI2dldEtpbmQoKQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMzsKCgkvKioKCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGRlbHRhLgoJICogCgkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSByZXNvdXJjZQoJICovCglwdWJsaWMgSU1vZHVsZVJlc291cmNlIGdldE1vZHVsZVJlc291cmNlKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEuCgkgKiBOb3JtYWxseSwgb25lIG9mIDxjb2RlPkFEREVEPC9jb2RlPiwgCgkgKiA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgPGNvZGU+Q0hBTkdFRDwvY29kZT4uCgkgKiAKCSAqIEByZXR1cm4gdGhlIGtpbmQgb2YgdGhpcyByZXNvdXJjZSBkZWx0YQoJICogCgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0FEREVECgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI1JFTU9WRUQKCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAoJICovCglwdWJsaWMgaW50IGdldEtpbmQoKTsKCgkvKioKCSAqIFJldHVybnMgbW9kdWxlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoaXMgcmVzb3VyY2UgCgkgKiB3aGljaCB3ZXJlIGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkLiBSZXR1cm5zIGFuIGVtcHR5CgkgKiBhcnJheSBpZiB0aGVyZSBhcmUgbm8gYWZmZWN0ZWQgY2hpbGRyZW4uCgkgKiA8cD4KCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGZ1bGx5IGVxdWl2YWxlbnQgdG86CgkgKiA8cHJlPgoJICogICBnZXRBZmZlY3RlZENoaWxkcmVuKEFEREVEIHwgUkVNT1ZFRCB8IENIQU5HRUQsIElSZXNvdXJjZS5OT05FKTsKCSAqIDwvcHJlPgoJICogPC9wPgoJICoKCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0FEREVECgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI1JFTU9WRUQKCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAoJICovCglwdWJsaWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKCk7CgkKCS8qKgoJICogUmV0dXJucyB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSBkZWx0YS4KCSAqIFJldHVybnMgdGhlIGVtcHR5IHBhdGggZm9yIHJlc291cmNlcyBpbiB0aGUgbW9kdWxlIHJvb3QuCgkgKiA8cD4KCSAqIEEgcmVzb3VyY2UncyBtb2R1bGUtcmVsYXRpdmUgcGF0aCBpbmRpY2F0ZXMgdGhlIHJvdXRlIGZyb20gdGhlIG1vZHVsZQoJICogdG8gdGhlIHJlc291cmNlLiBXaXRoaW4gYSBtb2R1bGUsIHRoZXJlIGlzIGV4YWN0bHkgb25lIHN1Y2ggcGF0aAoJICogZm9yIGFueSBnaXZlbiByZXNvdXJjZS4gVGhlIHJldHVybmVkIHBhdGggbmV2ZXIgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yLgoJICogPC9wPgoJICogQHJldHVybiB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSBkZWx0YQoJICogQHNlZSBJTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKCSAqLwoJcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwoJCgkvKioKCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBkZXNjZW5kZW50IGRlbHRhIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBhdGggaW4KCSAqIHRoaXMgZGVsdGEsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggZGVzY2VuZGVudCBleGlzdHMuCgkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwoJICogaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyBkZWx0YS4gICBUcmFpbGluZyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkLgoJICogSWYgdGhlIHBhdGggaXMgZW1wdHkgdGhpcyBkZWx0YSBpcyByZXR1cm5lZC4KCSAqIDxwPgoJICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhdm9pZCBtYW51YWwgdHJhdmVyc2FsIG9mIHRoZSBkZWx0YQoJICogdHJlZSBpbiBjYXNlcyB3aGVyZSB0aGUgbGlzdGVuZXIgaXMgb25seSBpbnRlcmVzdGVkIGluIGNoYW5nZXMgdG8KCSAqIHBhcnRpY3VsYXIgcmVzb3VyY2VzLiAgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGdlbmVyYWxseSBiZQoJICogZmFzdGVyIHRoYW4gbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgZGVsdGEgdG8gYSBwYXJ0aWN1bGFyIGRlc2NlbmRlbnQuCgkgKiA8L3A+CgkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgZGVzaXJlZCBkZXNjZW5kZW50IGRlbHRhCgkgKiBAcmV0dXJuIHRoZSBkZXNjZW5kZW50IGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCgkgKiAJCWRlc2NlbmRlbnQgZXhpc3RzIGluIHRoZSBkZWx0YQoJICogQHBsYW5uZWRmb3IgMi4wCgkgKi8KCS8vcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhIGZpbmRNZW1iZXIoSVBhdGggcGF0aCk7CgkKCS8qKgoJICogUmV0dXJucyByZXNvdXJjZSBkZWx0YXMgZm9yIGFsbCBjaGlsZHJlbiBvZiB0aGlzIHJlc291cmNlIAoJICogd2hvc2Uga2luZCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbWFzay4gS2luZCBtYXNrcyBhcmUgZm9ybWVkCgkgKiBieSB0aGUgYml0d2lzZSBvciBvZiA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4ga2luZCBjb25zdGFudHMuCgkgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyBhZmZlY3RlZCBjaGlsZHJlbi4KCSAqIDxwPgoJICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0bzoKCSAqIDxwcmU+CgkgKiAgIGdldEFmZmVjdGVkQ2hpbGRyZW4oa2luZE1hc2ssIElSZXNvdXJjZS5OT05FKTsKCSAqIDwvcHJlPgoJICogVGVhbS1wcml2YXRlIG1lbWJlciByZXNvdXJjZXMgYXJlIDxiPm5vdDwvYj4gaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KCSAqIDwvcD4KCSAqCgkgKiBAcGFyYW0ga2luZE1hc2sgYSBtYXNrIGZvcm1lZCBieSB0aGUgYml0d2lzZSBvciBvZiA8Y29kZT5JUmVzb3VyY2VEZWx0YSA8L2NvZGU+IAoJICogICAgZGVsdGEga2luZCBjb25zdGFudHMKCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCgkgKiBAc2VlIElSZXNvdXJjZURlbHRhI0FEREVECgkgKiBAc2VlIElSZXNvdXJjZURlbHRhI1JFTU9WRUQKCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjQ0hBTkdFRAoJICogQHNlZSAjZ2V0QWZmZWN0ZWRDaGlsZHJlbihpbnQpCgkgKi8KCS8vcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbihpbnQga2luZE1hc2spOwoJCgkvKioKCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3IuCgkgKiBUaGUgb25seSBraW5kcyBvZiByZXNvdXJjZSBkZWx0YXMgdmlzaXRlZCAKCSAqIGFyZSA8Y29kZT5BRERFRDwvY29kZT4sIDxjb2RlPlJFTU9WRUQ8L2NvZGU+LCAKCSAqIGFuZCA8Y29kZT5DSEFOR0VEPC9jb2RlPi4KCSAqIFRoZSB2aXNpdG9yJ3MgPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGlzCgkgKiByZXNvdXJjZSBkZWx0YSBpZiBhcHBsaWNhYmxlLiBJZiB0aGUgdmlzaXRvciByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LAoJICogdGhlIHJlc291cmNlIGRlbHRhJ3MgY2hpbGRyZW4gYXJlIGFsc28gdmlzaXRlZC4KCSAqIDxwPgoJICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0byAKCSAqIDxjb2RlPmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuTk9ORSk8L2NvZGU+LgoJICogQWx0aG91Z2ggdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkIGZvciB0aGlzIHJlc291cmNlIGRlbHRhLCBpdCB3aWxsIG5vdCBiZQoJICogaW52b2tlZCBmb3IgYW55IHRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yCgkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIHZpc2l0b3IgZmFpbGVkIHdpdGggdGhpcyBleGNlcHRpb24uCgkgKiBAc2VlIElSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChJUmVzb3VyY2VEZWx0YSkKCSAqLwoJLy9wdWJsaWMgdm9pZCBhY2NlcHQoSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwp9