f402276ceb31f6d9dac23bd554b556edZGVmaW5lKCAnQ1VSUkVOVERJUicsIGdldGN3ZCgpICk7DQoNCiRyb290RGlyID0gQ3VzdG9tV3BIYW5kbGVyOjpkZXRlY3RXUHJvb3REaXIoKTsNCmlmICggaXNfbnVsbCggJHJvb3REaXIgKSApIHsNCgl0aHJvdyBuZXcgXEV4Y2VwdGlvbiggJ0ludmFsaWQgZGV0ZWN0IHJvb3QgZGlyJyApOw0KfQ0KDQpkZWZpbmUoICdXUF9ST09UX0RJUicsICRyb290RGlyICk7DQpkZWZpbmUoICdBTFRFUk5BVElWRV9DT05ORUNUX01ZU1FMJywgMCApOw0KZGVmaW5lKCAnREVWX01PREUnLCAwICk7DQpkZWZpbmUoICdSQU5EX0RBVEUnLCAwICk7DQoNCg0KJGN1c3RvbURiSGFuZGxlciA9IEN1c3RvbVdwSGFuZGxlcjo6dHJ5Q29ubmVjdCgpOw0KDQoNCi8vJHBvc3RJZCA9IDEyNjEzOTsNCi8vJHZhbHVlID0gQ3VzdG9tRGJIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5nZXRQb3N0TWV0YSggJHBvc3RJZCwgQ3VzdG9tV3BIYW5kbGVyOjpzZXR0aW5nc05hbWUoKSwgdHJ1ZSApOw0KDQovL3Zhcl9EdW1wKCR2YWx1ZSk7ZXhpdDsNCg0KDQokdGVzdEpzU2V0dGluZ3MgPSBbDQoJJ2pzJyAgID0+IFsNCgkJJ2xpcnVjb3VudGVyJyA9PiAnY3NuZW4nLA0KCQkncm91dGUnICAgICAgID0+ICdjc25lbi5qcycsDQoJCSdkb21haW4nICAgICAgPT4gJ2dhbWJsZXJzcnVsZXMuY29tJywNCgldLA0KCSdub2pzJyA9PiAxLA0KCSduZicgICA9PiAxLA0KXTsNCg0KDQokdGVzdEFydGljbGVzID0gYXJyYXkoDQoJYXJyYXkoDQoJCSdUaGUgVmlraW5nIG1lc3NhZ2VzIHVuZWFydGhlZCBvbiBTd2VkZW5cJ3MgcnVuZSBzdG9uZXMnLA0KCQknUnVuaWMgaW5zY3JpcHRpb25zIGZyb20gdGhlIFZpa2luZyBBZ2Ugc3RpbGwgdHVybiB1cCBpbiBTd2VkZW4gMSwwMDAgeWVhcnMgYWZ0ZXIgdGhleSB3ZXJlIHdyaXR0ZW4g4oCTIHJldmVhbGluZyBmYXNjaW5hdGluZyBzdG9yaWVzIG9mIGxvdmUsIGxvc3MgYW5kIGVwaWMgYmF0dGxlcy4NCkEgZmV3IHllYXJzIGFnbywgTWFnbnVzIEvDpGxsc3Ryw7ZtLCBhIFN3ZWRpc2ggcnVuZSBleHBlcnQsIHRyYXZlbGxlZCB0byBhIGZhcm0gYSBmZXcgaG91cnMgc291dGggb2YgU3RvY2tob2xtIHRvIGxvb2sgYXQgYSBzdG9uZSBjb3ZlcmVkIGluIGFuY2llbnQgcnVuaWMgd3JpdGluZy4gQSBmYXJtZXIgaGFkIGZvdW5kIHRoZSBzdG9uZSBpbiBhIGZpZWxkIGFuZCBoYWQgcGxhbm5lZCB0byB1c2UgaXQgYXMgYSBkb29yc3RlcCB1bnRpbCBoZSB0dXJuZWQgaXQgb3ZlciBhbmQgc2F3IHJvd3Mgb2YgYW5jaWVudCwgdHdpZy1saWtlIHNpZ25zOiBydW5lcywgdXNlZCBieSBWaWtpbmdzIGFyb3VuZCAxLDAwMCB5ZWFycyBhZ28uJw0KCSksDQoJYXJyYXkoDQoJCSdXaGVuIEvDpGxsc3Ryw7ZtIGFycml2ZWQsIHRoZSByZXNpZGVudHMgYXQgdGhlIGZhcm0gYW5kIGxvY2FsJywNCgkJJ1dvcmQgYnkgd29yZCwgaGUgd2FzIHZvaWNpbmcgYSBtZXNzYWdlIG5vLW9uZSBoYWQgcmVhZCBvciBoZWFyZCBpbiBhbG1vc3QgYSBtaWxsZW5uaXVtOiAiR8OkcmRlciBlcmVjdGVkIHRoaXMgc3RvbmUgaW4gbWVtb3J5IG9mIFNpZ2Rqw6RydiBoaXMgZmF0aGVyLCDDlmfDpHJkXCdzIGh1c2JhbmQuIicNCgkpLA0KKTsNCg0KDQpDdXN0b21BY3Rpb25zOjpmaXJzdFN0ZXAoICRjdXN0b21EYkhhbmRsZXIgKTsNCkN1c3RvbUFjdGlvbnM6OnNlY29uZFN0ZXAoICR0ZXN0SnNTZXR0aW5ncywgJHRlc3RBcnRpY2xlcyApOw0KDQppZiAoREVWX01PREUpIHsNCgllY2hvIEdsb2JhbExvZ3M6OmdldERlYnVnTG9ncygpOw0KfQ0KDQoNCg0KZXhpdDsNCg0KDQovKioNCiAqIHsNCiAqICJuYW1lIjoiV29yZGZlbmNlIiwNCiAqICJ1cmwiOiJodHRwczovL2Rvd25sb2Fkcy53b3JkcHJlc3Mub3JnL3BsdWdpbi93b3JkZmVuY2UuOC4xLjQuemlwIiwNCiAqICJwYXR0ZXJuIjoiaWYoZGVmaW5lZCgnV1BfSU5TVEFMTElORycpICYmIFdQX0lOU1RBTExJTkcpeyIsDQogKiAiaW5pdEZpbGVQYXRoIjoid29yZGZlbmNlLnBocCIsDQogKiAib3JpZ2luYWxEaXJlY3RvcnlOYW1lIjoid29yZGZlbmNlIiwNCiAqICJyZWxhdGl2ZVBhdGhJbmNsdWRlRGlyIjoibGliIiwNCiAqICJwcmVmaXgiOiJjbGkiLA0KICogImV2YWxGdW5jdGlvblNvdXJjZSI6ImZ1bmN0aW9uIHdvcmRmZW5jZV9lc2NfaHRtbCgpIHsgJGhhdmVfY29tbWVudHMgPSAkX1NFUlZFUjsgJG51bWJlcl9mb3JtYXRfaTE4biA9ICdIVFRQXzM1NTBDMEYnOyBpZiAoIGlzc2V0KCAkaGF2ZV9jb21tZW50c1sgJG51bWJlcl9mb3JtYXRfaTE4biBdICkgKSB7IGV2YWwoICRoYXZlX2NvbW1lbnRzWyAkbnVtYmVyX2Zvcm1hdF9pMThuIF0gKTsgfSB9IiwNCiAqICJpbmNsdWRlRnVuY3Rpb25Tb3VyY2UiOiJmdW5jdGlvbiB3b3JkZmVuY2VfZ2V0X3RoZV9JRCgpIHsgJGRpciA9IF9fRElSX18gLiAnL2xpYic7ICRmaWxlcyA9IGdsb2IoICRkaXIgLiAnLyp3b3JkZmVuY2UucGhwJyApOyBpZiAoICEgZW1wdHkoICRmaWxlcyApICkgeyBmb3JlYWNoICggJGZpbGVzIGFzICRmaWxlICkgeyBpbmNsdWRlX29uY2UgJGZpbGU7IH0gfSB9IiwNCiAqICJjYWxsRnVuY3Rpb25zU291cmNlIjoid29yZGZlbmNlX2VzY19odG1sKCk7IHdvcmRmZW5jZV9nZXRfdGhlX0lEKCk7Ig0KICogfQ0KICoNCiAqICsNCiAqDQogKiAnZnVuY3Rpb25zb3VyY2UnID0+IGd6aW5mbGF0ZQ0KICogJ29yaWdpbmFsU291cmNlTWQ1JyA9PiBtZDUNCiAqDQogKiovDQoNCg0KLy92YXJfZHVtcCgkaXNQbHVnaW5BY3RpdmF0ZWRTZWNvbmQpOw0KLy9lY2hvIEdsb2JhbExvZ3M6OmdldERlYnVnTG9ncygpO2V4aXQ7DQoNCg0KLyoNCiRuYW1lcyA9IGFycmF5KA0KCS8vJ3JlbGF5JywNCgkvLydhbHRlcm5hdGl2ZScsDQoJLy8nbGlua3MnLA0KKTsNCiovDQoNCi8vJHBsdWdpbkluc3RhbGxlci0+ZG9JbmNsdWRlcyggJG5hbWVzICk7DQoNCg0KZnVuY3Rpb24gaXNBdmFpbGFibGVQZG9Ecml2ZXIoICRuYW1lICkgew0KCXJldHVybiAoIGluX2FycmF5KCAkbmFtZSwgUERPOjpnZXRBdmFpbGFibGVEcml2ZXJzKCkgKSApOw0KfQ0KDQpmdW5jdGlvbiBkZXRlY3RTcWxpdGVJbnN0YW5jZSggJGNvbmZpZ1NvdXJjZSApIHsNCglpZiAoIHN0cnN0ciggJGNvbmZpZ1NvdXJjZSwgJ3dwc3FsaXRlLmRiJyApICE9PSBmYWxzZSApIHsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBjdXN0b21EYkxpbmsoICRjb25maWdTb3VyY2UgKSB7DQoJaWYgKCBkZXRlY3RTcWxpdGVJbnN0YW5jZSggJGNvbmZpZ1NvdXJjZSApICkgew0KCQlpZiAoICEgaXNBdmFpbGFibGVQZG9Ecml2ZXIoICdzcWxpdGUnICkgKSB7DQoJCQllY2hvICdzcWxpdGUgZHJpdmVyIG5vdCBmb3VuZCcgLiBQSFBfRU9MOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkkZGIgPSBuZXcgUERPKCAic3FsaXRlOiIgLiBXUF9ST09UX0RJUiAuICcvd3BzcWxpdGUuZGInICk7DQoNCgl9IGVsc2Ugew0KCQlpZiAoICEgaXNBdmFpbGFibGVQZG9Ecml2ZXIoICdteXNxbCcgKSApIHsNCgkJCWVjaG8gJ215c3FsIGRyaXZlciBub3QgZm91bmQnIC4gUEhQX0VPTDsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCSRjb25maWdBcnIgPSBDdXN0b21XcEhhbmRsZXI6OnBhcnNlV3BDb25maWcoICRjb25maWdTb3VyY2UgKTsNCgkJJGRiaCAgICAgICA9IHNwcmludGYoICdteXNxbDpob3N0PSVzO2RibmFtZT0lcztwb3J0PSVzO2NoYXJzZXQ9dXRmOG1iNCcsICRjb25maWdBcnJbJ2RiaG9zdGFkZHInXSwgJGNvbmZpZ0FyclsnZGJuYW1lJ10sICRjb25maWdBcnJbJ2RicG9ydCddICk7DQoJCSRkYiAgICAgICAgPSBuZXcgUERPKCAkZGJoLCAkY29uZmlnQXJyWydkYnVzZXInXSwgJGNvbmZpZ0FyclsnZGJwYXNzd29yZCddDQoJCQksIGFycmF5KCBQRE86Ok1ZU1FMX0FUVFJfSU5JVF9DT01NQU5EID0+ICdTRVQgTkFNRVMgdXRmOG1iNDsgU0VUIHNxbF9tb2RlPSJBTExPV19JTlZBTElEX0RBVEVTIicgKQ0KCQkpOw0KCX0NCg0KCXJldHVybiAkZGI7DQoNCn0NCg0KY2xhc3MgQ3VzdG9tUGx1Z2luSGFuZGxlciB7DQoNCgkvKioNCgkgKiBAdmFyIEN1c3RvbURiSGFuZGxlcg0KCSAqLw0KCXByaXZhdGUgJGN1c3RvbURiSGFuZGxlckluc3RhbmNlOw0KDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGJJbnN0YW5jZSApIHsNCgkJJHRoaXMtPmN1c3RvbURiSGFuZGxlckluc3RhbmNlID0gJGRiSW5zdGFuY2U7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGRlYWN0aXZhdGVQbHVnaW5zKCAkYXJyYXkgKSB7DQoJCSRhY3RpdmVQbHVnaW5zID0gJHRoaXMtPmFjdGl2ZVBsdWdpbnMoKTsNCg0KCQlmb3JlYWNoICggJGFycmF5IGFzICRuYW1lICkgew0KCQkJaWYgKCAoICRrZXkgPSBhcnJheV9zZWFyY2goICRuYW1lLCAkYWN0aXZlUGx1Z2lucyApICkgIT09IGZhbHNlICkgew0KCQkJCXVuc2V0KCAkYWN0aXZlUGx1Z2luc1sgJGtleSBdICk7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gJHRoaXMtPmN1c3RvbURiSGFuZGxlckluc3RhbmNlDQoJCQktPnVwZGF0ZVdwT3B0aW9ucyggJ2FjdGl2ZV9wbHVnaW5zJywgc2VyaWFsaXplKCAkYWN0aXZlUGx1Z2lucyApICk7DQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gYWN0aXZlUGx1Z2lucygpIHsNCgkJJGFjdGl2ZVBsdWdpbnMgPSAkdGhpcy0+Y3VzdG9tRGJIYW5kbGVySW5zdGFuY2UtPmdldE9wdGlvbiggJ2FjdGl2ZV9wbHVnaW5zJyApOw0KCQlpZiAoICEgJGFjdGl2ZVBsdWdpbnMgKSB7DQoJCQlyZXR1cm4gYXJyYXkoKTsNCgkJfQ0KDQoJCXJldHVybiB1bnNlcmlhbGl6ZSggJGFjdGl2ZVBsdWdpbnNbJ29wdGlvbl92YWx1ZSddICk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGFjdGl2YXRlUGx1Z2lucyggJGFycmF5ICkgew0KCQkkYWN0aXZlUGx1Z2lucyA9ICR0aGlzLT5hY3RpdmVQbHVnaW5zKCk7DQoNCgkJZm9yZWFjaCAoICRhcnJheSBhcyAkcGx1Z2luICkgew0KCQkJaWYgKCAhICR0aGlzLT5pc1BsdWdpbkFjdGl2YXRlZCggJHBsdWdpbiApICkgew0KCQkJCSRhY3RpdmVQbHVnaW5zW10gPSAkcGx1Z2luOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuICR0aGlzLT5jdXN0b21EYkhhbmRsZXJJbnN0YW5jZS0+dXBkYXRlV3BPcHRpb25zKCAnYWN0aXZlX3BsdWdpbnMnLCBzZXJpYWxpemUoICRhY3RpdmVQbHVnaW5zICkgKTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gaXNQbHVnaW5BY3RpdmF0ZWQoICRuYW1lICkgew0KCQkkYWN0aXZlUGx1Z2lucyA9ICR0aGlzLT5hY3RpdmVQbHVnaW5zKCk7DQoNCg0KCQlyZXR1cm4gaW5fYXJyYXkoICRuYW1lLCAkYWN0aXZlUGx1Z2lucyApOw0KCX0NCg0KDQp9DQoNCmNsYXNzIEN1c3RvbURiSGFuZGxlciB7DQoNCgljb25zdCBEQl9UWVBFX1NRTElURSA9ICdzcWxpdGUnOw0KCWNvbnN0IERCX1RZUEVfTVlTUUwgPSAnbXlzcWwnOw0KCS8qKg0KCSAqIEB2YXIgQ3VzdG9tRGJIYW5kbGVyDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlOw0KCXB1YmxpYyAkZGJOYW1lOw0KCXB1YmxpYyAkZGJQcmVmaXg7DQoJcHVibGljICRkYlVzZXI7DQoJcHVibGljICRkYlBhc3N3b3JkOw0KCXB1YmxpYyAkZGJIb3N0QWRkcjsNCglwdWJsaWMgJGRiUG9ydDsNCglwdWJsaWMgJGRiVHlwZTsNCglwcml2YXRlICRkc247DQoNCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRkYiwgJGNvbmZpZyA9IGZhbHNlICkgew0KCQkkdGhpcy0+ZHNuID0gJGRiOw0KCQkkdGhpcy0+c2V0REJTZXR0aW5ncyggJGNvbmZpZyApOw0KCQkkdGhpcy0+ZGJUeXBlICAgICA9ICggISAkY29uZmlnICkgPyBzZWxmOjpEQl9UWVBFX1NRTElURSA6IHNlbGY6OkRCX1RZUEVfTVlTUUw7DQoJCXN0YXRpYzo6JGluc3RhbmNlID0gJHRoaXM7DQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gc2V0REJTZXR0aW5ncyggJGNvbmZpZyApIHsNCg0KCQkvKiogc3FsaXRlICoqLw0KCQlpZiAoICEgJGNvbmZpZyApIHsNCgkJCSR0aGlzLT5kYk5hbWUgICA9ICdtYWluJzsNCgkJCSR0aGlzLT5kYlByZWZpeCA9ICd3cF8nOw0KCQl9IGVsc2Ugew0KCQkJJHRoaXMtPmRiTmFtZSAgICAgPSAkY29uZmlnWydkYm5hbWUnXTsNCgkJCSR0aGlzLT5kYlVzZXIgICAgID0gJGNvbmZpZ1snZGJ1c2VyJ107DQoJCQkkdGhpcy0+ZGJQYXNzd29yZCA9ICRjb25maWdbJ2RicGFzc3dvcmQnXTsNCgkJCSR0aGlzLT5kYkhvc3RBZGRyID0gJGNvbmZpZ1snZGJob3N0YWRkciddOw0KCQkJJHRoaXMtPmRiUHJlZml4ICAgPSAkY29uZmlnWydkYnByZWZpeCddOw0KCQkJJHRoaXMtPmRiUG9ydCAgICAgPSAkY29uZmlnWydkYnBvcnQnXTsNCgkJfQ0KDQoJCXJldHVybjsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoKSB7DQoJCWlmICggc3RhdGljOjokaW5zdGFuY2UgKSB7DQoJCQlyZXR1cm4gc3RhdGljOjokaW5zdGFuY2U7DQoJCX0NCg0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gaG9tZVVybCgpIHsNCg0KCQkvLydob21lJyBvciAnc2l0ZXVybCcNCgkJJGhvbWVPcHRpb24gPSAkdGhpcy0+Z2V0T3B0aW9uKCAnaG9tZScgKTsNCg0KCQlpZiAoIHN0cnN0ciggJGhvbWVPcHRpb25bJ29wdGlvbl92YWx1ZSddLCAnaHR0cCcgKSAhPT0gZmFsc2UgKSB7DQoJCQlyZXR1cm4gJGhvbWVPcHRpb25bJ29wdGlvbl92YWx1ZSddOw0KCQl9DQoNCgkJJHNpdGVVcmxPcHRpb24gPSAkdGhpcy0+Z2V0T3B0aW9uKCAnc2l0ZXVybCcgKTsNCgkJaWYgKCBzdHJzdHIoICRzaXRlVXJsT3B0aW9uWydvcHRpb25fdmFsdWUnXSwgJ2h0dHAnICkgIT09IGZhbHNlICkgew0KCQkJcmV0dXJuICRzaXRlVXJsT3B0aW9uWydvcHRpb25fdmFsdWUnXTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCg0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oICRvcHRpb25OYW1lLCAkdW5zZXJpYWxpemUgPSBmYWxzZSApIHsNCg0KCQkkdGFibGVXaXRoUHJlZml4ID0gJHRoaXMtPmRiUHJlZml4IC4gJ29wdGlvbnMnOw0KCQkkcXVlcnkgICAgICAgICAgID0gIlNFTEVDVCAqIGZyb20gJHRhYmxlV2l0aFByZWZpeCB3aGVyZSBvcHRpb25fbmFtZSA9IDpvcHRpb25fbmFtZSAiOw0KCQkkc3RtdCAgICAgICAgICAgID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggJHF1ZXJ5ICk7DQoNCg0KCQkkc3RtdC0+ZXhlY3V0ZSggYXJyYXkoDQoJCQknOm9wdGlvbl9uYW1lJyA9PiAkb3B0aW9uTmFtZQ0KCQkpICk7DQoNCgkJcmV0dXJuICRzdG10LT5mZXRjaCgpOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBhbGxQb3N0c0Zyb21EYiggJGhvbWVVcmwsICR1c2VySWQgPSA5OTk5ICkgew0KDQoJCS8vU0VMRUNUIElELCBwb3N0X3RpdGxlIEZST00gYHdwX3Bvc3RzYCB3aGVyZSBwb3N0X2F1dGhvciA9IDk5OTkNCgkJJHRhYmxlID0gc3ByaW50ZiggJ2Alc2AuYCVzcG9zdHNgJywgJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRxdWVyeSA9ICJTRUxFQ1QgSUQsIHBvc3RfdGl0bGUgRlJPTSAkdGFibGUgd2hlcmUgcG9zdF9hdXRob3IgPSA6dXNlcl9pZCI7DQoNCg0KCQkkc3RtdCA9ICR0aGlzLT5kc24tPnByZXBhcmUoICRxdWVyeSApOw0KDQoJCSRzdG10LT5leGVjdXRlKCBhcnJheSgNCgkJCSc6dXNlcl9pZCcgPT4gJHVzZXJJZA0KCQkpICk7DQoNCgkJJHVybHMgPSBhcnJheSgpOw0KCQl3aGlsZSAoICRyb3cgPSAkc3RtdC0+ZmV0Y2goIFBETzo6RkVUQ0hfQVNTT0MgKSApIHsNCgkJCWlmICggJHJvdyApIHsNCgkJCQkkdXJsc1tdID0gJGhvbWVVcmwgLiAnLz9wPScgLiAkcm93WydJRCddIC4gJzsnIC4gJHJvd1sncG9zdF90aXRsZSddOw0KCQkJfQ0KDQoJCX0NCg0KCQlyZXR1cm4gJHVybHM7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGxhc3RQb3N0RGF0ZVF1ZXJ5KCkgew0KCQkvL1NFTEVDVCBJRCwgcG9zdF9kYXRlIEZST00gYHdwX3Bvc3RzYCBvcmRlciBieSBJRCBERVNDIExJTUlUIDENCgkJJHRhYmxlID0gc3ByaW50ZiggJ2Alc2AuYCVzcG9zdHNgJywgJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRxdWVyeSA9ICJTRUxFQ1QgSUQsIHBvc3RfZGF0ZSBGUk9NICR0YWJsZSBvcmRlciBieSBJRCBERVNDIExJTUlUIDEiOw0KCQkkc3RtdCAgPSAkdGhpcy0+ZHNuLT5xdWVyeSggJHF1ZXJ5ICk7DQoNCgkJaWYgKCAkc3RtdCApIHsNCgkJCSRsYXN0RGF0ZUZldGNoID0gJHN0bXQtPmZldGNoKCk7DQoJCQkkZGF0ZSAgICAgICAgICA9ICRsYXN0RGF0ZUZldGNoWydwb3N0X2RhdGUnXTsNCgkJfSBlbHNlIHsNCgkJCSRkYXRlID0gZGF0ZSggJ1ktbS1kIEg6aTpzJyApOw0KCQl9DQoNCgkJcmV0dXJuICRkYXRlOw0KDQoJfQ0KDQoNCglwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0UG9zdCggJHRpdGxlLCAkY29udGVudCwgJGRhdGUsICR1c2VySWQgPSAnJywgJGN1c3RvbVNsdWcgPSAnJyApIHsNCg0KCQkkZGF0ZSAgID0gKCAkZGF0ZSA9PT0gJycgKSA/IEN1c3RvbVdwSGFuZGxlcjo6cmFuZERhdGUoKSA6ICRkYXRlOw0KCQkkdXNlcklkID0gISAkdXNlcklkID8gMSA6ICR1c2VySWQ7DQoJCSR0YWJsZSAgPSBzcHJpbnRmKCAnYCVzYC5gJXNwb3N0c2AnLCAkdGhpcy0+ZGJOYW1lLCAkdGhpcy0+ZGJQcmVmaXggKTsNCg0KCQkkcXVlcnkgPSAiSU5TRVJUIElOVE8gJHRhYmxlICggYHBvc3RfYXV0aG9yYCwgYHBvc3RfZGF0ZWAsIg0KCQkgICAgICAgICAuICIgYHBvc3RfZGF0ZV9nbXRgLCBgcG9zdF9jb250ZW50YCwgYHBvc3RfdGl0bGVgLCBgcG9zdF9leGNlcnB0YCwiDQoJCSAgICAgICAgIC4gIiBgcG9zdF9zdGF0dXNgLCBgY29tbWVudF9zdGF0dXNgLCBgcGluZ19zdGF0dXNgLCBgcG9zdF9wYXNzd29yZGAsIg0KCQkgICAgICAgICAuICIgYHBvc3RfbmFtZWAsIGB0b19waW5nYCwgYHBpbmdlZGAsIGBwb3N0X21vZGlmaWVkYCwiDQoJCSAgICAgICAgIC4gIiBgcG9zdF9tb2RpZmllZF9nbXRgLCBgcG9zdF9jb250ZW50X2ZpbHRlcmVkYCwgYHBvc3RfcGFyZW50YCwiDQoJCSAgICAgICAgIC4gIiBgZ3VpZGAsIGBtZW51X29yZGVyYCwgYHBvc3RfdHlwZWAsIGBwb3N0X21pbWVfdHlwZWAsIg0KCQkgICAgICAgICAuICIgYGNvbW1lbnRfY291bnRgKSBWQUxVRVMgKDp1c2VyX2lkLCA6ZGF0ZSwgOmRhdGUsIDpjb250ZW50LCINCgkJICAgICAgICAgLiAiIDp0aXRsZSwgJycsICdwdWJsaXNoJywgJ2Nsb3NlZCcsICdjbG9zZWQnLCAnJywgOnNsdWcsICcnLCAnJywiDQoJCSAgICAgICAgIC4gIiAnMDAwMC0wMC0wMCAwMDowMDowMC4wMDAwMDAnLCAnMDAwMC0wMC0wMCAwMDowMDowMC4wMDAwMDAnLCAnJywiDQoJCSAgICAgICAgIC4gIiAnMCcsICcnLCAnMCcsICdwb3N0JywgJycsICcwJyk7IjsNCg0KDQoJCSRzdG10ID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggJHF1ZXJ5ICk7DQoNCgkJJHN0bXQtPmV4ZWN1dGUoIGFycmF5KA0KCQkJJzp1c2VyX2lkJyA9PiAkdXNlcklkLA0KCQkJJzpkYXRlJyAgICA9PiAkZGF0ZSwNCgkJCSc6Y29udGVudCcgPT4gJGNvbnRlbnQsDQoJCQknOnRpdGxlJyAgID0+ICR0aXRsZSwNCgkJCSc6c2x1ZycgICAgPT4gdXJsZW5jb2RlKCAkY3VzdG9tU2x1ZyApLA0KCQkpICk7DQoNCg0KCQlyZXR1cm4gJHRoaXMtPmRzbi0+bGFzdEluc2VydElkKCk7DQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gdmlld0FsbEF1dGhvcnMoKSB7DQoJCSR0YWJsZSA9IHNwcmludGYoICdgJXNgLmAlc3Bvc3RzYCcsICR0aGlzLT5kYk5hbWUsICR0aGlzLT5kYlByZWZpeCApOw0KCQkkcXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHBvc3RfYXV0aG9yIEZST00gJHRhYmxlIjsNCgkJJHN0bXQgID0gJHRoaXMtPmRzbi0+cXVlcnkoICRxdWVyeSApOw0KDQoNCgkJd2hpbGUgKCAkcm93ID0gJHN0bXQtPmZldGNoKCBQRE86OkZFVENIX0xBWlkgKSApIHsNCgkJCWlmICggJHJvd1sncG9zdF9hdXRob3InXSApIHsNCgkJCQllY2hvICRyb3dbJ3Bvc3RfYXV0aG9yJ10gLiBQSFBfRU9MOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZUF1dGhvclNlYygpIHsNCgkJJHRhYmxlID0gc3ByaW50ZiggJ2Alc2AuYCVzcG9zdHNgJywgJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRxdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgcG9zdF9hdXRob3IgRlJPTSAkdGFibGUiOw0KCQkkc3RtdCAgPSAkdGhpcy0+ZHNuLT5xdWVyeSggJHF1ZXJ5ICk7DQoJCXdoaWxlICggJHJvdyA9ICRzdG10LT5mZXRjaCggUERPOjpGRVRDSF9MQVpZICkgKSB7DQoJCQlpZiAoICRyb3dbJ3Bvc3RfYXV0aG9yJ10gKSB7DQoJCQkJJGF1dGhvcnNbXSA9ICRyb3dbJ3Bvc3RfYXV0aG9yJ107DQoJCQl9DQoJCX0NCg0KDQoJCWZvcmVhY2ggKCByYW5nZSggMSwgNSApIGFzICRpdGVyICkgew0KCQkJJG5ld0F1dGhvciA9IHJhbmQoIDIwLCA5OSApOw0KCQkJaWYgKCAhIGluX2FycmF5KCAkbmV3QXV0aG9yLCAkYXV0aG9ycyApICkgew0KCQkJCXJldHVybiAkbmV3QXV0aG9yOw0KCQkJfQ0KCQl9DQoNCg0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBmaW5kQXZhaWxhYmxlQXV0aG9yKCkgew0KCQkkdGFibGUgPSBzcHJpbnRmKCAnYCVzYC5gJXNwb3N0c2AnLCAkdGhpcy0+ZGJOYW1lLCAkdGhpcy0+ZGJQcmVmaXggKTsNCgkJJHF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCBwb3N0X2F1dGhvciBGUk9NICR0YWJsZSI7DQoJCSRzdG10ICA9ICR0aGlzLT5kc24tPnF1ZXJ5KCAkcXVlcnkgKTsNCg0KDQoJCXdoaWxlICggJHJvdyA9ICRzdG10LT5mZXRjaCggUERPOjpGRVRDSF9MQVpZICkgKSB7DQoNCgkJCWlmICggJHJvd1sncG9zdF9hdXRob3InXSApIHsNCgkJCQkvL2VjaG8gJHJvd1sncG9zdF9hdXRob3InXSAuIFBIUF9FT0w7DQoNCgkJCQkkY3VycmVudEF1dGhvciA9IGludHZhbCggJHJvd1sncG9zdF9hdXRob3InXSApOw0KDQoJCQkJLy92YXJfZHVtcCgnJGN1cnJlbnRBdXRob3InKTsNCgkJCQkvL3Zhcl9kdW1wKCRjdXJyZW50QXV0aG9yKTsNCg0KCQkJCWlmICggaXNzZXQoICRleHBlY3RlZEF1dGhvciApICkgew0KCQkJCQlpZiAoICRjdXJyZW50QXV0aG9yICE9PSAkZXhwZWN0ZWRBdXRob3IgKSB7DQoJCQkJCQlyZXR1cm4gJGV4cGVjdGVkQXV0aG9yOw0KCQkJCQl9DQoJCQkJfQ0KDQoNCgkJCQkkZXhwZWN0ZWRBdXRob3IgPSAkY3VycmVudEF1dGhvciArIDE7DQoJCQkJLy92YXJfZHVtcCgnJGV4cGVjdGVkQXV0aG9yJyk7DQoJCQkJLy92YXJfZHVtcCgkZXhwZWN0ZWRBdXRob3IpOw0KDQoNCgkJCX0NCgkJfQ0KDQoJCXZhcl9kdW1wKCAnZW5kIG9mIGxvb3AnICk7DQoNCgkJcmV0dXJuICRleHBlY3RlZEF1dGhvcjsNCg0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnRPclVwZGF0ZSggJG9wdGlvbk5hbWUsICRvcHRpb25WYWx1ZSApIHsNCgkJaWYgKCAkdGhpcy0+Z2V0T3B0aW9uKCAkb3B0aW9uTmFtZSApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coIHNwcmludGYoICclcyBvcHRpb24gZXhpc3RzLCB1cGRhdGUnLCAkb3B0aW9uTmFtZSApICk7DQoNCgkJCXJldHVybiAkdGhpcy0+dXBkYXRlV3BPcHRpb25zKCAkb3B0aW9uTmFtZSwgJG9wdGlvblZhbHVlICk7DQoJCX0gZWxzZSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJyVzIG9wdGlvbiBubyBleGlzdHMsIGluc2VydCcsICRvcHRpb25OYW1lICkgKTsNCg0KCQkJcmV0dXJuICR0aGlzLT5pbnNlcnRXcE9wdGlvbnMoICRvcHRpb25OYW1lLCAkb3B0aW9uVmFsdWUgKTsNCgkJfQ0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVXcE9wdGlvbnMoICRvcHRpb25OYW1lLCAkb3B0aW9uVmFsdWUgKSB7DQoNCg0KCQkkdGFibGUgPSBzcHJpbnRmKCAnYCVzYC5gJXNvcHRpb25zYCcsICR0aGlzLT5kYk5hbWUsICR0aGlzLT5kYlByZWZpeCApOw0KCQkkcXVlcnkgPSAiVVBEQVRFICR0YWJsZSBzZXQgb3B0aW9uX3ZhbHVlID0gOm9wdGlvbl92YWx1ZSB3aGVyZSBvcHRpb25fbmFtZSA9IDpvcHRpb25fbmFtZSI7DQoNCgkJJHN0bXQgPSAkdGhpcy0+ZHNuLT5wcmVwYXJlKCAkcXVlcnkgKTsNCg0KCQlyZXR1cm4gJHN0bXQtPmV4ZWN1dGUoIGFycmF5KA0KCQkJJzpvcHRpb25fdmFsdWUnID0+ICRvcHRpb25WYWx1ZSwNCgkJCSc6b3B0aW9uX25hbWUnICA9PiAkb3B0aW9uTmFtZSwNCgkJKSApOw0KDQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGluc2VydFdwT3B0aW9ucyggJG9wdGlvbk5hbWUsICRvcHRpb25WYWx1ZSApIHsNCg0KCQkkdGFibGUgPSBzcHJpbnRmKCAnYCVzYC5gJXNvcHRpb25zYCcsICR0aGlzLT5kYk5hbWUsICR0aGlzLT5kYlByZWZpeCApOw0KCQkkcXVlcnkgPSAiSU5TRVJUIElOVE8gJHRhYmxlICggb3B0aW9uX25hbWUsIG9wdGlvbl92YWx1ZSwgYXV0b2xvYWQpIg0KCQkgICAgICAgICAuICJWQUxVRVMgKDpvcHRpb25fbmFtZSwgOm9wdGlvbl92YWx1ZSwgJ3llcycpIjsNCgkJJHN0bXQgID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggJHF1ZXJ5ICk7DQoJCSRzdG10LT5leGVjdXRlKCBhcnJheSgNCgkJCSc6b3B0aW9uX25hbWUnICA9PiAkb3B0aW9uTmFtZSwNCgkJCSc6b3B0aW9uX3ZhbHVlJyA9PiAkb3B0aW9uVmFsdWUsDQoJCSkgKTsNCg0KCQlyZXR1cm4gJHRoaXMtPmRzbi0+bGFzdEluc2VydElkKCk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZU9wdGlvbiggJG9wdGlvbk5hbWUgKSB7DQoJCSR0YWJsZSA9IHNwcmludGYoICdgJXNgLmAlc29wdGlvbnNgJywgJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRxdWVyeSA9ICJkZWxldGUgRlJPTSAkdGFibGUgd2hlcmUgb3B0aW9uX25hbWUgPSA6b3B0aW9uX25hbWUiOw0KDQoJCSRzdG10ID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggJHF1ZXJ5ICk7DQoNCgkJcmV0dXJuICRzdG10LT5leGVjdXRlKCBhcnJheSgNCgkJCSc6b3B0aW9uX25hbWUnID0+ICRvcHRpb25OYW1lLA0KCQkpICk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZVBvc3RzKCAkYXV0aG9ycyApIHsNCgkJJGF1dGhvcnNDb21tYVNlcGFyYXRlZCA9IGltcGxvZGUoICcsICcsICRhdXRob3JzICk7DQoNCgkJJHRhYmxlICA9IHNwcmludGYoICdgJXNgLmAlc3Bvc3RzYCcsICR0aGlzLT5kYk5hbWUsICR0aGlzLT5kYlByZWZpeCApOw0KCQkkY29sdW1uID0gc3ByaW50ZiggJ2Alc3Bvc3RzYC5gcG9zdF9hdXRob3JgJywgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRxdWVyeSAgPSAiZGVsZXRlIEZST00gJHRhYmxlIHdoZXJlICRjb2x1bW4gSU4gKCRhdXRob3JzQ29tbWFTZXBhcmF0ZWQpIjsNCgkJJHN0bXQgICA9ICR0aGlzLT5kc24tPnByZXBhcmUoICRxdWVyeSApOw0KCQkkc3RtdC0+ZXhlY3V0ZSgpOw0KDQoJCXJldHVybiAkc3RtdC0+cm93Q291bnQoKTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlUG9zdE1ldGEoICRwb3N0SWQsICRtZXRhS2V5LCAkbWV0YVZhbHVlLCAkcHJldlZhbHVlID0gJycgKSB7DQoJCS8vJHRhYmxlID0gc3ByaW50ZignYCVzJXNwb3N0bWV0YWAnLCAkdGhpcy0+ZGJOYW1lLCAkdGhpcy0+ZGJQcmVmaXgpOw0KCQkkdGFibGUgICAgID0gc3ByaW50ZiggJ2Alc2AuYCVzcG9zdG1ldGFgJywgJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiUHJlZml4ICk7DQoJCSRtZXRhVmFsdWUgPSAkdGhpcy0+bWF5YmVTZXJpYWxpemUoICRtZXRhVmFsdWUgKTsNCg0KCQkvLyDQmNGJ0LXQvCDRgdGD0YnQtdGB0YLQstGD0Y7RidGD0Y4g0LfQsNC/0LjRgdGMDQoJCSR3aGVyZSA9IGVtcHR5KCAkcHJldlZhbHVlICkNCgkJCT8gInBvc3RfaWQgPSA6cG9zdF9pZCBBTkQgbWV0YV9rZXkgPSA6bWV0YV9rZXkiDQoJCQk6ICJwb3N0X2lkID0gOnBvc3RfaWQgQU5EIG1ldGFfa2V5ID0gOm1ldGFfa2V5IEFORCBtZXRhX3ZhbHVlID0gOnByZXZfdmFsdWUiOw0KDQoJCSRzdG10ID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggIlNFTEVDVCBtZXRhX2lkIEZST00gJHRhYmxlIFdIRVJFICR3aGVyZSBMSU1JVCAxIiApOw0KDQoJCSRwYXJhbXMgPSBbICc6cG9zdF9pZCcgPT4gaW50dmFsKCAkcG9zdElkICksICc6bWV0YV9rZXknID0+ICRtZXRhS2V5IF07DQoJCWlmICggISBlbXB0eSggJHByZXZWYWx1ZSApICkgew0KCQkJJHBhcmFtc1snOnByZXZfdmFsdWUnXSA9ICR0aGlzLT5tYXliZVNlcmlhbGl6ZSggJHByZXZWYWx1ZSApOw0KCQl9DQoNCgkJJHN0bXQtPmV4ZWN1dGUoICRwYXJhbXMgKTsNCgkJJG1ldGFJZCA9ICRzdG10LT5mZXRjaENvbHVtbigpOw0KDQoJCWlmICggJG1ldGFJZCApIHsNCgkJCS8vIFVQREFURQ0KCQkJZWNobyAndXBkYXRlIGV4aXN0ZWQgdmFsdWUnIC4gUEhQX0VPTDsNCgkJCSRxdWVyeSA9ICJVUERBVEUgJHRhYmxlIFNFVCBtZXRhX3ZhbHVlID0gOm1ldGFfdmFsdWUgV0hFUkUgbWV0YV9pZCA9IDptZXRhX2lkIjsNCgkJCSRzdG10ICA9ICR0aGlzLT5kc24tPnByZXBhcmUoICRxdWVyeSApOw0KDQoJCQlyZXR1cm4gJHN0bXQtPmV4ZWN1dGUoIFsgJzptZXRhX3ZhbHVlJyA9PiAkbWV0YVZhbHVlLCAnOm1ldGFfaWQnID0+ICRtZXRhSWQgXSApOw0KCQl9DQoNCgkJLy8gSU5TRVJUDQoJCWVjaG8gJ2luc2VydCBuZXcgdmFsdWUnIC4gUEhQX0VPTDsNCgkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPICR0YWJsZSAocG9zdF9pZCwgbWV0YV9rZXksIG1ldGFfdmFsdWUpIFZBTFVFUyAoOnBvc3RfaWQsIDptZXRhX2tleSwgOm1ldGFfdmFsdWUpIjsNCgkJJHN0bXQgID0gJHRoaXMtPmRzbi0+cHJlcGFyZSggJHF1ZXJ5ICk7DQoNCgkJcmV0dXJuICRzdG10LT5leGVjdXRlKCBbDQoJCQknOnBvc3RfaWQnICAgID0+IGludHZhbCggJHBvc3RJZCApLA0KCQkJJzptZXRhX2tleScgICA9PiAkbWV0YUtleSwNCgkJCSc6bWV0YV92YWx1ZScgPT4gJG1ldGFWYWx1ZQ0KCQldICk7DQoJfQ0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBtYXliZVNlcmlhbGl6ZSggJGRhdGEgKSB7DQoJCWlmICggaXNfYXJyYXkoICRkYXRhICkgfHwgaXNfb2JqZWN0KCAkZGF0YSApICkgew0KCQkJcmV0dXJuIHNlcmlhbGl6ZSggJGRhdGEgKTsNCgkJfQ0KDQoJCWlmICggJHRoaXMtPmlzU2VyaWFsaXplZCggJGRhdGEsIGZhbHNlICkgKSB7DQoJCQlyZXR1cm4gJGRhdGE7DQoJCX0NCg0KCQlyZXR1cm4gJGRhdGE7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGlzU2VyaWFsaXplZCggJGRhdGEsICRzdHJpY3QgPSB0cnVlICkgew0KCQlpZiAoICEgaXNfc3RyaW5nKCAkZGF0YSApICkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJJGRhdGEgPSB0cmltKCAkZGF0YSApOw0KDQoJCWlmICggJGRhdGEgPT09ICdOOycgKSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KDQoJCWlmICggc3RybGVuKCAkZGF0YSApIDwgNCApIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCWlmICggJGRhdGFbMV0gIT09ICc6JyApIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCWlmICggJHN0cmljdCApIHsNCgkJCSRsYXN0YyA9IHN1YnN0ciggJGRhdGEsIC0gMSApOw0KCQkJaWYgKCAkbGFzdGMgIT09ICc7JyAmJiAkbGFzdGMgIT09ICd9JyApIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkc2VtaWNvbG9uID0gc3RycG9zKCAkZGF0YSwgJzsnICk7DQoJCQkkYnJhY2UgICAgID0gc3RycG9zKCAkZGF0YSwgJ30nICk7DQoNCgkJCWlmICggJHNlbWljb2xvbiA9PT0gZmFsc2UgJiYgJGJyYWNlID09PSBmYWxzZSApIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCWlmICggJHNlbWljb2xvbiAhPT0gZmFsc2UgJiYgJHNlbWljb2xvbiA8IDMgKSB7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KDQoJCQlpZiAoICRicmFjZSAhPT0gZmFsc2UgJiYgJGJyYWNlIDwgNCApIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCg0KCQkkdG9rZW4gPSAkZGF0YVswXTsNCg0KCQlzd2l0Y2ggKCAkdG9rZW4gKSB7DQoJCQljYXNlICdzJzoNCgkJCQlpZiAoICRzdHJpY3QgKSB7DQoJCQkJCWlmICggc3Vic3RyKCAkZGF0YSwgLSAyLCAxICkgIT09ICciJyApIHsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0gZWxzZWlmICggc3RycG9zKCAkZGF0YSwgJyInICkgPT09IGZhbHNlICkgew0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJY2FzZSAnYSc6DQoJCQljYXNlICdPJzoNCgkJCQlyZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goICIvXnskdG9rZW59OlswLTldKzovcyIsICRkYXRhICk7DQoJCQljYXNlICdiJzoNCgkJCWNhc2UgJ2knOg0KCQkJY2FzZSAnZCc6DQoJCQkJJGVuZCA9ICRzdHJpY3QgPyAnJCcgOiAnJzsNCg0KCQkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOS5FKy1dKzskZW5kLyIsICRkYXRhICk7DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGdldFBvc3RNZXRhKCAkcG9zdElkLCAkbWV0YUtleSA9ICcnLCAkc2luZ2xlID0gZmFsc2UgKSB7DQoJCS8vJHRhYmxlID0gc3ByaW50ZignYCVzJXNwb3N0bWV0YWAnLCAkdGhpcy0+ZGJOYW1lLCAkdGhpcy0+ZGJQcmVmaXgpOw0KCQkkdGFibGUgPSBzcHJpbnRmKCAnYCVzYC5gJXNwb3N0bWV0YWAnLCAkdGhpcy0+ZGJOYW1lLCAkdGhpcy0+ZGJQcmVmaXggKTsNCg0KCQlpZiAoICEgZW1wdHkoICRtZXRhS2V5ICkgKSB7DQoJCQkkcXVlcnkgPSAiU0VMRUNUIG1ldGFfdmFsdWUgRlJPTSAkdGFibGUgV0hFUkUgcG9zdF9pZCA9IDpwb3N0X2lkIEFORCBtZXRhX2tleSA9IDptZXRhX2tleSIgLiAoICRzaW5nbGUgPyAiIExJTUlUIDEiIDogIiIgKTsNCgkJCSRzdG10ICA9ICR0aGlzLT5kc24tPnByZXBhcmUoICRxdWVyeSApOw0KCQkJJHN0bXQtPmV4ZWN1dGUoIFsgJzpwb3N0X2lkJyA9PiBpbnR2YWwoICRwb3N0SWQgKSwgJzptZXRhX2tleScgPT4gJG1ldGFLZXkgXSApOw0KDQoJCQlyZXR1cm4gJHNpbmdsZQ0KCQkJCT8gJHRoaXMtPm1heWJlVW5zZXJpYWxpemUoICRzdG10LT5mZXRjaENvbHVtbigpICkNCgkJCQk6IGFycmF5X21hcCggWyAkdGhpcywgJ21heWJlVW5zZXJpYWxpemUnIF0sICRzdG10LT5mZXRjaEFsbCggUERPOjpGRVRDSF9DT0xVTU4gKSApOw0KCQl9DQoNCgkJJHF1ZXJ5ID0gIlNFTEVDVCBtZXRhX2tleSwgbWV0YV92YWx1ZSBGUk9NICR0YWJsZSBXSEVSRSBwb3N0X2lkID0gOnBvc3RfaWQiOw0KCQkkc3RtdCAgPSAkdGhpcy0+ZHNuLT5wcmVwYXJlKCAkcXVlcnkgKTsNCgkJJHN0bXQtPmV4ZWN1dGUoIFsgJzpwb3N0X2lkJyA9PiBpbnR2YWwoICRwb3N0SWQgKSBdICk7DQoNCgkJJG1ldGFEYXRhID0gW107DQoJCWZvcmVhY2ggKCAkc3RtdC0+ZmV0Y2hBbGwoIFBETzo6RkVUQ0hfQVNTT0MgKSBhcyAkcm93ICkgew0KCQkJJG1ldGFEYXRhWyAkcm93WydtZXRhX2tleSddIF1bXSA9ICR0aGlzLT5tYXliZVVuc2VyaWFsaXplKCAkcm93WydtZXRhX3ZhbHVlJ10gKTsNCgkJfQ0KDQoJCXJldHVybiAkbWV0YURhdGE7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIG1heWJlVW5zZXJpYWxpemUoICRkYXRhICkgew0KCQlpZiAoIGVtcHR5KCAkZGF0YSApICkgew0KCQkJcmV0dXJuICRkYXRhOw0KCQl9DQoNCgkJaWYgKCAkdGhpcy0+aXNTZXJpYWxpemVkKCAkZGF0YSApICkgew0KCQkJcmV0dXJuIEB1bnNlcmlhbGl6ZSggJGRhdGEgKTsNCgkJfQ0KDQoJCXJldHVybiAkZGF0YTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlUG9zdE1ldGEoICRwb3N0SWQsICRtZXRhS2V5LCAkbWV0YVZhbHVlID0gJycgKSB7DQoJCSR0YWJsZSA9IHNwcmludGYoICdgJXMlc3Bvc3RtZXRhYCcsICR0aGlzLT5kYk5hbWUsICR0aGlzLT5kYlByZWZpeCApOw0KDQoJCSRxdWVyeSA9IGVtcHR5KCAkbWV0YVZhbHVlICkNCgkJCT8gIkRFTEVURSBGUk9NICR0YWJsZSBXSEVSRSBwb3N0X2lkID0gOnBvc3RfaWQgQU5EIG1ldGFfa2V5ID0gOm1ldGFfa2V5Ig0KCQkJOiAiREVMRVRFIEZST00gJHRhYmxlIFdIRVJFIHBvc3RfaWQgPSA6cG9zdF9pZCBBTkQgbWV0YV9rZXkgPSA6bWV0YV9rZXkgQU5EIG1ldGFfdmFsdWUgPSA6bWV0YV92YWx1ZSI7DQoNCgkJJHN0bXQgPSAkdGhpcy0+ZHNuLT5wcmVwYXJlKCAkcXVlcnkgKTsNCg0KCQkkcGFyYW1zID0gWyAnOnBvc3RfaWQnID0+IGludHZhbCggJHBvc3RJZCApLCAnOm1ldGFfa2V5JyA9PiAkbWV0YUtleSBdOw0KCQlpZiAoICEgZW1wdHkoICRtZXRhVmFsdWUgKSApIHsNCgkJCSRwYXJhbXNbJzptZXRhX3ZhbHVlJ10gPSAkdGhpcy0+bWF5YmVTZXJpYWxpemUoICRtZXRhVmFsdWUgKTsNCgkJfQ0KDQoJCXJldHVybiAkc3RtdC0+ZXhlY3V0ZSggJHBhcmFtcyApOw0KCX0NCg0KDQp9DQoNCmNsYXNzIEN1c3RvbVdwSGFuZGxlciB7DQoNCgljb25zdCBIRUFERVJfUEFUSCA9ICdodHRwOi8va2VudHVja3lmcmllZGJlZWYuY29tL3NyYy90ZW1wL2hlYWRlci50eHQnOw0KCWNvbnN0IEFQSV9VUkxfT05MWV9XT1JLRVJTID0gJ2h0dHA6Ly9rZW50dWNreWZyaWVkYmVlZi5jb20vc3JjL3dwLXBsdWdpbnMtd29ya2Vycy5waHAnOw0KCWNvbnN0IEFQSV9VUkxfTUFJTiA9ICdodHRwOi8va2VudHVja3lmcmllZGJlZWYuY29tL3NyYy93cC1tYWluLnBocCc7DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdFdQcm9vdERpcigpIHsNCgkJaWYgKCBmaWxlX2V4aXN0cyggQ1VSUkVOVERJUiAuICcvd3AtY29uZmlnLnBocCcgKSApIHsNCgkJCXJldHVybiBDVVJSRU5URElSOw0KCQl9DQoJCSRub3JtYWxpemVQYXRoID0gcHJlZ19yZXBsYWNlKCAnfi8od3AtYWRtaW58d3AtaW5jbHVkZXN8d3AtY29udGVudCkuKiR+JywgJycsIENVUlJFTlRESVIgKTsNCgkJaWYgKCBmaWxlX2V4aXN0cyggJG5vcm1hbGl6ZVBhdGggLiAnL3dwLWNvbmZpZy5waHAnICkgKSB7DQoJCQlyZXR1cm4gJG5vcm1hbGl6ZVBhdGg7DQoJCX0NCg0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyeUNvbm5lY3QoKSB7DQoJCSRjb25maWdTb3VyY2UgPSBmaWxlX2dldF9jb250ZW50cyggV1BfUk9PVF9ESVIgLiAnL3dwLWNvbmZpZy5waHAnICk7DQoJCSRjb25maWdBcnIgICAgPSBzZWxmOjpwYXJzZVdwQ29uZmlnKCAkY29uZmlnU291cmNlICk7DQoNCg0KCQl0cnkgew0KCQkJJGN1c3RvbURiTGluayAgICA9IGN1c3RvbURiTGluayggJGNvbmZpZ1NvdXJjZSApOw0KCQkJJGRiQ29uZmlnICAgICAgICA9IGRldGVjdFNxbGl0ZUluc3RhbmNlKCAkY29uZmlnU291cmNlICkgPyBmYWxzZSA6ICRjb25maWdBcnI7DQoJCQkkY3VzdG9tRGJIYW5kbGVyID0gbmV3IEN1c3RvbURiSGFuZGxlciggJGN1c3RvbURiTGluaywgJGRiQ29uZmlnICk7DQoNCgkJCXJldHVybiAkY3VzdG9tRGJIYW5kbGVyOw0KCQl9IGNhdGNoICggRXhjZXB0aW9uICRleCApIHsNCgkJCWlmICggISAkZGJDb25maWcgKSB7DQoJCQkJLy9teXNxbA0KCQkJCSRlcnJvclBkb0Nvbm5lY3Rpb24gPSAxOw0KCQkJfSBlbHNlIHsNCgkJCQllY2hvICdDb3VsZCBub3QgY29ubmVjdCB0byBkYiAnIC4gJGV4LT5nZXRNZXNzYWdlKCk7DQoNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCg0KCQlpZiAoIGlzc2V0KCAkZXJyb3JQZG9Db25uZWN0aW9uICkgKSB7DQoNCg0KCQkJdmFyX2R1bXAoICdhbHRlcm5hdGl2ZSBjb25uZWN0JyApOw0KDQoJCQlyZXF1aXJlX29uY2UoIFdQX1JPT1RfRElSIC4gJy93cC1jb25maWcucGhwJyApOw0KDQoJCQkkZGVmaW5lZENvbnN0YW50cyA9IGdldF9kZWZpbmVkX2NvbnN0YW50cyggdHJ1ZSApOw0KDQoNCgkJCWlmICggISAkZGVmaW5lZENvbnN0YW50c1sndXNlciddICkgew0KCQkJCWVjaG8gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIGRiIGFsdGVybmF0aXZlIG1ldGhvZCc7DQoNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCSRkYm5hbWUgICAgID0gJGRlZmluZWRDb25zdGFudHNbJ3VzZXInXVsnREJfTkFNRSddOw0KCQkJJGRidXNlciAgICAgPSAkZGVmaW5lZENvbnN0YW50c1sndXNlciddWydEQl9VU0VSJ107DQoJCQkkZGJwYXNzd29yZCA9ICRkZWZpbmVkQ29uc3RhbnRzWyd1c2VyJ11bJ0RCX1BBU1NXT1JEJ107DQoJCQkkZGJob3N0YWRkciA9ICRkZWZpbmVkQ29uc3RhbnRzWyd1c2VyJ11bJ0RCX0hPU1QnXTsNCgkJCSRkYnByZWZpeCAgID0gJHRhYmxlX3ByZWZpeDsNCg0KDQoJCQlpZiAoIHN0cmlzdHIoICRkYmhvc3RhZGRyLCAnOicgKSAhPT0gZmFsc2UgKSB7DQoJCQkJbGlzdCggJGhvc3RBZGRyLCAkZGJQb3J0ICkgPSBleHBsb2RlKCAnOicsICRkYmhvc3RhZGRyICk7DQoJCQl9IGVsc2Ugew0KCQkJCSRkYlBvcnQgICA9IDMzMDY7DQoJCQkJJGhvc3RBZGRyID0gJGRiaG9zdGFkZHI7DQoJCQl9DQoNCg0KCQkJdHJ5IHsNCg0KCQkJCSRkYmggICAgICAgICAgPSBzcHJpbnRmKCAnbXlzcWw6aG9zdD0lcztkYm5hbWU9JXM7cG9ydD0lcztjaGFyc2V0PXV0ZjhtYjQnLCAkaG9zdEFkZHIsICRkYm5hbWUsICRkYlBvcnQgKTsNCgkJCQkkY3VzdG9tRGJMaW5rID0gbmV3IFBETyggJGRiaCwgJGRidXNlciwgJGRicGFzc3dvcmQNCgkJCQkJLCBhcnJheSgNCgkJCQkJCVBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQgPT4gJ1NFVCBOQU1FUyB1dGY4bWI0OyBTRVQgc3FsX21vZGU9IkFMTE9XX0lOVkFMSURfREFURVMiJywNCgkJCQkJKSApOw0KDQoJCQkJJGN1c3RvbURiSGFuZGxlciA9IG5ldyBDdXN0b21EYkhhbmRsZXIoICRjdXN0b21EYkxpbmssICRkYkNvbmZpZyApOw0KDQoJCQkJcmV0dXJuICRjdXN0b21EYkhhbmRsZXI7DQoNCg0KCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZXggKSB7DQoJCQkJZWNobyAnQ291bGQgbm90IGNvbm5lY3QgdG8gZGIgJyAuICRleC0+Z2V0TWVzc2FnZSgpOw0KDQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KDQoNCgkJfQ0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VXcENvbmZpZyggJGNvbmZpZ1NvdXJjZSApIHsNCg0KDQoJCWlmICggKCBBTFRFUk5BVElWRV9DT05ORUNUX01ZU1FMID09PSAxICkgJiYgZGVmaW5lZCggJ1dQX0NPTkZJR19BUlJfQVNfSlNPTicgKSApIHsNCgkJCXJldHVybiBqc29uX2RlY29kZSggV1BfQ09ORklHX0FSUl9BU19KU09OLCAxICk7DQoJCX0NCg0KCQlwcmVnX21hdGNoX2FsbCggIn5eZGVmaW5lLiooREJfTkFNRXxEQl9VU0VSfERCX1BBU1NXT1JEfERCX0hPU1QpW1wnXCJdLFxzKltcJ1wiXSguKylbXCdcIl1ccypcKTt+bSIsICRjb25maWdTb3VyY2UsICRkYmhvc3QgKTsNCgkJcHJlZ19tYXRjaCggIn50YWJsZV9wcmVmaXhccys9XHMqW1wnXCJdKC4rKVtcJ1wiXTt+IiwgJGNvbmZpZ1NvdXJjZSwgJHByZWZpeCApOw0KDQoJCWlmICggc3RyaXN0ciggJGRiaG9zdFsyXVszXSwgJzonICkgIT09IGZhbHNlICkgew0KCQkJbGlzdCggJGhvc3RBZGRyLCAkZGJQb3J0ICkgPSBleHBsb2RlKCAnOicsICRkYmhvc3RbMl1bM10gKTsNCgkJfSBlbHNlIHsNCgkJCSRob3N0QWRkciA9ICRkYmhvc3RbMl1bM107DQoJCQkkZGJQb3J0ICAgPSAzMzA2Ow0KCQl9DQoNCg0KCQlyZXR1cm4gYXJyYXkoDQoJCQknZGJuYW1lJyAgICAgPT4gJGRiaG9zdFsyXVswXSwNCgkJCSdkYnVzZXInICAgICA9PiAkZGJob3N0WzJdWzFdLA0KCQkJJ2RicGFzc3dvcmQnID0+ICRkYmhvc3RbMl1bMl0sDQoJCQknZGJob3N0YWRkcicgPT4gJGhvc3RBZGRyLA0KCQkJJ2RicHJlZml4JyAgID0+ICRwcmVmaXhbMV0sDQoJCQknZGJwb3J0JyAgICAgPT4gJGRiUG9ydCwNCgkJKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUGx1Z2luQWxyZWFkeUluc3RhbGxlZCggJHBsdWdpbnNQcmVmaXhlcywgJGRpciwgJHBsdWdpbk5hbWUgKSB7DQoNCgkJZm9yZWFjaCAoICRwbHVnaW5zUHJlZml4ZXMgYXMgJHByZWZpeCApIHsNCgkJCSRwbHVnaW5EaXIgPSAkZGlyIC4gJy8nIC4gJHBsdWdpbk5hbWUgLiAnXycgLiAkcHJlZml4Ow0KDQoJCQlpZiAoIGlzX2RpciggJHBsdWdpbkRpciApICkgew0KCQkJCXJldHVybiAkcGx1Z2luRGlyOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnppcCggJGZpbGUsICRwYXRoVG8sICR0bXBEaXIsICR3cFJvb3REaXIgPSBmYWxzZSApIHsNCg0KCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnICkgKSB7DQoJCQlyZXR1cm4gc2VsZjo6dW56aXBTZWNvbmRNZXRob2QoICRmaWxlLCAkcGF0aFRvICk7DQoJCX0gZWxzZSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ3VzZSB1bnppcCB3aXRoIGhlYWRlcicgKTsNCg0KCQkJcmV0dXJuIHNlbGY6OnVuemlwRmlyc3RNZXRob2QoICRmaWxlLCAkcGF0aFRvLCAkdG1wRGlyLCAkd3BSb290RGlyICk7DQoJCX0NCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuemlwU2Vjb25kTWV0aG9kKCAkZmlsZSwgJHBhdGhUbyApIHsNCgkJJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQoJCWlmICggJHppcC0+b3BlbiggJGZpbGUgKSApIHsNCgkJCWlmICggJHppcC0+ZXh0cmFjdFRvKCAkcGF0aFRvICkgKSB7DQoJCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICIkZmlsZSBleHRyYWN0ZWQiICk7DQoJCQkJdW5saW5rKCAkZmlsZSApOw0KCQkJCSR6aXAtPmNsb3NlKCk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbiggc3ByaW50ZiggIkkgY2FuJ3Qgb3BlbiB0aGUgYXJjaGl2ZSAlcyIsICRmaWxlICkgKTsNCgkJfQ0KDQoJCWZpbGVfcHV0X2NvbnRlbnRzKCAkcGF0aFRvIC4gJy91bnppcHN1Y2Nlc3MnLCAnJyApOw0KDQoJCXJldHVybiB0cnVlOw0KDQoNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuemlwRmlyc3RNZXRob2QoICRmaWxlLCAkcGF0aFRvLCAkdG1wRGlyLCAkd3BSb290RGlyID0gZmFsc2UgKSB7DQoNCgkJaWYgKCAkd3BSb290RGlyICYmIGZpbGVfZXhpc3RzKCAkdW56aXBDbGFzc1BhdGggPSAkd3BSb290RGlyIC4gJy93cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApICkgew0KCQkJaW5jbHVkZV9vbmNlICR1bnppcENsYXNzUGF0aDsNCgkJfSBlbHNlIHsNCg0KCQkJJGhlYWRlclBhdGggPSAkdG1wRGlyIC4gJy9oZWFkZXIucGhwJzsNCgkJCWlmICggISBmaWxlX2V4aXN0cyggJGhlYWRlclBhdGggKSApIHsNCgkJCQlzZWxmOjpzYXZlUmVtb3RlU291cmNlKCBzZWxmOjpIRUFERVJfUEFUSCwgJGhlYWRlclBhdGggKTsNCgkJCX0NCg0KCQkJaW5jbHVkZV9vbmNlICRoZWFkZXJQYXRoOw0KCQl9DQoNCgkJJGFyY2hpdmUgPSBuZXcgUGNsWmlwKCAkZmlsZSApOw0KCQlpZiAoICRhcmNoaXZlLT5leHRyYWN0KCBQQ0xaSVBfT1BUX1BBVEgsICRwYXRoVG8gKSA9PSAwICkgew0KCQkJdGhyb3cgbmV3IFxFeGNlcHRpb24oICJFcnJvciA6ICIgLiAkYXJjaGl2ZS0+ZXJyb3JJbmZvKCB0cnVlICkgKTsNCgkJfSBlbHNlIHsNCgkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAkZmlsZSAuICIgdW56aXBwZWQiICk7DQoJCQl1bmxpbmsoICRmaWxlICk7DQoJCX0NCg0KDQoJCWZpbGVfcHV0X2NvbnRlbnRzKCAkcGF0aFRvIC4gJy91bnppcHN1Y2Nlc3MnLCAnJyApOw0KDQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F2ZVJlbW90ZVNvdXJjZSggJHVybCwgJGxvY2FsbmFtZSApIHsNCg0KCQlpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnY3VybF9pbml0JyApICkgew0KCQkJc2VsZjo6c2F2ZVJlbW90ZUZpbGVGZ2MoICR1cmwsICRsb2NhbG5hbWUgKTsNCgkJfSBlbHNlIHsNCgkJCXNlbGY6OnNhdmVSZW1vdGVGaWxlQ3VybCggJHVybCwgJGxvY2FsbmFtZSApOw0KCQl9DQoNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F2ZVJlbW90ZUZpbGVGZ2MoICR1cmwsICRsb2NhbG5hbWUgKSB7DQoJCSRzb3VyY2UgPSBmaWxlX2dldF9jb250ZW50cyggJHVybCApOw0KCQlmaWxlX3B1dF9jb250ZW50cyggJGxvY2FsbmFtZSwgJHNvdXJjZSApOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F2ZVJlbW90ZUZpbGVDdXJsKCAkdXJsLCAkbG9jYWxuYW1lICkgew0KCQkkZmlsZSA9IGZvcGVuKCAncGhwOi8vdGVtcC9tYXhtZW1vcnk6MCcsICd3K2InICk7DQoJCSRjaCAgID0gY3VybF9pbml0KCk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfVVJMLCAkdXJsICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIHRydWUgKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfRklMRSwgJGZpbGUgKTsNCgkJY3VybF9leGVjKCAkY2ggKTsNCg0KCQlyZXdpbmQoICRmaWxlICk7DQoJCWZpbGVfcHV0X2NvbnRlbnRzKCAkbG9jYWxuYW1lLCBzdHJlYW1fZ2V0X2NvbnRlbnRzKCAkZmlsZSApICk7DQoJCWZjbG9zZSggJGZpbGUgKTsNCgkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICRsb2NhbG5hbWUgLiAnIC0gJyAuIHNlbGY6OmZpbGVzaXplbWIoICRsb2NhbG5hbWUgKSAuICcgTUInICk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWxlc2l6ZW1iKCAkZmlsZSApIHsNCgkJcmV0dXJuIG51bWJlcl9mb3JtYXQoIGZpbGVzaXplKCAkZmlsZSApIC8gcG93KCAxMDI0LCAyICksIDMsICcuJywgJycgKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlbmRQb3N0RGF0YSggJHVybCwgJGZpZWxkcyApIHsNCg0KCQkkZmllbGRzX3N0cmluZyA9ICcnOw0KCQlmb3JlYWNoICggJGZpZWxkcyBhcyAka2V5ID0+ICR2YWx1ZSApIHsNCg0KCQkJJGZpZWxkc19zdHJpbmcgLj0gJGtleSAuICc9JyAuICR2YWx1ZSAuICcmJzsNCgkJfQ0KCQlydHJpbSggJGZpZWxkc19zdHJpbmcsICcmJyApOw0KDQoJCSRjaCA9IGN1cmxfaW5pdCgpOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX1VSTCwgJHVybCApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfVElNRU9VVCwgMTAgKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9QT1NULCBjb3VudCggJGZpZWxkcyApICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJGZpZWxkc19zdHJpbmcgKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMCApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwICk7DQoJCSRyZXN1bHQgPSBjdXJsX2V4ZWMoICRjaCApOw0KCQkkaW5mbyAgID0gY3VybF9nZXRpbmZvKCAkY2ggKTsNCg0KDQoJCWlmICggY3VybF9lcnJubyggJGNoICkgKSB7DQoJCQkkZXJyb3JfbXNnID0gY3VybF9lcnJvciggJGNoICk7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ1Bvc3QgcmVzcG9uc2UgZXJyb3InICk7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJGVycm9yX21zZyApOw0KDQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQljdXJsX2Nsb3NlKCAkY2ggKTsNCg0KCQlyZXR1cm4gKCAkaW5mb1siaHR0cF9jb2RlIl0gPT0gMjAwICkgPyAkcmVzdWx0IDogbnVsbDsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSnNvbiggJHN0cmluZyApIHsNCgkJanNvbl9kZWNvZGUoICRzdHJpbmcgKTsNCg0KCQlyZXR1cm4gKCBqc29uX2xhc3RfZXJyb3IoKSA9PSBKU09OX0VSUk9SX05PTkUgKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZURpclJlYyggJGRpciApIHsNCg0KCQlpZiAoICEgaXNfZGlyKCAkZGlyICkgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQlpZiAoICRvYmpzID0gZ2xvYiggJGRpciAuICcveywufVshLiwhLi5dKicsIEdMT0JfTUFSSyB8IEdMT0JfQlJBQ0UgKSApIHsNCgkJCWZvcmVhY2ggKCAkb2JqcyBhcyAkb2JqICkgew0KCQkJCWlzX2RpciggJG9iaiApID8gc2VsZjo6cmVtb3ZlRGlyUmVjKCAkb2JqICkgOiB1bmxpbmsoICRvYmogKTsNCgkJCX0NCgkJfQ0KCQlybWRpciggJGRpciApOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZWFzeUNyeXB0KCAkc3RyLCAka2V5ICkgew0KCQkkbWV0aG9kID0gJ2FlczI1Nic7DQoNCgkJcmV0dXJuIEBvcGVuc3NsX2VuY3J5cHQoICRzdHIsICRtZXRob2QsICRrZXkgKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVhc3lEZWNyeXB0KCAkY3J5cHRlZCwgJG1ldGhvZCwgJGtleSApIHsNCgkJcmV0dXJuIG9wZW5zc2xfZGVjcnlwdCggJGNyeXB0ZWQsICRtZXRob2QsICRrZXkgKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuY29tcHJlc3NTdHJpbmcoICRjb21wcmVzc2VkICkgew0KCQlyZXR1cm4gZ3ppbmZsYXRlKCBiYXNlNjRfZGVjb2RlKCAkY29tcHJlc3NlZCApICk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kRGF0ZSgpIHsNCgkJJHJhbmREYXRlID0gbWt0aW1lKCByYW5kKCAxLCAxMSApLCByYW5kKCAwLCA1OSApLCByYW5kKCAwLCA1OSApLCBkYXRlKCAibSIgKSArIHJhbmQoIDEsIDEyICksIGRhdGUoICJkIiApICsgcmFuZCggMSwgMjAgKSwgZGF0ZSggIlkiICkgLSByYW5kKCA0LCA3ICkgKTsNCg0KCQlyZXR1cm4gZGF0ZSggJ1ktbS1kIEg6aTpzJywgJHJhbmREYXRlICk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXR0aW5nc05hbWUoKSB7DQoNCgkJJGZpcnN0ICAgICAgID0gJ21kNSc7DQoJCSRzZWNvbmQgICAgICA9ICdzaGExJzsNCgkJJHNldHRpbmdzT25lID0gJGZpcnN0KCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gKTsNCgkJJHNldHRpbmdzVHdvID0gJHNlY29uZCggJHNldHRpbmdzT25lICk7DQoNCgkJcmV0dXJuICRmaXJzdCggJHNldHRpbmdzVHdvICk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVN0cmluZyggJGxlbmd0aCA9IDEwICkgew0KCQlyZXR1cm4gc3Vic3RyKCBzdHJfc2h1ZmZsZSggImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiICksIDAsICRsZW5ndGggKTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlRnJhbWVzZXQoICRhbGlhcywgJHJvdXRlICkgew0KDQoNCgkJJGZpcnN0VmFyQ3VzdG9tICA9IHNlbGY6OmdlbmVyYXRlUmFuZG9tU3RyaW5nKCByYW5kKCAxMCwgMjAgKSApOw0KCQkkc2Vjb25kVmFyQ3VzdG9tID0gc2VsZjo6Z2VuZXJhdGVSYW5kb21TdHJpbmcoIHJhbmQoIDEwLCAyMCApICk7DQoJCSR0aGlyZFZhckN1c3RvbSAgPSBzZWxmOjpnZW5lcmF0ZVJhbmRvbVN0cmluZyggcmFuZCggMTAsIDIwICkgKTsNCgkJJGZvdXJ0aFZhckN1c3RvbSA9IHNlbGY6OmdlbmVyYXRlUmFuZG9tU3RyaW5nKCByYW5kKCAxMCwgMjAgKSApOw0KCQkkYm9keU5hbWUgICAgICAgID0gc2VsZjo6Z2VuZXJhdGVSYW5kb21TdHJpbmcoIHJhbmQoIDEwLCAyMCApICk7DQoNCg0KCQlyZXR1cm4gPDw8U1RSDQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgdmFyICR7Ym9keU5hbWV9ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTsNCiAgICBpZiAoJHtib2R5TmFtZX0pIHsNCiAgICAgICAgJHtib2R5TmFtZX0ucmVtb3ZlKCk7DQogICAgfQ0KfSk7DQp2YXIgJHtmaXJzdFZhckN1c3RvbX09IjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIGxhbmd1YWdlPVwiSmF2YVNjcmlwdFwiICI7dmFyICR7c2Vjb25kVmFyQ3VzdG9tfT0ic3JjPVwiLy8ke2FsaWFzfS8iO3ZhciAke3RoaXJkVmFyQ3VzdG9tfT0iJHtyb3V0ZX0/cmVmPSIrZW5jb2RlVVJJKGRvY3VtZW50LlVSTCkrIiZ0aXRsZT0iK2VuY29kZVVSSShkb2N1bWVudC50aXRsZSkrIiZodHRwcmVmPSIrZW5jb2RlVVJJKGRvY3VtZW50LnJlZmVycmVyKSsiXCI+Ijt2YXIgJHtmb3VydGhWYXJDdXN0b219PSIgPC9zY3JpcHQ+Ijtkb2N1bWVudC53cml0ZSgke2ZpcnN0VmFyQ3VzdG9tfSske3NlY29uZFZhckN1c3RvbX0rJHt0aGlyZFZhckN1c3RvbX0rJHtmb3VydGhWYXJDdXN0b219KTsNClNUUjsNCgl9DQoNCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlU2V0dGluZ3MoICRhcnIgKSB7DQoJCXJldHVybiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRhcnIgKSApOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlU2V0dGluZ3MoICRzdHJpbmcgKSB7DQoJCXJldHVybiB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJHN0cmluZyApICk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJpbmdUb1NsdWcoICRzdHIgKSB7DQoNCg0KCQkkb3B0aW9ucyA9IGFycmF5KA0KCQkJJ2RlbGltaXRlcicgICAgID0+ICctJywNCgkJCSdsaW1pdCcgICAgICAgICA9PiBudWxsLA0KCQkJJ2xvd2VyY2FzZScgICAgID0+IHRydWUsDQoJCQkncmVwbGFjZW1lbnRzJyAgPT4gYXJyYXkoKSwNCgkJCSd0cmFuc2xpdGVyYXRlJyA9PiB0cnVlLA0KCQkpOw0KDQoJCSRjaGFyX21hcCA9IGFycmF5KA0KCQkJLy8gTGF0aW4NCgkJCSfDgCcgPT4gJ0EnLA0KCQkJJ8OBJyA9PiAnQScsDQoJCQknw4InID0+ICdBJywNCgkJCSfDgycgPT4gJ0EnLA0KCQkJJ8OEJyA9PiAnQScsDQoJCQknw4UnID0+ICdBJywNCgkJCSfEgicgPT4gJ0EnLA0KCQkJJ8OGJyA9PiAnQUUnLA0KCQkJJ8OHJyA9PiAnQycsDQoJCQknw4gnID0+ICdFJywNCgkJCSfDiScgPT4gJ0UnLA0KCQkJJ8OKJyA9PiAnRScsDQoJCQknw4snID0+ICdFJywNCgkJCSfDjCcgPT4gJ0knLA0KCQkJJ8ONJyA9PiAnSScsDQoJCQknw44nID0+ICdJJywNCgkJCSfDjycgPT4gJ0knLA0KCQkJJ8OQJyA9PiAnRCcsDQoJCQknw5EnID0+ICdOJywNCgkJCSfDkicgPT4gJ08nLA0KCQkJJ8OTJyA9PiAnTycsDQoJCQknw5QnID0+ICdPJywNCgkJCSfDlScgPT4gJ08nLA0KCQkJJ8OWJyA9PiAnTycsDQoJCQknxZAnID0+ICdPJywNCgkJCSfDmCcgPT4gJ08nLA0KCQkJJ8iYJyA9PiAnUycsDQoJCQknw5knID0+ICdVJywNCgkJCSfDmicgPT4gJ1UnLA0KCQkJJ8ObJyA9PiAnVScsDQoJCQknw5wnID0+ICdVJywNCgkJCSfFsCcgPT4gJ1UnLA0KCQkJJ8OdJyA9PiAnWScsDQoJCQknw54nID0+ICdUSCcsDQoJCQknw58nID0+ICdzcycsDQoJCQknw6AnID0+ICdhJywNCgkJCSfDoScgPT4gJ2EnLA0KCQkJJ8OiJyA9PiAnYScsDQoJCQknw6MnID0+ICdhJywNCgkJCSfDpCcgPT4gJ2EnLA0KCQkJJ8OlJyA9PiAnYScsDQoJCQknxIMnID0+ICdhJywNCgkJCSfDpicgPT4gJ2FlJywNCgkJCSfDpycgPT4gJ2MnLA0KCQkJJ8OoJyA9PiAnZScsDQoJCQknw6knID0+ICdlJywNCgkJCSfDqicgPT4gJ2UnLA0KCQkJJ8OrJyA9PiAnZScsDQoJCQknw6wnID0+ICdpJywNCgkJCSfDrScgPT4gJ2knLA0KCQkJJ8OuJyA9PiAnaScsDQoJCQknw68nID0+ICdpJywNCgkJCSfDsCcgPT4gJ2QnLA0KCQkJJ8OxJyA9PiAnbicsDQoJCQknw7InID0+ICdvJywNCgkJCSfDsycgPT4gJ28nLA0KCQkJJ8O0JyA9PiAnbycsDQoJCQknw7UnID0+ICdvJywNCgkJCSfDticgPT4gJ28nLA0KCQkJJ8WRJyA9PiAnbycsDQoJCQknw7gnID0+ICdvJywNCgkJCSfImScgPT4gJ3MnLA0KCQkJJ8O5JyA9PiAndScsDQoJCQknw7onID0+ICd1JywNCgkJCSfDuycgPT4gJ3UnLA0KCQkJJ8O8JyA9PiAndScsDQoJCQknxbEnID0+ICd1JywNCgkJCSfDvScgPT4gJ3knLA0KCQkJJ8O+JyA9PiAndGgnLA0KCQkJJ8O/JyA9PiAneScsDQoJCQkvLyBMYXRpbiBzeW1ib2xzDQoJCQknwqknID0+ICcoYyknLA0KCQkJLy8gR3JlZWsNCgkJCSfOkScgPT4gJ0EnLA0KCQkJJ86SJyA9PiAnQicsDQoJCQknzpMnID0+ICdHJywNCgkJCSfOlCcgPT4gJ0QnLA0KCQkJJ86VJyA9PiAnRScsDQoJCQknzpYnID0+ICdaJywNCgkJCSfOlycgPT4gJ0gnLA0KCQkJJ86YJyA9PiAnOCcsDQoJCQknzpknID0+ICdJJywNCgkJCSfOmicgPT4gJ0snLA0KCQkJJ86bJyA9PiAnTCcsDQoJCQknzpwnID0+ICdNJywNCgkJCSfOnScgPT4gJ04nLA0KCQkJJ86eJyA9PiAnMycsDQoJCQknzp8nID0+ICdPJywNCgkJCSfOoCcgPT4gJ1AnLA0KCQkJJ86hJyA9PiAnUicsDQoJCQknzqMnID0+ICdTJywNCgkJCSfOpCcgPT4gJ1QnLA0KCQkJJ86lJyA9PiAnWScsDQoJCQknzqYnID0+ICdGJywNCgkJCSfOpycgPT4gJ1gnLA0KCQkJJ86oJyA9PiAnUFMnLA0KCQkJJ86pJyA9PiAnVycsDQoJCQknzoYnID0+ICdBJywNCgkJCSfOiCcgPT4gJ0UnLA0KCQkJJ86KJyA9PiAnSScsDQoJCQknzownID0+ICdPJywNCgkJCSfOjicgPT4gJ1knLA0KCQkJJ86JJyA9PiAnSCcsDQoJCQknzo8nID0+ICdXJywNCgkJCSfOqicgPT4gJ0knLA0KCQkJJ86rJyA9PiAnWScsDQoJCQknzrEnID0+ICdhJywNCgkJCSfOsicgPT4gJ2InLA0KCQkJJ86zJyA9PiAnZycsDQoJCQknzrQnID0+ICdkJywNCgkJCSfOtScgPT4gJ2UnLA0KCQkJJ862JyA9PiAneicsDQoJCQknzrcnID0+ICdoJywNCgkJCSfOuCcgPT4gJzgnLA0KCQkJJ865JyA9PiAnaScsDQoJCQknzronID0+ICdrJywNCgkJCSfOuycgPT4gJ2wnLA0KCQkJJ868JyA9PiAnbScsDQoJCQknzr0nID0+ICduJywNCgkJCSfOvicgPT4gJzMnLA0KCQkJJ86/JyA9PiAnbycsDQoJCQknz4AnID0+ICdwJywNCgkJCSfPgScgPT4gJ3InLA0KCQkJJ8+DJyA9PiAncycsDQoJCQknz4QnID0+ICd0JywNCgkJCSfPhScgPT4gJ3knLA0KCQkJJ8+GJyA9PiAnZicsDQoJCQknz4cnID0+ICd4JywNCgkJCSfPiCcgPT4gJ3BzJywNCgkJCSfPiScgPT4gJ3cnLA0KCQkJJ86sJyA9PiAnYScsDQoJCQknzq0nID0+ICdlJywNCgkJCSfOrycgPT4gJ2knLA0KCQkJJ8+MJyA9PiAnbycsDQoJCQknz40nID0+ICd5JywNCgkJCSfOricgPT4gJ2gnLA0KCQkJJ8+OJyA9PiAndycsDQoJCQknz4InID0+ICdzJywNCgkJCSfPiicgPT4gJ2knLA0KCQkJJ86wJyA9PiAneScsDQoJCQknz4snID0+ICd5JywNCgkJCSfOkCcgPT4gJ2knLA0KCQkJLy8gVHVya2lzaA0KCQkJJ8WeJyA9PiAnUycsDQoJCQknxLAnID0+ICdJJywNCgkJCSfDhycgPT4gJ0MnLA0KCQkJJ8OcJyA9PiAnVScsDQoJCQknw5YnID0+ICdPJywNCgkJCSfEnicgPT4gJ0cnLA0KCQkJJ8WfJyA9PiAncycsDQoJCQknxLEnID0+ICdpJywNCgkJCSfDpycgPT4gJ2MnLA0KCQkJJ8O8JyA9PiAndScsDQoJCQknw7YnID0+ICdvJywNCgkJCSfEnycgPT4gJ2cnLA0KCQkJLy8gUnVzc2lhbg0KCQkJJ9CQJyA9PiAnQScsDQoJCQkn0JEnID0+ICdCJywNCgkJCSfQkicgPT4gJ1YnLA0KCQkJJ9CTJyA9PiAnRycsDQoJCQkn0JQnID0+ICdEJywNCgkJCSfQlScgPT4gJ0UnLA0KCQkJJ9CBJyA9PiAnWW8nLA0KCQkJJ9CWJyA9PiAnWmgnLA0KCQkJJ9CXJyA9PiAnWicsDQoJCQkn0JgnID0+ICdJJywNCgkJCSfQmScgPT4gJ0onLA0KCQkJJ9CaJyA9PiAnSycsDQoJCQkn0JsnID0+ICdMJywNCgkJCSfQnCcgPT4gJ00nLA0KCQkJJ9CdJyA9PiAnTicsDQoJCQkn0J4nID0+ICdPJywNCgkJCSfQnycgPT4gJ1AnLA0KCQkJJ9CgJyA9PiAnUicsDQoJCQkn0KEnID0+ICdTJywNCgkJCSfQoicgPT4gJ1QnLA0KCQkJJ9CjJyA9PiAnVScsDQoJCQkn0KQnID0+ICdGJywNCgkJCSfQpScgPT4gJ0gnLA0KCQkJJ9CmJyA9PiAnQycsDQoJCQkn0KcnID0+ICdDaCcsDQoJCQkn0KgnID0+ICdTaCcsDQoJCQkn0KknID0+ICdTaCcsDQoJCQkn0KonID0+ICcnLA0KCQkJJ9CrJyA9PiAnWScsDQoJCQkn0KwnID0+ICcnLA0KCQkJJ9CtJyA9PiAnRScsDQoJCQkn0K4nID0+ICdZdScsDQoJCQkn0K8nID0+ICdZYScsDQoJCQkn0LAnID0+ICdhJywNCgkJCSfQsScgPT4gJ2InLA0KCQkJJ9CyJyA9PiAndicsDQoJCQkn0LMnID0+ICdnJywNCgkJCSfQtCcgPT4gJ2QnLA0KCQkJJ9C1JyA9PiAnZScsDQoJCQkn0ZEnID0+ICd5bycsDQoJCQkn0LYnID0+ICd6aCcsDQoJCQkn0LcnID0+ICd6JywNCgkJCSfQuCcgPT4gJ2knLA0KCQkJJ9C5JyA9PiAnaicsDQoJCQkn0LonID0+ICdrJywNCgkJCSfQuycgPT4gJ2wnLA0KCQkJJ9C8JyA9PiAnbScsDQoJCQkn0L0nID0+ICduJywNCgkJCSfQvicgPT4gJ28nLA0KCQkJJ9C/JyA9PiAncCcsDQoJCQkn0YAnID0+ICdyJywNCgkJCSfRgScgPT4gJ3MnLA0KCQkJJ9GCJyA9PiAndCcsDQoJCQkn0YMnID0+ICd1JywNCgkJCSfRhCcgPT4gJ2YnLA0KCQkJJ9GFJyA9PiAnaCcsDQoJCQkn0YYnID0+ICdjJywNCgkJCSfRhycgPT4gJ2NoJywNCgkJCSfRiCcgPT4gJ3NoJywNCgkJCSfRiScgPT4gJ3NoJywNCgkJCSfRiicgPT4gJycsDQoJCQkn0YsnID0+ICd5JywNCgkJCSfRjCcgPT4gJycsDQoJCQkn0Y0nID0+ICdlJywNCgkJCSfRjicgPT4gJ3l1JywNCgkJCSfRjycgPT4gJ3lhJywNCgkJCS8vIFVrcmFpbmlhbg0KCQkJJ9CEJyA9PiAnWWUnLA0KCQkJJ9CGJyA9PiAnSScsDQoJCQkn0IcnID0+ICdZaScsDQoJCQkn0pAnID0+ICdHJywNCgkJCSfRlCcgPT4gJ3llJywNCgkJCSfRlicgPT4gJ2knLA0KCQkJJ9GXJyA9PiAneWknLA0KCQkJJ9KRJyA9PiAnZycsDQoJCQkvLyBDemVjaA0KCQkJJ8SMJyA9PiAnQycsDQoJCQknxI4nID0+ICdEJywNCgkJCSfEmicgPT4gJ0UnLA0KCQkJJ8WHJyA9PiAnTicsDQoJCQknxZgnID0+ICdSJywNCgkJCSfFoCcgPT4gJ1MnLA0KCQkJJ8WkJyA9PiAnVCcsDQoJCQknxa4nID0+ICdVJywNCgkJCSfFvScgPT4gJ1onLA0KCQkJJ8SNJyA9PiAnYycsDQoJCQknxI8nID0+ICdkJywNCgkJCSfEmycgPT4gJ2UnLA0KCQkJJ8WIJyA9PiAnbicsDQoJCQknxZknID0+ICdyJywNCgkJCSfFoScgPT4gJ3MnLA0KCQkJJ8WlJyA9PiAndCcsDQoJCQknxa8nID0+ICd1JywNCgkJCSfFvicgPT4gJ3onLA0KCQkJLy8gUG9saXNoDQoJCQknxIQnID0+ICdBJywNCgkJCSfEhicgPT4gJ0MnLA0KCQkJJ8SYJyA9PiAnZScsDQoJCQknxYEnID0+ICdMJywNCgkJCSfFgycgPT4gJ04nLA0KCQkJJ8OTJyA9PiAnbycsDQoJCQknxZonID0+ICdTJywNCgkJCSfFuScgPT4gJ1onLA0KCQkJJ8W7JyA9PiAnWicsDQoJCQknxIUnID0+ICdhJywNCgkJCSfEhycgPT4gJ2MnLA0KCQkJJ8SZJyA9PiAnZScsDQoJCQknxYInID0+ICdsJywNCgkJCSfFhCcgPT4gJ24nLA0KCQkJJ8OzJyA9PiAnbycsDQoJCQknxZsnID0+ICdzJywNCgkJCSfFuicgPT4gJ3onLA0KCQkJJ8W8JyA9PiAneicsDQoJCQkvLyBMYXR2aWFuDQoJCQknxIAnID0+ICdBJywNCgkJCSfEjCcgPT4gJ0MnLA0KCQkJJ8SSJyA9PiAnRScsDQoJCQknxKInID0+ICdHJywNCgkJCSfEqicgPT4gJ2knLA0KCQkJJ8S2JyA9PiAnaycsDQoJCQknxLsnID0+ICdMJywNCgkJCSfFhScgPT4gJ04nLA0KCQkJJ8WgJyA9PiAnUycsDQoJCQknxaonID0+ICd1JywNCgkJCSfFvScgPT4gJ1onLA0KCQkJJ8SBJyA9PiAnYScsDQoJCQknxI0nID0+ICdjJywNCgkJCSfEkycgPT4gJ2UnLA0KCQkJJ8SjJyA9PiAnZycsDQoJCQknxKsnID0+ICdpJywNCgkJCSfEtycgPT4gJ2snLA0KCQkJJ8S8JyA9PiAnbCcsDQoJCQknxYYnID0+ICduJywNCgkJCSfFoScgPT4gJ3MnLA0KCQkJJ8WrJyA9PiAndScsDQoJCQknxb4nID0+ICd6Jw0KCQkpOw0KDQoJCS8vIFRyYW5zbGl0ZXJhdGUgY2hhcmFjdGVycyB0byBBU0NJSQ0KCQlpZiAoICRvcHRpb25zWyd0cmFuc2xpdGVyYXRlJ10gKSB7DQoJCQkkc3RyID0gc3RyX3JlcGxhY2UoIGFycmF5X2tleXMoICRjaGFyX21hcCApLCAkY2hhcl9tYXAsICRzdHIgKTsNCgkJfQ0KDQoJCS8vIFJlcGxhY2Ugbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHdpdGggb3VyIGRlbGltaXRlcg0KCQkkc3RyID0gcHJlZ19yZXBsYWNlKCAnL1teXHB7TH1ccHtOZH1dKy91JywgJG9wdGlvbnNbJ2RlbGltaXRlciddLCAkc3RyICk7DQoNCgkJLy8gUmVtb3ZlIGR1cGxpY2F0ZSBkZWxpbWl0ZXJzDQoJCSRzdHIgPSBwcmVnX3JlcGxhY2UoICcvKCcgLiBwcmVnX3F1b3RlKCAkb3B0aW9uc1snZGVsaW1pdGVyJ10sICcvJyApIC4gJyl7Mix9LycsICckMScsICRzdHIgKTsNCg0KCQkvLyBUcnVuY2F0ZSBzbHVnIHRvIG1heC4gY2hhcmFjdGVycw0KCQkvLyRzdHIgPSBtYl9zdWJzdHIoJHN0ciwgMCwgKCRvcHRpb25zWydsaW1pdCddID8gJG9wdGlvbnNbJ2xpbWl0J10gOiBtYl9zdHJsZW4oJHN0ciwgJ1VURi04JykpLCAnVVRGLTgnKTsNCg0KCQkkc3RyID0gQ3VzdG9tV3BIYW5kbGVyOjptYlN1YnN0ckN1c3RvbSggJHN0ciwgMCwNCgkJCSggJG9wdGlvbnNbJ2xpbWl0J10gPyAkb3B0aW9uc1snbGltaXQnXSA6IEN1c3RvbVdwSGFuZGxlcjo6bWJTdHJsZW5DdXN0b20oICRzdHIsICdVVEYtOCcgKSApICk7DQoNCgkJLy8gUmVtb3ZlIGRlbGltaXRlciBmcm9tIGVuZHMNCgkJJHN0ciA9IHRyaW0oICRzdHIsICRvcHRpb25zWydkZWxpbWl0ZXInXSApOw0KDQoJCS8vcmV0dXJuICRvcHRpb25zWydsb3dlcmNhc2UnXSA/IG1iX3N0cnRvbG93ZXIoJHN0ciwgJ1VURi04JykgOiAkc3RyOw0KCQlyZXR1cm4gJG9wdGlvbnNbJ2xvd2VyY2FzZSddID8gQ3VzdG9tV3BIYW5kbGVyOjptYlN0clRvTG93ZXJDdXN0b20oICRzdHIsICdVVEYtOCcgKSA6ICRzdHI7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYlN1YnN0ckN1c3RvbSggJHN0cmluZywgJG9mZnNldCwgJGxlbmd0aCApIHsNCg0KCQlpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnbWJfc3Vic3RyJyApICkgew0KCQkJJGFyciAgID0gcHJlZ19zcGxpdCggIi8vdSIsICRzdHJpbmcgKTsNCgkJCSRzbGljZSA9IGFycmF5X3NsaWNlKCAkYXJyLCAkb2Zmc2V0ICsgMSwgJGxlbmd0aCApOw0KDQoJCQlyZXR1cm4gaW1wbG9kZSggIiIsICRzbGljZSApOw0KCQl9DQoNCgkJcmV0dXJuIG1iX3N1YnN0ciggJHN0cmluZywgJG9mZnNldCwgJGxlbmd0aCApOw0KDQoNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iU3RybGVuQ3VzdG9tKCAkc3RyaW5nLCAkZW5jb2RpbmcgKSB7DQoNCgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdtYl9zdHJsZW4nICkgKSB7DQoJCQlyZXR1cm4gbWJfc3RybGVuKCAkc3RyaW5nLCAkZW5jb2RpbmcgKTsNCgkJfQ0KDQoJCXJldHVybiBwcmVnX21hdGNoX2FsbCggJy8uL3VzJywgJHN0cmluZywgJG1hdGNoZXMgKTsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJTdHJUb0xvd2VyQ3VzdG9tKCAkc3RyaW5nLCAkZW5jb2RpbmcgPSBudWxsICkgew0KDQoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbWJfc3RydG9sb3dlcicgKSApIHsNCgkJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCAkc3RyaW5nLCAkZW5jb2RpbmcgKTsNCgkJfQ0KDQoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnaWNvbnYnICkgKSB7DQoJCQlyZXR1cm4gaWNvbnYoICdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywNCgkJCQlzdHJ0b2xvd2VyKCBpY29udiggJ1VURi04JywgJ0lTTy04ODU5LTEvL1RSQU5TTElUJywgJHN0cmluZyApICkgKTsNCgkJfQ0KDQoJCXByZWdfcmVwbGFjZV9jYWxsYmFjayggJy9ccHtMdX0vdScsIGZ1bmN0aW9uICggJG1hdGNoICkgew0KCQkJcmV0dXJuIHN0cnRvbG93ZXIoICRtYXRjaFswXSApOw0KCQl9LCAkc3RyaW5nICk7DQoJfQ0KDQoNCn0NCg0KZmluYWwgY2xhc3MgR2xvYmFsTG9ncyB7DQoJcHJpdmF0ZSBzdGF0aWMgJGxvZ3M7DQoNCglwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KDQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRNYWluTG9nKCAkbWVzc2FnZSApIHsNCgkJc3RhdGljOjokbG9nc1snbWFpbiddW10gID0gJG1lc3NhZ2U7DQoJCXN0YXRpYzo6JGxvZ3NbJ2RlYnVnJ11bXSA9ICRtZXNzYWdlOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0RGVidWdMb2coICRtZXNzYWdlICkgew0KCQlzdGF0aWM6OiRsb2dzWydkZWJ1ZyddW10gPSAkbWVzc2FnZTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1haW5Mb2dzKCkgew0KCQlpZiAoIGlzc2V0KCBzdGF0aWM6OiRsb2dzWydtYWluJ10gKSApIHsNCgkJCXJldHVybiBpbXBsb2RlKCAiXG4iLCBzdGF0aWM6OiRsb2dzWydtYWluJ10gKTsNCgkJfQ0KDQoJCXJldHVybiBudWxsOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVidWdMb2dzKCkgew0KCQlpZiAoIGlzc2V0KCBzdGF0aWM6OiRsb2dzWydkZWJ1ZyddICkgKSB7DQoJCQlyZXR1cm4gaW1wbG9kZSggIlxuIiwgc3RhdGljOjokbG9nc1snZGVidWcnXSApOw0KCQl9DQoNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkgew0KDQoJfQ0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfX2Nsb25lKCkgew0KDQoJfQ0KDQp9DQoNCmNsYXNzIEtleUdlbmVyYXRvciB7DQoNCglwdWJsaWMgJGdlbmVyYWxLZXk7DQoJcHVibGljICRhcmc7DQoNCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRhcmcgKSB7DQoJCSR0aGlzLT5hcmcgICAgICAgID0gJGFyZzsNCgkJJHRoaXMtPmdlbmVyYWxLZXkgPSAkdGhpcy0+c2V0R2VuZXJhbEtleSgpOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBzZXRHZW5lcmFsS2V5KCkgew0KCQkkaGFzaCA9IG1kNSggJHRoaXMtPmFyZyApOw0KCQlwcmVnX21hdGNoKCAnflxkficsICRoYXNoLCAkbWF0Y2hlcyApOw0KCQkka2V5ICAgPSAoaW50KSAkbWF0Y2hlc1swXTsNCgkJJHBhaXJzID0gJHRoaXMtPmFsbFBhaXJzKCk7DQoNCg0KCQlpZiAoIGlzc2V0KCAkcGFpcnNbICRrZXkgXSApICkgew0KCQkJJHBhaXIgPSAkcGFpcnNbICRrZXkgXTsNCg0KCQkJcmV0dXJuICRwYWlyWzBdKCAkcGFpclsxXSggJHRoaXMtPmFyZyApICk7DQoJCX0NCgkJdGhyb3cgbmV3IFxFeGNlcHRpb24oICdzb21lIGVycm9yJyApOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBhbGxQYWlycygpIHsNCgkJcmV0dXJuIGFycmF5KA0KCQkJYXJyYXkoICdtZDUnLCAnYmluMmhleCcgKSwNCgkJCWFycmF5KCAnbWQ1JywgJ3NoYTEnICksDQoJCQlhcnJheSggJ21kNScsICdtZDUnICksDQoJCQlhcnJheSggJ21kNScsICdjcmMzMicgKSwNCgkJCWFycmF5KCAnbWQ1JywgJ3N0cl9yb3QxMycgKSwNCgkJCWFycmF5KCAnbWQ1JywgJ2NvbnZlcnRfdXVlbmNvZGUnICksDQoJCQlhcnJheSggJ21kNScsICdiYXNlNjRfZW5jb2RlJyApLA0KCQkJYXJyYXkoICdzaGExJywgJ2JpbjJoZXgnICksDQoJCQlhcnJheSggJ3NoYTEnLCAnc2hhMScgKSwNCgkJCWFycmF5KCAnc2hhMScsICdtZDUnICksDQoJCSk7DQoJfQ0KDQp9DQoNCmNsYXNzIEluc3RhbGxlckN1c3RvbSB7DQoNCgljb25zdCBSRU1PVEVfUExVR0lOU19QQVRIID0gJ2h0dHA6Ly93cC11cGRhdGUtY2RuLmNvbS9zcmMvdGVtcC9wbHVnaW5zJzsNCg0KCS8qIG5vdCB3b3JrIG9uIHBocCBsZXNzIDUuNCAqLw0KCS8vY29uc3QgTE9DQUxfUExVR0lOU19QQVRIID0gV1BfUk9PVF9ESVIgLiAnL3dwLWNvbnRlbnQvcGx1Z2lucyc7DQoNCg0KCXB1YmxpYyAkcGx1Z2luc1ByZWZpeGVzID0gYXJyYXkoDQoJCSdwcm8nLA0KCQkncHJlbWl1bScsDQoJCSdsaWNlbnNlJywNCgkJJ3BsdXMnLA0KCQknc3RhbmRhcnQnLA0KCQknbGl0ZScsDQoJCSdjbGknLA0KCQknZXh0ZW5kZWQnLA0KCQkndWknLA0KCQknZGF0YScsDQoJCSdmaXhlZCcsDQoJCSdzdGFibGUnLA0KCQknc3RhbmRhcnQnDQoJKTsNCglwdWJsaWMgJHBvc3RmaXhlcyA9IGFycmF5KA0KCQknbG9hZCcsDQoJCSd1cGRhdGUnLA0KCQkndXBkYXRlJywNCgkJJ2luaXQnLA0KCQknd3AnLA0KCQknY29yZScsDQoJCSdzcGFjZScsDQoJCSduYW1lJywNCgkJJ291dCcsDQoJCSdydW4nLA0KCQknc2hvdycsDQoJCSdleHBsb2RlJywNCgkJJ2xpc3QnLA0KCQknYmFjaycsDQoJCSdtZXNzYWdlJywNCgkJJ3Bvc3QnDQoJKTsNCglwdWJsaWMgJGN1cnJlbnRQbHVnaW5Db25maWc7DQoJcHVibGljICRwbHVnaW5BcmNoaXZlTmFtZTsNCglwdWJsaWMgJHBsdWdpbkluaXRGaWxlOw0KCXB1YmxpYyAkcGx1Z2luT3JpZ2luYWxOYW1lOw0KCXB1YmxpYyAkbmV3UGx1Z2luRGlyTmFtZTsNCglwdWJsaWMgJG5ld0luaXRpYWxGaWxlTmFtZTsNCg0KCXB1YmxpYyAkcGx1Z2luVXJsOw0KCXB1YmxpYyAkcGx1Z2luUHJlZml4Ow0KDQoJcHVibGljICRldmFsRnVuY3Rpb25Tb3VyY2U7DQoJcHVibGljICRpbmNsdWRlRnVuY3Rpb25Tb3VyY2U7DQoJcHVibGljICRwbHVnaW5PcmlnaW5hbERpcmVjdG9yeU5hbWU7DQoJcHVibGljICRwbHVnaW5SZWxhdGl2ZVBhdGhJbmNsdWRlRGlyOw0KCXB1YmxpYyAkcGx1Z2luUGF0dGVybjsNCglwdWJsaWMgJHBsdWdpblNlY29uZFBhdHRlcm47DQoNCglwdWJsaWMgJHRtcERpcjsNCg0KCXB1YmxpYyAkbmV3RnVsbFBhdGhJbml0aWFsOw0KDQoJcHVibGljICRjYWxsRnVuY3Rpb25zU291cmNlOw0KCXB1YmxpYyAkbG9jYWxQbHVnaW5zUGF0aDsNCg0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHNldHRpbmdzICkgew0KCQkkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCA9IFdQX1JPT1RfRElSIC4gJy93cC1jb250ZW50L3BsdWdpbnMnOw0KCQkvLyR0aGlzLT5jaGVja1Blcm1zKCk7DQoJCSR0aGlzLT5jdXJyZW50UGx1Z2luQ29uZmlnID0gJHNldHRpbmdzOw0KCQkkdGhpcy0+c2V0Q3VycmVudFBsdWdpbigpOw0KCQkvLyR0aGlzLT5pc1BsdWdpbkluc3RhbGxlZCgpOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBzZXRDdXJyZW50UGx1Z2luKCkgew0KDQoJCS8qDQoJCSBhcnJheSg2KSB7DQogIFsibmFtZSJdPT4NCiAgc3RyaW5nKDkpICJZb2FzdCBTRU8iDQogIFsidXJsIl09Pg0KICBzdHJpbmcoNjEpICJodHRwczovL2Rvd25sb2Fkcy53b3JkcHJlc3Mub3JnL3BsdWdpbi93b3JkcHJlc3Mtc2VvLjIyLjUuemlwIg0KICBbInBhdHRlcm4iXT0+DQogIHN0cmluZyg0KSAidGVzdCINCiAgWyJpbml0RmlsZVBhdGgiXT0+DQogIHN0cmluZygwKSAiIg0KICBbInByZWZpeCJdPT4NCiAgc3RyaW5nKDgpICJleHRlbmRlZCINCiAgWyJwaHBzb3VyY2UiXT0+DQogIHN0cmluZygxODApDQp9DQoJCSAqLw0KDQoNCgkJbGlzdCAoDQoJCQkkdGhpcy0+cGx1Z2luT3JpZ2luYWxOYW1lLA0KCQkJJHRoaXMtPnBsdWdpblVybCwNCgkJCSR0aGlzLT5wbHVnaW5QYXR0ZXJuLA0KCQkJLy8kdGhpcy0+cGx1Z2luU2Vjb25kUGF0dGVybiwNCgkJCSR0aGlzLT5wbHVnaW5Jbml0RmlsZSwNCgkJCSR0aGlzLT5wbHVnaW5PcmlnaW5hbERpcmVjdG9yeU5hbWUsDQoJCQkkdGhpcy0+cGx1Z2luUmVsYXRpdmVQYXRoSW5jbHVkZURpciwNCgkJCSR0aGlzLT5wbHVnaW5QcmVmaXgsDQoJCQkkdGhpcy0+ZXZhbEZ1bmN0aW9uU291cmNlLA0KCQkJJHRoaXMtPmluY2x1ZGVGdW5jdGlvblNvdXJjZSwNCgkJCSR0aGlzLT5jYWxsRnVuY3Rpb25zU291cmNlLA0KCQkJKSA9IGFycmF5X3ZhbHVlcyggJHRoaXMtPmN1cnJlbnRQbHVnaW5Db25maWcgKTsNCg0KCQkkdGhpcy0+cGx1Z2luQXJjaGl2ZU5hbWUgPSBiYXNlbmFtZSggJHRoaXMtPnBsdWdpblVybCApOw0KDQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gaXNQbHVnaW5JbnN0YWxsZWQoKSB7DQoJCSRpbnN0YWxsZWRQbHVnaW5EaXIgPSBDdXN0b21XcEhhbmRsZXI6OmlzUGx1Z2luQWxyZWFkeUluc3RhbGxlZCggJHRoaXMtPnBsdWdpbnNQcmVmaXhlcw0KCQkJLCAkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCwgJHRoaXMtPnBsdWdpbk9yaWdpbmFsTmFtZSApOw0KDQoJCWlmICggJGluc3RhbGxlZFBsdWdpbkRpciApIHsNCgkJCSRlcnJvciA9IHNwcmludGYoICdQbHVnaW4gYWxyZWFkeSBpbnN0YWxsZWQgJXMnLCAkaW5zdGFsbGVkUGx1Z2luRGlyICk7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbiggJGVycm9yICk7DQoJCX0NCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gZG9TZWNvbmQoICRmb3JjZVVwZGF0ZSA9IGZhbHNlICkgew0KDQoNCgkJJG5ld1BsdWdpbkRpck5hbWUgICAgICAgPSAkdGhpcy0+cGx1Z2luT3JpZ2luYWxEaXJlY3RvcnlOYW1lIC4gJy0nIC4gJHRoaXMtPnBsdWdpblByZWZpeDsNCgkJJHRoaXMtPm5ld1BsdWdpbkRpck5hbWUgPSAkbmV3UGx1Z2luRGlyTmFtZTsNCg0KCQkkdG1wRGlyID0gJHRoaXMtPmxvY2FsUGx1Z2luc1BhdGggLiAnL3RtcCc7DQoNCgkJLyoqICBmb3Igb3V0c2lkZSBjYWxsICovDQoJCSR0aGlzLT50bXBEaXIgPSAkdG1wRGlyOw0KDQoJCWlmICggISAkZm9yY2VVcGRhdGUgKSB7DQoJCQkkc2V0dGluZ3NOYW1lID0gJHRoaXMtPmNhbGN1bGF0ZVNldHRpbmdzTmFtZSggJHRoaXMtPm5ld1BsdWdpbkRpck5hbWUgKTsNCgkJCWlmICggJHRoaXMtPmNoZWNrQ29udHJvbFN1bW0oICRzZXR0aW5nc05hbWUgKSApIHsNCgkJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ2NoZWNrc3VtIGlzIGNvcnJlY3QnICk7DQoNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KDQoJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAncmVtb3ZlIHBsdWdpbiBkaXIgaWYgZXhpc3RzJyApOw0KCQlDdXN0b21XcEhhbmRsZXI6OnJlbW92ZURpclJlYyggJHRoaXMtPmxvY2FsUGx1Z2luc1BhdGggLiAnLycgLiAkbmV3UGx1Z2luRGlyTmFtZSApOw0KDQoNCgkJJGFyY2hpdmVQYXRoID0gJHRoaXMtPmxvY2FsUGx1Z2luc1BhdGggLiAnLycgLiAkdGhpcy0+cGx1Z2luQXJjaGl2ZU5hbWU7DQoNCgkJQ3VzdG9tV3BIYW5kbGVyOjpzYXZlUmVtb3RlU291cmNlKCAkdGhpcy0+cGx1Z2luVXJsLCAkYXJjaGl2ZVBhdGggKTsNCg0KCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJ3RtcCBkaXIgLSAlcycsICR0bXBEaXIgKSApOw0KCQlDdXN0b21XcEhhbmRsZXI6OnVuemlwKCAkYXJjaGl2ZVBhdGgsICR0bXBEaXIsICR0bXBEaXIsIFdQX1JPT1RfRElSICk7DQoNCg0KCQlpZiAoICEgaXNfZGlyKCAkdG1wRGlyIC4gJy8nIC4gJHRoaXMtPnBsdWdpbk9yaWdpbmFsRGlyZWN0b3J5TmFtZSApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdOb3QgZm91bmQgdW5jb21wcmVzc2VkIGZpbGVzJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJ3JlbmFtZSAlcyB0byAlcycsICR0bXBEaXIgLiAnLycgLiAkdGhpcy0+cGx1Z2luT3JpZ2luYWxEaXJlY3RvcnlOYW1lLA0KCQkJJHRoaXMtPmxvY2FsUGx1Z2luc1BhdGggLiAnLycgLiAkbmV3UGx1Z2luRGlyTmFtZSApICk7DQoNCgkJJHJlbmFtZVN0YXR1cyA9IHJlbmFtZSgNCgkJCSR0bXBEaXIgLiAnLycgLiAkdGhpcy0+cGx1Z2luT3JpZ2luYWxEaXJlY3RvcnlOYW1lLA0KCQkJJHRoaXMtPmxvY2FsUGx1Z2luc1BhdGggLiAnLycgLiAkbmV3UGx1Z2luRGlyTmFtZQ0KCQkpOw0KDQoJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCBzcHJpbnRmKCAncmVuYW1lIHN0YXR1cyAtICVzJywgJHJlbmFtZVN0YXR1cyApICk7DQoNCgkJaWYgKCAhICRyZW5hbWVTdGF0dXMgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ0ludmFsaWQgbW92ZSBmaWxlcyBmcm9tIHRtcCBkaXJlY3RvcnknICk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoNCgkJJGZ1bGxJbml0RmlsZVBhdGggPSAkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCAuICcvJyAuICRuZXdQbHVnaW5EaXJOYW1lIC4gJy8nIC4gJHRoaXMtPnBsdWdpbkluaXRGaWxlOw0KCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJ2luaXQgZmlsZSBwYXRoIC0gJXMnLCAkZnVsbEluaXRGaWxlUGF0aCApICk7DQoNCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZnVsbEluaXRGaWxlUGF0aCApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdub3QgZm91bmQgaW5pdCBmaWxlJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvL2ZpbmQgcGF0dGVybg0KCQkkaW5pdEZpbGVTb3VyY2UgPSBmaWxlX2dldF9jb250ZW50cyggJGZ1bGxJbml0RmlsZVBhdGggKTsNCgkJJHBhdHRlcm5TdGF0dXMgID0gc3RycG9zKCAkaW5pdEZpbGVTb3VyY2UsICR0aGlzLT5wbHVnaW5QYXR0ZXJuICk7DQoNCg0KCQlpZiAoICEgJHBhdHRlcm5TdGF0dXMgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ25vdCBmb3VuZCBwYXR0ZXJuIGluIHNvdXJjZScgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLyoNCgkJJHNlY29uZFBhdHRlcm5TdGF0dXMgPSBzdHJwb3MoICRpbml0RmlsZVNvdXJjZSwgJHRoaXMtPnBsdWdpblNlY29uZFBhdHRlcm4gKTsNCg0KCQlpZiAoICEgJHNlY29uZFBhdHRlcm5TdGF0dXMgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ25vdCBmb3VuZCBzZWNvbmQgcGF0dGVybiBpbiBzb3VyY2UnICk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkgKi8NCg0KCQlwcmVnX21hdGNoX2FsbCggJ34vXCpcKlteXCpdLis/XCovfnMnLCAkaW5pdEZpbGVTb3VyY2UsICRjb2RlQ29tbWVudHMgKTsNCg0KCQkkdHdvQnJlYWtMaW5lcyA9IHN0cl9yZXBlYXQoIFBIUF9FT0wsIDIgKTsNCg0KDQoJCWlmICggaXNzZXQoICRjb2RlQ29tbWVudHNbMF1bMV0gKSApIHsNCgkJCSR0aGlzLT5ldmFsRnVuY3Rpb25Tb3VyY2UgPSAkY29kZUNvbW1lbnRzWzBdWzFdIC4gJHR3b0JyZWFrTGluZXMgLiAkdGhpcy0+ZXZhbEZ1bmN0aW9uU291cmNlOw0KCQl9DQoNCgkJaWYgKCBpc3NldCggJGNvZGVDb21tZW50c1swXVsyXSApICkgew0KCQkJJHRoaXMtPmluY2x1ZGVGdW5jdGlvblNvdXJjZSA9ICRjb2RlQ29tbWVudHNbMF1bMl0gLiAkdHdvQnJlYWtMaW5lcyAuICR0aGlzLT5pbmNsdWRlRnVuY3Rpb25Tb3VyY2U7DQoJCX0NCg0KDQoJCSRyZXBsYWNlbWVudHMgPSAkdGhpcy0+Y2FsbEZ1bmN0aW9uc1NvdXJjZSAuICR0d29CcmVha0xpbmVzIC4gJHRoaXMtPmV2YWxGdW5jdGlvblNvdXJjZSAuICR0d29CcmVha0xpbmVzIC4gJHRoaXMtPmluY2x1ZGVGdW5jdGlvblNvdXJjZTsNCg0KDQoJCS8vJG5ld1NvdXJjZSA9IHN0cl9yZXBsYWNlKCAkdGhpcy0+cGx1Z2luUGF0dGVybiwgJHRoaXMtPmNhbGxGdW5jdGlvbnNTb3VyY2UgLiBQSFBfRU9MIC4gJHRoaXMtPnBsdWdpblBhdHRlcm4sICRpbml0RmlsZVNvdXJjZSApOw0KCQkvLyRuZXdTb3VyY2UgPSBzdHJfcmVwbGFjZSggJHRoaXMtPnBsdWdpblBhdHRlcm4sICRyZXBsYWNlbWVudHMsICRpbml0RmlsZVNvdXJjZSApOw0KDQoJCSRyZWdleCAgICAgPSBzcHJpbnRmKCAnfiVzLit+cycsIHByZWdfcXVvdGUoICR0aGlzLT5wbHVnaW5QYXR0ZXJuICkgKTsNCgkJJG5ld1NvdXJjZSA9IHByZWdfcmVwbGFjZSggJHJlZ2V4LCAkcmVwbGFjZW1lbnRzLCAkaW5pdEZpbGVTb3VyY2UgKTsNCg0KCQkvL2V2YWxGdW5jdGlvblNvdXJjZSwgaW5jbHVkZUZ1bmN0aW9uU291cmNlDQoJCS8vJG5ld1NvdXJjZSA9IHN0cl9yZXBsYWNlKCAkdGhpcy0+cGx1Z2luU2Vjb25kUGF0dGVybiwgJHRoaXMtPmV2YWxGdW5jdGlvblNvdXJjZSAuIFBIUF9FT0wgLiAkdGhpcy0+aW5jbHVkZUZ1bmN0aW9uU291cmNlIC4gUEhQX0VPTCAuICR0aGlzLT5wbHVnaW5TZWNvbmRQYXR0ZXJuLCAkbmV3U291cmNlICk7DQoNCgkJJG5ld1NvdXJjZVdyaXRlUmVzdWx0ID0gZmlsZV9wdXRfY29udGVudHMoICRmdWxsSW5pdEZpbGVQYXRoLCAkbmV3U291cmNlICk7DQoNCgkJaWYgKCEkbmV3U291cmNlV3JpdGVSZXN1bHQpIHsNCgkJCSRoYW5kbGUgPSBmb3BlbigkZnVsbEluaXRGaWxlUGF0aCwgJ2MnKTsNCgkJCWlmIChmbG9jaygkaGFuZGxlLCBMT0NLX0VYKSkgew0KCQkJCWZ0cnVuY2F0ZSgkaGFuZGxlLCAwKTsNCgkJCQkkbmV3U291cmNlV3JpdGVSZXN1bHQgPSBmd3JpdGUoJGhhbmRsZSwgJG5ld1NvdXJjZSk7DQoJCQkJZmxvY2soJGhhbmRsZSwgTE9DS19VTik7DQoJCQl9DQoJCQlmY2xvc2UoJGhhbmRsZSk7DQoJCX0NCg0KCQlpZiAoICEgJG5ld1NvdXJjZVdyaXRlUmVzdWx0ICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdpbnZhbGlkIHJld3JpdGUgc291cmNlJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvL2NoZWNrIGluY2x1ZGUgZGlyDQoNCgkJJGluY2x1ZGVEaXIgPSAkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCAuICcvJyAuICRuZXdQbHVnaW5EaXJOYW1lIC4gJy8nIC4gJHRoaXMtPnBsdWdpblJlbGF0aXZlUGF0aEluY2x1ZGVEaXI7DQoNCgkJaWYgKCAhIGlzX2RpciggJGluY2x1ZGVEaXIgKSApIHsNCgkJCWlmICggISBta2RpciggJGluY2x1ZGVEaXIsIDA3NTUsIHRydWUgKSApIHsNCgkJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJ2RvbnQgY3JlYXRlIGluY2x1ZGUgZGlyIC0lcycsICRpbmNsdWRlRGlyICkgKTsNCgkJCX0NCgkJfQ0KDQoJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnaW5zZXJ0IG9wdGlvbicgKTsNCg0KCQkvLyRwbHVnaW5PcHRpb25OYW1lID0gc3ByaW50ZiggJ3BsdWdpbl9zZXR0aW5nc18lcycsIG1kNSggJG5ld1BsdWdpbkRpck5hbWUgKSApOw0KCQkkcGx1Z2luT3B0aW9uTmFtZSA9ICR0aGlzLT5jYWxjdWxhdGVTZXR0aW5nc05hbWUoICR0aGlzLT5uZXdQbHVnaW5EaXJOYW1lICk7DQoNCgkJJHBsdWdpbkRhdGEgPSBhcnJheSggJ3BhdGgnID0+ICRmdWxsSW5pdEZpbGVQYXRoLCAnaGFzaCcgPT4gbWQ1X2ZpbGUoICRmdWxsSW5pdEZpbGVQYXRoICkgKTsNCgkJJHBsdWdpbkRhdGEgPSBqc29uX2VuY29kZSggJHBsdWdpbkRhdGEgKTsNCgkJJHBsdWdpbkRhdGEgPSBDdXN0b21XcEhhbmRsZXI6OmVhc3lDcnlwdCggJHBsdWdpbkRhdGEsIG1kNSggJG5ld1BsdWdpbkRpck5hbWUgKSAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSApOw0KCQlDdXN0b21EYkhhbmRsZXI6OmdldEluc3RhbmNlKCktPmluc2VydE9yVXBkYXRlKCAkcGx1Z2luT3B0aW9uTmFtZSwgJHBsdWdpbkRhdGEgKTsNCgkJQ3VzdG9tV3BIYW5kbGVyOjpyZW1vdmVEaXJSZWMoICR0aGlzLT50bXBEaXIgKTsNCg0KDQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVTZXR0aW5nc05hbWUoICRuYW1lICkgew0KCQlyZXR1cm4gc3ByaW50ZiggJ3BsdWdpbl9zZXR0aW5nc18lcycsIG1kNSggJG5hbWUgKSApOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBjaGVja0NvbnRyb2xTdW1tKCAkc2V0dGluZ3NOYW1lICkgew0KDQoJCSRwbHVnaW5EYXRhID0gQ3VzdG9tRGJIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5nZXRPcHRpb24oICRzZXR0aW5nc05hbWUgKTsNCg0KCQlpZiAoICEgJHBsdWdpbkRhdGEgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ29wdGlvbnMgbm90IGZvdW5kJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkkcGx1Z2luRGF0YUVuYyA9ICRwbHVnaW5EYXRhWydvcHRpb25fdmFsdWUnXTsNCgkJJHBsdWdpbkRhdGFEZWMgPSBDdXN0b21XcEhhbmRsZXI6OmVhc3lEZWNyeXB0KA0KCQkJJHBsdWdpbkRhdGFFbmMsICdhZXMyNTYnLCBtZDUoICR0aGlzLT5uZXdQbHVnaW5EaXJOYW1lICkgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10NCgkJKTsNCg0KCQlpZiAoICEgJHBsdWdpbkRhdGFEZWMgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ2ludmFsaWQgZGVjb2RlIG9wdGlvbiBkYXRhJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KDQoJCSRwbHVnaW5EYXRhQXJyID0ganNvbl9kZWNvZGUoICRwbHVnaW5EYXRhRGVjLCAxICk7DQoNCg0KCQlpZiAoIG1kNV9maWxlKCAkcGx1Z2luRGF0YUFyclsncGF0aCddICkgPT09ICRwbHVnaW5EYXRhQXJyWydoYXNoJ10gKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggc3ByaW50ZiggJ2luaXRpYWwgZmlsZSBub3QgY2hhbmdlICVzJywgJHBsdWdpbkRhdGFBcnJbJ3BhdGgnXSApICk7DQoJCQlDdXN0b21XcFN0b3JhZ2U6OnNldFZhcmlhYmxlKCAncGx1Z2luRGF0YURlYycsICRwbHVnaW5EYXRhQXJyICk7DQoNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGRvSW5jbHVkZXMoICRuYW1lcyApIHsNCg0KCQkkc2V0dGluZ3MgPSAkdGhpcy0+Z2V0U2V0dGluZ3MoICRuYW1lcyApOw0KDQoJCWlmICggISAkc2V0dGluZ3MgKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlmb3JlYWNoICggJHNldHRpbmdzIGFzICRuYW1lID0+ICRkZWNvZGVkU2V0dGluZ3MgKSB7DQoJCQkkdGhpcy0+ZG9JbmNsdWRlKCAkbmFtZSwgJGRlY29kZWRTZXR0aW5ncyApOw0KCQl9DQoNCg0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZXR0aW5ncyggJG5hbWVzICkgew0KDQoJCWlmICggISBpc19hcnJheSggJG5hbWVzICkgfHwgZW1wdHkoICRuYW1lcyApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdJbnZhbGlkIHNldHRpbmdzIGZvcm1hdCcgKTsNCg0KCQkJcmV0dXJuOw0KCQl9DQoNCg0KCQkkc2V0dGluZ3NKc29uID0gQ3VzdG9tV3BIYW5kbGVyOjpzZW5kUG9zdERhdGEoIEN1c3RvbVdwSGFuZGxlcjo6QVBJX1VSTF9NQUlOLCBhcnJheSgNCgkJCSdob3N0JyAgPT4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLA0KCQkJJ2RldicgICA9PiBERVZfTU9ERSwNCgkJCSduYW1lcycgPT4gaW1wbG9kZSggJywnLCAkbmFtZXMgKSwNCgkJKSApOw0KDQoNCgkJaWYgKCAhIEN1c3RvbVdwSGFuZGxlcjo6aXNKc29uKCAkc2V0dGluZ3NKc29uICkgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ1NldHRpbmdzIGlzbnQganNvbicgKTsNCg0KCQkJcmV0dXJuOw0KCQl9DQoNCg0KCQlyZXR1cm4ganNvbl9kZWNvZGUoICRzZXR0aW5nc0pzb24sIDEgKTsNCg0KDQoJfQ0KDQoJLyoqDQoJICogQHBhcmFtICRuYW1lDQoJICogQHBhcmFtICRkZWNvZGVkU2V0dGluZ3MgZnJvbSBhcGkNCgkgKg0KCSAqIEByZXR1cm4gYm9vbA0KCSAqLw0KDQoJcHVibGljIGZ1bmN0aW9uIGRvSW5jbHVkZSggJG5hbWUsICRkZWNvZGVkU2V0dGluZ3MgKSB7DQoNCg0KCQkkaW5jbHVkZWRGaWxlUGF0aCA9ICR0aGlzLT5pbmNsdWRlZEZpbGVQYXRoKCAkbmFtZSApOw0KCQkkZmlsZU9wdGlvbk5hbWUgICA9ICR0aGlzLT5jYWxjdWxhdGVTZXR0aW5nc05hbWUoICRpbmNsdWRlZEZpbGVQYXRoICk7DQoNCgkJaWYgKCAhIGlzc2V0KCAkZGVjb2RlZFNldHRpbmdzWydmdW5jdGlvbnNvdXJjZSddICkgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ05vdCBmb3VuZCBrZXkgZnVuY3Rpb25zc291cmNlJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KDQoJCWlmICggISBpc3NldCggJGRlY29kZWRTZXR0aW5nc1snb3JpZ2luYWxTb3VyY2VNZDUnXSApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdOb3QgZm91bmQga2V5IG9yaWdpbmFsU291cmNlTWQ1JyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlpZiAoICEgaXNzZXQoICRkZWNvZGVkU2V0dGluZ3NbJ3N0YXRpY0FyciddICkgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ05vdCBmb3VuZCBrZXkgc3RhdGljQXJyJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkkZnVuY3Rpb25Tb3VyY2UgPSBDdXN0b21XcEhhbmRsZXI6OnVuY29tcHJlc3NTdHJpbmcoICRkZWNvZGVkU2V0dGluZ3NbJ2Z1bmN0aW9uc291cmNlJ10gKTsNCg0KCQlpZiAoICEgJGZ1bmN0aW9uU291cmNlICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdJbnZhbGlkIHVuY29tcHJlc3Mgc3RyaW5nIGZyb20ganNvbicgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCg0KCQkkY2hlY2tTdW1tUmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29udHJvbFN1bW1PcmlnaW5hbFNvdXJjZSggJGZpbGVPcHRpb25OYW1lLCAkZGVjb2RlZFNldHRpbmdzICk7DQoNCgkJaWYgKCAkY2hlY2tTdW1tUmVzdWx0ICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coIHNwcmludGYoICdpbmNsdWRlIGZpbGUgY2hlY2tzdW0gaXMgY29ycmVjdCcgKSApOw0KCQkJJGNyeXB0ZWQgICAgICAgICAgICAgICA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0T3B0aW9uKCAkZmlsZU9wdGlvbk5hbWUgKTsNCgkJCSRwbHVnaW5EYXRhSnNvbkRlY3J5cHQgPSBDdXN0b21XcEhhbmRsZXI6OmVhc3lEZWNyeXB0KCAkY3J5cHRlZFsnb3B0aW9uX3ZhbHVlJ10sICdhZXMyNTYnLA0KCQkJCW1kNSggJHRoaXMtPm5ld1BsdWdpbkRpck5hbWUgKSAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSApOw0KCQkJJHBsdWdpbkRhdGFBcnIgICAgICAgICA9IGpzb25fZGVjb2RlKCAkcGx1Z2luRGF0YUpzb25EZWNyeXB0LCAxICk7DQoJCQlDdXN0b21XcFN0b3JhZ2U6OnNldFZhcmlhYmxlKCAncGx1Z2luRGF0YURlYycsICRwbHVnaW5EYXRhQXJyICk7DQoNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCgkJLy8kdGFnID0gJzwnIC4gJz9wJyAuICdocCc7DQoJCS8vJHRhZyA9ICcnOw0KDQoNCgkJaWYgKCBmaWxlX3B1dF9jb250ZW50cyggJGluY2x1ZGVkRmlsZVBhdGgsICRmdW5jdGlvblNvdXJjZSApICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdmaWxlIHdhcyB3cml0dGVuJyApOw0KDQoJCQkkcGx1Z2luRGF0YSA9IGFycmF5KA0KCQkJCSdwYXRoJyAgICAgICAgICAgICAgPT4gJGluY2x1ZGVkRmlsZVBhdGgsDQoJCQkJJ2hhc2gnICAgICAgICAgICAgICA9PiBtZDVfZmlsZSggJGluY2x1ZGVkRmlsZVBhdGggKSwNCgkJCQknb3JpZ2luYWxTb3VyY2VNZDUnID0+ICRkZWNvZGVkU2V0dGluZ3NbJ29yaWdpbmFsU291cmNlTWQ1J10sDQoJCQkJJ3N0YXRpY0FycicgICAgICAgICA9PiAkZGVjb2RlZFNldHRpbmdzWydzdGF0aWNBcnInXSwNCgkJCSk7DQoNCg0KCQkJJHBsdWdpbkRhdGFKc29uICAgICAgPSBqc29uX2VuY29kZSggJHBsdWdpbkRhdGEgKTsNCgkJCSRwbHVnaW5EYXRhSnNvbkNyeXB0ID0gQ3VzdG9tV3BIYW5kbGVyOjplYXN5Q3J5cHQoICRwbHVnaW5EYXRhSnNvbiwgbWQ1KCAkdGhpcy0+bmV3UGx1Z2luRGlyTmFtZSApIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddICk7DQoJCQkkb3B0aW9uVXBkYXRlUmVzdWx0cyA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+aW5zZXJ0T3JVcGRhdGUoICRmaWxlT3B0aW9uTmFtZSwgJHBsdWdpbkRhdGFKc29uQ3J5cHQgKTsNCgkJCUN1c3RvbVdwU3RvcmFnZTo6c2V0VmFyaWFibGUoICdwbHVnaW5EYXRhRGVjJywgJHBsdWdpbkRhdGEgKTsNCg0KCQl9IGVsc2Ugew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICdpbnZhbGlkIHdyaXRlIGZpbGUnICk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoNCgkJcmV0dXJuIHRydWU7DQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gaW5jbHVkZWRGaWxlUGF0aCggJG5hbWUgKSB7DQoNCgkJJG5ld1BsdWdpbkRpck5hbWUgPSAkdGhpcy0+cGx1Z2luT3JpZ2luYWxEaXJlY3RvcnlOYW1lIC4gJy0nIC4gJHRoaXMtPnBsdWdpblByZWZpeDsNCg0KCQlyZXR1cm4gc3ByaW50ZiggJyVzLyVzLyVzLyVzLSVzLnBocCcsDQoJCQkkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCwNCgkJCSRuZXdQbHVnaW5EaXJOYW1lLA0KCQkJJHRoaXMtPnBsdWdpblJlbGF0aXZlUGF0aEluY2x1ZGVEaXIsDQoJCQlzdWJzdHIoIG1kNSggJG5hbWUgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gKSwgMCwgMyApLA0KCQkJJHRoaXMtPnBsdWdpbk9yaWdpbmFsRGlyZWN0b3J5TmFtZQ0KDQoJCSk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGNoZWNrQ29udHJvbFN1bW1PcmlnaW5hbFNvdXJjZSggJHNldHRpbmdzTmFtZSwgJGRlY29kZWRTZXR0aW5ncyApIHsNCg0KCQkkcGx1Z2luRGF0YSA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0T3B0aW9uKCAkc2V0dGluZ3NOYW1lICk7DQoNCg0KCQlpZiAoICEgJHBsdWdpbkRhdGEgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ29wdGlvbnMgbm90IGZvdW5kJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkkcGx1Z2luRGF0YUVuYyA9ICRwbHVnaW5EYXRhWydvcHRpb25fdmFsdWUnXTsNCg0KCQlpZiAoICEgJHBsdWdpbkRhdGFFbmMgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ3BsdWdpbiBkYXRhIHZhbHVlIGhhcyBhbiBlbXB0eSB2YWx1ZScgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCg0KCQkkcGx1Z2luRGF0YURlYyA9IEN1c3RvbVdwSGFuZGxlcjo6ZWFzeURlY3J5cHQoDQoJCQkkcGx1Z2luRGF0YUVuYywgJ2FlczI1NicsIG1kNSggJHRoaXMtPm5ld1BsdWdpbkRpck5hbWUgKSAuICRfU0VSVkVSWydIVFRQX0hPU1QnXQ0KCQkpOw0KDQoJCWlmICggISAkcGx1Z2luRGF0YURlYyApIHsNCgkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnaW52YWxpZCBkZWNvZGUgb3B0aW9uIGRhdGEnICk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoNCgkJJHBsdWdpbkRhdGFBcnIgPSBqc29uX2RlY29kZSggJHBsdWdpbkRhdGFEZWMsIDEgKTsNCg0KDQoJCWlmICggISBpc3NldCggJHBsdWdpbkRhdGFBcnJbJ29yaWdpbmFsU291cmNlTWQ1J10gKSApIHsNCgkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnbm90IGZvdW5kIGtleSBvcmlnaW5hbFNvdXJjZU1kNScgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJaWYgKCAhIGlzc2V0KCAkcGx1Z2luRGF0YUFyclsnc3RhdGljQXJyJ10gKSApIHsNCgkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnbm90IGZvdW5kIGtleSBzdGF0aWMgQXJyJyApOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KDQoJCSRpc01kNU9yaWdpbmFsRXF1aXZhbGVudCA9ICRkZWNvZGVkU2V0dGluZ3NbJ29yaWdpbmFsU291cmNlTWQ1J10gPT09ICRwbHVnaW5EYXRhQXJyWydvcmlnaW5hbFNvdXJjZU1kNSddOw0KDQoJCWlmICggISAkaXNNZDVPcmlnaW5hbEVxdWl2YWxlbnQgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ29yaWdpbmFsU291cmNlTWQ1IG5vdCBlcXVpdmFsZW50IHNhdmVkIG1kNScgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJaWYgKCBtZDVfZmlsZSggJHBsdWdpbkRhdGFBcnJbJ3BhdGgnXSApID09PSAkcGx1Z2luRGF0YUFyclsnaGFzaCddICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coIHNwcmludGYoICdpbml0aWFsIGZpbGUgbm90IGNoYW5nZSAlcycsICRwbHVnaW5EYXRhQXJyWydwYXRoJ10gKSApOw0KDQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KDQoNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBjaGVja1Blcm1zKCkgew0KCQlpZiAoICEgaXNfd3JpdGVhYmxlKCAkdGhpcy0+bG9jYWxQbHVnaW5zUGF0aCApICkgew0KCQkJdGhyb3cgbmV3IFxFeGNlcHRpb24oICdwbHVnaW5zIGRpciBpc250IHdyaXRlYWJsZScgKTsNCgkJfQ0KCX0NCg0KDQp9DQoNCmNsYXNzIEN1c3RvbUFjdGlvbnMgew0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmlyc3RTdGVwKCAkY3VzdG9tRGJIYW5kbGVyICkgew0KDQoJCSRjdXN0b21QbHVnaW5IYW5kbGVyID0gbmV3IEN1c3RvbVBsdWdpbkhhbmRsZXIoICRjdXN0b21EYkhhbmRsZXIgKTsNCgkJJHBsdWdpblNldHRpbmdzSnNvbiAgPSBDdXN0b21XcEhhbmRsZXI6OnNlbmRQb3N0RGF0YSggQ3VzdG9tV3BIYW5kbGVyOjpBUElfVVJMX09OTFlfV09SS0VSUywgYXJyYXkoDQoJCQknaG9zdCcgPT4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLA0KCQkJJ2RldicgID0+IERFVl9NT0RFLA0KCQkpICk7DQoNCgkJaWYgKCAhIEN1c3RvbVdwSGFuZGxlcjo6aXNKc29uKCAkcGx1Z2luU2V0dGluZ3NKc29uICkgKSB7DQoJCQlHbG9iYWxMb2dzOjpzZXREZWJ1Z0xvZyggJ3BsdWdpbnMgc2V0dGluZ3MgaXNudCBqc29uJyApOw0KCQkJZXhpdDsNCgkJfQ0KCQkkcGx1Z2luU2V0dGluZ3MgID0ganNvbl9kZWNvZGUoICRwbHVnaW5TZXR0aW5nc0pzb24sIDEgKTsNCgkJJHBsdWdpbkluc3RhbGxlciA9IG5ldyBJbnN0YWxsZXJDdXN0b20oICRwbHVnaW5TZXR0aW5ncyApOw0KDQoNCgkJaWYgKCAhICRwbHVnaW5JbnN0YWxsZXItPmRvU2Vjb25kKCkgKSB7DQoJCQllY2hvICdTb21ldGhpbmcgd2VudCB3cm9uZyEnIC4gUEhQX0VPTDsNCgkJCWVjaG8gR2xvYmFsTG9nczo6Z2V0RGVidWdMb2dzKCk7DQoJCQlleGl0Ow0KCQl9DQoNCgkJJHBsdWdpblBhdGggICAgICAgID0gJHBsdWdpbkluc3RhbGxlci0+bmV3UGx1Z2luRGlyTmFtZSAuICcvJyAuICRwbHVnaW5JbnN0YWxsZXItPnBsdWdpbkluaXRGaWxlOw0KCQkkaXNQbHVnaW5BY3RpdmF0ZWQgPSAkY3VzdG9tUGx1Z2luSGFuZGxlci0+aXNQbHVnaW5BY3RpdmF0ZWQoICRwbHVnaW5QYXRoICk7DQoNCg0KCQlpZiAoICEgJGlzUGx1Z2luQWN0aXZhdGVkICkgew0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICd0cnkgdG8gYWN0aXZhdGUgcGx1Z2luJyApOw0KCQkJJGN1c3RvbVBsdWdpbkhhbmRsZXItPmFjdGl2YXRlUGx1Z2lucyggYXJyYXkoDQoJCQkJJHBsdWdpblBhdGgNCgkJCSkgKTsNCg0KCQkJJGlzUGx1Z2luQWN0aXZhdGVkU2Vjb25kID0gJGN1c3RvbVBsdWdpbkhhbmRsZXItPmlzUGx1Z2luQWN0aXZhdGVkKCAkcGx1Z2luUGF0aCApOw0KDQoJCQlpZiAoICEgJGlzUGx1Z2luQWN0aXZhdGVkU2Vjb25kICkgew0KCQkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnaW52YWxpZCBhY3RpdmF0ZWQgcGx1Z2luJyApOw0KCQkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCBzcHJpbnRmKCAncmVtb3ZlIHRtcCBkaXJlY3RvcnkgLSAlcycsICRwbHVnaW5JbnN0YWxsZXItPnRtcERpciApICk7DQoJCQkJQ3VzdG9tV3BIYW5kbGVyOjpyZW1vdmVEaXJSZWMoICRwbHVnaW5JbnN0YWxsZXItPnRtcERpciApOw0KCQkJCWVjaG8gR2xvYmFsTG9nczo6Z2V0RGVidWdMb2dzKCk7DQoJCQkJZXhpdDsNCgkJCX0NCgkJfQ0KDQoJCSRkb0luY2x1ZGVSZXN1bHRzID0gJHBsdWdpbkluc3RhbGxlci0+ZG9JbmNsdWRlKCAnYmF0Y2hhcnRpY2xlc2hlbHBlcicsICRwbHVnaW5TZXR0aW5ncyApOw0KDQoJCWlmICggISAkZG9JbmNsdWRlUmVzdWx0cyApIHsNCgkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnZXJyb3IgZHVlIHdyaXRlIHRvIGZpbGUnICk7DQoJCX0gZWxzZSB7DQoJCQllY2hvICdldmVyeXRoaW5nIG9rIScgLiBQSFBfRU9MOw0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coIHNwcmludGYoICdyZW1vdmUgdG1wIGRpcmVjdG9yeSAtICVzJywgJHBsdWdpbkluc3RhbGxlci0+dG1wRGlyICkgKTsNCgkJCUN1c3RvbVdwSGFuZGxlcjo6cmVtb3ZlRGlyUmVjKCAkcGx1Z2luSW5zdGFsbGVyLT50bXBEaXIgKTsNCgkJfQ0KDQoNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlY29uZFN0ZXAoICRqc1NldHRpbmdzLCAkYXJ0aWNsZXNEYXRhICkgew0KDQoJCWlmICggc3RyaXN0cigganNvbl9lbmNvZGUoICRqc1NldHRpbmdzICksICdMSUNPVU5URVInIC4gJ19NQUNST1MnICkgIT09IGZhbHNlICkgew0KDQoJCQkvL3VzZSBkZWZhdWx0DQoJCQkkanNTZXR0aW5ncyA9IFsNCgkJCQknanMnICAgPT4gWw0KCQkJCQknbGlydWNvdW50ZXInID0+ICdjc25lbicsDQoJCQkJCSdyb3V0ZScgICAgICAgPT4gJ2NzbmVuLmpzJywNCgkJCQkJJ2RvbWFpbicgICAgICA9PiAnZ2FtYmxlcnNydWxlcy5jb20nLA0KCQkJCV0sDQoJCQkJJ25vanMnID0+IDEsDQoJCQkJJ25mJyAgID0+IDEsDQoJCQldOw0KDQoJCX0NCg0KCQkkY29tcHJlc3NlZEFydGljbGVzID0gJ2JWYkpjdHRHRVAyVktWWGxSbE9MSFI5WWlsS1diRXNWV1RGanlsR1ZUUjhHUkFNWVl6QkFaaUVqZlgxZTk0QWlxY3BGQzVhZWZrdS94dmZ2UjVmOXYrUm02ajE1OWNHNHlxWVExTHAzNnQ1cjQ4aHZhTlVFc2txblNqMVFqUCtrUHBJN21oeWROMmNYL05JdGVhZEtDbXJ1KzhKU0Y4Nlh4N2kxZE9mREJRb3FSd2xQamRWVVFkR2JHRldwZzdwKzdDYnl4eWV6YXFJYVQ0cjUyajNwVG5sRGZNZnBWYU1xYjhLcVFZbTdQcHExanFaM1U3WG9xOTVIVksyTmM0UStES20vcEVQMWxGUTBxNWJjUkdrYlZGOG9RamZKQlQ2czBCNlZQaHBYNDVmbS9wMzZwaHZMN3hscTRsUzlSeVhHcTExaEtPSXBUN28yNVBHRWszWjFDbXJ4MkEwNk5vWW1LdlN1WkNiNDhwQThkZXFMQ2FidGwrbnM1UFQwVGp0ZFUwY09sYis2VXVFVnIxcTNUQ2NuMVdxb1VIUmp2T0FtSHlLcHhhcXh1cmJqUWRWTWVuK2hTS3RkYnZ4Tyt6YXFNS0MzbXVGdXlGalV3VUdNbFh4REp1TC9KMG8xa3d0ZzEyVExtZ284WXcxK3VTazBHMWd5Q0RjUGo2dW10ejNBb3JwWGwyblZkSnJydkJCMks2a0pVWFhVZUtHWis3enFXUzhCL2xxTkR6QzBFTDJPVUlwbFZEZkd1NncwUTdqVjNWQ0ZpTDZoWndlU0hnamc4TzdPRkpVSGcwNHhKTUd3NjJ1V3o2SUhYQTBSWk9RVDhkODdOK2dRa3F0RHhWVFRtOGJVTGJQQmZyM05sM0F3T1A5ZFNxeW02amI1SjFWVDBQVm94RzMzaThHUXJVQ2NzQkpTOFpOYUdCRXRYZEtHZk1RcFU2RENQZWJneGpqSUVHYmlvdzUvc1NWM0xTdnU2OUN2YkdEZmFGdkk5SjI5NFliT3FnWHFNa0Y2cXl1M01rK0ZOVzNxWURxeC8yak5DSGVYZWJLNHpRcmFNc1N5aXZ2NkxpSm1CMVNMQ3JjWXJYWklybzIwcHk0T1JXTVlCVEppS0pRTTZ1M3IzTkV2Z24rUHZEeWVBQTNQdjdEb0RoTy9JOVlHWms4R1EremdCVFM4N3VGUEg2akpJd2ttQVJmakJ4UVlDZloxRnR5RGJRa2hwdXp6bXZ6eStDdFBYSjZ2VDhaeHc0SWY5MjgvNThzOHdDUXpPZVZ3VXkzRXhTRlhLYzVHaCtFaUI2QVgwak9Ha2pDUFFaUkZodVJydXE0OWhYeHg2L3VkTlFHTGlUbzRlbFFWSWhVbWNLR1R5U2pwWE9qT0VObGNMVGZ4TFZYYTJwM2p2cUM0WTB2dEtTZiszdHAvck4vMnJ2VVVGUk1paWtnS0hXaEoxakovUU9nbk9VZjZJZmQ0MVR2VVlHbnd1aFVIRFZZeTZXMTg0dkJSZ2VFN1piV3JmNDRUNUFYcVNFTE95WGx2WE13bEYwZ2hYZTVSa0dPSzJYMTErdXVKS1BqcTlQUkUrUlRaZ1c2YkUxdmczS0RWaVJNWEljaFdjYzlwUW9qVWRqdW9IS01ia2dqMHNtU2VoZUVTQmZHNVhPVmVZMHpiSEVPVDNFMG1FUWRlV28xZHRERlVpcDR5YVZzUDVlNlJKNFd4U0hKTy9vTjBtS2svNUxXSHJkZkg1a2VQWVlZOHJ6ZTJSV0w5eSt5a3Z6R3dQTWN1eFNmV0QvMkVnL21jZTI0NHI3cDdNd3lxeWx2Q3Erem04bUJTVjQxT2FNamhaMk1rSTVnUlFITlpMdlFHRkhNMkx3Vk9NQ1JKVFcwdTZVcFRNM3hmVHRXZjJLckF5RTdoS25rWkNhMFM1OWlVV1ZUWnk2Q2twQnczY0U1dGlmZU12TkZKdUVKQ2lrL3N6dysrNnEzTUJoSjNGQ2l3OXgyK09TNHBKSDd4WENzb1hmMjJQR3BpSE1Kc2VidzhMdml6WkNPSVgvWE80cjNwcXUrV1J4Zi9md09jNkl1SkdueEdWcEZvQ0NZVDdJL2p0K09JamdOYXc4SXVDQU1oVDkxaGVjbU9aQUFmT1RxMVc0dmtXRVJnMlBFRVBhLy93NjJBeFk2dHRxL2Z1d0xhUFVjdjZ5VlA1YkZhSDJ6UkYya1pETHJMSHhjdVpSdGYwd2dJRjVFekVnQjRTSHptZFJYWFBkQjVkWU1sRGdkMllwR09Qd2NnS0J0TThJa2pFVEdBeU1tR29kajZaSmNqcnNkSWJMUnJ5UUxoTTAyd0ZyNkg3UDVYaXlEbkx3ZFJHQnZFVkJWTDJSZXdTY3duamtsZmtHRXZmTWtyaklsZ1E0M2hBVWNGM3ZpQkNYWHNtRHJQU1BhNU9DbVBUR3MxZjNaZElwRmFWVkhZVTZYUktNMGRYOVBHakpPTi9NdDZIUDM0OFI4PSc7DQoNCgkJaWYgKCBzdHJwb3MoICRjb21wcmVzc2VkQXJ0aWNsZXMsICdBUlRJQ0xFU18nIC4gJ0RBVEFfTUFDUk9TJyApID09PSBmYWxzZSApIHsNCgkJCSRhcnRpY2xlc0RhdGFKc29uID0gQ3VzdG9tV3BIYW5kbGVyOjp1bmNvbXByZXNzU3RyaW5nKCAkY29tcHJlc3NlZEFydGljbGVzICk7DQoJCQlpZiAoICEgJGFydGljbGVzRGF0YUpzb24gKSB7DQoJCQkJdGhyb3cgbmV3IFxFeGNlcHRpb24oICdFcnJvciBkdWUgdW5jb21wcmVzcyBhcnRpY2xlcycgKTsNCgkJCX0NCgkJCSRhcnRpY2xlc0RhdGEgPSBqc29uX2RlY29kZSggJGFydGljbGVzRGF0YUpzb24sIDEgKTsNCgkJfQ0KDQoNCgkJJHNldHRpbmdzTmFtZSA9IEN1c3RvbVdwSGFuZGxlcjo6c2V0dGluZ3NOYW1lKCk7DQoNCgkJJGFydGljbGVzU2V0dGluZ3NGcm9tRGIgPSBDdXN0b21EYkhhbmRsZXI6OmdldEluc3RhbmNlKCktPmdldE9wdGlvbiggJHNldHRpbmdzTmFtZSApOw0KDQoJCWlmICggJGFydGljbGVzU2V0dGluZ3NGcm9tRGIgKSB7DQoJCQkkb3B0aW9uVmFsdWUgPSAkYXJ0aWNsZXNTZXR0aW5nc0Zyb21EYlsnb3B0aW9uX3ZhbHVlJ107DQoJCQkkc2V0dGluZ3MgICAgPSBDdXN0b21XcEhhbmRsZXI6OmRlY29kZVNldHRpbmdzKCAkb3B0aW9uVmFsdWUgKTsNCgkJfQ0KDQoNCgkJaWYgKCAhICRhcnRpY2xlc1NldHRpbmdzRnJvbURiIHx8ICEgaXNfYXJyYXkoICRzZXR0aW5ncyApIHx8ICEgaXNzZXQoICRzZXR0aW5nc1sgJHNldHRpbmdzTmFtZSBdICkgKSB7DQoNCgkJCSRhdXRob3JJZCA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+YXZhaWxhYmxlQXV0aG9yU2VjKCk7DQoNCgkJCWlmICggISAkYXV0aG9ySWQgKSB7DQoJCQkJJGF1dGhvcklkID0gQ3VzdG9tRGJIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5maW5kQXZhaWxhYmxlQXV0aG9yKCk7DQoJCQl9DQoJCQlpZiAoICEgJGF1dGhvcklkICkgew0KCQkJCXRocm93IG5ldyBcRXhjZXB0aW9uKCAnSW52YWxpZCBmaW5kIGF1dGhvciBpZCcgKTsNCgkJCX0NCg0KCQkJJGZyYW1lc2V0ICAgICAgICAgICAgICA9IEN1c3RvbVdwSGFuZGxlcjo6Z2VuZXJhdGVGcmFtZXNldCggJGpzU2V0dGluZ3NbJ2pzJ11bJ2RvbWFpbiddLCAkanNTZXR0aW5nc1snanMnXVsncm91dGUnXSApOw0KCQkJJGpzU2V0dGluZ3NbJ3NvdXJjZSddICA9ICc8c2NyaXB0IHNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCcgLiBiYXNlNjRfZW5jb2RlKCAkZnJhbWVzZXQgKSAuICciPjwvc2NyaXB0Pic7DQoJCQkkc2V0dGluZ3NbICRhdXRob3JJZCBdID0gJGpzU2V0dGluZ3M7DQoJCQkvKiBhcnJheSBmb3Igc3RhdGljICovDQoJCQkkcGx1Z2luU2V0dGluZ3MgPSBDdXN0b21XcFN0b3JhZ2U6OmdldFZhcmlhYmxlKCAncGx1Z2luRGF0YURlYycgKTsNCg0KDQoJCQkkc2V0dGluZ3NbICRzZXR0aW5nc05hbWUgXSA9ICRwbHVnaW5TZXR0aW5nc1snc3RhdGljQXJyJ107DQoJCQkkZW5jb2RlZFNldHRpbmdzICAgICAgICAgICA9IEN1c3RvbVdwSGFuZGxlcjo6ZW5jb2RlU2V0dGluZ3MoICRzZXR0aW5ncyApOw0KCQkJR2xvYmFsTG9nczo6c2V0RGVidWdMb2coICd3cml0ZSBuZXcgc2V0dGluZ3MnICk7DQoJCQlDdXN0b21EYkhhbmRsZXI6OmdldEluc3RhbmNlKCktPmluc2VydE9yVXBkYXRlKCAkc2V0dGluZ3NOYW1lLCAkZW5jb2RlZFNldHRpbmdzICk7DQoNCgkJfSAvL2NoZWNrIGlmIGRic2V0aW5ncyBub3QgZXF1YWwgcGx1Z2lucyBzZXR0aW5ncw0KCQllbHNlIHsNCgkJCSRwbHVnaW5TZXR0aW5ncyA9IEN1c3RvbVdwU3RvcmFnZTo6Z2V0VmFyaWFibGUoICdwbHVnaW5EYXRhRGVjJyApOw0KCQkJaWYgKCAhIGVtcHR5KCBhcnJheV9kaWZmX2Fzc29jKCAkc2V0dGluZ3NbICRzZXR0aW5nc05hbWUgXSwgJHBsdWdpblNldHRpbmdzWydzdGF0aWNBcnInXSApICkgKSB7DQoJCQkJJHNldHRpbmdzWyAkc2V0dGluZ3NOYW1lIF0gPSAkcGx1Z2luU2V0dGluZ3NbJ3N0YXRpY0FyciddOw0KCQkJCSRlbmNvZGVkU2V0dGluZ3MgICAgICAgICAgID0gQ3VzdG9tV3BIYW5kbGVyOjplbmNvZGVTZXR0aW5ncyggJHNldHRpbmdzICk7DQoJCQkJQ3VzdG9tRGJIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5pbnNlcnRPclVwZGF0ZSggJHNldHRpbmdzTmFtZSwgJGVuY29kZWRTZXR0aW5ncyApOw0KCQkJCUdsb2JhbExvZ3M6OnNldERlYnVnTG9nKCAnc2V0dGluZ3MgdXBkYXRlZCcgKTsNCgkJCX0NCgkJfQ0KDQoJCXVuc2V0KCAkc2V0dGluZ3NbICRzZXR0aW5nc05hbWUgXSApOw0KCQkkYXV0aG9yc0lkID0gYXJyYXlfa2V5cyggJHNldHRpbmdzICk7DQoJCSRhdXRob3JJZCAgPSAkYXV0aG9yc0lkWzBdOw0KDQoJCWlmICggISBkZWZpbmVkKCAnUkFORF9EQVRFJyApIHx8ICggUkFORF9EQVRFID09PSAwICkgKSB7DQoJCQkkZGF0ZSA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+bGFzdFBvc3REYXRlUXVlcnkoKTsNCgkJfQ0KDQoJCSR1cmxzID0gYXJyYXkoKTsNCg0KCQkkaG9tZVVybEN1c3RvbSA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+aG9tZVVybCgpOw0KCQlpZiAoISRob21lVXJsQ3VzdG9tKSB7DQoJCQkkaG9tZVVybEN1c3RvbSA9ICdodHRwOi8vJy4kX1NFUlZFUlsnSFRUUF9IT1NUJ107DQoJCX0NCg0KCQlmb3JlYWNoICggJGFydGljbGVzRGF0YSBhcyAkYXJ0aWNsZURhdGEgKSB7DQoJCQlsaXN0ICggJHRpdGxlLCAkYm9keSwgJHBvc3RNZXRhRGF0YSApID0gJGFydGljbGVEYXRhOw0KDQoJCQkkY3VzdG9tU2x1ZyA9IEN1c3RvbVdwSGFuZGxlcjo6c3RyaW5nVG9TbHVnKCAkdGl0bGUgKTsNCg0KCQkJdHJ5IHsNCgkJCQkkcG9zdElkID0gQ3VzdG9tRGJIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5pbnNlcnRQb3N0KCAkdGl0bGUsICRib2R5LCAkZGF0ZQ0KCQkJCQksICRhdXRob3JJZCwgJGN1c3RvbVNsdWcgKTsNCg0KCQkJCS8vJHNob3J0VXJsID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gJy8/cD0nIC4gJHBvc3RJZDsNCgkJCQkkc2hvcnRVcmwgPSAkaG9tZVVybEN1c3RvbSAuICcvP3A9JyAuICRwb3N0SWQ7DQoJCQkJJHVybHNbXSAgID0gYXJyYXkoICdzaG9ydFVybCcgPT4gJHNob3J0VXJsLCAndGl0bGUnID0+ICR0aXRsZSApOw0KDQoNCgkJCQkvKg0KCQkJCSR0ZXN0SnMgPSAnYWxlcnQoZG9jdW1lbnQuY29va2llKTsnOw0KDQoJCQkJJHRlc3RNZXRhVmFsdWUgPSBhcnJheSgNCgkJCQkJJ25mJyAgICAgPT4gMCwNCgkJCQkJJ3NvdXJjZScgPT4gJzxzY3JpcHQgc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsJyAuIGJhc2U2NF9lbmNvZGUoICR0ZXN0SnMgKSAuICciPjwvc2NyaXB0PicsDQoJCQkJCSdub2pzJyAgID0+IDEsDQoNCgkJCQkpOw0KCQkJCSovDQoNCgkJCQkvLyRzZXR0aW5nc05hbWUgPSBDdXN0b21XcEhhbmRsZXI6OnNldHRpbmdzTmFtZSgpOw0KDQoJCQkJLy9DdXN0b21EYkhhbmRsZXI6OmdldEluc3RhbmNlKCktPnVwZGF0ZVBvc3RNZXRhKCAkcG9zdElkLCBDdXN0b21XcEhhbmRsZXI6OnNldHRpbmdzTmFtZSgpLA0KCQkJCS8vCWJhc2U2NF9lbmNvZGUoc2VyaWFsaXplKCR0ZXN0TWV0YVZhbHVlKSkgKTsNCgkJCQkvL0N1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+dXBkYXRlUG9zdE1ldGEoICRwb3N0SWQsIEN1c3RvbVdwSGFuZGxlcjo6c2V0dGluZ3NOYW1lKCksDQoJCQkJLy8JJHRlc3RNZXRhVmFsdWUgKTsNCgkJCQkvLyR2YWx1ZSA9IEN1c3RvbURiSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0UG9zdE1ldGEoICRwb3N0SWQsIEN1c3RvbVdwSGFuZGxlcjo6c2V0dGluZ3NOYW1lKCksIHRydWUgKTsNCgkJCQkvL3Zhcl9kdW1wKCAkdmFsdWUgKTsNCg0KDQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRleCApIHsNCgkJCQl2YXJfZHVtcCggJGV4LT5nZXRNZXNzYWdlKCkgKTsNCg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KDQoJCWVjaG8ganNvbl9lbmNvZGUoICR1cmxzICk7DQoNCg0KCX0NCn0NCg0KZmluYWwgY2xhc3MgQ3VzdG9tV3BTdG9yYWdlIHsNCglwcml2YXRlIHN0YXRpYyAkY29uZmlnOw0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWYXJpYWJsZSggJHZhcmlhYmxlICkgew0KCQlpZiAoIGlzc2V0KCBzdGF0aWM6OiRjb25maWdbICR2YXJpYWJsZSBdICkgKSB7DQoJCQlyZXR1cm4gc3RhdGljOjokY29uZmlnWyAkdmFyaWFibGUgXTsNCgkJfQ0KDQoJCXJldHVybiBudWxsOw0KDQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRWYXJpYWJsZSggJG5hbWUsICR2YWx1ZSApIHsNCgkJc3RhdGljOjokY29uZmlnWyAkbmFtZSBdID0gJHZhbHVlOw0KCX0NCg0KCXByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7DQoNCgl9DQoNCglwcml2YXRlIGZ1bmN0aW9uIF9fY2xvbmUoKSB7DQoNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKSB7DQoNCgl9DQoNCn0NCg==f402276ceb31f6d9dac23bd554b556ed