LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7CgppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5Nb25pdG9yQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci8qKgogKiBBbiB0cmFuc3BvcnQgKGhlYWRlcikgdmlld2VyLgogKi8KcHVibGljIGNsYXNzIEhlYWRlclZpZXdlciB7Cglwcm90ZWN0ZWQgYm9vbGVhbiBkaXNwbGF5SGVhZGVyOwoKCXByb3RlY3RlZCBDb21wb3NpdGUgaGVhZGVyQ29tcDsKCXByb3RlY3RlZCBDb21wb3NpdGUgaW5uZXJDb21wOwoJcHJvdGVjdGVkIENvbXBvc2l0ZSByb290Q29tcDsKCglwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyTGFiZWw7Cglwcm90ZWN0ZWQgVGV4dCBoZWFkZXJUZXh0OwoJcHJvdGVjdGVkIElSZXF1ZXN0IHJyOwoJcHJvdGVjdGVkIGJ5dGUgbXNnOwoJcHJvdGVjdGVkIEdyaWRMYXlvdXQgbGF5b3V0OwoJcHJvdGVjdGVkIEdyaWREYXRhIGRhdGE7CgoJcHJvdGVjdGVkIGJvb2xlYW4gaGlkZGVuOwoKCXByb3RlY3RlZCBzdGF0aWMgaW50IEhFQURFUl9MQUJFTF9TSVpFID0gMTU7Cglwcm90ZWN0ZWQgc3RhdGljIGludCBIRUFERVJfVEVYVF9TSVpFID0gMTEwOwoJcHVibGljIHN0YXRpYyBieXRlIFJFUVVFU1RfSEVBREVSID0gMDsKCXB1YmxpYyBzdGF0aWMgYnl0ZSBSRVNQT05TRV9IRUFERVIgPSAxOwoKCXB1YmxpYyBIZWFkZXJWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgYnl0ZSBtZXNzYWdlKSB7CgkJcm9vdENvbXAgPSBwYXJlbnQ7CgkJZGlzcGxheUhlYWRlciA9IHRydWU7CgkJaGlkZGVuID0gZmFsc2U7CgkJCgkJaGVhZGVyQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CgkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQloZWFkZXJDb21wLnNldExheW91dChsYXlvdXQpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CgoJCWlubmVyQ29tcCA9IG5ldyBDb21wb3NpdGUoaGVhZGVyQ29tcCwgU1dULk5PTkUpOwoJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwoJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwoJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7CgkJaW5uZXJDb21wLnNldExheW91dChsYXlvdXQpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKCQlkYXRhLmhlaWdodEhpbnQgPSBIRUFERVJfTEFCRUxfU0laRTsKCQlpbm5lckNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKCgkJcnIgPSBudWxsOwoJCW1zZyA9IG1lc3NhZ2U7CgoJCXNldERpc3BsYXlIZWFkZXIoZmFsc2UpOwoJfQoJCgkvKnB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgewoJCXJldHVybiBoaWRkZW47Cgl9Ki8KCQoJLypwdWJsaWMgdm9pZCBoaWRlVmlld2VyKCkgewoJCWhpZGRlbiA9IHRydWU7CgkJaW5uZXJDb21wLmRpc3Bvc2UoKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CgkJZGF0YS5oZWlnaHRIaW50ID0gMDsKCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CQoJCXJvb3RDb21wLmxheW91dCh0cnVlKTsKCX0KCQoJcHVibGljIHZvaWQgc2hvd1ZpZXdlcigpIHsKCQloaWRkZW4gPSBmYWxzZTsKCQkKCQlpbm5lckNvbXAgPSBuZXcgQ29tcG9zaXRlKGhlYWRlckNvbXAsIFNXVC5OT05FKTsKCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5udW1Db2x1bW5zID0gMTsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwoJCWlubmVyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJZGF0YS5oZWlnaHRIaW50ID0gSEVBREVSX0xBQkVMX1NJWkU7CgkJaW5uZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CgkJCgkJZGlzcGxheUhlYWRlciA9IHRydWU7CgkJc2V0RGlzcGxheUhlYWRlcihmYWxzZSk7Cgl9Ki8KCQoJcHVibGljIHZvaWQgc2V0UmVxdWVzdFJlc3BvbnNlKElSZXF1ZXN0IHJlcXJlc3ApIHsKCQlyciA9IHJlcXJlc3A7CgkJaWYgKCFoaWRkZW4pCgkJCWdldFZpZXcoKTsKCX0KCglwdWJsaWMgdm9pZCBzZXREaXNwbGF5SGVhZGVyKGJvb2xlYW4gYikgewoJCWlmIChkaXNwbGF5SGVhZGVyICE9IGIpIHsKCQkJZGlzcGxheUhlYWRlciA9IGI7CgkJCWlmIChkaXNwbGF5SGVhZGVyKSB7CgkJCQlpbm5lckNvbXAuZGlzcG9zZSgpOwoKCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKCQkJCWRhdGEuaGVpZ2h0SGludCA9IEhFQURFUl9URVhUX1NJWkU7CgkJCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CgkJCQkJCQkJCgkJCQlpbm5lckNvbXAgPSBuZXcgQ29tcG9zaXRlKGhlYWRlckNvbXAsIFNXVC5OT05FKTsKCQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CgkJCQlpbm5lckNvbXAuc2V0TGF5b3V0KGxheW91dCk7CgkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJCQlkYXRhLmhlaWdodEhpbnQgPSBIRUFERVJfVEVYVF9TSVpFOwoJCQkJaW5uZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CgkJCQkJCQkJCgkJCQloZWFkZXJUZXh0ID0gbmV3IFRleHQoaW5uZXJDb21wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CgkJCQlEaXNwbGF5IGRpc3BsYXkgPSBpbm5lckNvbXAuZ2V0RGlzcGxheSgpOwoJCQkJaGVhZGVyVGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwoJCQkJaGVhZGVyVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwoJCQkJaGVhZGVyVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7CgkJCQloZWFkZXJUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7CgkJCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoaGVhZGVyVGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKCgkJCQlyb290Q29tcC5sYXlvdXQodHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQlpbm5lckNvbXAuZGlzcG9zZSgpOwoKCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKCQkJCWRhdGEuaGVpZ2h0SGludCA9IEhFQURFUl9MQUJFTF9TSVpFOwoJCQkJaGVhZGVyQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCQkJCgkJCQlpbm5lckNvbXAgPSBuZXcgQ29tcG9zaXRlKGhlYWRlckNvbXAsIFNXVC5OT05FKTsKCQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7CgkJCQlpbm5lckNvbXAuc2V0TGF5b3V0KGxheW91dCk7CgkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJCQlkYXRhLmhlaWdodEhpbnQgPSBIRUFERVJfTEFCRUxfU0laRTsKCQkJCWlubmVyQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwoKCQkJCWhlYWRlckxhYmVsID0gbmV3IExhYmVsKGlubmVyQ29tcCwgU1dULk5PTkUpOwoJCQkJaGVhZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CgkJCQkKCQkJCXJvb3RDb21wLmxheW91dCh0cnVlKTsKCQkJfQoJCX0KCQlnZXRWaWV3KCk7Cgl9CgoJLypwdWJsaWMgYm9vbGVhbiBnZXREaXNwbGF5SGVhZGVyKCkgewoJCXJldHVybiBkaXNwbGF5SGVhZGVyOwoJfSovCgoJcHJpdmF0ZSB2b2lkIGdldFZpZXcoKSB7CgkJU3RyaW5nIG91dCA9ICIiOwoJCWlmIChyciAhPSBudWxsKSB7CgkJCWlmIChtc2cgPT0gUkVRVUVTVF9IRUFERVIpIHsKCQkJCW91dCA9IE1vbml0b3JDb3JlLnBhcnNlKHJyLmdldFJlcXVlc3QoSVJlcXVlc3QuVFJBTlNQT1JUKSk7CgkJCX0gZWxzZSBpZiAobXNnID09IFJFU1BPTlNFX0hFQURFUikgewoJCQkJb3V0ID0gTW9uaXRvckNvcmUucGFyc2UocnIuZ2V0UmVzcG9uc2UoSVJlcXVlc3QuVFJBTlNQT1JUKSk7CgkJCX0KCQl9CgkJCgkJaWYgKGRpc3BsYXlIZWFkZXIpIHsKCQkJaGVhZGVyVGV4dC5zZXRUZXh0KG91dCk7CgkJfSBlbHNlIHsKCQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CgkJCWludCBpbmRleCA9IG91dC5pbmRleE9mKGxpbmVTZXBhcmF0b3IpOwoJCQlpZihpbmRleCA+IDApCgkJCQloZWFkZXJMYWJlbC5zZXRUZXh0KE1vbml0b3JVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWhlYWRlckxhYmVsIikgKyAiOiAiICsgb3V0LnN1YnN0cmluZygwLCBpbmRleCkpOwoJCQllbHNlIAoJCQkJaGVhZGVyTGFiZWwuc2V0VGV4dChNb25pdG9yVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVoZWFkZXJMYWJlbCIpICsgIjogICIgKyBvdXQpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCWhlYWRlckNvbXAuZGlzcG9zZSgpOwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgdGhlIGhlYWRlciBjYW4gYmUgZWRpdGVkLgoJICogCgkgKiBAcGFyYW0gZWRpdGFibGUgSWYgdHJ1ZSB0aGUgaGVhZGVyIGNhbiBiZSBlZGl0ZWQsIG90aGVyd2lzZSB0aGUgaGVhZGVyIGNhbm5vdCBiZSBlZGl0ZWQuCgkgKi8KCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKCQloZWFkZXJUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSBoZWFkZXIuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgZnJvbSB0aGUgaGVhZGVyLgoJICovCglwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7CgkJaWYgKGhlYWRlclRleHQgPT0gbnVsbCB8fCBoZWFkZXJUZXh0LmlzRGlzcG9zZWQoKSkKCQkJcmV0dXJuIG51bGw7CgkJCgkJU3RyaW5nIGhlYWRlciA9IGhlYWRlclRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgNCBieXRlcyBlbmQgdGhlIGhlYWRlci4gVGhlIGdldEJ5dGVzKCkKCQkvLyBtZXRob2QgcmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgoJCWJ5dGVbXSB0d29OZXdsaW5lcyA9IG5ldyBieXRlW10geyAnXDAxNScsICdcMDEyJywgJ1wwMTUnLCAnXDAxMicgfTsKCQlieXRlW10gaGVhZGVyQnl0ZXMgPSBoZWFkZXIuZ2V0Qnl0ZXMoKTsKCQlieXRlW10gcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtoZWFkZXJCeXRlcy5sZW5ndGggKyA0XTsKCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlckJ5dGVzLCAwLCByZXRCeXRlcywgMCwgaGVhZGVyQnl0ZXMubGVuZ3RoKTsKCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgaGVhZGVyQnl0ZXMubGVuZ3RoLCA0KTsKCQlyZXR1cm4gcmV0Qnl0ZXM7Cgl9Cn0=