LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7CgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLkNvbnRlbnRWaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci8qKgogKiBBbiBpbWFnZSB2aWV3ZXIuCiAqLwpwdWJsaWMgY2xhc3MgSW1hZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKCXByb3RlY3RlZCBDb21wb3NpdGUgcm9vdENvbXA7Cglwcm90ZWN0ZWQgQ29tcG9zaXRlIHZpZXdlckNvbXA7Cglwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuSUNvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCgkgKi8KCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewoJCXJvb3RDb21wID0gcGFyZW50OwoJCQoJCXZpZXdlckNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwoJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQl2aWV3ZXJDb21wLnNldExheW91dChsYXlvdXQpOwoJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKCQl2aWV3ZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7CgoJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbCh2aWV3ZXJDb21wLCBTV1QuTk9ORSk7CgkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuSUNvbnRlbnRWaWV3ZXIjc2V0Q29udGVudCgpCgkgKi8KCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoYnl0ZVtdIGIpIHsKCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApIHsKCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoIjwiICsgTW9uaXRvclVJUGx1Z2luLmdldFJlc291cmNlKCIlaW1hZ2VWaWV3SW52YWxpZCIpICsgIj4iKTsKCQl9IGVsc2UgewoJCQlieXRlIGNyID0gJ1xyJzsKCQkJYnl0ZSBsZiA9ICdcbic7CgkJCWludCB0cmltRnJvbnQgPSAwOwoJCQlpbnQgdHJpbUJhY2sgPSAwOwoJCQlpbnQgbGVuID0gYi5sZW5ndGggLSAxOwoJCQl3aGlsZShiW3RyaW1Gcm9udF0gPT0gY3IgfHwgYlt0cmltRnJvbnRdID09IGxmKQoJCQkJdHJpbUZyb250Kys7CgkJCXdoaWxlKGJbbGVuIC0gdHJpbUJhY2tdID09IGNyIHx8IGJbbGVuIC0gdHJpbUJhY2tdID09IGxmKQoJCQkJdHJpbUJhY2srKzsKCQkJCQoJCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiAwKSB7CgkJCQlieXRlW10gdGVtcCA9IGI7CgkJCQliID0gbmV3IGJ5dGVbdGVtcC5sZW5ndGggLSB0cmltQmFjayAtIHRyaW1Gcm9udF07CgkJCQlmb3IoaW50IGkgPSB0cmltRnJvbnQ7IGkgPCB0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrOyBpKyspIHsKCQkJCQliW2kgLSB0cmltRnJvbnRdID0gdGVtcFtpXTsKCQkJCX0KCQkJfQoJCQl0cnkgewoJCQkJSW1hZ2VEYXRhIGltZ0QgPSBuZXcgSW1hZ2VEYXRhKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKSk7CgkJCQlJbWFnZSBpbWcgPSBuZXcgSW1hZ2UobnVsbCwgaW1nRCk7CgkJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UoaW1nKTsKCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewoJCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoIjwiICsgTW9uaXRvclVJUGx1Z2luLmdldFJlc291cmNlKCIlaW1hZ2VWaWV3SW52YWxpZCIpICsgIj4iKTsKCQkJfQoJCX0KCQkKCQl2aWV3ZXJDb21wLmxheW91dCh0cnVlKTsKCX0KCQoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5JQ29udGVudFZpZXdlciNkaXNwb3NlKCkKCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQl2aWV3ZXJDb21wLmRpc3Bvc2UoKTsKCX0KfQ==