cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnB1Ymxpc2g7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucmVzb3VyY2VzLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucmVzb3VyY2VzLklNb2R1bGVSZXNvdXJjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5yZXNvdXJjZXMuSVJlbW90ZUZvbGRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5yZXNvdXJjZXMuSVJlbW90ZVJlc291cmNlOwovKioKICogUHVibGlzaCB0cmVlIHZpZXdlci4KICovCnB1YmxpYyBjbGFzcyBQdWJsaXNoVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgVGFibGVUcmVlVmlld2VyIHsKCXByb3RlY3RlZCBWaXN1YWxQdWJsaXNoZXIgdmlzdWFsUHVibGlzaGVyOwoJcHJvdGVjdGVkIFB1Ymxpc2hWaWV3ZXJGaWx0ZXIgZmlsdGVyOwoKCS8qKgoJICogUHVibGlzaFRhYmxlVHJlZVZpZXdlciBjb25zdHJ1Y3RvciBjb21tZW50LgoJICogQHBhcmFtIHRyZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWUKCSAqLwoJcHVibGljIFB1Ymxpc2hUYWJsZVRyZWVWaWV3ZXIoVGFibGVUcmVlIHRyZWUsIFZpc3VhbFB1Ymxpc2hlciB2aXN1YWxQdWJsaXNoZXIyKSB7CgkJc3VwZXIodHJlZSk7CgkJdGhpcy52aXN1YWxQdWJsaXNoZXIgPSB2aXN1YWxQdWJsaXNoZXIyOwoJCgkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQdWJsaXNoVHJlZUNvbnRlbnRQcm92aWRlcih2aXN1YWxQdWJsaXNoZXIpKTsKCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBQdWJsaXNoVHJlZUxhYmVsUHJvdmlkZXIodmlzdWFsUHVibGlzaGVyKSk7CgkJc2V0SW5wdXQodmlzdWFsUHVibGlzaGVyLmdldE1vZHVsZXMoKSk7CgkJc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7CgkJCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikKCQkJCQlyZXR1cm4gMDsKCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlUmVzb3VyY2UpCgkJCQkJcmV0dXJuIDE7CgkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlbW90ZUZvbGRlcikKCQkJCQlyZXR1cm4gMDsKCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVtb3RlUmVzb3VyY2UpCgkJCQkJcmV0dXJuIDE7CgkJCQllbHNlCgkJCQkJcmV0dXJuIDI7CgkJCX0KCQl9KTsKCQoJCWZpbHRlciA9IG5ldyBQdWJsaXNoVmlld2VyRmlsdGVyKHZpc3VhbFB1Ymxpc2hlcik7CgkJYWRkRmlsdGVyKGZpbHRlcik7CgkKCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7ImxvY2FsIiwgInJlbW90ZSIsICJzdGF0dXMiLCAiYWN0aW9uIn0pOwoJCXNldENlbGxFZGl0b3JzKG5ldyBDZWxsRWRpdG9yW10ge251bGwsIG51bGwsIG51bGwsIG5ldyBDaGVja2JveENlbGxFZGl0b3IodHJlZSl9KTsKCQoJCUlDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyID0gbmV3IElDZWxsTW9kaWZpZXIoKSB7CgkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewoJCQkJLy9UcmFjZS50cmFjZSgiZ2V0VmFsdWUgIiArIGVsZW1lbnQgKyAiICIgKyBwcm9wZXJ0eSk7CgkKCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVJlc291cmNlKSB7CgkJCQkJSU1vZHVsZVJlc291cmNlIHJlc291cmNlID0gKElNb2R1bGVSZXNvdXJjZSkgZWxlbWVudDsKCQkJCQlJUGF0aCBwYXRoID0gdmlzdWFsUHVibGlzaGVyLmdldFB1Ymxpc2hDb250cm9sKHJlc291cmNlLmdldE1vZHVsZSgpKS5nZXRNYXBwZWRMb2NhdGlvbihyZXNvdXJjZSk7CgkJCQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRvU3RyaW5nKCkgPT0gbnVsbCkKCQkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKCQkJCQkKCQkJCQlpZiAodmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlc1RvUHVibGlzaChyZXNvdXJjZS5nZXRNb2R1bGUoKSkuY29udGFpbnMocmVzb3VyY2UpKQoJCQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7CgkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVJlbW90ZVJlc291cmNlKSB7CgkJCQkJTW9kdWxlUmVtb3RlUmVzb3VyY2UgcHJyID0gKE1vZHVsZVJlbW90ZVJlc291cmNlKSBlbGVtZW50OwoJCQkJCUlSZW1vdGVSZXNvdXJjZSByZW1vdGUgPSBwcnIuZ2V0UmVtb3RlKCk7CgkJCQkJSVBhdGggcGF0aCA9IHJlbW90ZS5nZXRQYXRoKCk7CgkJCQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRvU3RyaW5nKCkgPT0gbnVsbCkKCQkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKCQkJCQkKCQkJCQlJTW9kdWxlIG1vZHVsZSA9IHByci5nZXRNb2R1bGUoKTsKCQkJCQlpZiAodmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlc1RvRGVsZXRlKG1vZHVsZSkuY29udGFpbnMocmVtb3RlKSkKCQkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwoJCQkJCQoJCQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7CgkJCQl9CgkJCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwoJCQl9CgkKCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKCQkJCS8vVHJhY2UudHJhY2UoImNhbk1vZGlmeSAiICsgZWxlbWVudCArICIgIiArIHByb3BlcnR5KTsKCQkJCWlmICgiYWN0aW9uIi5lcXVhbHMocHJvcGVydHkpKSB7CgkJCQkJLy8gY2hlY2sgdGhhdCBpdCBpcyBtYXBwZWQhIQoJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVJlc291cmNlKSB7CgkJCQkJCUlNb2R1bGVSZXNvdXJjZSByZXNvdXJjZSA9IChJTW9kdWxlUmVzb3VyY2UpIGVsZW1lbnQ7CgkJCQkJCUlQYXRoIHBhdGggPSB2aXN1YWxQdWJsaXNoZXIuZ2V0UHVibGlzaENvbnRyb2wocmVzb3VyY2UuZ2V0TW9kdWxlKCkpLmdldE1hcHBlZExvY2F0aW9uKHJlc291cmNlKTsKCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewoJCQkJCQkJYnl0ZSBzdGF0dXMgPSB2aXN1YWxQdWJsaXNoZXIuZ2V0UmVzb3VyY2VTdGF0dXMocmVzb3VyY2UsIHBhdGgpOwoJCQkJCQkJaWYgKHN0YXR1cyAhPSBWaXN1YWxQdWJsaXNoZXIuU1RBVFVTX05FVykKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkKCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewoJCQkJaWYgKCEiYWN0aW9uIi5lcXVhbHMocHJvcGVydHkpKQoJCQkJCXJldHVybjsKCQoJCQkJVGFibGVUcmVlSXRlbSB0dGkgPSAoVGFibGVUcmVlSXRlbSkgZWxlbWVudDsKCQkJCU9iamVjdCBvYmogPSB0dGkuZ2V0RGF0YSgpOwoJCQkJLy9UcmFjZS50cmFjZSgibW9kaWZ5ICIgKyBlbGVtZW50ICsgIiAiICsgcHJvcGVydHkgKyAiICIgKyB2YWx1ZSArICIgIiArIG9iaik7CgkJCQlib29sZWFuIHZhbCA9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwoJCgkJCQlpZiAob2JqIGluc3RhbmNlb2YgSU1vZHVsZVJlc291cmNlKSB7CgkJCQkJSU1vZHVsZVJlc291cmNlIHJlc291cmNlID0gKElNb2R1bGVSZXNvdXJjZSkgb2JqOwoJCQkJCUlNb2R1bGUgbW9kdWxlID0gcmVzb3VyY2UuZ2V0TW9kdWxlKCk7CgkJCQkJTGlzdCBwdWJsaXNoTGlzdCA9IHZpc3VhbFB1Ymxpc2hlci5nZXRSZXNvdXJjZXNUb1B1Ymxpc2gobW9kdWxlKTsKCQkJCQlpZiAodmFsKSB7CgkJCQkJCXB1Ymxpc2hMaXN0LmFkZChyZXNvdXJjZSk7CgkJCQkJCWhhbmRsZVB1Ymxpc2hSZXNvdXJjZShtb2R1bGUsIHB1Ymxpc2hMaXN0LCByZXNvdXJjZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcHVibGlzaExpc3QucmVtb3ZlKHJlc291cmNlKTsKCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikKCQkJCQkJCWhhbmRsZVVucHVibGlzaENvbnRhaW5lcihtb2R1bGUsIHB1Ymxpc2hMaXN0LCAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2UpOwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlUmVtb3RlUmVzb3VyY2UpIHsKCQkJCQlNb2R1bGVSZW1vdGVSZXNvdXJjZSBwcnIgPSAoTW9kdWxlUmVtb3RlUmVzb3VyY2UpIG9iajsKCQkJCQlJUmVtb3RlUmVzb3VyY2UgcmVtb3RlID0gcHJyLmdldFJlbW90ZSgpOwoJCQkJCUlNb2R1bGUgbW9kdWxlID0gcHJyLmdldE1vZHVsZSgpOwoJCQkJCUxpc3QgZGVsZXRlTGlzdCA9IHZpc3VhbFB1Ymxpc2hlci5nZXRSZXNvdXJjZXNUb0RlbGV0ZShtb2R1bGUpOwoJCQkJCWlmICh2YWwpIHsKCQkJCQkJZGVsZXRlTGlzdC5hZGQocmVtb3RlKTsKCQkJCQkJaWYgKHJlbW90ZSBpbnN0YW5jZW9mIElSZW1vdGVGb2xkZXIpCgkJCQkJCQloYW5kbGVEZWxldGVSZW1vdGVGb2xkZXIobW9kdWxlLCBkZWxldGVMaXN0LCBwcnIuZ2V0Rm9sZGVyKCksIChJUmVtb3RlRm9sZGVyKSByZW1vdGUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRlbGV0ZUxpc3QucmVtb3ZlKHJlbW90ZSk7CgkJCQkJCWhhbmRsZVVuZGVsZXRlUmVtb3RlUmVzb3VyY2UobW9kdWxlLCBkZWxldGVMaXN0LCBwcnIuZ2V0Rm9sZGVyKCksIHJlbW90ZSk7CgkJCQkJfQoJCQkJfQoJCQkJcmVmcmVzaChvYmopOwoJCQl9CgkJfTsKCQlzZXRDZWxsTW9kaWZpZXIoY2VsbE1vZGlmaWVyKTsKCQlleHBhbmRUb0xldmVsKDMpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZmlsdGVyLgoJICoKCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wdWJsaXNoLlB1Ymxpc2hWaWV3ZXJGaWx0ZXIKCSAqLwoJcHVibGljIFB1Ymxpc2hWaWV3ZXJGaWx0ZXIgZ2V0RmlsdGVyKCkgewoJCXJldHVybiBmaWx0ZXI7Cgl9CgoJLyoqCgkgKiBIYW5kbGVzIGEgZGVsZXRpb24gYnkgbWFraW5nIHN1cmUgdGhhdCB0aGUgY2hpbGQgcmVzb3VyY2VzCgkgKiBhcmUgYWxzbyBkZWxldGVkLgoJICoKCSAqIEBwYXJhbSByZW1vdGUgSVJlbW90ZVJlc291cmNlCgkgKi8KCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlbGV0ZVJlbW90ZUZvbGRlcihJTW9kdWxlIG1vZHVsZSwgTGlzdCBkZWxldGVMaXN0LCBNb2R1bGVEZWxldGVkUmVzb3VyY2VGb2xkZXIgZm9sZGVyLCBJUmVtb3RlRm9sZGVyIHJlbW90ZUZvbGRlcikgewoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVtb3RlRm9sZGVyLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCUlSZW1vdGVSZXNvdXJjZSByZW1vdGUgPSAoSVJlbW90ZVJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7CgkKCQkJaWYgKCFkZWxldGVMaXN0LmNvbnRhaW5zKHJlbW90ZSkpIHsKCQkJCWRlbGV0ZUxpc3QuYWRkKHJlbW90ZSk7CgkJCQlyZWZyZXNoKG5ldyBNb2R1bGVSZW1vdGVSZXNvdXJjZShmb2xkZXIsIG1vZHVsZSwgcmVtb3RlKSk7CgkJCX0KCQkJaWYgKHJlbW90ZSBpbnN0YW5jZW9mIElSZW1vdGVGb2xkZXIpCgkJCQloYW5kbGVEZWxldGVSZW1vdGVGb2xkZXIobW9kdWxlLCBkZWxldGVMaXN0LCBmb2xkZXIsIChJUmVtb3RlRm9sZGVyKSByZW1vdGUpOwoJCX0KCX0KCgkvKioKCSAqIEhhbmRsZXMgYSBmaWxlIHB1Ymxpc2hpbmcgYnkgbWFraW5nIHN1cmUgdGhhdCB0aGUKCSAqIHBhcmVudCBkaXJlY3RvcmllcyBhcmUgcHVibGlzaGVkLgoJICogIVNob3VsZCByZWFsbHkgY2hlY2sgcmVtb3RlIHBhcmVudCBpbnN0ZWFkIG9mIGxvY2FsIHBhcmVudCEKCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2Ugb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlCgkgKi8KCXByb3RlY3RlZCB2b2lkIGhhbmRsZVB1Ymxpc2hSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgTGlzdCBwdWJsaXNoTGlzdCwgSU1vZHVsZVJlc291cmNlIHJlc291cmNlKSB7CgkJSU1vZHVsZUZvbGRlciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKCQl3aGlsZSAoY29udGFpbmVyICE9IG51bGwpIHsKCQkJSVBhdGggcGF0aCA9IHZpc3VhbFB1Ymxpc2hlci5nZXRQdWJsaXNoQ29udHJvbChtb2R1bGUpLmdldE1hcHBlZExvY2F0aW9uKGNvbnRhaW5lcik7CgkJCWlmIChwYXRoICE9IG51bGwpIHsKCQkJCWJ5dGUgc3RhdHVzID0gdmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlU3RhdHVzKGNvbnRhaW5lciwgcGF0aCk7CgkJCQlpZiAoc3RhdHVzID09IFZpc3VhbFB1Ymxpc2hlci5TVEFUVVNfTkVXICYmICFwdWJsaXNoTGlzdC5jb250YWlucyhjb250YWluZXIpKSB7CgkJCQkJcHVibGlzaExpc3QuYWRkKGNvbnRhaW5lcik7CgkJCQkJcmVmcmVzaChjb250YWluZXIpOwoJCQkJfQoJCQl9CgkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKCQl9Cgl9CgkKCS8qKgoJICogSGFuZGxlcyBhIGRlbGV0aW9uIGJ5IG1ha2luZyBzdXJlIHRoYXQgdGhlIHBhcmVudCByZXNvdXJjZXMKCSAqIGFyZSBhbHNvIGRlbGV0ZWQuCgkgKgoJICogQHBhcmFtIHJlbW90ZSBJUmVtb3RlUmVzb3VyY2UKCSAqLwoJcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5kZWxldGVSZW1vdGVSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgTGlzdCBkZWxldGVMaXN0LCBNb2R1bGVEZWxldGVkUmVzb3VyY2VGb2xkZXIgZm9sZGVyLCBJUmVtb3RlUmVzb3VyY2UgcmVtb3RlKSB7CgkJSVJlbW90ZUZvbGRlciByZW1vdGVGb2xkZXIgPSByZW1vdGUuZ2V0UGFyZW50KCk7CgkJd2hpbGUgKHJlbW90ZUZvbGRlciAhPSBudWxsKSB7CgkJCWlmIChkZWxldGVMaXN0LmNvbnRhaW5zKHJlbW90ZUZvbGRlcikpIHsKCQkJCWRlbGV0ZUxpc3QucmVtb3ZlKHJlbW90ZUZvbGRlcik7CgkJCQlyZWZyZXNoKG5ldyBNb2R1bGVSZW1vdGVSZXNvdXJjZShmb2xkZXIsIG1vZHVsZSwgcmVtb3RlRm9sZGVyKSk7CgkJCX0KCQoJCQlyZW1vdGVGb2xkZXIgPSByZW1vdGVGb2xkZXIuZ2V0UGFyZW50KCk7CgkJfQoJfQoKCS8qKgoJICogSGFuZGxlcyBhIGNvbnRhaW5lciBub3QgYmVpbmcgcHVibGlzaGVkIGJ5IGRlc2VsZWN0aW5nIGFueXRoaW5nCgkgKiBpbiB0aGUgY29udGFpbmVyLAoJICogIVNob3VsZCByZWFsbHkgY2hlY2sgcmVtb3RlIGNoaWxkcmVuIGluc3RlYWQgb2YgbG9jYWwgY2hpbGRyZW4hCgkgKgoJICogQHBhcmFtIHJlc291cmNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZQoJICovCglwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbnB1Ymxpc2hDb250YWluZXIoSU1vZHVsZSBtb2R1bGUsIExpc3QgcHVibGlzaExpc3QsIElNb2R1bGVGb2xkZXIgY29udGFpbmVyKSB7CgkJSU1vZHVsZVJlc291cmNlW10gY2hpbGRyZW4gPSBudWxsOwoJCXRyeSB7CgkJCWNoaWxkcmVuID0gY29udGFpbmVyLm1lbWJlcnMoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCX0KCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKCQkJcmV0dXJuOwoJCgkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJSVBhdGggcGF0aCA9IHZpc3VhbFB1Ymxpc2hlci5nZXRQdWJsaXNoQ29udHJvbChtb2R1bGUpLmdldE1hcHBlZExvY2F0aW9uKGNoaWxkcmVuW2ldKTsKCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwdWJsaXNoTGlzdC5jb250YWlucyhjaGlsZHJlbltpXSkpIHsKCQkJCXB1Ymxpc2hMaXN0LnJlbW92ZShjaGlsZHJlbltpXSk7CgkJCQlyZWZyZXNoKGNoaWxkcmVuW2ldKTsKCQkJfQoJCgkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpCgkJCQloYW5kbGVVbnB1Ymxpc2hDb250YWluZXIobW9kdWxlLCBwdWJsaXNoTGlzdCwgKElNb2R1bGVGb2xkZXIpIGNoaWxkcmVuW2ldKTsKCQl9Cgl9CgoJLyoqCgkgKiBVcGRhdGVzIHRoZSBmaWx0ZXIuCgkgKgoJICogQHBhcmFtIGZpbHRlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnB1Ymxpc2guUHVibGlzaFZpZXdlckZpbHRlcgoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVGaWx0ZXIoKSB7CgkJcmVtb3ZlRmlsdGVyKGZpbHRlcik7CgkJYWRkRmlsdGVyKGZpbHRlcik7Cgl9Cn0K