LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDEyIEp1ZXJnZW4gSGF1ZwogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCiAqCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAqIAogKiBDT05UUklCVVRPUlM6CiAqIAkJSnVlcmdlbiBIYXVnCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnBhY2thZ2Ugb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5qYXZhLmdlbgoKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdAppbXBvcnQgamF2YS51dGlsLkxpc3QKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5BY3Rvckluc3RhbmNlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uSW5zdGFuY2VCYXNlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkFjdG9yQ2xhc3MKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uQXR0cmlidXRlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkRhdGFDbGFzcwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5FbnVtZXJhdGlvblR5cGUKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUHJpbWl0aXZlVHlwZQppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS51dGlsLlJvb21IZWxwZXJzCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmJhc2UuSURhdGFDb25maWd1cmF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmdlbmVyaWMuUHJvY2VkdXJlSGVscGVycwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5nZW5lcmljLlJvb21FeHRlbnNpb25zCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmdlbmVyaWMuVHlwZUhlbHBlcnMKCmNsYXNzIENvbmZpZ0dlbkFkZG9uIHsKCQoJQEluamVjdCBleHRlbnNpb24gSmF2YUV4dGVuc2lvbnMgc3RkRXh0CglASW5qZWN0IGV4dGVuc2lvbiBUeXBlSGVscGVycyB0eXBlSGVscGVycwoJQEluamVjdCBleHRlbnNpb24gUHJvY2VkdXJlSGVscGVycyBoZWxwZXJzCglASW5qZWN0IElEYXRhQ29uZmlndXJhdGlvbiBkYXRhQ29uZmlnRXh0CglASW5qZWN0IGV4dGVuc2lvbiBSb29tSGVscGVycwoJQEluamVjdCBleHRlbnNpb24gUm9vbUV4dGVuc2lvbnMKCUBJbmplY3QgSW5pdGlhbGl6YXRpb24gaW5pdEdlbgoJCgkvLyBGb3IgU3ViU3lzdGVtQ2xhc3NHZW4KCQoJZGVmIHB1YmxpYyBnZW5BY3Rvckluc3RhbmNlQ29uZmlnKEFjdG9ySW5zdGFuY2UgYWksIFN0cmluZyBhaVZhcmlhYmxlTmFtZSl7JycnCgkJCatGT1IgYSA6IGFpLmFjdG9yQ2xhc3MuYWxsQXR0cmlidXRlc7sKCQkJCathcHBseUluc3RhbmNlQ29uZmlnKGFpLCBhaVZhcmlhYmxlTmFtZSwgbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGU+KCkudW5pb24oYSkpuwoJCQmrRU5ERk9SuwoJCQmrRk9SIHBpIDogYWkub3JkZXJlZElmSXRlbUluc3RhbmNlc7sKCQkJCat2YXIgYXR0cmlicyA9IGdldFBvcnRDbGFzcyhwaS5pbnRlcmZhY2VJdGVtKT8uYXR0cmlidXRlc7sKCQkJCatJRiBhdHRyaWJzICE9PSBudWxsuwoJCQkJCatGT1IgYSA6IGF0dHJpYnO7CgkJCQkJCathcHBseUluc3RhbmNlQ29uZmlnKHBpLCBhaVZhcmlhYmxlTmFtZSsiLiIraW52b2tlR2V0dGVyKHBpLm5hbWUsIG51bGwpLCBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZT4oKS51bmlvbihhKSm7CgkJCQkJq0VOREZPUrsKCQkJCatFTkRJRrsKCQkJq0VOREZPUrsKCQknJycKCX0KCQoJZGVmIHByaXZhdGUgQ2hhclNlcXVlbmNlIGFwcGx5SW5zdGFuY2VDb25maWcoSW5zdGFuY2VCYXNlIGluc3RhbmNlLCBTdHJpbmcgaW52b2tlcywgTGlzdDxBdHRyaWJ1dGU+IHBhdGgpewoJCXZhciBhID0gcGF0aC5sYXN0CgkJdmFyIGFUeXBlID0gYS50eXBlLnR5cGUJCQoJCXN3aXRjaCBhVHlwZSB7CgkJCVByaW1pdGl2ZVR5cGU6IHsKCQkJCXZhciB2YWx1ZSA9IHR5cGVIZWxwZXJzLmdldEF0dHJJbnN0YW5jZUNvbmZpZ1ZhbHVlKHBhdGgsIGluc3RhbmNlKQoJCQkJaWYodmFsdWUgIT09IG51bGwpCgkJCQkJaW5pdEdlbi5nZW5BdHRyaWJ1dGVJbml0aWFsaXplcihhLCB0b1ZhbHVlTGl0ZXJhbChhVHlwZSwgdmFsdWUpLCBpbnZva2VzKQkKCQkJfQoJCQlFbnVtZXJhdGlvblR5cGU6IHsKCQkJCXZhciB2YWx1ZSA9IHR5cGVIZWxwZXJzLmdldEF0dHJJbnN0YW5jZUNvbmZpZ1ZhbHVlKHBhdGgsIGluc3RhbmNlKQoJCQkJaWYodmFsdWUgIT09IG51bGwpCgkJCQkJaW5pdEdlbi5nZW5BdHRyaWJ1dGVJbml0aWFsaXplcihhLCB2YWx1ZSwgaW52b2tlcykKCQkJfQoJCQlEYXRhQ2xhc3M6CgkJCQknJycKCQkJCQmrRk9SIGUgOiAoYVR5cGUgYXMgRGF0YUNsYXNzKS5hbGxBdHRyaWJ1dGVzuwoJCQkJCQmrYXBwbHlJbnN0YW5jZUNvbmZpZyhpbnN0YW5jZSwgaW52b2tlcysiLiIrYS5uYW1lLmludm9rZUdldHRlcihudWxsKSwgcGF0aC51bmlvbihlKSm7CgkJCQkJq0VOREZPUrsKCQkJCScnJwkKCQl9CQoJfQoJCgkvLyBGb3IgQWN0b3JDbGFzc0dlbgoJCglkZWYgcHVibGljIGdlbkR5bkNvbmZpZ0dldHRlclNldHRlcihBY3RvckNsYXNzIGFjKXsnJycKCQmrRk9SIGEgOiBkYXRhQ29uZmlnRXh0LmdldER5bkNvbmZpZ1JlYWRBdHRyaWJ1dGVzKGFjKbsKCQkJcHVibGljIKthLnR5cGUudHlwZS50eXBlTmFtZburSUYgYS5zaXplPjC7W12rRU5ESUa7IGdldKthLm5hbWUudG9GaXJzdFVwcGVyuygpewoJCQkJaWYobG9ja1+rYS5uYW1luyA9PSBudWxsKQoJCQkJCXJldHVybiCrYS5uYW1luzsKCQkJCWVsc2UKCQkJCQlzeW5jaHJvbml6ZWQobG9ja1+rYS5uYW1luyl7CgkJCQkJCXJldHVybiCrYS5uYW1luzsKCQkJCQl9CgkJCX0KCQkJcHVibGljIHZvaWQgc2V0q2EubmFtZS50b0ZpcnN0VXBwZXK7KKthLnR5cGUudHlwZS50eXBlTmFtZburSUYgYS5zaXplPjC7W12rRU5ESUa7IKthLm5hbWW7KXsKCQkJCWlmKGxvY2tfq2EubmFtZbsgPT0gbnVsbCkKCQkJCQl0aGlzLqthLm5hbWW7ID0gq2EubmFtZbs7CgkJCQllbHNlCgkJCQkJc3luY2hyb25pemVkKGxvY2tfq2EubmFtZbspewoJCQkJCQl0aGlzLqthLm5hbWW7ID0gq2EubmFtZbs7CgkJCQkJfQoJCQl9CgkJCXB1YmxpYyBEeW5Db25maWdMb2NrIGdldKthLm5hbWUudG9GaXJzdFVwcGVyu0xvY2soKXsKCQkJCXJldHVybiBsb2NrX6thLm5hbWW7OwoJCQl9CQoJCatFTkRGT1K7CgkJq0ZPUiBhIDogZGF0YUNvbmZpZ0V4dC5nZXREeW5Db25maWdXcml0ZUF0dHJpYnV0ZXMoYWMpuwoJCQlwdWJsaWMgdm9pZCBzZXRBbmRXcml0ZathLm5hbWUudG9GaXJzdFVwcGVyuyirYS50eXBlLnR5cGUudHlwZU5hbWW7q0lGIGEuc2l6ZT4wu1tdq0VORElGuyCrYS5uYW1luyl7CgkJCQkJc2V0q2EubmFtZS50b0ZpcnN0VXBwZXK7KKthLm5hbWW7KTsKCQkJCQlnZXRWYXJpYWJsZVNlcnZpY2UoKS53cml0ZSh0aGlzLmdldEluc3RhbmNlUGF0aCgpKyIvq2EubmFtZbsiLCCrYS5uYW1luyk7CgkJCX0KCQmrRU5ERk9SuwoJJycnfQoJCglkZWYgcHVibGljIGdlbk1pbk1heENvbnN0YW50cyhBY3RvckNsYXNzIGFjKXsKCQl2YXIgcmVzdWx0ID0gJycnCgkJCatGT1IgYSA6IGFjLmFsbEF0dHJpYnV0ZXO7CgkJCQmrZ2VuTWluTWF4Q29uc3RhbnRzUmVjKGFjLCBhLm5hbWUsIG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlPigpLnVuaW9uKGEpKbsKCQkJq0VOREZPUrsKCQknJycKCQlpZihyZXN1bHQubGVuZ3RoICE9IDApCgkJCXJlc3VsdCA9IHJlc3VsdCsnJycvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGUgU3BlY2lmaWNhdGlvbnMnJycKCQlyZXR1cm4gcmVzdWx0Cgl9CgkKCWRlZiBwcml2YXRlIENoYXJTZXF1ZW5jZSBnZW5NaW5NYXhDb25zdGFudHNSZWMoQWN0b3JDbGFzcyBhYywgU3RyaW5nIHZhck5hbWVQYXRoLCBMaXN0PEF0dHJpYnV0ZT4gcGF0aCl7CgkJdmFyIGFUeXBlID0gcGF0aC5sYXN0LnR5cGUudHlwZQoJCXN3aXRjaCBhVHlwZSB7CgkJCURhdGFDbGFzczoKCQkJCScnJwoJCQkJCatGT1IgZSA6IChhVHlwZSBhcyBEYXRhQ2xhc3MpLmFsbEF0dHJpYnV0ZXO7CgkJCQkJCatnZW5NaW5NYXhDb25zdGFudHNSZWMoYWMsIHZhck5hbWVQYXRoKyJfIitlLm5hbWUsIHBhdGgudW5pb24oZSkpuwoJCQkJCatFTkRGT1K7CgkJCQknJycKCQkJUHJpbWl0aXZlVHlwZTp7CgkJCQl2YXIgdGVtcCA9IG51bGwgYXMgU3RyaW5nCgkJCQknJycKCQkJCQmrSUYgKHRlbXAgPSBkYXRhQ29uZmlnRXh0LmdldEF0dHJDbGFzc0NvbmZpZ01pblZhbHVlKGFjLCBwYXRoKSkgIT09IG51bGy7CgkJCQkJCXB1YmxpYyBzdGF0aWMgq2FUeXBlLm1pbk1heFR5cGW7IE1JTl+rdmFyTmFtZVBhdGi7ID0gq2FUeXBlLnRvVmFsdWVMaXRlcmFsKHRlbXApuzsKCQkJCQmrRU5ESUa7CgkJCQkJq0lGICh0ZW1wID0gZGF0YUNvbmZpZ0V4dC5nZXRBdHRyQ2xhc3NDb25maWdNYXhWYWx1ZShhYywgcGF0aCkpICE9PSBudWxsuwoJCQkJCQlwdWJsaWMgc3RhdGljIKthVHlwZS5taW5NYXhUeXBluyBNQVhfq3Zhck5hbWVQYXRouyA9IKthVHlwZS50b1ZhbHVlTGl0ZXJhbCh0ZW1wKbs7CgkJCQkJq0VORElGuwoJCQkJJycnCgkJCX0KCQl9Cgl9CgkKCWRlZiBwcml2YXRlIGdldE1pbk1heFR5cGUoUHJpbWl0aXZlVHlwZSB0eXBlKXsKCQlyZXR1cm4gc3dpdGNoKHR5cGUudHlwZU5hbWUpewoJCQljYXNlICJieXRlIjoKCQkJCSJpbnQiCgkJCWNhc2UgInNob3J0IjoKCQkJCSJpbnQiCgkJCWNhc2UgImZsb2F0IjoKCQkJCSJkb3VibGUiCgkJCWRlZmF1bHQ6CgkJCQl0eXBlLnR5cGVOYW1lCgkJfQoJfQoJCn0K