LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiCgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSVJlcXVlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklSZXNlbmRSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5Nb25pdG9yQ29yZTsKLyoqCiAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtb25pdG9yIHNlcnZlciB2aWV3LgogKi8KcHVibGljIGNsYXNzIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXJ7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwoKCXByb3RlY3RlZCBib29sZWFuIHNvcnRCeVJlc3BvbnNlVGltZTsKCgkvKioKCSAqIFByb3h5VHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKioKCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4KCSAqIDxwPgoJICogW0lzc3VlOiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2hhbmdlZCB0byB0YWtlIGEgVmlld2VyLAoJICogcmVuYW1lZCBhbmQgcmVwdXJwb3NlZCB0byBkaXNjb25uZWN0IGEgY29udGVudCBwcm92aWRlciBmcm9tCgkgKiBhIHZpZXdlci4gVGhpcyBpcyBvdmVyIGFuZCBhYm92ZSB3aGF0IGlucHV0Q2hhbmdlZCBkb2VzLAoJICogd2hpY2ggaXMgZGlzY29ubmVjdGluZyBhIGNvbnRlbnQgcHJvdmlkZXIgZnJvbSB0aGUgdmlld2VyJ3MKCSAqIGlucHV0IChidXQgbm90IHRoZSB2aWV3ZXIgaXRzZWxmKS4KCSAqIF0KCSAqIDwvcD4KCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50LgoJICogPHA+CgkgKiBOb3RlOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCAKCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzPC9jb2RlPiBpcwoJICogdGhhdCA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgCgkgKiB0cmVlIHZpZXdlcidzIHJvb3QgZWxlbWVudHMsIHdoZXJlYXMgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IGlzIHVzZWQKCSAqIHRvIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlCgkgKiAoaW5jbHVkaW5nIGEgcm9vdCkuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtJc3N1ZTogRG9uJ3Qga25vdyB3aGF0IGFib3ZlIGlzIHRyeWluZyB0byBzYXkuCgkgKiAgU2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzLgoJICogXQoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50CgkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIAoJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikKCSAqLwoJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CgkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CgkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCQlJUmVxdWVzdFtdIHJlcXVlc3RzID0gTW9uaXRvckNvcmUuZ2V0UmVxdWVzdHMoKTsKCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKCQkJCWludCBzaXplID0gcmVxdWVzdHMubGVuZ3RoOwoJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQlJUmVxdWVzdCByZXEgPSByZXF1ZXN0c1tpXTsKCQkJCQlpZiAoKHJlcS5nZXRMb2NhbFBvcnQoKSA9PSBpbi5pbnRWYWx1ZSgpKQoJCQkJCQkJJiYgIShyZXEgaW5zdGFuY2VvZiBJUmVzZW5kUmVxdWVzdCkpCgkJCQkJCWxpc3QuYWRkKHJlcSk7CgkJCQl9CgkJCX0KCQkJaWYgKHNvcnRCeVJlc3BvbnNlVGltZSkKCQkJCXNvcnRCeVJlc3BvbnNlVGltZShsaXN0KTsKCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwoJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXF1ZXN0KSB7CgkJCUlSZXF1ZXN0IHJlcSA9IChJUmVxdWVzdCkgZWxlbWVudDsKCQkJSVJlc2VuZFJlcXVlc3RbXSByciA9IHJlcS5nZXRSZXNlbmRSZXF1ZXN0cygpOwoJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJCWlmIChyciAhPSBudWxsKSB7CgkJCQlpbnQgc2l6ZSA9IHJyLmxlbmd0aDsKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQkJbGlzdC5hZGQocnJbaV0pOwoJCQkJfQoJCQl9CgkJCWlmIChzb3J0QnlSZXNwb25zZVRpbWUpCgkJCQlzb3J0QnlSZXNwb25zZVRpbWUobGlzdCk7CgkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoKCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZQoJICogZ2l2ZW4gZWxlbWVudC4gVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsCgkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KCSAqLwoJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7CgkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7CgkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQkJSVJlcXVlc3RbXSByZXF1ZXN0cyA9IE1vbml0b3JDb3JlLmdldFJlcXVlc3RzKCk7CgkJCWlmIChyZXF1ZXN0cyAhPSBudWxsKSB7CgkJCQlpbnQgc2l6ZSA9IHJlcXVlc3RzLmxlbmd0aDsKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQkJSVJlcXVlc3QgcmVxID0gcmVxdWVzdHNbaV07CgkJCQkJSW50ZWdlciBpbiA9IG5ldyBJbnRlZ2VyKHJlcS5nZXRMb2NhbFBvcnQoKSk7CgkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKGluKSkKCQkJCQkJbGlzdC5hZGQoaW4pOwoJCQkJfQoJCQl9CgkJCWlmIChzb3J0QnlSZXNwb25zZVRpbWUpCgkJCQlzb3J0QnlSZXNwb25zZVRpbWUobGlzdCk7CgkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKCQl9CgkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpOwoJfQoKCS8qCgkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKCSAqIGluZGljYXRpbmcgdGhhdCB0aGUgcGFyZW50IGNhbid0IGJlIGNvbXB1dGVkLiAKCSAqLwoJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7CgkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSW50ZWdlcikKCQkJCXJldHVybiBST09UOwoJCQlJUmVxdWVzdCBjYWxsID0gKElSZXF1ZXN0KSBlbGVtZW50OwoJCQlpZiAoY2FsbCBpbnN0YW5jZW9mIElSZXNlbmRSZXF1ZXN0KSB7CgkJCQlJUmVzZW5kUmVxdWVzdCBjYWxsUmVzZW5kID0gKElSZXNlbmRSZXF1ZXN0KSBjYWxsOwoJCQkJSVJlcXVlc3QgcGFyZW50ID0gY2FsbFJlc2VuZC5nZXRPcmlnaW5hbFJlcXVlc3QoKTsKCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKCQkJCQlyZXR1cm4gcGFyZW50OwoJCQl9CgkJCXJldHVybiBuZXcgSW50ZWdlcihjYWxsLmdldExvY2FsUG9ydCgpKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIGN1cnJlbnRseSBiZWluZyBzb3J0ZWQgYnkgcmVzcG9uc2UgdGltZS4KCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0U29ydEJ5UmVzcG9uc2VUaW1lKCkgewoJCXJldHVybiBzb3J0QnlSZXNwb25zZVRpbWU7Cgl9CgoJLyoKCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hpbGRyZW4uCgkgKi8KCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CgkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQoJCQlyZXR1cm4gdHJ1ZTsKCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXF1ZXN0KSB7CgkJCXJldHVybiAoKElSZXF1ZXN0KSBlbGVtZW50KS5nZXRSZXNlbmRSZXF1ZXN0cygpLmxlbmd0aCA+IDA7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKgoJICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0CgkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgoJICovCglwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBzb3J0IGJ5IHJlc3BvbnNlIHRpbWUgb3B0aW9uLgoJICogQHBhcmFtIGIgYm9vbGVhbgoJICovCglwdWJsaWMgdm9pZCBzZXRTb3J0QnlSZXNwb25zZVRpbWUoYm9vbGVhbiBiKSB7CgkJc29ydEJ5UmVzcG9uc2VUaW1lID0gYjsKCX0KCgkvKioKCSAqIAoJICovCglwcm90ZWN0ZWQgdm9pZCBzb3J0QnlSZXNwb25zZVRpbWUoTGlzdCBsaXN0KSB7CgkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgc2l6ZTsgaisrKSB7CgkJCQlJUmVxdWVzdCBjMSA9IChJUmVxdWVzdCkgbGlzdC5nZXQoaSk7CgkJCQlJUmVxdWVzdCBjMiA9IChJUmVxdWVzdCkgbGlzdC5nZXQoaik7CgkJCQlpZiAoYzEuZ2V0UmVzcG9uc2VUaW1lKCkgPCBjMi5nZXRSZXNwb25zZVRpbWUoKSkgewoJCQkJCWxpc3Quc2V0KGksIGMyKTsKCQkJCQlsaXN0LnNldChqLCBjMSk7CgkJCQl9CgkJCX0KCQl9Cgl9Cn0=