LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CmltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLyoqCiAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCiAqLwpwdWJsaWMgY2xhc3MgVHJhY2UgewoJcHVibGljIHN0YXRpYyBpbnQgQ09ORklHID0gMDsKCXB1YmxpYyBzdGF0aWMgaW50IElORk8gPSAxOwoJcHVibGljIHN0YXRpYyBpbnQgV0FSTklORyA9IDI7CglwdWJsaWMgc3RhdGljIGludCBTRVZFUkUgPSAzOwoJcHVibGljIHN0YXRpYyBpbnQgRklORVIgPSA0OwoJcHVibGljIHN0YXRpYyBpbnQgRklORVNUID0gNTsKCQoJcHVibGljIHN0YXRpYyBpbnQgUkVTT1VSQ0VTID0gNjsKCXB1YmxpYyBzdGF0aWMgaW50IEVYVEVOU0lPTl9QT0lOVCA9IDc7CglwdWJsaWMgc3RhdGljIGludCBMSVNURU5FUlMgPSA4OwoJcHVibGljIHN0YXRpYyBpbnQgUlVOVElNRV9UQVJHRVQgPSA5OwoJcHVibGljIHN0YXRpYyBpbnQgUEVSRk9STUFOQ0UgPSAxMDsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXZlbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKCQkiQ09ORklHICAgIiwgIklORk8gICAgICIsICJXQVJOSU5HICAiLCAiU0VWRVJFICAgIiwgIkZJTkVSICAgICIsICJGSU5FU1QgICAiLAoJCSJSRVNPVVJDRVMiLCAiRVhURU5TSU9OIiwgIkxJU1RFTkVSUyIsICJUQVJHRVQgICAiLCAiUEVSRiAgICAgIn07Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2VyID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZC9NTS95eSBISDptbS5zcy5TU1MiKTsKCglwcm90ZWN0ZWQgc3RhdGljIGludCBwbHVnaW5MZW5ndGggPSAtMTsKCgkvKioKCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXByaXZhdGUgVHJhY2UoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKioKCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgoJICoKCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGludCBsZXZlbCwgU3RyaW5nIHMpIHsKCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Cgl9CgoJLyoqCgkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgoJICoKCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKCSAqIEBwYXJhbSB0IGphdmEubGFuZy5UaHJvd2FibGUKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGludCBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7CgkJdHJhY2UoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgbGV2ZWwsIHMsIHQpOwoJfQoKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KCSAqCgkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCgkgKiBAcGFyYW0gdCBqYXZhLmxhbmcuVGhyb3dhYmxlCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcGx1Z2luSWQsIGludCBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7CgkJaWYgKHBsdWdpbklkID09IG51bGwgfHwgcyA9PSBudWxsKQoJCQlyZXR1cm47CgoJCWlmICghU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKCQkJcmV0dXJuOwoJCQoJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luSWQpOwoJCWlmIChwbHVnaW5JZC5sZW5ndGgoKSA+IHBsdWdpbkxlbmd0aCkKCQkJcGx1Z2luTGVuZ3RoID0gcGx1Z2luSWQubGVuZ3RoKCk7CgkJZWxzZSBpZiAocGx1Z2luSWQubGVuZ3RoKCkgPCBwbHVnaW5MZW5ndGgpCgkJCXNiLmFwcGVuZChzcGFjZXIuc3Vic3RyaW5nKDAsIHBsdWdpbkxlbmd0aCAtIHBsdWdpbklkLmxlbmd0aCgpKSk7CgkJc2IuYXBwZW5kKCIgIik7CgkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKCQlzYi5hcHBlbmQoIiAiKTsKCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7CgkJc2IuYXBwZW5kKCIgIik7CgkJc2IuYXBwZW5kKHMpOwoJCS8vUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU2VydmVyQ29yZS5QTFVHSU5fSUQgKyAiLyIgKyAicmVzb3VyY2VzIik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKCQlpZiAodCAhPSBudWxsKQoJCQl0LnByaW50U3RhY2tUcmFjZSgpOwoJfQoKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCgkgKgoJICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHMpIHsKCQl0cmFjZShzLCBudWxsKTsKCX0KCgkvKioKCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCgkgKgoJICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwoJICogQHBhcmFtIHQgamF2YS5sYW5nLlRocm93YWJsZQoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7CgkJdHJhY2UoRklORVIsIHMsIHQpOwoJfQp9