PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBGRlAgTUFaIFNFTyBVcGRhdGUKICogRGVzY3JpcHRpb246IE9uZS10aW1lIFNFTyB1cGRhdGUgZm9yIE1BWiBicmFuZCBwYWdlCiAqLwoKLy8gVXNlIHBsdWdpbnNfbG9hZGVkIGhvb2sgLSBXb3JkUHJlc3MgaXMgZnVsbHkgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQKYWRkX2FjdGlvbigncGx1Z2luc19sb2FkZWQnLCAnZmZwX3VwZGF0ZV9tYXpfc2VvJywgMSk7CgpmdW5jdGlvbiBmZnBfdXBkYXRlX21hel9zZW8oKSB7CiAgICAvLyBPbmx5IHJ1biBvbmNlCiAgICAkZmxhZyA9ICdmZnBfbWF6X3Nlb19kb25lXycgLiBkYXRlKCdZbWQnKTsKICAgIGlmIChnZXRfdHJhbnNpZW50KCRmbGFnKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy8gTUFaIGJyYW5kIHRlcm0KICAgICR0ZXJtX2lkID0gMTYyOTU7CiAgICAKICAgIC8vIFZlcmlmeSB0ZXJtIGV4aXN0cwogICAgaWYgKCF0ZXJtX2V4aXN0cygkdGVybV9pZCwgJ3B3Yi1icmFuZCcpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvLyBTRU8gZGF0YSB0byB1cGRhdGUKICAgICRzZW8gPSBhcnJheSgKICAgICAgICAncmFua19tYXRoX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBNQVogY2FyYm9uIGZpYmVyIHBhcnRzIGZvciAyMDE1LTIwMjYgRm9yZCBNdXN0YW5nLiBQcmVtaXVtIGRyeSBjYXJib24gaG9vZHMsIGZlbmRlcnMsIHNwb2lsZXJzICYgYWVybyBmb3IgUzY1MCBhbmQgUzU1MC4gMjEgcHJvZHVjdHMuIEZyZWUgc2hpcHBpbmcgb3ZlciAkMjAwLicsCiAgICAgICAgJ3JhbmtfbWF0aF9mb2N1c19rZXl3b3JkJyA9PiAnTUFaIGNhcmJvbiBmaWJlcixNdXN0YW5nIGNhcmJvbiBmaWJlciBwYXJ0cyxTNjUwIGNhcmJvbiBmaWJlcixTNTUwIGNhcmJvbiBmaWJlcixNdXNjbGUgQXV0byBab25lJywKICAgICAgICAncmFua19tYXRoX2ZhY2Vib29rX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX2ZhY2Vib29rX2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBNQVogY2FyYm9uIGZpYmVyIHBhcnRzIGZvciAyMDE1LTIwMjYgRm9yZCBNdXN0YW5nLiBQcmVtaXVtIGRyeSBjYXJib24gaG9vZHMsIGZlbmRlcnMsIHNwb2lsZXJzICYgYWVybyBmb3IgUzY1MCBhbmQgUzU1MC4gMjEgcHJvZHVjdHMuIEZyZWUgc2hpcHBpbmcgb3ZlciAkMjAwLicsCiAgICAgICAgJ3JhbmtfbWF0aF90d2l0dGVyX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX3R3aXR0ZXJfZGVzY3JpcHRpb24nID0 ICdTaG9wIE1BWiBjYXJib24gZmliZXIgcGFydHMgZm9yIDIwMTUtMjAyNiBGb3JkIE11c3RhbmcuIFByZW1pdW0gZHJ5IGNhcmJvbiBob29kcywgZmVuZGVycywgc3BvaWxlcnMgJiBhZXJvIGZvciBTNjUwIGFuZCBTNTUwLiAyMSBwcm9kdWN0cy4gRnJlZSBzaGlwcGluZyBvdmVyICQyMDAuJywKICAgICk7CiAgICAKICAgIC8vIFVwZGF0ZSBhbGwgU0VPIGZpZWxkcwogICAgZm9yZWFjaCAoJHNlbyBhcyAka2V5ID0 ICR2YWx1ZSkgewogICAgICAgIHVwZGF0ZV90ZXJtX21ldGEoJHRlcm1faWQsICRrZXksICR2YWx1ZSk7CiAgICB9CiAgICAKICAgIC8vIFNldCBmbGFnIHRvIHByZXZlbnQgcmUtcnVubmluZwogICAgc2V0X3RyYW5zaWVudCgkZmxhZywgdHJ1ZSwgREFZX0lOX1NFQ09ORFMpOwogICAgCiAgICAvLyBMb2cgc3VjY2VzcwogICAgZXJyb3JfbG9nKCdGRlA6IE1BWiBTRU8gdXBkYXRlZCBzdWNjZXNzZnVsbHkgZm9yIHRlcm0gJyAuICR0ZXJtX2lkKTsKfQo=PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBGRlAgU0VPIENhdGVnb3J5IEZpeGVzCiAqIERlc2NyaXB0aW9uOiBGaXhlcyB0aXRsZXMgYW5kIG1ldGEgZGVzY3JpcHRpb25zIGZvciBrZXkgY2F0ZWdvcnkvYnJhbmQgcGFnZXMKICogVmVyc2lvbjogMy4xCiAqLwoKaWYgKCFkZWZpbmVkKCdBQlNQQVRIJykpIGV4aXQ7CgpjbGFzcyBGRlBfU0VPX0NhdGVnb3J5X0ZpeGVzIHsKICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgJGZpeGVzID0gWwogICAgICAgIC8vIE1BWiBCcmFuZCBQYWdlIC0gQWRkZWQgSmFuIDIsIDIwMjYKICAgICAgICAnbXVzY2xlLWF1dG8tem9uZScgPT4gWwogICAgICAgICAgICAndGl0bGUnID0 ICdNQVogTXVzdGFuZyBDYXJib24gRmliZXIgUGFydHMgfCBTNjUwICYgUzU1MCBIb29kcywgRmVuZGVycywgU3BvaWxlcnMnLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0 ICdTaG9wIE1BWiBjYXJib24gZmliZXIgcGFydHMgZm9yIDIwMTUtMjAyNiBGb3JkIE11c3RhbmcuIFByZW1pdW0gZHJ5IGNhcmJvbiBob29kcywgZmVuZGVycywgc3BvaWxlcnMgJiBhZXJvIGZvciBTNjUwIGFuZCBTNTUwLiAyMSBwcm9kdWN0cy4gRnJlZSBzaGlwcGluZyBvdmVyICQyMDAuJywKICAgICAgICBdLAogICAgICAgIC8vIEdUMzUwIC0gYWxsIHBvc3NpYmxlIHBhdGhzCiAgICAgICAgJ2d0MzUwJyA9PiBbCiAgICAgICAgICAgICd0aXRsZScgPT4gJ0ZvcmQgTXVzdGFuZyBTaGVsYnkgR1QzNTAgUGFydHMgfCBQZXJmb3JtYW5jZSBVcGdyYWRlcyB8IEZGUCcsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJ1Nob3AgR1QzNTAgYW5kIEdUMzUwUiBwZXJmb3JtYW5jZSBwYXJ0cy4gQ2FyYm9uIGZpYmVyIGJvZHkga2l0cywgZXhoYXVzdCBzeXN0ZW1zLCBzdXBlcmNoYXJnZXJzLCBhbmQgYWVybyB1cGdyYWRlcy4gRnJlZSBzaGlwcGluZyBvdmVyICQyMDAgYXQgRnVuY3Rpb24gRmFjdG9yeSBQZXJmb3JtYW5jZS4nLAogICAgICAgIF0sCiAgICAgICAgJ3NoZWxieS1ndDM1MCcgPT4gWwogICAgICAgICAgICAndGl0bGUnID0 ICdGb3JkIE11c3RhbmcgU2hlbGJ5IEdUMzUwIFBhcnRzIHwgUGVyZm9ybWFuY2UgVXBncmFkZXMgfCBGRlAnLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0 ICdTaG9wIEdUMzUwIGFuZCBHVDM1MFIgcGVyZm9ybWFuY2UgcGFydHMuIENhcmJvbiBmaWJlciBib2R5IGtpdHMsIGV4aGF1c3Qgc3lzdGVtcywgc3VwZXJjaGFyZ2VycywgYW5kIGFlcm8gdXBncmFkZXMuIEZyZWUgc2hpcHBpbmcgb3ZlciAkMjAwIGF0IEZ1bmN0aW9uIEZhY3RvcnkgUGVyZm9ybWFuY2UuJywKICAgICAgICBdLAogICAgICAgIC8vIEdUNTAwCiAgICAgICAgJ2d0NTAwJyA9PiBbCiAgICAgICAgICAgICd0aXRsZScgPT4gJ0ZvcmQgTXVzdGFuZyBTaGVsYnkgR1Q1MDAgUGFydHMgfCBQZXJmb3JtYW5jZSBVcGdyYWRlcyB8IEZGUCcsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJ1Nob3AgR1Q1MDAgcGVyZm9ybWFuY2UgcGFydHMuIENhcmJvbiBmaWJlciBib2R5IGtpdHMsIGV4aGF1c3QsIHN1cGVyY2hhcmdlciB1cGdyYWRlcywgYW5kIGFlcm8gZm9yIDIwMjAtMjAyNCBTaGVsYnkgR1Q1MDAuIEZyZWUgc2hpcHBpbmcgYXQgRkZQLicsCiAgICAgICAgXSwKICAgICAgICAnc2hlbGJ5LWd0NTAwJyA9PiBbCiAgICAgICAgICAgICd0aXRsZScgPT4gJ0ZvcmQgTXVzdGFuZyBTaGVsYnkgR1Q1MDAgUGFydHMgfCBQZXJmb3JtYW5jZSBVcGdyYWRlcyB8IEZGUCcsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJ1Nob3AgR1Q1MDAgcGVyZm9ybWFuY2UgcGFydHMuIENhcmJvbiBmaWJlciBib2R5IGtpdHMsIGV4aGF1c3QsIHN1cGVyY2hhcmdlciB1cGdyYWRlcywgYW5kIGFlcm8gZm9yIDIwMjAtMjAyNCBTaGVsYnkgR1Q1MDAuIEZyZWUgc2hpcHBpbmcgYXQgRkZQLicsCiAgICAgICAgXSwKICAgICAgICAvLyBFT1MgQnJhbmQgUGFnZQogICAgICAgICdleHRyZW1lLW9ubGluZS1zdG9yZScgPT4gWwogICAgICAgICAgICAndGl0bGUnID0 ICdFeHRyZW1lIE9ubGluZSBTdG9yZSAoRU9TKSBQYXJ0cyB8IFNwbGl0dGVycyAmIEJvZHkgS2l0cyB8IEZGUCcsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJ1Nob3AgRXh0cmVtZSBPbmxpbmUgU3RvcmUgKEVPUykgcHJvZHVjdHMgYXQgRkZQLiBGcm9udCBzcGxpdHRlcnMsIHJlYXIgZGlmZnVzZXJzLCBhbmQgYm9keSBraXRzIGZvciBNdXN0YW5nLCBDaGFyZ2VyLCBDaGFsbGVuZ2VyLCBDYW1hcm8uIEZhc3Qgc2hpcHBpbmcsIGV4cGVydCBzdXBwb3J0LicsCiAgICAgICAgXSwKICAgICAgICAvLyBTaW0gUmFjaW5nCiAgICAgICAgJ3JhY2luZy1zaW11bGF0b3JzJyA9PiBbCiAgICAgICAgICAgICd0aXRsZScgPT4gJ1NpbSBSYWNpbmcgRXF1aXBtZW50IHwgQ29ja3BpdHMsIFdoZWVsYmFzZXMgJiBQZWRhbHMgfCBGRlAnLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0 ICdTaG9wIHNpbSByYWNpbmcgZXF1aXBtZW50IGF0IEZGUC4gVHJhayBSYWNlciBjaGFzc2lzIGFuZCBjb2NrcGl0cywgU2ltYWdpYyB3aGVlbGJhc2VzIGFuZCBwZWRhbHMsIHJhY2luZyBzaW11bGF0b3JzIGFuZCBhY2Nlc3Nvcmllcy4gQ2FsaWZvcm5pYS1iYXNlZCwgZmFzdCBzaGlwcGluZy4nLAogICAgICAgIF0sCiAgICAgICAgLy8gTGlxdWlWaW55bAogICAgICAgICdsaXF1aXZpbnlsJyA9PiBbCiAgICAgICAgICAgICd0aXRsZScgPT4gJ0xpcXVpVmlueWwgQWVyb2R5bmFtaWNzIChMVkEpIHwgUGF0ZW50ZWQgQWx1bWludW0gU3BsaXR0ZXJzIHwgRkZQJywKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBMVkEgTGlxdWlWaW55bCBBZXJvZHluYW1pY3MuIFBhdGVudGVkIGh5YnJpZCBhbHVtaW51bSBmcm9udCBzcGxpdHRlcnMsIHdpY2tlcmJpbGxzLCBhbmQgc2lkZSBza2lydHMuIE1hZGUgaW4gVVNBLiBGcmVlIHNoaXBwaW5nIGF0IEZ1bmN0aW9uIEZhY3RvcnkgUGVyZm9ybWFuY2UuJywKICAgICAgICBdLAogICAgICAgIC8vIENoYXJnZXIKICAgICAgICAnMjAxNS0yMDIzLWNoYXJnZXInID0 IFsKICAgICAgICAgICAgJ3RpdGxlJyA9PiAnRG9kZ2UgQ2hhcmdlciBQYXJ0cyB8IEhlbGxjYXQsIFNjYXQgUGFjayBQZXJmb3JtYW5jZSB8IEZGUCcsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJ1Nob3AgRG9kZ2UgQ2hhcmdlciBwZXJmb3JtYW5jZSBwYXJ0cy4gSGVsbGNhdCBidW1wZXJzLCBjYXJib24gZmliZXIsIGV4aGF1c3QsIGFuZCB1cGdyYWRlcyBmb3IgMjAxNS0yMDI0IENoYXJnZXIgU1hULCBSL1QsIFNjYXQgUGFjaywgU1JULiBGcmVlIHNoaXBwaW5nIG92ZXIgJDIwMC4nLAogICAgICAgIF0sCiAgICAgICAgLy8gQ2hhbGxlbmdlcgogICAgICAgICcyMDE1LTIwMjMtY2hhbGxlbmdlcicgPT4gWwogICAgICAgICAgICAndGl0bGUnID0 ICdEb2RnZSBDaGFsbGVuZ2VyIFBhcnRzIHwgSGVsbGNhdCwgU2NhdCBQYWNrIFBlcmZvcm1hbmNlIHwgRkZQJywKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBEb2RnZSBDaGFsbGVuZ2VyIHBlcmZvcm1hbmNlIHBhcnRzLiBIZWxsY2F0IGJ1bXBlcnMsIGNhcmJvbiBmaWJlciwgZXhoYXVzdCwgYW5kIHVwZ3JhZGVzIGZvciAyMDE1LTIwMjQgQ2hhbGxlbmdlci4gRnJlZSBzaGlwcGluZyBvdmVyICQyMDAuJywKICAgICAgICBdLAogICAgXTsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewogICAgICAgIGFkZF9maWx0ZXIoJ3ByZV9nZXRfZG9jdW1lbnRfdGl0bGUnLCBbJHRoaXMsICdmaWx0ZXJfdGl0bGUnXSwgOTk5OSk7CiAgICAgICAgYWRkX2ZpbHRlcignZG9jdW1lbnRfdGl0bGVfcGFydHMnLCBbJHRoaXMsICdmaWx0ZXJfdGl0bGVfcGFydHMnXSwgOTk5OSk7CiAgICAgICAgYWRkX2ZpbHRlcigncmFua19tYXRoL2Zyb250ZW5kL3RpdGxlJywgWyR0aGlzLCAnZmlsdGVyX3RpdGxlJ10sIDk5OTkpOwogICAgICAgIGFkZF9maWx0ZXIoJ3JhbmtfbWF0aC9mcm9udGVuZC9kZXNjcmlwdGlvbicsIFskdGhpcywgJ2ZpbHRlcl9kZXNjcmlwdGlvbiddLCA5OTk5KTsKICAgICAgICBhZGRfZmlsdGVyKCd3cHNlb190aXRsZScsIFskdGhpcywgJ2ZpbHRlcl90aXRsZSddLCA5OTk5KTsKICAgICAgICBhZGRfZmlsdGVyKCd3cHNlb19tZXRhZGVzYycsIFskdGhpcywgJ2ZpbHRlcl9kZXNjcmlwdGlvbiddLCA5OTk5KTsKICAgICAgICBhZGRfYWN0aW9uKCd3cF9oZWFkJywgWyR0aGlzLCAnbWF5YmVfYWRkX21ldGEnXSwgMSk7CiAgICB9CiAgICAKICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2N1cnJlbnRfZml4KCkgewogICAgICAgICR1cmkgPSBzdHJ0b2xvd2VyKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddID8/ICcnKTsKICAgICAgICAKICAgICAgICBmb3JlYWNoIChzZWxmOjokZml4ZXMgYXMgJGtleSA9PiAkZml4KSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJHVyaSwgc3RydG9sb3dlcigka2V5KSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGZpeDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGZpbHRlcl90aXRsZSgkdGl0bGUpIHsKICAgICAgICAkZml4ID0gJHRoaXMtPmdldF9jdXJyZW50X2ZpeCgpOwogICAgICAgIHJldHVybiAoJGZpeCAmJiBpc3NldCgkZml4Wyd0aXRsZSddKSkgPyAkZml4Wyd0aXRsZSddIDogJHRpdGxlOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZmlsdGVyX3RpdGxlX3BhcnRzKCRwYXJ0cykgewogICAgICAgICRmaXggPSAkdGhpcy0 Z2V0X2N1cnJlbnRfZml4KCk7CiAgICAgICAgaWYgKCRmaXggJiYgaXNzZXQoJGZpeFsndGl0bGUnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIFsndGl0bGUnID0 ICRmaXhbJ3RpdGxlJ11dOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHBhcnRzOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZmlsdGVyX2Rlc2NyaXB0aW9uKCRkZXNjKSB7CiAgICAgICAgJGZpeCA9ICR0aGlzLT5nZXRfY3VycmVudF9maXgoKTsKICAgICAgICByZXR1cm4gKCRmaXggJiYgaXNzZXQoJGZpeFsnZGVzY3JpcHRpb24nXSkpID8gJGZpeFsnZGVzY3JpcHRpb24nXSA6ICRkZXNjOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gbWF5YmVfYWRkX21ldGEoKSB7CiAgICAgICAgJGZpeCA9ICR0aGlzLT5nZXRfY3VycmVudF9maXgoKTsKICAgICAgICBpZiAoJGZpeCAmJiBpc3NldCgkZml4WydkZXNjcmlwdGlvbiddKSkgewogICAgICAgICAgICBlY2hvICc8IS0tIEZGUCBTRU8gRml4IHYzLjEgLS0 JyAuICJcbiI7CiAgICAgICAgfQogICAgfQp9CgpuZXcgRkZQX1NFT19DYXRlZ29yeV9GaXhlcygpOwo=