cGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAqgCkNvbnRyaWJ1dG9yczoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKCi8qKgogKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdG9vbCB0aGF0IGNhbiBiZSBydW4uIFRoZSB0b29sCiAqIGNhbiBiZSBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgd29ya3NwYWNlLgogKiA8cD4KICogQW4gZXh0ZXJuYWwgdG9vbCBjb25zaXN0IG9mIGEgdXNlciBkZWZpbmVkIG5hbWUsIGEgcGF0aCB0byB0aGUgbG9jYXRpb24KICogb2YgdGhlIGZpbGUsIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGZpbGUsIGFuZCB0aGUgd29ya2luZwogKiBkaXJlY3RvcnkuCiAqIDwvcD48cD4KICogQWZ0ZXIgdGhlIHRvb2wgaGFzIHJ1biwgcGFydCBvciBhbGwgb2YgdGhlIHdvcmtzcGFjZSBjYW4gYmUKICogcmVmcmVzaGVkIHRvIHBpY2t1cCBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRvb2wuIFRoaXMgaXMgb3B0aW9uYWwKICogYW5kIGRvZXMgbm90aGluZyBieSBkZWZhdWx0CiAqIDwvcD4KICovCnB1YmxpYyBjbGFzcyBFeHRlcm5hbFRvb2wgewoJLy8gSW50ZXJuYWwgdGFncyBmb3Igc3RvcmluZyB0b29sIHJlbGF0ZWQgaW5mb3JtYXRpb24KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9UWVBFID0gIiF7dG9vbF90eXBlfSI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9OQU1FID0gIiF7dG9vbF9uYW1lfSI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9MT0NBVElPTiA9ICIhe3Rvb2xfbG9jfSI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9BUkdVTUVOVFMgPSAiIXt0b29sX2FyZ3N9IjsgLy8kTk9OLU5MUy0xJAoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UT09MX0RJUkVDVE9SWSA9ICIhe3Rvb2xfZGlyfSI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9SRUZSRVNIID0gIiF7dG9vbF9yZWZyZXNofSI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9TSE9XX0xPRyA9ICIhe3Rvb2xfc2hvd19sb2d9IjsgLy8kTk9OLU5MUy0xJAoJCgkvLyBLbm93biBraW5kIG9mIHRvb2xzCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX1RZUEVfUFJPR1JBTSA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLnR5cGUucHJvZ3JhbSI7IC8vJE5PTi1OTFMtMSQKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfVFlQRV9BTlQgPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy50eXBlLmFudCI7IC8vJE5PTi1OTFMtMSQKCQoJLy8gVmFyaWFibGUgbmFtZXMgdGhlIHRvb2wgd2lsbCBleHBhbmQKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9XT1JLU1BBQ0VfTE9DID0gIndvcmtzcGFjZV9sb2MiOyAvLyROT04tTkxTLTEkCgoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1BST0pFQ1RfTE9DID0gInByb2plY3RfbG9jIjsgLy8kTk9OLU5MUy0xJAoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1BST0pFQ1RfUEFUSCA9ICJwcm9qZWN0X3BhdGgiOyAvLyROT04tTkxTLTEkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfUFJPSkVDVF9OQU1FID0gInByb2plY3RfbmFtZSI7IC8vJE5PTi1OTFMtMSQKCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfUkVTT1VSQ0VfTE9DID0gInJlc291cmNlX2xvYyI7IC8vJE5PTi1OTFMtMSQKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9SRVNPVVJDRV9QQVRIID0gInJlc291cmNlX3BhdGgiOyAvLyROT04tTkxTLTEkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfUkVTT1VSQ0VfTkFNRSA9ICJyZXNvdXJjZV9uYW1lIjsgLy8kTk9OLU5MUy0xJAoKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9DT05UQUlORVJfTE9DID0gImNvbnRhaW5lcl9sb2MiOyAvLyROT04tTkxTLTEkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfQ09OVEFJTkVSX1BBVEggPSAiY29udGFpbmVyX3BhdGgiOyAvLyROT04tTkxTLTEkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfQ09OVEFJTkVSX05BTUUgPSAiY29udGFpbmVyX25hbWUiOyAvLyROT04tTkxTLTEkCgoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0VESVRPUl9DVVJfQ09MID0gImVkaXRvcl9jdXJfY29sIjsgLy8kTk9OLU5MUy0xJAoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0VESVRPUl9DVVJfTElORSA9ICJlZGl0b3JfY3VyX2xpbmUiOyAvLyROT04tTkxTLTEkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfRURJVE9SX1NFTF9URVhUID0gImVkaXRvcl9zZWxfdGV4dCI7IC8vJE5PTi1OTFMtMSQKCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfQU5UX1RBUkdFVCA9ICJhbnRfdGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0JVSUxEX1RZUEUgPSAiYnVpbGRfdHlwZSI7IC8vJE5PTi1OTFMtMSQKCgkvLyBLbm93biByZWZyZXNoIHNjb3BlcwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9TQ09QRV9OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9TQ09QRV9XT1JLU1BBQ0UgPSAid29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJDsKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfU0NPUEVfUFJPSkVDVCA9ICJwcm9qZWN0IjsgLy8kTk9OLU5MUy0xJDsKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfU0NPUEVfV09SS0lOR19TRVQgPSAid29ya2luZ19zZXQiOyAvLyROT04tTkxTLTEkOwoJCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVkFMVUUgPSAiIjsgLy8kTk9OLU5MUy0xJDsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCgkKCXByaXZhdGUgU3RyaW5nIHR5cGUgPSBUT09MX1RZUEVfUFJPR1JBTTsKCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBFTVBUWV9WQUxVRTsKCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uID0gRU1QVFlfVkFMVUU7Cglwcml2YXRlIFN0cmluZyBhcmd1bWVudHMgPSBFTVBUWV9WQUxVRTsKCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9IEVNUFRZX1ZBTFVFOwoJcHJpdmF0ZSBTdHJpbmcgcmVmcmVzaFNjb3BlID0gRU1QVFlfVkFMVUU7Cglwcml2YXRlIGJvb2xlYW4gc2hvd0xvZyA9IHRydWU7CgkKCS8qKgoJICogQ3JlYXRlcyBhbiBlbXB0eSBpbml0aWFsaXplZCBleHRlcm5hbCB0b29sLgoJICovCglwdWJsaWMgRXh0ZXJuYWxUb29sKCkgewoJCXN1cGVyKCk7CgkJdGhpcy5yZWZyZXNoU2NvcGUgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKFJFRlJFU0hfU0NPUEVfTk9ORSwgbnVsbCk7Cgl9CgoJLyoqCgkgKiBDcmVhdGVzIGEgZnVsbHkgaW5pdGlhbGl6ZWQgZXh0ZXJuYWwgdG9vbC4KCSAqLwoJcHVibGljIEV4dGVybmFsVG9vbChTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGFyZ3VtZW50cywgU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHJlZnJlc2hTY29wZSwgYm9vbGVhbiBzaG93TG9nKSB7CgkJdGhpcygpOwoJCWlmICh0eXBlICE9IG51bGwpCgkJCXRoaXMudHlwZSA9IHR5cGU7CgkJaWYgKG5hbWUgIT0gbnVsbCkKCQkJdGhpcy5uYW1lID0gbmFtZTsKCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwoJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKCQkJdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CgkJaWYgKGRpcmVjdG9yeSAhPSBudWxsKQoJCQl0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKCQlpZiAocmVmcmVzaFNjb3BlICE9IG51bGwpCgkJCXRoaXMucmVmcmVzaFNjb3BlID0gcmVmcmVzaFNjb3BlOwoJCXRoaXMuc2hvd0xvZyA9IHNob3dMb2c7Cgl9CgkKCS8qKgoJICogQ3JlYXRlcyBhbiBleHRlcm5hbCB0b29sIGJhc2VkIG9uIHNwZWNpZmllZCBhcmd1bWVudHMuCgkgKiBSZXR1cm5zIG51bGwgaWYgbm8gY29ycmVzcG9uZGluZyBleHRlcm5hbCB0b29sIGNvdWxkIGJlIGNyZWF0ZWQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgRXh0ZXJuYWxUb29sIGZyb21Bcmd1bWVudE1hcChNYXAgYXJncykgewoJCS8vIFZhbGlkYXRlIHRoZSBjcml0aWNhbCBpbmZvcm1hdGlvbi4KCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpYXJncy5nZXQoVEFHX1RPT0xfVFlQRSk7CgkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX05BTUUpOwoJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpYXJncy5nZXQoVEFHX1RPT0xfTE9DQVRJT04pOwoJCWlmICh0eXBlID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8IGxvY2F0aW9uID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCWlmICh0eXBlLmxlbmd0aCgpID09IDAgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IGxvY2F0aW9uLmxlbmd0aCgpID09IDApCgkJCXJldHVybiBudWxsOwoJCVN0cmluZyBzU2hvd0xvZyA9IChTdHJpbmcpYXJncy5nZXQoVEFHX1RPT0xfU0hPV19MT0cpOwoJCWJvb2xlYW4gc2hvd0xvZzsKCQlpZiAoRkFMU0UuZXF1YWxzKHNTaG93TG9nKSkKCQkJc2hvd0xvZyA9IGZhbHNlOwoJCWVsc2UKCQkJc2hvd0xvZyA9IHRydWU7CgkJCQoJCXJldHVybiBuZXcgRXh0ZXJuYWxUb29sKAoJCQl0eXBlLAoJCQluYW1lLAoJCQlsb2NhdGlvbiwKCQkJKFN0cmluZylhcmdzLmdldChUQUdfVE9PTF9BUkdVTUVOVFMpLAoJCQkoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX0RJUkVDVE9SWSksCgkJCShTdHJpbmcpYXJncy5nZXQoVEFHX1RPT0xfUkVGUkVTSCksCgkJCXNob3dMb2cpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdHlwZSBvZiBleHRlcm5hbCB0b29sLgoJICovCglwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CgkJcmV0dXJuIHR5cGU7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZXh0ZXJuYWwgdG9vbC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBuYW1lOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIHBhdGggd2hlcmUgdGhlIGV4dGVybmFsIHRvb2wgaXMgbG9jYXRlZC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKCQlyZXR1cm4gbG9jYXRpb247Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZXh0ZXJuYWwgdG9vbC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRBcmd1bWVudHMoKSB7CgkJcmV0dXJuIGFyZ3VtZW50czsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBydW4gdGhlIGV4dGVybmFsIHRvb2wgaW4uCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKCQlyZXR1cm4gZGlyZWN0b3J5OwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIHNjb3BlIG9mIHJlc291cmNlcyB0byByZWZyZXNoIGFmdGVyCgkgKiB0aGUgZXh0ZXJuYWwgdG9vbCBpcyBydW4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRSZWZyZXNoU2NvcGUoKSB7CgkJcmV0dXJuIHJlZnJlc2hTY29wZTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBleGVjdXRpb24gbG9nIG9mIHRoZSBleHRlcm5hbCB0b29sCgkgKiB3aWxsIGJlIHNob3duIG9uIHRoZSBsb2cgY29uc29sZS4KCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0U2hvd0xvZygpIHsKCQlyZXR1cm4gc2hvd0xvZzsJCgl9CgkKCS8qKgoJICogU2V0cyB0aGUgdHlwZSBvZiBleHRlcm5hbCB0b29sLgoJICovCglwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CgkJaWYgKHR5cGUgPT0gbnVsbCkKCQkJdGhpcy50eXBlID0gRU1QVFlfVkFMVUU7CgkJZWxzZQoJCQl0aGlzLnR5cGUgPSB0eXBlOwoJfQoJCgkvKioKCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHRvb2wuCgkgKi8KCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKCQlpZiAobmFtZSA9PSBudWxsKQoJCQl0aGlzLm5hbWUgPSBFTVBUWV9WQUxVRTsKCQllbHNlCgkJCXRoaXMubmFtZSA9IG5hbWU7Cgl9CgkKCS8qKgoJICogU2V0cyB0aGUgcGF0aCB3aGVyZSB0aGUgZXh0ZXJuYWwgdG9vbCBpcyBsb2NhdGVkLgoJICovCglwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKCQkJdGhpcy5sb2NhdGlvbiA9IEVNUFRZX1ZBTFVFOwoJCWVsc2UKCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwoJfQoJCgkvKioKCSAqIFNldHMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV4dGVybmFsIHRvb2wuCgkgKi8KCXB1YmxpYyB2b2lkIHNldEFyZ3VtZW50cyhTdHJpbmcgYXJndW1lbnRzKSB7CgkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKQoJCQl0aGlzLmFyZ3VtZW50cyA9IEVNUFRZX1ZBTFVFOwoJCWVsc2UKCQkJdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7Cgl9CgkKCS8qKgoJICogU2V0cyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gcnVuIHRoZSBleHRlcm5hbCB0b29sIGluLgoJICovCglwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKCQlpZiAoZGlyZWN0b3J5ID09IG51bGwpCgkJCXRoaXMuZGlyZWN0b3J5ID0gRU1QVFlfVkFMVUU7CgkJZWxzZQoJCQl0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKCX0KCQoJLyoqCgkgKiBTZXRzIHRoZSBzY29wZSBvZiByZXNvdXJjZXMgdG8gcmVmcmVzaCBhZnRlcgoJICogdGhlIGV4dGVybmFsIHRvb2wgaXMgcnVuCgkgKi8KCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hTY29wZShTdHJpbmcgcmVmcmVzaFNjb3BlKSB7CgkJaWYgKHJlZnJlc2hTY29wZSA9PSBudWxsIHx8IHJlZnJlc2hTY29wZS5sZW5ndGgoKSA8IDEpCgkJCXRoaXMucmVmcmVzaFNjb3BlID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhSRUZSRVNIX1NDT1BFX05PTkUsIG51bGwpOwoJCWVsc2UKCQkJdGhpcy5yZWZyZXNoU2NvcGUgPSByZWZyZXNoU2NvcGU7Cgl9CgkKCS8qKgoJICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgZXhlY3V0aW9uIGxvZyBvZiB0aGUgZXh0ZXJuYWwgdG9vbCBzaG91bGQKCSAqIGJlIHNob3duIG9uIHRoZSBsb2cgY29uc29sZS4KCSAqLwoJcHVibGljIHZvaWQgc2V0U2hvd0xvZyhib29sZWFuIHNob3dMb2cpIHsKCQl0aGlzLnNob3dMb2cgPSBzaG93TG9nOwkKCX0KCQoJLyoqCgkgKiBTdG9yZXMgdGhlIGV4dGVybmFsIHRvb2wgYXMgYW4gYXJndW1lbnQgbWFwIHRoYXQgY2FuIGJlCgkgKiB1c2VkIGxhdGVyIG9uIHRvIHJlY3JlYXRlIHRoaXMgZXh0ZXJuYWwgdG9vbC4KCSAqIAoJICogQHJldHVybiB0aGUgYXJndW1lbnQgbWFwCgkgKi8KCXB1YmxpYyBNYXAgdG9Bcmd1bWVudE1hcCgpIHsKCQlIYXNoTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwoJCWFyZ3MucHV0KFRBR19UT09MX1RZUEUsIHR5cGUpOwoJCWFyZ3MucHV0KFRBR19UT09MX05BTUUsIG5hbWUpOwoJCWFyZ3MucHV0KFRBR19UT09MX0xPQ0FUSU9OLCBsb2NhdGlvbik7CgkJYXJncy5wdXQoVEFHX1RPT0xfQVJHVU1FTlRTLCBhcmd1bWVudHMpOwoJCWFyZ3MucHV0KFRBR19UT09MX0RJUkVDVE9SWSwgZGlyZWN0b3J5KTsKCQlhcmdzLnB1dChUQUdfVE9PTF9SRUZSRVNILCByZWZyZXNoU2NvcGUpOwoJCWlmIChzaG93TG9nKQoJCQlhcmdzLnB1dChUQUdfVE9PTF9TSE9XX0xPRywgVFJVRSk7CgkJZWxzZQoJCQlhcmdzLnB1dChUQUdfVE9PTF9TSE9XX0xPRywgRkFMU0UpOwoJCQoJCXJldHVybiBhcmdzOwoJfQoKCS8qKgoJICogQ29uZmlndXJlcyB0aGUgZ2l2ZW4gYnVpbGQgY29tbWFuZCB0byBpbnZva2UgdGhpcwoJICogZXh0ZXJuYWwgdG9vbC4KCSAqIAoJICogQHBhcmFtIGNvbW1hbmQgdGhlIGJ1aWxkIGNvbW1hbmQgdG8gY29uZmlndXJlCgkgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIGNvbW1hbmQuCgkgKi8KCXB1YmxpYyBJQ29tbWFuZCB0b0J1aWxkQ29tbWFuZChJQ29tbWFuZCBjb21tYW5kKSB7CgkJTWFwIGFyZ3MgPSB0b0FyZ3VtZW50TWFwKCk7CgkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShFeHRlcm5hbFRvb2xzQnVpbGRlci5JRCk7CgkJY29tbWFuZC5zZXRBcmd1bWVudHMoYXJncyk7CgkJCgkJcmV0dXJuIGNvbW1hbmQ7Cgl9Cn0K