LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai53aXphcmRzLnVpLndpemFyZHM7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS52aWV3cy5EYXduRXhwbG9yZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZUZvbGRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnNlc3Npb24uQ0RPU2Vzc2lvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnRyYW5zYWN0aW9uLkNET1RyYW5zYWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udmlldy5DRE9WaWV3Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2oud2l6YXJkcy5XaXphcmRFTUZDb250ZXh0Ow0KDQoNCnB1YmxpYyBjbGFzcyBOZXdCYXNlbGluZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QUk9KRUNUX0JBU0VMSU5FID0gIkNyZWF0ZSBQcm9qZWN0IEJhc2VsaW5lIjsNCglwcml2YXRlIFNlbGVjdFByb2plY3RXaXphcmRQYWdlIHByb2plY3RTZWxlY3Rpb247DQoJcHJpdmF0ZSBBc3N1clByb2pSZWZGcmFtZXdvcmtTZWxlY3Rpb25XaXphcmRQYWdlIHJlZlNlbGVjdGlvblBhZ2U7DQoJcHJvdGVjdGVkIFN0cmluZyBxcmVmRGlyOw0KCXByaXZhdGUgV2l6YXJkRU1GQ29udGV4dCB3aXphcmRFeGVjdXRpb25Db250ZXh0Ow0KCUNET1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gbnVsbDsNCglwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUFyZ01vZGVsOw0KCQ0KCXB1YmxpYyBOZXdCYXNlbGluZVdpemFyZCgpIHsNCgkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQoJCXRoaXMud2l6YXJkRXhlY3V0aW9uQ29udGV4dCA9IG5ldyBXaXphcmRFTUZDb250ZXh0KHRoaXMpOw0KCQkNCgl9DQoNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCgkJc3VwZXIuYWRkUGFnZXMoKTsNCgkJcHJvamVjdFNlbGVjdGlvbj1jcmVhdGVQcm9qU2VsZWN0aW9uUGFnZSgpOw0KCQl0aGlzLmFkZFBhZ2UocHJvamVjdFNlbGVjdGlvbik7CQ0KCQlyZWZTZWxlY3Rpb25QYWdlID0gY3JlYXRlQXNzdXJQcm9qU2VsZWN0aW9uUGFnZSgpOw0KCQl0aGlzLmFkZFBhZ2UocmVmU2VsZWN0aW9uUGFnZSk7CQ0KCQkNCgkJDQoJfQ0KCQ0KDQoJcHJvdGVjdGVkIFNlbGVjdFByb2plY3RXaXphcmRQYWdlIGNyZWF0ZVByb2pTZWxlY3Rpb25QYWdlKCkgew0KCQkvKkNET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmluaXQoDQoJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRSZXBvc2l0b3J5TmFtZSgpLA0KCQkJCVByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJvdG9jb2woKSwNCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFNlcnZlck5hbWUoKSk7DQoJCUNET1Nlc3Npb24gc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmdldEN1cnJlbnRTZXNzaW9uKCk7DQoJCUNET1ZpZXcgdmlldyA9IHNlc3Npb25DRE8ub3BlblZpZXcoKTsNCgkJKi8NCgkJLy9EYXduRXhwbG9yZXIgdmlldyA9IChEYXduRXhwbG9yZXIpUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuIHNob3dWaWV3KCJvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udWkudmlld3MuRGF3bkV4cGxvcmVyIik7DQoJCQ0KCURhd25FeHBsb3JlciByZXBvVmlldyA9bnVsbDsNCgkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZmVyZW5jZXNbXSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFZpZXdSZWZlcmVuY2VzKCk7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld1JlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCgkJCWlmICgib3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnVpLnZpZXdzLkRhd25FeHBsb3JlciIuZXF1YWxzKHZpZXdSZWZlcmVuY2VzW2ldLmdldElkKCkpKSB7DQoJCQkJcmVwb1ZpZXcgPSAoRGF3bkV4cGxvcmVyKXZpZXdSZWZlcmVuY2VzW2ldLmdldFZpZXcoZmFsc2UpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJCWlmKHJlcG9WaWV3IT1udWxsKXsNCgkJCXRyYW5zYWN0aW9uPXJlcG9WaWV3LmdldFZpZXcoKS5nZXRTZXNzaW9uKCkub3BlblRyYW5zYWN0aW9uKCk7DQoJCQ0KCQkJcmV0dXJuIG5ldyBTZWxlY3RQcm9qZWN0V2l6YXJkUGFnZSgiYXNzdXJhbmNlcHJvamVjdCIsdHJ1ZSxyZXBvVmlldy5nZXRWaWV3KCkpOw0KCQl9DQoJCWVsc2V7DQoJCQlDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZS5pbml0KA0KCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRSZXBvc2l0b3J5TmFtZSgpLA0KCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcm90b2NvbCgpLA0KCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRTZXJ2ZXJOYW1lKCkpOw0KCQkJQ0RPU2Vzc2lvbiBzZXNzaW9uQ0RPID0gQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuZ2V0Q3VycmVudFNlc3Npb24oKTsNCgkJCUNET1ZpZXcgdmlldyA9IHNlc3Npb25DRE8ub3BlblZpZXcoKTsNCgkJCXRyYW5zYWN0aW9uPXNlc3Npb25DRE8ub3BlblRyYW5zYWN0aW9uKCk7DQoJCQlyZXR1cm4gbmV3IFNlbGVjdFByb2plY3RXaXphcmRQYWdlKCJhc3N1cmFuY2Vwcm9qZWN0Iix0cnVlLHZpZXcpOw0KCQl9CQkNCgl9DQoJDQoJcHJvdGVjdGVkIEFzc3VyUHJvalJlZkZyYW1ld29ya1NlbGVjdGlvbldpemFyZFBhZ2UgY3JlYXRlQXNzdXJQcm9qU2VsZWN0aW9uUGFnZSgpIHsNCgkJcmV0dXJuIG5ldyBBc3N1clByb2pSZWZGcmFtZXdvcmtTZWxlY3Rpb25XaXphcmRQYWdlKEFzc3VyUHJvalJlZkZyYW1ld29ya1NlbGVjdGlvbldpemFyZFBhZ2UuUkVGRVJFTkNFX0ZSQU1FV09SS19TRUxFQ1RJT04pOw0KCX0NCgkNCgkNCgkNCgkNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCgkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KDQoJfQ0KDQoJQE92ZXJyaWRlDQoJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCgkJDQoJCVVSSSBwcm9qZWN0ID0gcHJvamVjdFNlbGVjdGlvbi5nZXRVUkkoKTsNCgkJDQoJCVN0cmluZyBjb25maXJtYXRpb25UZXh0PSIiOw0KCQlpZihwcm9qZWN0IT1udWxsKXsNCgkJCVN0cmluZyBwYXRoID0gcHJvamVjdC5wYXRoKCk7DQoJCQlwYXRoPXBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoIi8iKSk7DQoJCQlDRE9SZXNvdXJjZUZvbGRlciBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyPSB0cmFuc2FjdGlvbi5nZXRSZXNvdXJjZUZvbGRlcihwYXRoKTsNCgkJCUNET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IHRyYW5zYWN0aW9uLmdldE9yQ3JlYXRlUmVzb3VyY2UoYXNzdXJhbmNlcHJvamVjdEZvbGRlci5nZXRQYXRoKCkgKyAiLyIgKyByZWZTZWxlY3Rpb25QYWdlLmdldEJhc2VsaW5lTmFtZSgpICsgIi5iYXNlbGluZSIpOw0KCQkJLy9UaGUgdXNlciBoYXMgY2hvc2VuIHRoZSBzYW1lIG5hbWUgZm9yIGJhc2VsaW5lLiBJIGhhdmUgdG8gZGVsZXRlIHRoZSBiYXNlbGluZSBtb2RlbCwgdGhlIGJhc2VsaW5lIGRpYWdyYW0sIHRoZSBhcmd1bWVudGF0aW9uIG1vZGVsIGFuZCB0aGUgYXJndW1lbnRhdGlvbiBkaWFncmFtDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCWlmKHRhcmdldFJlc291cmNlLmlzRXhpc3RpbmcoKSl7DQoJCQkJY29uZmlybWF0aW9uVGV4dCA9ICJTZWxlY3RlZCBBc3N1cmFuY2UgUHJvamVjdCBhbHJlYWR5IGhhcyBhIGJhc2VsaW5lIG1vZGVsIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgd2lsbCBiZSByZXBsYWNlZC5cbiI7CQkJCQ0KCQkJCQ0KCQkJCWlmKHByb2plY3RTZWxlY3Rpb24uZ2VuZXJhdGVBcmd1bWVudGF0aW9uKCkpew0KCQkJCQlTdHJpbmcgYXJnRm9sZGVyUGF0aCA9IGFzc3VyYW5jZXByb2plY3RGb2xkZXIuZ2V0UGF0aCgpLnN1YnN0cmluZygwLCBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmdldFBhdGgoKS5sYXN0SW5kZXhPZigiLyIpKTsNCgkJCQkJDQoJCQkJCQ0KCQkJCQlDRE9SZXNvdXJjZSBhcmdSZXNvdXJjZSAgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKGFyZ0ZvbGRlclBhdGggKyAiL0FSR1VNRU5UQVRJT04vIiArIHJlZlNlbGVjdGlvblBhZ2UuZ2V0QmFzZWxpbmVOYW1lKCkgKyAiLmFyZyIpOw0KCQkJCQlpZihhcmdSZXNvdXJjZS5pc0V4aXN0aW5nKCkpew0KCQkJCQkJY29uZmlybWF0aW9uVGV4dCA9IGNvbmZpcm1hdGlvblRleHQgKyAiXG5TZWxlY3RlZCBBc3N1cmFuY2UgUHJvamVjdCBhbHJlYWR5IGhhcyBhbiBhcmd1bWVudGF0aW9uIG1vZGVsIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgd2lsbCBiZSByZXBsYWNlZC5cbiI7DQoJCQkJCX0NCgkJCQkJCQkJCQkNCgkJCQl9DQoJCQkJY29uZmlybWF0aW9uVGV4dCA9IGNvbmZpcm1hdGlvblRleHQgKyAiXG5cbkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHRoZSBwcm9jZXNzP1xuIjsNCgkJCQkNCgkJCQlib29sZWFuIGNvbmZpcm1hdGlvbiA9IE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oZ2V0U2hlbGwoKSwgIlVwZGF0YXRpb24gcHJvY2VzcyIsIGNvbmZpcm1hdGlvblRleHQpOw0KCQkJCWlmICghY29uZmlybWF0aW9uKSB7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJDQoJCQ0KCQljb25maXJtYXRpb25UZXh0PSJUaGlzIHByb2Nlc3MgY291bGQgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuXG5cbkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlPyI7DQoJCWJvb2xlYW4gY29uZmlybWF0aW9uID0gIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oZ2V0U2hlbGwoKSwgIkJhc2VsaW5lIGNyZWF0aW9uIG9yIHVwZGF0YXRpb24gcHJvY2VzcyIsIGNvbmZpcm1hdGlvblRleHQpOw0KCQlpZiAoIWNvbmZpcm1hdGlvbikgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9CQ0KCQkJDQoJCXRyYW5zYWN0aW9uLmNsb3NlKCk7CQkNCgkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSk7DQoJCWRpYWxvZy5vcGVuKCk7DQoJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGRpYWxvZy5nZXRQcm9ncmVzc01vbml0b3IoKTsNCgkJbW9uaXRvci5iZWdpblRhc2soQ1JFQVRFX1BST0pFQ1RfQkFTRUxJTkUsIDIwKTsNCgkJDQoJCQ0KCQkNCgkJDQoJCUFzc3VyUHJvakluaXRpYWxpemF0aW9uSGVscGVyIHByb2plY3RJbml0aWFsaXplciA9IG5ldyBBc3N1clByb2pJbml0aWFsaXphdGlvbkhlbHBlcigiTmFtZSIsIiIscHJvamVjdFNlbGVjdGlvbi5nZW5lcmF0ZUFyZ3VtZW50YXRpb24oKSk7CQkNCgkJbW9uaXRvci53b3JrZWQoMSk7DQoJCQ0KCQkvL1Jlc291cmNlU2V0IHJlc291cmNlU2V0ID0gd2l6YXJkRXhlY3V0aW9uQ29udGV4dC5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKTsgDQoJCU9iamVjdFtdIHJlZlJlcXVpcmVtZW50cyA9IHJlZlNlbGVjdGlvblBhZ2UuZ2V0U2VsZWN0ZWRSZWZSZXEoKTsNCgkJcXJlZkRpciA9IHJlZlNlbGVjdGlvblBhZ2UuZ2V0UVJlZigpOw0KCQl0cnkgew0KCQkJcHJvamVjdEluaXRpYWxpemVyLmNyZWF0ZUNyZWF0ZUNvbW1hbmRzKCBtb25pdG9yLCB0aGlzLmdldENvbnRhaW5lcigpLHJlZlJlcXVpcmVtZW50cywgcmVmU2VsZWN0aW9uUGFnZS5nZXRTZWxlY3RlZENyaXRMZXZlbHMoKSxyZWZTZWxlY3Rpb25QYWdlLmdldFNlbGVjdGVkQXBsaUxldmVscygpLHFyZWZEaXIsIHJlZlNlbGVjdGlvblBhZ2UuZ2V0QmFzZWxpbmVOYW1lKCksIHByb2plY3QpOw0KCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgew0KCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaw0KCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCQ0KCQltb25pdG9yLndvcmtlZCgxKTsJCQ0KDQoJCXJldHVybiB0cnVlOw0KCX0NCgkNCglwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldEN1cnJlbnRTZWxlY3RlZFByb2plY3QoKSB7DQoJICAgIElQcm9qZWN0IHByb2plY3QgPSBudWxsOw0KCSAgICBJU2VsZWN0aW9uU2VydmljZSBzZWxlY3Rpb25TZXJ2aWNlID0gDQoJICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKTsNCg0KCSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uKCk7DQoNCgkgICAgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCgkgICAgICAgIE9iamVjdCBlbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOw0KDQoJICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgew0KCSAgICAgICAgICAgIHByb2plY3Q9ICgoSVJlc291cmNlKWVsZW1lbnQpLmdldFByb2plY3QoKTsNCgkgICAgICAgIH0gLyplbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFja2FnZUZyYWdtZW50Um9vdCkgew0KCSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqUHJvamVjdCA9IA0KCSAgICAgICAgICAgICAgICAoKFBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKTsNCgkgICAgICAgICAgICBwcm9qZWN0ID0galByb2plY3QuZ2V0UHJvamVjdCgpOw0KCSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7DQoJICAgICAgICAgICAgSUphdmFQcm9qZWN0IGpQcm9qZWN0PSAoKElKYXZhRWxlbWVudCllbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOw0KCSAgICAgICAgICAgIHByb2plY3QgPSBqUHJvamVjdC5nZXRQcm9qZWN0KCk7DQoJICAgICAgICB9Ki8NCgkgICAgfQ0KCSAgICByZXR1cm4gcHJvamVjdDsNCgl9DQoNCn0NCg==