LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2IEVjbGlwc2UgRm91bmRhdGlvbgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGplc3BlckBzZWxza2FiZXQub3JnCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy5mb3JtYXQ7CgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHMudXRpbC5TdHJpbmdDb21wYXJlVXRpbDsKCnB1YmxpYyBjbGFzcyBUZXN0Rm9ybWF0UHJvY2Vzc29yWE1MIGV4dGVuZHMgVGVzdENhc2UgewoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BMSVRfTVVMVElfQVRUUlMgPSBmYWxzZTsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UID0gIiAiOwoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gZmFsc2U7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MSU5FX1dJRFRIID0gNzI7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKCQoJcHJpdmF0ZSBTdHJpbmdDb21wYXJlVXRpbCBmU3RyaW5nQ29tcGFyZVV0aWw7CgoJcHVibGljIFRlc3RGb3JtYXRQcm9jZXNzb3JYTUwoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCglwcml2YXRlIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3I7CgoJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7CgkJZlN0cmluZ0NvbXBhcmVVdGlsID0gbmV3IFN0cmluZ0NvbXBhcmVVdGlsKCk7Cgl9CgoJLyoqCgkgKiBtdXN0IHJlbGVhc2UgbW9kZWwgKGZyb20gZWRpdCkgYWZ0ZXIKCSAqIAoJICogQHBhcmFtIGZpbGVuYW1lCgkgKiAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoaXMgY2xhc3MgKFRlc3RTdHJ1Y3R1cmVkUGFydGl0aW9uZXIpCgkgKi8KCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7CgoJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwoJCXRyeSB7CgkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUpOwoJCQlpZiAoaW5TdHJlYW0gPT0gbnVsbCkKCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGZpbGUgcmVzb3VyY2Ugc3RyZWFtICIgKyBmaWxlbmFtZSk7CgkJCWZpbmFsIFN0cmluZyBiYXNlRmlsZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoZmlsZW5hbWUpLnRvU3RyaW5nKCk7CgkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChiYXNlRmlsZSwgaW5TdHJlYW0sIG5ldyBVUklSZXNvbHZlcigpIHsKCgkJCQlTdHJpbmcgZkJhc2UgPSBiYXNlRmlsZTsKCgkJCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7CgkJCQkJcmV0dXJuIGZCYXNlOwoJCQkJfQoKCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7CgkJCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBmQmFzZSk7CgkJCQl9CgoJCQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7CgkJCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpKTsKCQkJCX0KCgkJCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpIHsKCQkJCQlpbnQgbGFzdFNsYXNoID0gYmFzZVJlZmVyZW5jZS5sYXN0SW5kZXhPZigiLyIpOwoJCQkJCWlmIChsYXN0U2xhc2ggPiAwKQoJCQkJCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICsgMSkgKyB1cmk7CgkJCQkJcmV0dXJuIGJhc2VSZWZlcmVuY2U7CgkJCQl9CgoJCQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewoJCQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgYmFzZVJlZmVyZW5jZSk7CgkJCQl9CgoJCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CgkJCQkJcmV0dXJuIG51bGw7CgkJCQl9CgoJCQkJcHVibGljIElDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoKCQkJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewoJCQkJCXJldHVybiBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0TG9jYXRpb25CeVVSSSh1cmkpKTsKCQkJCX0KCgkJCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewoJCQkJCXRoaXMuZkJhc2UgPSBuZXdMb2NhdGlvbjsKCQkJCX0KCgkJCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKCQkJCX0KCQkJfSk7CgkJfQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewoJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKCQl9CgkJcmV0dXJuIG1vZGVsOwoJfQoKCXByb3RlY3RlZCB2b2lkIGZvcm1hdEFuZEFzc2VydEVxdWFscyhTdHJpbmcgYmVmb3JlUGF0aCwgU3RyaW5nIGFmdGVyUGF0aCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlJU3RydWN0dXJlZE1vZGVsIGJlZm9yZU1vZGVsID0gbnVsbCwgYWZ0ZXJNb2RlbCA9IG51bGw7CgkJdHJ5IHsKCQkJYmVmb3JlTW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoYmVmb3JlUGF0aCk7CgkJCWFzc2VydE5vdE51bGwoImNvdWxkIG5vdCByZXRyaWV2ZSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciA6ICIgKyBiZWZvcmVQYXRoLCBiZWZvcmVNb2RlbCk7CgoJCQlhZnRlck1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0KGFmdGVyUGF0aCk7CgkJCWFzc2VydE5vdE51bGwoImNvdWxkIG5vdCByZXRyaWV2ZSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciA6ICIgKyBhZnRlclBhdGgsIGFmdGVyTW9kZWwpOwoKCQkJSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByb2Nlc3Nvci5nZXRGb3JtYXRQcmVmZXJlbmNlcygpOwoJCQlmb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgoTUFYX0xJTkVfV0lEVEgpOwoJCQlmb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMoQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKTsKCQkJZm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KElOREVOVCk7CgkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhTUExJVF9NVUxUSV9BVFRSUyk7CgoJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0TW9kZWwoYmVmb3JlTW9kZWwpOwoKCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZvcm1hdHRlZEJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQliZWZvcmVNb2RlbC5zYXZlKGZvcm1hdHRlZEJ5dGVzKTsgLy8gImJlZm9yZU1vZGVsIiBzaG91bGQgbm93IGJlCgkJCS8vIGFmdGVyIHRoZSBmb3JtYXR0ZXIKCgkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBhZnRlckJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQlhZnRlck1vZGVsLnNhdmUoYWZ0ZXJCeXRlcyk7CgoJCQlTdHJpbmcgZm9ybWF0dGVkQ29udGVudHMgPSBuZXcgU3RyaW5nKGFmdGVyQnl0ZXMudG9CeXRlQXJyYXkoKSwgVVRGXzgpOwoJCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9IG5ldyBTdHJpbmcoZm9ybWF0dGVkQnl0ZXMudG9CeXRlQXJyYXkoKSwgVVRGXzgpOwoJCQlhc3NlcnRUcnVlKCJGb3JtYXR0ZWQgZG9jdW1lbnQgZGlmZmVycyBmcm9tIHRoZSBleHBlY3RlZCIsIGZTdHJpbmdDb21wYXJlVXRpbC5lcXVhbHNJZ25vcmVMaW5lU2VwZXJhdG9yKGZvcm1hdHRlZENvbnRlbnRzLCBleHBlY3RlZENvbnRlbnRzKSk7CgkJfQoJCWZpbmFsbHkgewoJCQlpZiAoYmVmb3JlTW9kZWwgIT0gbnVsbCkKCQkJCWJlZm9yZU1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCQlpZiAoYWZ0ZXJNb2RlbCAhPSBudWxsKQoJCQkJYWZ0ZXJNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKCQl9Cgl9CgoJcHVibGljIHZvaWQgdGVzdFNpbXBsZVhtbCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKCJ0ZXN0ZmlsZXMveG1sL3NpbXBsZS1zdGFuZGFsb25lLnhtbCIsICJ0ZXN0ZmlsZXMveG1sL3NpbXBsZS1zdGFuZGFsb25lLWZtdC54bWwiKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0UHJlc2VydmVGb3JtYXQoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewoJCWZvcm1hdEFuZEFzc2VydEVxdWFscygidGVzdGZpbGVzL3htbC94bWwtc3BhY2UtcHJlc2VydmUtc3RhbmRhbG9uZS54bWwiLCAidGVzdGZpbGVzL3htbC94bWwtc3BhY2UtcHJlc2VydmUtc3RhbmRhbG9uZS1mbXQueG1sIik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdFByZXNlcnZlRm9ybWF0RFREKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlmb3JtYXRBbmRBc3NlcnRFcXVhbHMoInRlc3RmaWxlcy94bWwveG1sLXNwYWNlLXByZXNlcnZlLWR0ZC54bWwiLCAidGVzdGZpbGVzL3htbC94bWwtc3BhY2UtcHJlc2VydmUtZHRkLWZtdC54bWwiKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0T25lTGluZUZvcm1hdCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gQlVHMTE1NzE2CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKCJ0ZXN0ZmlsZXMveG1sL29uZWxpbmUueG1sIiwgInRlc3RmaWxlcy94bWwvb25lbGluZS1mbXQueG1sIik7Cgl9Cgp9Cg==