LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnRlc3RzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUudGVzdHMuaW50ZXJuYWwuVXRpbFRlc3RDYXNlOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS50ZXN0cy5tb2R1bGUuRGVsZXRlTW9kdWxlVGVzdENhc2U7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnRlc3RzLm1vZHVsZS5Nb2R1bGVUZXN0Q2FzZTsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CgpwdWJsaWMgY2xhc3MgQWxsVGVzdHMgewoJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewoJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUudGVzdHMiKTsKCQkvLyRKVW5pdC1CRUdJTiQKCQlTeXN0ZW0uc2V0UHJvcGVydHkoInd0cC5hdXRvdGVzdC5ub25pbnRlcmFjdGl2ZSIsICJ0cnVlIik7CgkJCgkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4aXN0ZW5jZVRlc3QuY2xhc3MpOwoJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0UnVudGltZVRlc3RDYXNlLmNsYXNzKSk7CgkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShNb2R1bGVUZXN0Q2FzZS5jbGFzcykpOwoJCQoJCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIpOyAKCQkvL3MgPSAiRDpcXFRvb2xzXFx0b21jYXRcXGpha2FydGEtdG9tY2F0LTMuMi40IjsKCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7CgkJCVJ1bnRpbWVMb2NhdGlvbi5ydW50aW1lTG9jYXRpb24gPSBzOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDMyUnVudGltZVRlc3RDYXNlLmNsYXNzKSk7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0MzJTZXJ2ZXJUZXN0Q2FzZS5jbGFzcykpOwoJCX0gZWxzZSB7CgkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogVG9tY2F0IDMuMiBub3QgZm91bmQgLSB0ZXN0cyBza2lwcGVkIik7CgkJfQoJCQoJCXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIik7CgkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewoJCQlSdW50aW1lTG9jYXRpb24ucnVudGltZUxvY2F0aW9uID0gczsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ0MFJ1bnRpbWVUZXN0Q2FzZS5jbGFzcykpOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDQwU2VydmVyVGVzdENhc2UuY2xhc3MpKTsKCQl9IGVsc2UgewoJCQlTeXN0ZW0uZXJyLnByaW50bG4oIldhcm5pbmc6IFRvbWNhdCA0LjAgbm90IGZvdW5kIC0gdGVzdHMgc2tpcHBlZCIpOwoJCX0KCQkKCQlzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIpOwoJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApIHsKCQkJUnVudGltZUxvY2F0aW9uLnJ1bnRpbWVMb2NhdGlvbiA9IHM7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0NDFSdW50aW1lVGVzdENhc2UuY2xhc3MpKTsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ0MVNlcnZlclRlc3RDYXNlLmNsYXNzKSk7CgkJfSBlbHNlIHsKCQkJU3lzdGVtLmVyci5wcmludGxuKCJXYXJuaW5nOiBUb21jYXQgNC4xIG5vdCBmb3VuZCAtIHRlc3RzIHNraXBwZWQiKTsKCQl9CgkJCgkJcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiKTsKCQkvL3MgPSAiRDpcXFRvb2xzXFx0b21jYXRcXGpha2FydGEtdG9tY2F0LTUuMC4xOSI7CgkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewoJCQlSdW50aW1lTG9jYXRpb24ucnVudGltZUxvY2F0aW9uID0gczsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ1MFJ1bnRpbWVUZXN0Q2FzZS5jbGFzcykpOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDUwU2VydmVyVGVzdENhc2UuY2xhc3MpKTsKCQl9IGVsc2UgewoJCQlTeXN0ZW0uZXJyLnByaW50bG4oIldhcm5pbmc6IFRvbWNhdCA1LjAgbm90IGZvdW5kIC0gdGVzdHMgc2tpcHBlZCIpOwoJCX0KCQkKCQlzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIpOwoJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApIHsKCQkJUnVudGltZUxvY2F0aW9uLnJ1bnRpbWVMb2NhdGlvbiA9IHM7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0NTVSdW50aW1lVGVzdENhc2UuY2xhc3MpKTsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ1NVNlcnZlclRlc3RDYXNlLmNsYXNzKSk7CgkJfSBlbHNlIHsKCQkJU3lzdGVtLmVyci5wcmludGxuKCJXYXJuaW5nOiBUb21jYXQgNS41IG5vdCBmb3VuZCAtIHRlc3RzIHNraXBwZWQiKTsKCQl9CgkJCgkJc3VpdGUuYWRkVGVzdFN1aXRlKFV0aWxUZXN0Q2FzZS5jbGFzcyk7CgkJCgkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShEZWxldGVNb2R1bGVUZXN0Q2FzZS5jbGFzcykpOwoJCS8vJEpVbml0LUVORCQKCQlyZXR1cm4gc3VpdGU7Cgl9Cn0=