LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7CmltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwoKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwoKaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CmltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwppbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwppbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKCgovKioKICogQnVpbGRzIHRoZSBjb25maWcgb2JqZWN0cyBmcm9tIHRoZWlyIFhNTCBkZWZpbml0aW9ucwogKiAKICogQGF1dGhvciBCLiBH9nJrZW0gRVJDQU4KICovCnB1YmxpYyBjbGFzcyBYTUxSZWFkZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgp7Cglwcml2YXRlIElYTUxUYWdQcm9jZXNzb3IgY29uZmlnID0gbnVsbDsKCXByaXZhdGUgQ2hhckFycmF5V3JpdGVyIGNvbnRlbnRzID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwoJcHVibGljIFhNTFJlYWRlcihJWE1MVGFnUHJvY2Vzc29yIGJ1aWxkQ29uZmlnKQoJewoJCXN1cGVyKCk7CgkJdGhpcy5jb25maWcgPSBidWlsZENvbmZpZzsKCX0KCgkvKioKCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQoJICovCglwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoJCXRocm93cyBTQVhFeGNlcHRpb24KCXsKCQljb250ZW50cy53cml0ZShjaCwgc3RhcnQsIGxlbmd0aCk7Cgl9CgoJLyoqCgkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKCSAqLwoJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZVNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCgkJdGhyb3dzIFNBWEV4Y2VwdGlvbgoJewoJCVN0cmluZyB0YWdOYW1lID0gKCBsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUubGVuZ3RoKCkgPiAwKSA/IGxvY2FsTmFtZSA6IHFOYW1lOwoJCWNvbmZpZy5hc3Nlc1RhZ0VuZCh0YWdOYW1lLCBjb250ZW50cy50b1N0cmluZygpKTsKCX0KCgkvKioKCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCgkgKi8KCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKCQlTdHJpbmcgbmFtZVNwYWNlVVJJLAoJCVN0cmluZyBsb2NhbE5hbWUsCgkJU3RyaW5nIHFOYW1lLAoJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykKCQl0aHJvd3MgU0FYRXhjZXB0aW9uCgl7CgkJY29udGVudHMucmVzZXQoKTsKCQlTdHJpbmcgdGFnTmFtZSA9ICggbG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLmxlbmd0aCgpID4gMCkgPyBsb2NhbE5hbWUgOiBxTmFtZTsKCQljb25maWcuYXNzZXNUYWdTdGFydCh0YWdOYW1lLGF0dHJpYnV0ZXMpOwoJfQoKCS8qKgoJICogTWV0aG9kIGdldENvbmZpZ09iamVjdC4KCSAqIEByZXR1cm4gT2JqZWN0CgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlnT2JqZWN0KCkKCXsKCQlyZXR1cm4gdGhpcy5jb25maWcuZ2V0Q29uZmlnT2JqZWN0KCk7Cgl9CgoJcHVibGljIHN0YXRpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBnZXRTZXJ2ZXJEZWZpbml0aW9uKFN0cmluZyBmaWxlTmFtZSkKCXsKCQl0cnkKCQl7CgkJCXJldHVybiAoU2VydmVyVHlwZURlZmluaXRpb24pIGRvUGFyc2UoZmlsZU5hbWUsIG5ldyBYTUxDb25maWd1cmF0aW9uKCkpOwoJCX0KCQljYXRjaCAoRXhjZXB0aW9uIGUpCgkJewoJCQllLnByaW50U3RhY2tUcmFjZSgpOy8vSjJFRVBsdWdpbi5sb2coZSk7CgkJCXJldHVybiBudWxsOwoJCX0KCgl9CgoJCQoJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGRvUGFyc2UoU3RyaW5nIGZpbGVOYW1lLCBJWE1MVGFnUHJvY2Vzc29yIGNmKQoJCXRocm93cwoJCQlGaWxlTm90Rm91bmRFeGNlcHRpb24sCgkJCUlPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KCXsKICAgICAgCgkJU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOzsKCQlzYXhQYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwoJCWphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBwYXJzZXIgPSAgc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKCQlwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7CgkJQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBuZXcgWE1MUmVhZGVyKGNmKTsKCQlwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIoY29udGVudEhhbmRsZXIpOwoJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSkpOwoJCXBhcnNlci5wYXJzZShzb3VyY2UsIG5ldyBYTUxSZWFkZXIoY2YpKTsKCQlyZXR1cm4gY2YuZ2V0Q29uZmlnT2JqZWN0KCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmcgY29udGVudCwgSVhNTFRhZ1Byb2Nlc3NvciBjZikKCQl0aHJvd3MKCQkJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAoJCQlJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCgl7CgkJU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOzsKCQlqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgcGFyc2VyID0gIHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CgkJc2F4UGFyc2VyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKCQlwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7CgkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBDaGFyQXJyYXlSZWFkZXIoY29udGVudC50b0NoYXJBcnJheSgpKSk7CgkJcGFyc2VyLnBhcnNlKHNvdXJjZSwgbmV3IFhNTFJlYWRlcihjZikpOwoJCXJldHVybiBjZi5nZXRDb25maWdPYmplY3QoKTsKCX0KCQp9Cg==