moflo 4.12.7 → 4.12.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Auto-generated by build. Do not edit manually.
3
+ * Source of truth: the canonical helper files themselves (bin/*, .claude/helpers/*)
4
+ * via scripts/generate-embedded-helpers.mjs — run `npm run generate:helpers`.
5
+ *
6
+ * These back `flo init`'s fallback helper writes, which cannot read the files
7
+ * they emit (see the script's header for why). Editing this file by hand
8
+ * re-creates the drift it exists to remove; tests/guards/embedded-helpers-parity
9
+ * .test.ts will fail if it is stale.
10
+ *
11
+ * Values are base64 of the LF-normalised file. Decoded lazily by
12
+ * helpers-generator.ts, so the normal init path — which copies the real files
13
+ * and never touches these — pays nothing for them.
14
+ */
15
+ /* eslint-disable */
16
+ export const EMBEDDED_HELPERS_BASE64 = {
17
+ "auto-memory-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovKioKICogQXV0byBNZW1vcnkgQnJpZGdlIEhvb2sgKEFEUi0wNDgvMDQ5KSDigJQgTWluaW1hbCBGYWxsYmFjawogKiBGdWxsIHZlcnNpb24gaXMgY29waWVkIGZyb20gcGFja2FnZSBzb3VyY2Ugd2hlbiBhdmFpbGFibGUuCiAqCiAqIFVzYWdlOgogKiAgIG5vZGUgYXV0by1tZW1vcnktaG9vay5tanMgaW1wb3J0ICAgIyBTZXNzaW9uU3RhcnQKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN5bmMgICAgICMgU2Vzc2lvbkVuZCAvIFN0b3AKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN0YXR1cyAgICMgU2hvdyBicmlkZ2Ugc3RhdHVzCiAqLwoKaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAncGF0aCc7CmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnOwoKY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTsKY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKTsKY29uc3QgUFJPSkVDVF9ST09UID0gam9pbihfX2Rpcm5hbWUsICcuLi8uLicpOwpjb25zdCBEQVRBX0RJUiA9IGpvaW4oUFJPSkVDVF9ST09ULCAnLm1vZmxvJywgJ2RhdGEnKTsKY29uc3QgU1RPUkVfUEFUSCA9IGpvaW4oREFUQV9ESVIsICdhdXRvLW1lbW9yeS1zdG9yZS5qc29uJyk7Cgpjb25zdCBESU0gPSAnXHgxYlsybSc7CmNvbnN0IFJFU0VUID0gJ1x4MWJbMG0nOwpjb25zdCBkaW0gPSAobXNnKSA9PiBjb25zb2xlLmxvZyhgICAke0RJTX0ke21zZ30ke1JFU0VUfWApOwoKLy8gRW5zdXJlIGRhdGEgZGlyCmlmICghZXhpc3RzU3luYyhEQVRBX0RJUikpIG1rZGlyU3luYyhEQVRBX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7Cgphc3luYyBmdW5jdGlvbiBsb2FkTWVtb3J5UGFja2FnZSgpIHsKICAvLyBNZW1vcnkgd2FzIGlubGluZWQgaW50byBtb2ZsbydzIGNsaSBwYWNrYWdlIGJ5IHRoZSB3b3Jrc3BhY2UtY29sbGFwc2UgZXBpYwogIC8vICgjNTg2IC8gc3RvcnkgIzU5OCkg4oCUIHRoZSBiYXJlIGBAbW9mbG8vbWVtb3J5YCBzcGVjaWZpZXIgbm8gbG9uZ2VyIHJlc29sdmVzLgogIC8vIEFmdGVyIHRoZSBmaW5hbCBjbGkgY29sbGFwc2UgKCM2MDIpIHRoZSBjb21waWxlZCBtb2R1bGUgc2hpcHMgYXQKICAvLyA8bW9mbG8tcGtnLXJvb3Q+L2Rpc3Qvc3JjL2NsaS9tZW1vcnkvaW5kZXguanMuCiAgY29uc3QgTUVNT1JZX1JFTCA9IGpvaW4oJ2Rpc3QnLCAnc3JjJywgJ2NsaScsICdtZW1vcnknLCAnaW5kZXguanMnKTsKICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydCgndXJsJyk7CgogIC8vIFN0cmF0ZWd5IDE6IFJlc29sdmUgbW9mbG8ncyBwYWNrYWdlLmpzb24gZGlyZWN0bHkgZnJvbSB0aGUgY29uc3VtZXIKICAvLyBwcm9qZWN0IOKAlCBpdHMgZGlybmFtZSBJUyB0aGUgcGFja2FnZSByb290LCBubyB3YWxrIG5lZWRlZC4KICB0cnkgewogICAgY29uc3QgeyBjcmVhdGVSZXF1aXJlIH0gPSBhd2FpdCBpbXBvcnQoJ21vZHVsZScpOwogICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihQUk9KRUNUX1JPT1QsICdwYWNrYWdlLmpzb24nKSk7CiAgICBjb25zdCBwa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ21vZmxvL3BhY2thZ2UuanNvbicpKTsKICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4ocGtnUm9vdCwgTUVNT1JZX1JFTCk7CiAgICBpZiAoZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsKICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH0KCiAgLy8gU3RyYXRlZ3kgMjogV2FsayB1cCBmcm9tIFBST0pFQ1RfUk9PVCBsb29raW5nIGZvciBtb2ZsbyBpbiBhbnkgbm9kZV9tb2R1bGVzLgogIGxldCBzZWFyY2hEaXIgPSBQUk9KRUNUX1JPT1Q7CiAgY29uc3QgeyBwYXJzZSB9ID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7CiAgd2hpbGUgKHNlYXJjaERpciAhPT0gcGFyc2Uoc2VhcmNoRGlyKS5yb290KSB7CiAgICBjb25zdCBjYW5kaWRhdGUgPSBqb2luKHNlYXJjaERpciwgJ25vZGVfbW9kdWxlcycsICdtb2ZsbycsIE1FTU9SWV9SRUwpOwogICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgewogICAgICB0cnkgeyByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICB9CiAgICBzZWFyY2hEaXIgPSBkaXJuYW1lKHNlYXJjaERpcik7CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKYXN5bmMgZnVuY3Rpb24gZG9JbXBvcnQoKSB7CiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIGF1dG8gbWVtb3J5IGltcG9ydCBza2lwcGVkIChub24tY3JpdGljYWwpJyk7CiAgICByZXR1cm47CiAgfQoKICAvLyBGdWxsIGltcGxlbWVudGF0aW9uIGRlZmVycmVkIHRvIGNvcGllZCB2ZXJzaW9uCiAgZGltKCdBdXRvIG1lbW9yeSBpbXBvcnQgYXZhaWxhYmxlIOKAlCBydW4gaW5pdCAtLXVwZ3JhZGUgZm9yIGZ1bGwgc3VwcG9ydCcpOwp9Cgphc3luYyBmdW5jdGlvbiBkb1N5bmMoKSB7CiAgaWYgKCFleGlzdHNTeW5jKFNUT1JFX1BBVEgpKSB7CiAgICBkaW0oJ05vIGVudHJpZXMgdG8gc3luYycpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIHN5bmMgc2tpcHBlZCAobm9uLWNyaXRpY2FsKScpOwogICAgcmV0dXJuOwogIH0KCiAgZGltKCdBdXRvIG1lbW9yeSBzeW5jIGF2YWlsYWJsZSDigJQgcnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsIHN1cHBvcnQnKTsKfQoKZnVuY3Rpb24gZG9TdGF0dXMoKSB7CiAgY29uc29sZS5sb2coJ1xuPT09IEF1dG8gTWVtb3J5IEJyaWRnZSBTdGF0dXMgPT09XG4nKTsKICBjb25zb2xlLmxvZygnICBQYWNrYWdlOiAgICAgICAgRmFsbGJhY2sgbW9kZSAocnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsKScpOwogIGNvbnNvbGUubG9nKGAgIFN0b3JlOiAgICAgICAgICAke2V4aXN0c1N5bmMoU1RPUkVfUEFUSCkgPyAnSW5pdGlhbGl6ZWQnIDogJ05vdCBpbml0aWFsaXplZCd9YCk7CiAgY29uc29sZS5sb2coJycpOwp9Cgpjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5hcmd2WzJdIHx8ICdzdGF0dXMnOwoKdHJ5IHsKICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgIGNhc2UgJ2ltcG9ydCc6IGF3YWl0IGRvSW1wb3J0KCk7IGJyZWFrOwogICAgY2FzZSAnc3luYyc6IGF3YWl0IGRvU3luYygpOyBicmVhazsKICAgIGNhc2UgJ3N0YXR1cyc6IGRvU3RhdHVzKCk7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5sb2coJ1VzYWdlOiBhdXRvLW1lbW9yeS1ob29rLm1qcyA8aW1wb3J0fHN5bmN8c3RhdHVzPicpOwogICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgfQp9IGNhdGNoIChlcnIpIHsKICAvLyBIb29rcyBtdXN0IG5ldmVyIGNyYXNoIENsYXVkZSBDb2RlIC0gZmFpbCBzaWxlbnRseQogIGRpbShgRXJyb3IgKG5vbi1jcml0aWNhbCk6ICR7ZXJyLm1lc3NhZ2V9YCk7Cn0K",
18
+ "gate-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnOwoKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CmlmICghY29tbWFuZCkgcHJvY2Vzcy5leGl0KDApOwoKLy8gUmVhZCBzdGRpbiBKU09OIGZyb20gQ2xhdWRlIENvZGUKdmFyIHN0ZGluRGF0YSA9ICcnOwp0cnkgewogIHN0ZGluRGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgcmVzKGRhdGEpOyB9LCA1MDApOwogICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyBkYXRhICs9IGNodW5rOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcyhkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0pOwogICAgaWYgKHByb2Nlc3Muc3RkaW4uaXNUVFkpIHsgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOyByZXMoJycpOyB9CiAgfSk7Cn0gY2F0Y2ggKGUpIHsgLyogbm8gc3RkaW4gKi8gfQoKdmFyIGhvb2tDb250ZXh0ID0ge307CnRyeSB7IGlmIChzdGRpbkRhdGEudHJpbSgpKSBob29rQ29udGV4dCA9IEpTT04ucGFyc2Uoc3RkaW5EYXRhKTsgfSBjYXRjaCAoZSkge30KCi8vIFBhc3MgdG9vbCBpbmZvIGFzIGVudiB2YXJzIGZvciBnYXRlLmNqcwp2YXIgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYpOwppZiAoaG9va0NvbnRleHQudG9vbF9uYW1lKSBlbnYuVE9PTF9OQU1FID0gaG9va0NvbnRleHQudG9vbF9uYW1lOwovLyBGb3J3YXJkIENsYXVkZSBDb2RlJ3Mgc2Vzc2lvbl9pZCBzbyBnYXRlLmNqcyBjYW4gZW5mb3JjZSBtZW1vcnktZmlyc3QKLy8gcGVyLWFjdG9yICgjODM4KSDigJQgZWFjaCBzcGF3bmVkIHN1YmFnZW50IGdldHMgaXRzIG93biBzZXNzaW9uX2lkLCBzbyBhCi8vIHNoYXJlZCB3b3JrZmxvdy1zdGF0ZS5qc29uIG5vIGxvbmdlciBsZXRzIG9uZSBzdWJhZ2VudCdzIGRpcmVjdGl2ZSBiZQovLyBzaWxlbnRseSBzYXRpc2ZpZWQgYnkgdGhlIHBhcmVudCdzIGVhcmxpZXIgc2VhcmNoLgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnNlc3Npb25faWQgPT09ICdzdHJpbmcnICYmIGhvb2tDb250ZXh0LnNlc3Npb25faWQpIHsKICBlbnYuSE9PS19TRVNTSU9OX0lEID0gaG9va0NvbnRleHQuc2Vzc2lvbl9pZDsKfQovLyAjMTM3NCDigJQgZm9yd2FyZCB0aGUgdHJhbnNjcmlwdCBwYXRoIHNvIGEgZ2F0ZSBjYW4gcmVhZCB3aGF0IHRoZSBzZXNzaW9uCi8vIGFjdHVhbGx5IERJRCwgbm90IG9ubHkgd2hhdCB3b3JrZmxvdy1zdGF0ZS5qc29uIHdhcyB0b2xkIGFib3V0IGl0LiBVc2VkIGJ5Ci8vIGNoZWNrLWJlZm9yZS1wciB0byBjb3VudCBUYXNrQ3JlYXRlIGNhbGxzIGFnYWluc3QgdGVybWluYWwgVGFza1VwZGF0ZSBjYWxsczsKLy8gdGhlIGFsdGVybmF0aXZlIOKAlCBhIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIOKAlCBpcyB0aGUgd2lyaW5nICMxMzMxCi8vIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZCwgYW5kIHRoZSB0cmFuc2NyaXB0IGFscmVhZHkgaG9sZHMgdGhlIGFuc3dlci4KLy8gQWJzZW50IG9uIGhvc3RzIHRoYXQgZG9uJ3Qgc2VuZCBpdDogZ2F0ZXMgdHJlYXQgdGhhdCBhcyAidW5rbm93biIgYW5kIHN0YXkgc2lsZW50LgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnRyYW5zY3JpcHRfcGF0aCA9PT0gJ3N0cmluZycgJiYgaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoKSB7CiAgZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIID0gaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoOwp9Ci8vICMxMzMyOiBzdHJ1Y3R1cmVkIHRvb2wgaW5wdXRzIGFyZSBmb3J3YXJkZWQgYXMgSlNPTiwgbm90IGRyb3BwZWQuCi8vCi8vIFRoaXMgcHJldmlvdXNseSBmb3J3YXJkZWQgT05MWSBzdHJpbmcgdmFsdWVzLCBzbyBhbnkgb2JqZWN0LXZhbHVlZCBpbnB1dCB3YXMKLy8gaW52aXNpYmxlIHRvIGdhdGUuY2pzLiBUaGF0IGJsb2NrZWQgdGhlIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlIGZyb20gcmVhZGluZwovLyBgL3ZlcmlmeWAncyBwZXItY3JpdGVyaW9uIHZlcmRpY3QsIHdoaWNoICMxMzI4IHN0b3JlcyBpbiBtZW1vcnlfc3RvcmUncwovLyBgbWV0YWRhdGFgIOKAlCBhbiBvYmplY3QuIFBhcnNpbmcgdGhlIHZlcmRpY3Qgb3V0IG9mIHRoZSBwcm9zZSBgdmFsdWVgIHN0cmluZwovLyBpbnN0ZWFkIHdvdWxkIHJlLWNyZWF0ZSBleGFjdGx5IHRoZSBmcmVlLXRleHQgZGVwZW5kZW5jeSAjMTMyOCByZW1vdmVkLgovLwovLyBDcm9zcy1wbGF0Zm9ybSAoUnVsZSAjMSk6IFdpbmRvd3MgY2FwcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdAovLyB+MzJLQiBhbmQgdGhlIHdob2xlIGJsb2NrIGF0IH4zMksgd2lkZSBjaGFycywgYW5kIGV4Y2VlZGluZyBpdCBmYWlscyB0aGUKLy8gc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZy4gTmV3bHktZm9yd2FyZGVkIHZhbHVlcyBhcmUgdGhlcmVmb3JlIHNraXBwZWQKLy8gd2hlbiBvdmVyc2l6ZWQsIG5vdCBjbGlwcGVkIOKAlCBhIHRydW5jYXRlZCBKU09OIGJsb2Igd291bGQgcGFyc2UgYXMgbWFsZm9ybWVkCi8vIG9uIHRoZSBmYXIgc2lkZSBhbmQgcmVhZCBhcyBhIGNvcnJ1cHQgcmVjb3JkIHJhdGhlciB0aGFuIGFuIGFic2VudCBvbmUuCi8vIGBtZXRhZGF0YWAgaXMgY2FwcGVkIGF0IDY0S0IgYnkgbWVtb3J5X3N0b3JlLCBzbyBhIHJlYWwgdmVyZGljdCBuZXZlciBuZWFycwovLyB0aGlzLiBTVFJJTkcgdmFsdWVzIGtlZXAgdGhlaXIgcHJldmlvdXMgdW5jYXBwZWQgYmVoYXZpb3VyIGJ5dGUtZm9yLWJ5dGU6Ci8vIGdhdGUuY2pzIHJlYWRzIFRPT0xfSU5QVVRfY29tbWFuZCwgYW5kIGRyb3BwaW5nIGFuIG92ZXJzaXplZCBoZXJlZG9jIGNvbW1hbmQKLy8gd291bGQgc2lsZW50bHkgc3RvcCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZCBmcm9tIGZpcmluZyBvbiB0aGUgZXhhY3QgaW5wdXRzCi8vIG1vc3Qgd29ydGggY2hlY2tpbmcuCnZhciBNQVhfU1RSVUNUVVJFRF9MRU4gPSAxNjM4NDsKaWYgKGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgPT09ICdvYmplY3QnKSB7CiAgT2JqZWN0LmtleXMoaG9va0NvbnRleHQudG9vbF9pbnB1dCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgIHZhciByYXcgPSBob29rQ29udGV4dC50b29sX2lucHV0W2tleV07CiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHsKICAgICAgZW52WydUT09MX0lOUFVUXycgKyBrZXldID0gcmF3OwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgdmFsOwogICAgaWYgKHR5cGVvZiByYXcgPT09ICdudW1iZXInIHx8IHR5cGVvZiByYXcgPT09ICdib29sZWFuJykgewogICAgICB2YWwgPSBTdHJpbmcocmF3KTsKICAgIH0gZWxzZSBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7CiAgICAgIHRyeSB7IHZhbCA9IEpTT04uc3RyaW5naWZ5KHJhdyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuOyB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm47IC8vIG51bGwvdW5kZWZpbmVkL2Z1bmN0aW9uIOKAlCBub3RoaW5nIG1lYW5pbmdmdWwgdG8gZm9yd2FyZAogICAgfQogICAgaWYgKHZhbC5sZW5ndGggPiBNQVhfU1RSVUNUVVJFRF9MRU4pIHJldHVybjsKICAgIGVudlsnVE9PTF9JTlBVVF8nICsga2V5XSA9IHZhbDsKICB9KTsKfQoKLy8gIzEzMjI6IGZvcndhcmQgdGhlIHBhcnRzIG9mIHRvb2xfcmVzcG9uc2UgdGhhdCBhY3R1YWxseSBleGlzdCwgc28gYSBnYXRlIGNhbgovLyBvYnNlcnZlIGFuIE9VVENPTUUgcmF0aGVyIHRoYW4gb25seSB0aGUgaW50ZW50IGl0IHdhcyBoYW5kZWQuCi8vCi8vIENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZCBjYXJyaWVzIE5PIGV4aXQgc3RhdHVzIOKAlCBwcm9iZWQgb24gdjIuMS4yMjAsCi8vIHRvb2xfcmVzcG9uc2UgZm9yIGEgQmFzaCBjYWxsIGlzIHtzdGRvdXQsIHN0ZGVyciwgaW50ZXJydXB0ZWQsIGlzSW1hZ2UsCi8vIG5vT3V0cHV0RXhwZWN0ZWR9LiBQb3N0VG9vbFVzZSBhbHNvIGRvZXMgbm90IGZpcmUgYXQgYWxsIHdoZW4gdGhlIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8sIHNvIHRoZSBvbmx5IGNhc2UgYSBnYXRlIGNhbiBzdGlsbCBiZSBmb29sZWQgYnkgaXMgYW4gZXhpdCBjb2RlCi8vIE1BU0tFRCBieSBhIHBpcGUgb3IgYHx8IHRydWVgLCB3aGVyZSB0aGUgcmVzcG9uc2UgbG9va3MgY2xlYW4uIFRoZSBydW5uZXIncwovLyBvd24gb3V0cHV0IGlzIHRoZSBzb2xlIHJlbWFpbmluZyBzaWduYWw7IHJlY29yZC10ZXN0LXJ1biByZWFkcyBpdCBpbiBnYXRlLmNqcy4KLy8KLy8gVGFpbCwgbm90IGhlYWQuIEV2ZXJ5IHRlc3QgcnVubmVyIHByaW50cyBpdHMgcGFzcy9mYWlsIHN1bW1hcnkgTEFTVCwgc28KLy8gY2xpcHBpbmcgdGhlIGZyb250IG9mIGEgbG9uZyBsb2cgd291bGQgZGlzY2FyZCB0aGUgZXhhY3QgbGluZXMgdGhpcyBleGlzdHMgdG8KLy8gcmVhZC4gQm91bmRzIGFyZSBkZWxpYmVyYXRlbHkgdGlnaHQg4oCUIFdpbmRvd3MgY2FwcyB0aGUgd2hvbGUgZW52aXJvbm1lbnQKLy8gYmxvY2sgYXQgfjMySyB3aWRlIGNoYXJzIGFuZCBmYWlscyB0aGUgc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZywgYW5kCi8vIFRPT0xfSU5QVVRfY29tbWFuZCBpcyBhbHJlYWR5IGZvcndhcmRlZCB1bmNhcHBlZCBhbG9uZ3NpZGUgdGhlc2UuCnZhciBNQVhfUkVTUE9OU0VfU1RET1VUID0gNDA5NjsKdmFyIE1BWF9SRVNQT05TRV9TVERFUlIgPSAyMDQ4OwpmdW5jdGlvbiB0YWlsT2YodmFsdWUsIG1heCkgewogIHJldHVybiB2YWx1ZS5sZW5ndGggPiBtYXggPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBtYXgpIDogdmFsdWU7Cn0KaWYgKGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgPT09ICdvYmplY3QnKSB7CiAgdmFyIHJlc3AgPSBob29rQ29udGV4dC50b29sX3Jlc3BvbnNlOwogIGlmICh0eXBlb2YgcmVzcC5zdGRvdXQgPT09ICdzdHJpbmcnICYmIHJlc3Auc3Rkb3V0KSB7CiAgICBlbnYuVE9PTF9SRVNQT05TRV9zdGRvdXQgPSB0YWlsT2YocmVzcC5zdGRvdXQsIE1BWF9SRVNQT05TRV9TVERPVVQpOwogIH0KICBpZiAodHlwZW9mIHJlc3Auc3RkZXJyID09PSAnc3RyaW5nJyAmJiByZXNwLnN0ZGVycikgewogICAgZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyID0gdGFpbE9mKHJlc3Auc3RkZXJyLCBNQVhfUkVTUE9OU0VfU1RERVJSKTsKICB9CiAgLy8gQm9vbGVhbiDigJQgdGhlIHN0cmluZy10eXBlZCBmb3J3YXJkaW5nIGFib3ZlIHdvdWxkIGRyb3AgaXQgc2lsZW50bHkuCiAgaWYgKHR5cGVvZiByZXNwLmludGVycnVwdGVkID09PSAnYm9vbGVhbicpIHsKICAgIGVudi5UT09MX1JFU1BPTlNFX2ludGVycnVwdGVkID0gU3RyaW5nKHJlc3AuaW50ZXJydXB0ZWQpOwogIH0KfQoKLy8gIzE0MzUg4oCUIGRlbGl2ZXIgYSBQQVNTSU5HIGdhdGUncyBhZHZpc29yeSB0byBDbGF1ZGUsIG5vdCBvbmx5IHRvIHRoZSB0cmFuc2NyaXB0LgovLwovLyBDbGF1ZGUgQ29kZSBzaG93cyBhIFByZVRvb2xVc2UvUG9zdFRvb2xVc2UgaG9vaydzIHN0ZG91dCB0byB0aGUgdXNlciBpbgovLyB0cmFuc2NyaXB0IG1vZGUgYW5kIHN0b3BzIHRoZXJlOyB0aGUgbW9kZWwgbmV2ZXIgc2VlcyBpdC4gU28gZXZlcnkgYWR2aXNvcnkKLy8gdGhlIGdhdGVzIGVtaXQgb24gdGhlIGV4aXQtMCBwYXRoIHdhcyBpbnZpc2libGUgb24gZXhhY3RseSB0aGUgcnVucyBpdCB3YXMKLy8gd3JpdHRlbiBmb3I6ICMxMzc0J3Mgb3Blbi10YXNrIGNvdW50LCB0aGUgcHJlLUFnZW50IFRhc2tDcmVhdGUgcmVtaW5kZXIsIHRoZQovLyBuYW1lc3BhY2UgaGludCwgdGhlIGRvY3Mtb25seSBhbmQgc2ltcGxpZnktYXV0by1wYXNzIG5vdGVzLiBUaGV5IHN1cmZhY2VkIG9ubHkKLy8gd2hlbiBzb21lIE9USEVSIGdhdGUgYmxvY2tlZCwgYmVjYXVzZSB0aGUgY2F0Y2ggYXJtIGJlbG93IHJlLXJvdXRlcyBlcnIuc3Rkb3V0Ci8vIHRvIHN0ZGVyciDigJQgaS5lLiBvbmx5IG9uY2UgdGhlIFBSIGhhZCBhbHJlYWR5IGJlZW4gc3RvcHBlZCBmb3IgYW5vdGhlciByZWFzb24uCi8vIEEgY29uc3VtZXIgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mgd2l0aCB0aGF0IHJlbWluZGVyICJ3b3JraW5nIi4KLy8KLy8gYGhvb2tTcGVjaWZpY091dHB1dC5hZGRpdGlvbmFsQ29udGV4dGAgaXMgdGhlIGRvY3VtZW50ZWQgY2hhbm5lbCBmcm9tIGEgcGFzc2luZwovLyB0b29sIGhvb2sgaW50byB0aGUgbW9kZWwncyBjb250ZXh0LiBXcmFwIHRoZXJlIGFuZCBub3doZXJlIGVsc2U6IFNlc3Npb25TdGFydAovLyBhbmQgVXNlclByb21wdFN1Ym1pdCBhbHJlYWR5IGluamVjdCB0aGVpciBzdGRvdXQgYXMgY29udGV4dCwgc28gd3JhcHBpbmcgdGhvc2UKLy8gd291bGQgcmV3cml0ZSBhIHdvcmtpbmcgcGF0aCBmb3Igbm90aGluZy4gQW4gdW5rbm93biBvciBhYnNlbnQgaG9va19ldmVudF9uYW1lCi8vIGZhbGxzIGJhY2sgdG8gcmF3IHN0ZG91dCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW91ci4KdmFyIEFEVklTT1JZX0VWRU5UUyA9IHsgUHJlVG9vbFVzZTogdHJ1ZSwgUG9zdFRvb2xVc2U6IHRydWUgfTsKZnVuY3Rpb24gZW1pdEFkdmlzb3J5KHRleHQpIHsKICB2YXIgZXZlbnQgPSBob29rQ29udGV4dC5ob29rX2V2ZW50X25hbWU7CiAgaWYgKCFBRFZJU09SWV9FVkVOVFNbZXZlbnRdKSB7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0ZXh0KTsKICAgIHJldHVybjsKICB9CiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkoewogICAgaG9va1NwZWNpZmljT3V0cHV0OiB7IGhvb2tFdmVudE5hbWU6IGV2ZW50LCBhZGRpdGlvbmFsQ29udGV4dDogdGV4dCB9LAogIH0pICsgJ1xuJyk7Cn0KCi8vIFJ1biBnYXRlLmNqcyB3aXRoIHRoZSBlbnJpY2hlZCBlbnZpcm9ubWVudAp2YXIgcHJvamVjdERpciA9IChlbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwp2YXIgZ2F0ZVNjcmlwdCA9IHJlc29sdmUocHJvamVjdERpciwgJy5jbGF1ZGUvaGVscGVycy9nYXRlLmNqcycpOwp0cnkgewogIHZhciBvdXRwdXQgPSBleGVjRmlsZVN5bmMoJ25vZGUnLCBbZ2F0ZVNjcmlwdCwgY29tbWFuZF0sIHsKICAgIGVudjogZW52LCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogNTAwMCwgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ3BpcGUnXSwgd2luZG93c0hpZGU6IHRydWUKICB9KTsKICBpZiAob3V0cHV0LnRyaW0oKSkgZW1pdEFkdmlzb3J5KG91dHB1dCk7CiAgcHJvY2Vzcy5leGl0KDApOwp9IGNhdGNoIChlcnIpIHsKICAvLyBnYXRlLmNqcyBleGl0KDIpID0gYmxvY2ssIGV4aXQoMSkgPSBhbHNvIGJsb2NrIGF0dGVtcHQg4oCUIHRyYW5zbGF0ZSBib3RoIHRvIGV4aXQoMikKICBpZiAoZXJyLnN0ZGVycikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZXJyLnN0ZGVycik7CiAgaWYgKGVyci5zdGRvdXQpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGVyci5zdGRvdXQpOwogIHByb2Nlc3MuZXhpdChlcnIuc3RhdHVzID09PSAyIHx8IGVyci5zdGF0dXMgPT09IDEgPyAyIDogMCk7Cn0K",
19
+ "gate.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwp2YXIgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7CnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCnZhciBQUk9KRUNUX0RJUiA9IChwcm9jZXNzLmVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBTVEFURV9GSUxFID0gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLmNsYXVkZScsICd3b3JrZmxvdy1zdGF0ZS5qc29uJyk7CgovLyB0ZXN0c0ZpbmdlcnByaW50IC8gc2ltcGxpZnlGaW5nZXJwcmludCAvIHZlcmlmeUZpbmdlcnByaW50IHBpbiBlYWNoIGNyZWRpdCB0bwovLyB0aGUgY29kZSBpdCBkZXNjcmliZXMsIHNvIGEgY2hhbmdlIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0L011bHRpRWRpdCAoYSBCYXNoCi8vIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsIHRoZSBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24pIGludmFsaWRhdGVzIGl0LgovLyBTZWUgY3JlZGl0RmluZ2VycHJpbnQoKSBmb3Igd2h5IHRoZSBib29sZWFuIGZsYWdzIGFsb25lIGNhbm5vdC4KdmFyIFNUQVRFX0RFRkFVTFRTID0geyB0YXNrc0NyZWF0ZWQ6IGZhbHNlLCB0YXNrQ291bnQ6IDAsIHRhc2tzQWNrbm93bGVkZ2VkOiBmYWxzZSwgbWVtb3J5U2VhcmNoZWQ6IGZhbHNlLCBtZW1vcnlTZWFyY2hlZEJ5OiB7fSwgbWVtb3J5UmVxdWlyZWQ6IHRydWUsIGxlYXJuaW5nc1N0b3JlZDogZmFsc2UsIHRlc3RzUnVuOiBmYWxzZSwgdGVzdHNGaW5nZXJwcmludDogbnVsbCwgc2ltcGxpZnlSdW46IGZhbHNlLCBzaW1wbGlmeVNuYXBzaG90U2hhOiBudWxsLCBzaW1wbGlmeUZpbmdlcnByaW50OiBudWxsLCB2ZXJpZnlSdW46IGZhbHNlLCB2ZXJpZnlPdXRjb21lOiBudWxsLCB2ZXJpZnlGaW5nZXJwcmludDogbnVsbCwgaW50ZXJhY3Rpb25Db3VudDogMCwgc2Vzc2lvblN0YXJ0OiBudWxsLCBsYXN0QmxvY2tlZEF0OiBudWxsLCBsYXN0TmFtZXNwYWNlSGludDogJycsIGxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5OiB7fSwgZmxNb2RlOiBudWxsLCBzd2FybUluaXRpYWxpemVkOiBmYWxzZSwgaGl2ZUluaXRpYWxpemVkOiBmYWxzZSwgc2RkTW9kZTogZmFsc2UsIGFjdGl2ZVNkZFNsdWc6IG51bGwgfTsKCi8vIFBlci1hY3RvciBtZW1vcnktc2VhcmNoIHRyYWNraW5nICgjODM4KS4gVGhlIGxlZ2FjeSBgbWVtb3J5U2VhcmNoZWRgIGJvb2xlYW4KLy8gaXMgc2Vzc2lvbi13aWRlLCBzbyBvbmNlIHRoZSBwYXJlbnQgc2VhcmNoZXMgbWVtb3J5LCBldmVyeSBzcGF3bmVkIHN1YmFnZW50Ci8vIGluaGVyaXRzIHRoZSBzYXRpc2ZpZWQgZmxhZyBhbmQgdGhlIGRpcmVjdGl2ZSdzICJXSUxMIEJMT0NLIiBwcm9taXNlIGJlY29tZXMKLy8gZmFsc2UuIFdoZW4gZ2F0ZS1ob29rLm1qcyBmb3J3YXJkcyBDbGF1ZGUgQ29kZSdzIHN0ZGluIGBzZXNzaW9uX2lkYCBhcwovLyBIT09LX1NFU1NJT05fSUQsIHByZWZlciB0aGUgcGVyLXNlc3Npb24gbWFwIHNvIGVhY2ggc3ViYWdlbnQgbXVzdCBzZWFyY2gKLy8gbWVtb3J5IGl0c2VsZiBiZWZvcmUgaXRzIGZpcnN0IEdsb2IvR3JlcC9SZWFkLiBGYWxscyBiYWNrIHRvIHRoZSBsZWdhY3kKLy8gYm9vbGVhbiB3aGVuIG5vIHNlc3Npb24gaWQgaXMgcHJlc2VudCAoQ0xJIGludm9jYXRpb25zLCB0ZXN0cywgb2xkZXIgaG9zdHMpLgpmdW5jdGlvbiBpc01lbW9yeVNlYXJjaGVkRm9yKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICBpZiAoc2lkKSB7CiAgICB2YXIgbWFwID0gc3RhdGUubWVtb3J5U2VhcmNoZWRCeSB8fCB7fTsKICAgIHJldHVybiBtYXBbc2lkXSA9PT0gdHJ1ZTsKICB9CiAgcmV0dXJuIHN0YXRlLm1lbW9yeVNlYXJjaGVkID09PSB0cnVlOwp9CgovLyBTdGFtcCB0aGUgbGVnYWN5IGJvb2wgcGx1cyAod2hlbiBIT09LX1NFU1NJT05fSUQgaXMgc2V0KSB0aGUgcGVyLWFjdG9yIG1hcC4KLy8gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQg4oCUIGNhbGxlcnMgZ2F0ZSB3cml0ZVN0YXRlKCkgb24gaXQKLy8gdG8gYXZvaWQgcmVkdW5kYW50IGZzeW5jcyBpbiB0aWdodCBiYXNoLW1lbW9yeSBsb29wcy4KZnVuY3Rpb24gbWFya01lbW9yeVNlYXJjaGVkKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICB2YXIgY2hhbmdlZCA9IGZhbHNlOwogIGlmIChzdGF0ZS5tZW1vcnlTZWFyY2hlZCAhPT0gdHJ1ZSkgeyBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgaWYgKHNpZCkgewogICAgaWYgKCFzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5KSBzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5ID0ge307CiAgICBpZiAoc3RhdGUubWVtb3J5U2VhcmNoZWRCeVtzaWRdICE9PSB0cnVlKSB7IHN0YXRlLm1lbW9yeVNlYXJjaGVkQnlbc2lkXSA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgfQogIHJldHVybiBjaGFuZ2VkOwp9CgpmdW5jdGlvbiByZWFkU3RhdGUoKSB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNUQVRFX0ZJTEUpKSB7CiAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSk7CiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHNvIG1pc3Npbmcga2V5cyAoZS5nLiBhZGRlZCBpbiBuZXdlciB2ZXJzaW9ucykgYXJlIGZpbGxlZCBpbgogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHBhcnNlZCk7CiAgICB9CiAgfSBjYXRjaCAoZSkgeyAvKiByZXNldCBvbiBjb3JydXB0aW9uICovIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMpOwp9CgpmdW5jdGlvbiB3cml0ZVN0YXRlKHMpIHsKICB0cnkgewogICAgdmFyIGRpciA9IHBhdGguZGlybmFtZShTVEFURV9GSUxFKTsKICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkocywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKLy8gTG9hZCBtb2Zsby55YW1sIGdhdGUgY29uZmlnIChkZWZhdWx0czogYWxsIGVuYWJsZWQpCmZ1bmN0aW9uIGxvYWRHYXRlQ29uZmlnKCkgewogIC8vIHZlcmlmeV9iZWZvcmVfZG9uZSBpcyBvcHQtT1VUIChkZWZhdWx0IHRydWUpLCBsaWtlIGV2ZXJ5IG90aGVyIGdhdGU6ICMxMjk0CiAgLy8gc2hpcHMgYSByZWFsIC92ZXJpZnkgc2tpbGwgYW5kIGhhcyAvZmxvIGRlbGVnYXRlIHRvIGl0LCBzbyBsZWF2aW5nIGl0IG9mZiBieQogIC8vIGRlZmF1bHQgd291bGQgbWFrZSB0aGUgZGVmYXVsdCAvZmxvIHJ1biBzaWxlbnRseSBza2lwIHRoZSBhY2NlcHRhbmNlIGNoZWNrLgogIC8vIERpc2FibGUgcGVyLXByb2plY3Qgd2l0aCBgdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZWAgb3IgcGVyLXJ1biBgLS1uby12ZXJpZnlgLgogIC8vIHRhc2tfc3RhdHVzX2dhdGUgaXMgYSBNT0RFLCBub3QgYSBib29sZWFuOiAnYmxvY2snIHwgJ3dhcm4nIHwgJ29mZicgKCMxNDM1KS4KICAvLyAjMTM3NCBzaGlwcGVkIHRoZSBvcGVuLXRhc2sgY291bnQgYXMgYSB3YXJuLW9ubHkgc3Rkb3V0IGxpbmUsIGFuZCBhIGNvbnN1bWVyCiAgLy8gc3RpbGwgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mg4oCUIGEgcmVtaW5kZXIgdGhhdCBzdXJ2aXZlZCB0ZW4KICAvLyBjb25zZWN1dGl2ZSBpZ25vcmVzIGluIG9uZSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wuIEJsb2NraW5nIGlzIHRoZSBkZWZhdWx0CiAgLy8gYmVjYXVzZSB0aGUgaG9uZXN0ICJ0aGVzZSBzdGF5IG9wZW4gb24gcHVycG9zZSIgb3V0Y29tZSBpcyBvbmUgY29tbWFuZCBhd2F5CiAgLy8gKHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWQpLCBzbyBub3RoaW5nIGhlcmUgY2FuIGRlYWRsb2NrIGEgcnVuLgogIHZhciBkZWZhdWx0cyA9IHsgbWVtb3J5X2ZpcnN0OiB0cnVlLCB0YXNrX2NyZWF0ZV9maXJzdDogdHJ1ZSwgY29udGV4dF90cmFja2luZzogdHJ1ZSwgdGVzdGluZ19nYXRlOiB0cnVlLCBzaW1wbGlmeV9nYXRlOiB0cnVlLCBsZWFybmluZ3NfZ2F0ZTogdHJ1ZSwgc3dhcm1faW52b2NhdGlvbl9nYXRlOiB0cnVlLCB2ZXJpZnlfYmVmb3JlX2RvbmU6IHRydWUsIHNkZF9nYXRlOiB0cnVlLCB0YXNrX3N0YXR1c19nYXRlOiAnYmxvY2snIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmIChjb250ZW50KSB7CiAgICAvLyBCb29sZWFuIGZvcm1zIGFyZSBhY2NlcHRlZCBzbyB0aGlzIGtleSByZWFkcyBsaWtlIGV2ZXJ5IG90aGVyIGdhdGUgaW4gdGhlCiAgICAvLyBibG9jazogYGZhbHNlYCBpcyB0aGUgc2FtZSBvcHQtb3V0IGB0ZXN0aW5nX2dhdGU6IGZhbHNlYCBpcywgYHRydWVgIG1lYW5zCiAgICAvLyBlbmZvcmNlLiBBbnl0aGluZyB1bnJlY29nbmlzZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbgogICAgLy8gc2lsZW50bHkgZGlzYWJsaW5nIHRoZSBnYXRlIOKAlCBhIHR5cG8gbXVzdCBub3QgYmUgYSBzdGVhbHRoIG9wdC1vdXQuCiAgICB2YXIgdHNnID0gL3Rhc2tfc3RhdHVzX2dhdGU6XHMqWyciXT8oYmxvY2t8d2FybnxvZmZ8ZmFsc2V8dHJ1ZSlbJyJdPy9pLmV4ZWMoY29udGVudCk7CiAgICBpZiAodHNnKSB7CiAgICAgIHZhciBtb2RlID0gdHNnWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGRlZmF1bHRzLnRhc2tfc3RhdHVzX2dhdGUgPSBtb2RlID09PSAnZmFsc2UnID8gJ29mZicgOiBtb2RlID09PSAndHJ1ZScgPyAnYmxvY2snIDogbW9kZTsKICAgIH0KICAgIGlmICgvbWVtb3J5X2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubWVtb3J5X2ZpcnN0ID0gZmFsc2U7CiAgICBpZiAoL3Rhc2tfY3JlYXRlX2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGFza19jcmVhdGVfZmlyc3QgPSBmYWxzZTsKICAgIGlmICgvY29udGV4dF90cmFja2luZzpccypmYWxzZS9pLnRlc3QoY29udGVudCkpIGRlZmF1bHRzLmNvbnRleHRfdHJhY2tpbmcgPSBmYWxzZTsKICAgIGlmICgvdGVzdGluZ19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGVzdGluZ19nYXRlID0gZmFsc2U7CiAgICBpZiAoL3NpbXBsaWZ5X2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zaW1wbGlmeV9nYXRlID0gZmFsc2U7CiAgICBpZiAoL2xlYXJuaW5nc19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubGVhcm5pbmdzX2dhdGUgPSBmYWxzZTsKICAgIGlmICgvc3dhcm1faW52b2NhdGlvbl9nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuc3dhcm1faW52b2NhdGlvbl9nYXRlID0gZmFsc2U7CiAgICAvLyBPcHQtb3V0OiBvbiBieSBkZWZhdWx0OyBkaXNhYmxlIG9ubHkgd2hlbiBleHBsaWNpdGx5IHNldCBmYWxzZS4KICAgIGlmICgvdmVyaWZ5X2JlZm9yZV9kb25lOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudmVyaWZ5X2JlZm9yZV9kb25lID0gZmFsc2U7CiAgICAvLyBzZGRfZ2F0ZSBpcyB0aGUgY2hlY2stYmVmb3JlLWltcGxlbWVudCBiYWNrc3RvcCAoIzEyOTcpLiBPcHQtb3V0OyB0aGUKICAgIC8vIGdhdGUgb25seSBmaXJlcyB3aGVuIGEgcnVuIGlzIGFjdHVhbGx5IGFybWVkIGZvciBTREQgKHNkZE1vZGUpLCBzbwogICAgLy8gbGVhdmluZyBpdCBvbiBjb3N0cyBub24tU0REIHdvcmsgbm90aGluZy4KICAgIGlmICgvc2RkX2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zZGRfZ2F0ZSA9IGZhbHNlOwogIH0KICByZXR1cm4gZGVmYXVsdHM7Cn0KCi8vIFBhcnNlIHRoZSB0b3AtbGV2ZWwgYHNkZDpgIGJsb2NrIGZyb20gbW9mbG8ueWFtbCAoIzEyOTcpLiBTY29wZWQgdG8gdGhlIGJsb2NrCi8vIGJvZHkgc28gd2UgbmV2ZXIgbWF0Y2ggYSBgZGVmYXVsdDpgIGtleSBmcm9tIGFub3RoZXIgc2VjdGlvbiAoZXBpYywgbWVyZ2UpLgovLyBDcm9zcy1wbGF0Zm9ybTogdG9sZXJhdGVzIENSTEY7IG5vIHBhdGggc2VwYXJhdG9ycyBoYXJkY29kZWQuCmZ1bmN0aW9uIGxvYWRTZGRDb25maWcoKSB7CiAgdmFyIG91dCA9IHsgZGVmYXVsdDogZmFsc2UsIHNwZWNzRGlyOiAnLm1vZmxvL3NwZWNzJyB9OwogIHZhciBjb250ZW50ID0gTU9GTE9fWUFNTDsKICBpZiAoIWNvbnRlbnQpIHJldHVybiBvdXQ7CiAgdmFyIGJsb2NrID0gY29udGVudC5tYXRjaCgvXnNkZDpbIFx0XSpccj9cbigoPzpbIFx0XSsuKig/OlxyP1xufCQpKSopL20pOwogIGlmICghYmxvY2spIHJldHVybiBvdXQ7CiAgdmFyIGJvZHkgPSBibG9ja1sxXTsKICBpZiAoL15ccypkZWZhdWx0OlxzKnRydWVcYi9pbS50ZXN0KGJvZHkpKSBvdXQuZGVmYXVsdCA9IHRydWU7CiAgdmFyIHNkID0gYm9keS5tYXRjaCgvXlxzKnNwZWNzX2RpcjpccyooLis/KVxzKiQvaW0pOwogIGlmIChzZCkgewogICAgdmFyIHYgPSBzZFsxXS5yZXBsYWNlKC9ccysjLiokLywgJycpLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICcnKS50cmltKCk7CiAgICBpZiAodikgb3V0LnNwZWNzRGlyID0gdjsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gUGFyc2UgdGhlIHRvcC1sZXZlbCBgbWVyZ2U6YCBibG9jayBmcm9tIG1vZmxvLnlhbWwgKCMxMjg1KS4gQmxvY2stc2NvcGVkIGZvcgovLyB0aGUgc2FtZSByZWFzb24gYXMgbG9hZFNkZENvbmZpZzogYSBiYXJlIGBhdXRvOmAga2V5IGNhbiBhcHBlYXIgdW5kZXIgb3RoZXIKLy8gc2VjdGlvbnMuIENyb3NzLXBsYXRmb3JtOiB0b2xlcmF0ZXMgQ1JMRi4KZnVuY3Rpb24gbG9hZE1lcmdlQ29uZmlnKCkgewogIHZhciBvdXQgPSB7IGF1dG86IGZhbHNlIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmICghY29udGVudCkgcmV0dXJuIG91dDsKICB2YXIgYmxvY2sgPSBjb250ZW50Lm1hdGNoKC9ebWVyZ2U6WyBcdF0qXHI/XG4oKD86WyBcdF0rLiooPzpccj9cbnwkKSkqKS9tKTsKICBpZiAoIWJsb2NrKSByZXR1cm4gb3V0OwogIGlmICgvXlxzKmF1dG86XHMqdHJ1ZVxiL2ltLnRlc3QoYmxvY2tbMV0pKSBvdXQuYXV0byA9IHRydWU7CiAgcmV0dXJuIG91dDsKfQoKLy8gUmVhZCBtb2Zsby55YW1sIGV4YWN0bHkgb25jZSBwZXIgZ2F0ZSBwcm9jZXNzICgjMTI5NyByZXZpZXcpOiBsb2FkR2F0ZUNvbmZpZwovLyBhbmQgbG9hZFNkZENvbmZpZyBib3RoIHBhcnNlIGl0LCBhbmQgdGhlIGdhdGUgZmlyZXMgb24gZXZlcnkgV3JpdGUvRWRpdCDigJQgYQovLyBzZWNvbmQgcmVhZCBpcyB3YXN0ZWQgc3lzY2FsbHMuIFNpbmdsZSByZWFkRmlsZVN5bmMgaW4gdHJ5L2NhdGNoIChubyBleGlzdHNTeW5jCi8vIGRvdWJsZS1zdGF0KTsgRU5PRU5UL3VucmVhZGFibGUg4oaSICcnIOKGkiBldmVyeSBwYXJzZXIgZmFsbHMgYmFjayB0byBkZWZhdWx0cy4KZnVuY3Rpb24gcmVhZE1vZmxvWWFtbCgpIHsKICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihQUk9KRUNUX0RJUiwgJ21vZmxvLnlhbWwnKSwgJ3V0Zi04Jyk7IH0KICBjYXRjaCAoZSkgeyByZXR1cm4gJyc7IH0KfQp2YXIgTU9GTE9fWUFNTCA9IHJlYWRNb2Zsb1lhbWwoKTsKCi8vICMxMzk0IOKAlCBpcyB0aGUgaG9vayB0aGF0IHRyYW5zY3JpYmVzIC92ZXJpZnkncyB2ZXJkaWN0IGludG8gd29ya2Zsb3ctc3RhdGUuanNvbgovLyBhY3R1YWxseSB3aXJlZD8gRGlzdGluZ3Vpc2hlcyAidGhlIGFnZW50IHNraXBwZWQgU3RlcCA1IiBmcm9tICJub3RoaW5nIGV4aXN0cwovLyB0byByZWNvcmQgdGhlIHZlcmRpY3QiLCB3aGljaCBuZWVkIG9wcG9zaXRlIHJlbWVkaWVzOiB0aGUgZmlyc3QgaXMgZml4ZWQgYnkKLy8gcmUtcnVubmluZyAvdmVyaWZ5LCB0aGUgc2Vjb25kIGNhbm5vdCBiZS4KLy8KLy8gRGVsaWJlcmF0ZWx5IE5PVCBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSBsaWtlIE1PRkxPX1lBTUw6IHRoaXMgaXMgb25seSBldmVyCi8vIGNvbnN1bHRlZCBvbiBhbiBhbHJlYWR5LWJsb2NrZWQgY2hlY2stYmVmb3JlLWRvbmUgcGF0aCwgc28gcmVhZGluZyBpdCBlYWdlcmx5Ci8vIHdvdWxkIGFkZCBhIHN5c2NhbGwgdG8gZXZlcnkgV3JpdGUvRWRpdCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBhbG1vc3Qgbm8gZ2F0ZQovLyBpbnZvY2F0aW9uIGFza3MuIFN1YnN0cmluZyBtYXRjaCAobm90IGEgSlNPTiB3YWxrKSBzbyBpdCBob2xkcyByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIG1hdGNoZXIgYmxvY2sgYSBjb25zdW1lcidzIGhvb2sgbGl2ZXMgaW4sIG9yIGhvdyB0aGV5IGhhbmQtZWRpdGVkIGl0LgovLyBVbnJlYWRhYmxlL21hbGZvcm1lZCBzZXR0aW5ncyDihpIgdHJ1ZSwgc28gYSBwYXJzZSBmYWlsdXJlIGZhbGxzIGJhY2sgdG8gdGhlCi8vIHByZS1leGlzdGluZyBnZW5lcmljIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGEgd2lyaW5nIGJ1ZyB0aGF0IG1heSBub3QKLy8gZXhpc3QuCmZ1bmN0aW9uIGlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpIHsKICB0cnkgewogICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcuY2xhdWRlJywgJ3NldHRpbmdzLmpzb24nKSwgJ3V0Zi04JykKICAgICAgLmluZGV4T2YoJ3JlY29yZC12ZXJpZnktb3V0Y29tZScpID49IDA7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gdHJ1ZTsgfQp9Cgp2YXIgY29uZmlnID0gbG9hZEdhdGVDb25maWcoKTsKdmFyIHNkZENvbmYgPSBsb2FkU2RkQ29uZmlnKCk7CnZhciBtZXJnZUNvbmYgPSBsb2FkTWVyZ2VDb25maWcoKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07Cgp2YXIgRVhFTVBUID0gWycuY2xhdWRlLycsICcuY2xhdWRlXFwnLCAnQ0xBVURFLm1kJywgJ01FTU9SWS5tZCcsICd3b3JrZmxvdy1zdGF0ZScsICdub2RlX21vZHVsZXMnLCAnbW9mbG8ueWFtbCddOwoKLy8gQXBwZW5kZWQgdG8gZXZlcnkgbWVtb3J5LWZpcnN0IGRlbmlhbC4gV2l0aG91dCBpdCwgYSBjb250ZXh0IGF1ZGl0IG9mIENsYXVkZQovLyBDb2RlJ3MgZGVuaWFsIHRlbGVtZXRyeSByZWFkcyBtb2ZsbydzIGdhdGUgZW5mb3JjZW1lbnRzIGFzIHBlcm1pc3Npb24tc2V0dXAKLy8gZmFpbHVyZXMgYW5kICJmaXhlcyIgdGhlbSB3aXRoIGFsbG93IHJ1bGVzIOKAlCB3aGljaCBjYW5ub3Qgb3ZlcnJpZGUgYSBob29rCi8vIGJsb2NrIGF0IGFsbCAoIzEzMDcgZmluZGluZyA1KS4gTmFtaW5nIHRoZSBnYXRlIG1ha2VzIHRoZSBjYXVzZSBzZWxmLWV2aWRlbnQuCnZhciBHQVRFX09SSUdJTl9OT1RFID0gJ1RoaXMgaXMgYSBtb2ZsbyBob29rLCBub3QgYSBDbGF1ZGUgQ29kZSBwZXJtaXNzaW9uIHJ1bGUg4oCUIGFsbG93LXJ1bGVzIGNhbm5vdCBvdmVycmlkZSBpdC4nOwoKLy8gIzEzNDgg4oCUIHRoZSBwcmUtUFIgZ2F0ZXMgYXJlIG9yZGVyLWRlcGVuZGVudCBhbmQgZWFjaCBibG9jayBtZXNzYWdlIG5hbWVkIG9ubHkKLy8gaXRzIG93biBtaXNzaW5nIGdhdGUsIHNvIGEgY2FsbGVyIGNvdWxkIHNhdGlzZnkgdGhlbSBvbmUgYXQgYSB0aW1lIGZvcmV2ZXI6Ci8vIC9mbG8tc2ltcGxpZnkgbWF5IGVkaXQgY29kZSAod2hpY2ggcmVzZXRzIHRlc3RzIGFuZCB2ZXJpZnkpLCBhbmQgL3ZlcmlmeSBtdXN0Ci8vIG5vdCwgc28gc2ltcGxpZnkgc3RyaWN0bHkgcHJlY2VkZXMgdmVyaWZ5LiBCb3RoIGJsb2NraW5nIGdhdGVzIHByaW50IHRoaXMuCi8vIC92ZXJpZnkncyBTdGVwIDUgbWVtb3J5X3N0b3JlIGNhcnJpZXMgdGhlIHZlcmRpY3QgQU5EIHN0YW1wcyBsZWFybmluZ3MsIHdoaWNoCi8vIGlzIHdoeSBsZWFybmluZ3MgaGFzIG5vIHNlcGFyYXRlIHN0ZXAgaGVyZS4KdmFyIE9SREVSX0hJTlQgPSAnT3JkZXIgdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZW06IHRlc3RzIGdyZWVuIC0+IC9mbG8tc2ltcGxpZnkgKHJlLXJ1biB0ZXN0cyBpZiBpdCBlZGl0cykgLT4gL3ZlcmlmeSAtPiBpdHMgbWVtb3J5X3N0b3JlIHZlcmRpY3QgLT4gZ2ggcHIgY3JlYXRlXG4nOwovLyAjMTQzNCDigJQgdGhlIG9sZCB0ZXh0ICgnbGVhcm5pbmdzIGhhdmUgbm90IGJlZW4gc3RvcmVkIChjYWxsIG1lbW9yeV9zdG9yZSknKQovLyBuYW1lZCB0aGUgbWVjaGFuaXNtIGJ1dCBubyBxdWFsaXR5IGJhciwgc28gdGhlIGNoZWFwZXN0IHdheSBwYXN0IGl0IHdhcyBhCi8vIHN1bW1hcnkgb2YgdGhlIHJ1biDigJQgYXVkaXQgZXhoYXVzdCB0aGF0IGRpc3BsYWNlcyByZXVzYWJsZSBsZXNzb25zIGZyb20gZXZlcnkKLy8gZnV0dXJlIGJvdW5kZWQgc2VhcmNoLiBOYW1lIHRoZSBiYXIgQU5EIHRoZSBuby13cml0ZSBwYXRoIGhlcmU6IGFuIGVzY2FwZQovLyBoYXRjaCBub2JvZHkgY2FuIGZpbmQgaXMgbm90IGFuIGVzY2FwZSBoYXRjaCAoc2VlICMxMzMyJ3MgZ2F0ZSBkZWFkbG9jaykuCi8vCi8vIFRoZSBlc2NhcGUgY29tbWFuZCBpcyBidWlsdCBmcm9tIF9fZmlsZW5hbWUsIG5vdCB3cml0dGVuIGFzIGEgcmVsYXRpdmUgcGF0aC4KLy8gVGhlIGNhbGxlciBpcyB0aGUgbW9kZWwgdHlwaW5nIGludG8gYSBCYXNoIHRvb2wsIE5PVCBhIGhvb2s6ICRDTEFVREVfUFJPSkVDVF9ESVIKLy8gaXMgdW5zZXQgdGhlcmUgKHNvIHRoZSBzZXR0aW5ncy5qc29uIGZvcm0gd291bGQgZXhwYW5kIHRvICIvLmNsYXVkZS8uLi4iKSwgYW5kIGEKLy8gYmFyZSBgLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzYCBicmVha3MgZnJvbSBhbnkgY3dkIGJ1dCB0aGUgcHJvamVjdCByb290LiBUaGUKLy8gcnVubmluZyBzY3JpcHQncyBvd24gYWJzb2x1dGUgcGF0aCBpcyBjb3JyZWN0IG9uIGV2ZXJ5IE9TIGFuZCBmcm9tIGFueSBjd2Q7Ci8vIGRvdWJsZSBxdW90ZXMgY2FycnkgV2luZG93cyBzZXBhcmF0b3JzIGFuZCBzcGFjZXMgdGhyb3VnaCB0aGUgc2hlbGwuCnZhciBMRUFSTklOR1NfTUlTU0lORyA9CiAgJ25vIGR1cmFibGUgbGVzc29uIHJlY29yZGVkLiBBIGxlc3NvbiBxdWFsaWZpZXMgb25seSBpZiBpdCB3b3VsZCBoZWxwIGEgZnV0dXJlIHNlc3Npb24gJyArCiAgJ3dvcmtpbmcgb24gYSBESUZGRVJFTlQgdGFzayDigJQgYSByZXVzYWJsZSBwYXR0ZXJuLCBhIHRyYXAsIGEgZGVjaXNpb24gKyByYXRpb25hbGUuICcgKwogICdTdG9yZSBvbmUgd2l0aCBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUgKG5hbWVzcGFjZSAibGVhcm5pbmdzIjsgdXNlICJwYXR0ZXJucyIgZm9yIGEgJyArCiAgJ3JldXNhYmxlIGNvZGUgc2hhcGUpLiBXaGF0IFRISVMgcnVuIGNoYW5nZWQgaXMgZ2l0IGhpc3Rvcnkg4oCUIGl0IGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksICcgKwogICdub3QgaW4gbWVtb3J5LiBJZiB0aGlzIHJ1biB0YXVnaHQgbm90aGluZyBuZXcsIHNheSBzbyBpbnN0ZWFkIG9mIGludmVudGluZyBvbmU6ICcgKwogICdub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic7CnZhciBHQVRFX0RJU0FCTEVfTk9URSA9ICdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogbWVtb3J5X2ZpcnN0OiBmYWxzZSc7Ci8vICMxMzM4IOKAlCBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uIHN0YXJ0IGFuZCBuZXZlcgovLyByZXNwYXducyB0aGVtLCBzbyBhIHNlc3Npb24gY2FuIG91dGxpdmUgaXRzIG1vZmxvIE1DUCBjb25uZWN0aW9uLiBOYW1pbmcgb25seQovLyBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHRoZXJlIHBvaW50cyB0aGUgcmVhZGVyIGF0IHRoZSBvbmUgdGhpbmcgdGhhdCBjYW5ub3QKLy8gd29yazsgdGhpcyBDTEkgcGF0aCBjcmVkaXRzIHRoZSBnYXRlIGlkZW50aWNhbGx5IGFuZCBuZWVkcyBubyBNQ1AuCnZhciBNQ1BfRkFMTEJBQ0tfTk9URSA9ICdJZiBtY3BfX21vZmxvX18qIHRvb2xzIGFyZSB1bmF2YWlsYWJsZSB0aGlzIHNlc3Npb24gKE1DUCBzZXJ2ZXIgbm90IGNvbm5lY3RlZCksIHRoaXMgY3JlZGl0cyB0aGUgZ2F0ZSB0b286IG5weCBmbG8gbWVtb3J5IHNlYXJjaCAtLXF1ZXJ5ICI8dG9waWM+IiAtLW5hbWVzcGFjZSA8bnM+JzsKLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgc3dhcm0vaGl2ZSBnYXRlJ3MgZXF1aXZhbGVudC4gVGhlIENMSSBydW5zIHRoZSBzYW1lCi8vIGluLXByb2Nlc3MgaGFuZGxlciBhbmQgcGVyc2lzdHMgdGhlIHN3YXJtLCBzbyBpdCBzYXRpc2ZpZXMgdGhpcyBnYXRlIGZvcgovLyByZWFsOyBpdCBpcyByZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MgKFBvc3RUb29sVXNlLCAjMTMyMikuCnZhciBDT09SRF9GQUxMQkFDS19OT1RFID0gJ0lmIG1jcF9fbW9mbG9fXyogdG9vbHMgYXJlIHVuYXZhaWxhYmxlIHRoaXMgc2Vzc2lvbiAoTUNQIHNlcnZlciBub3QgY29ubmVjdGVkKSwgdGhpcyBzYXRpc2ZpZXMgdGhlIGdhdGUgdG9vOic7CgovLyAjMTI5NCBGaW5kaW5nIDMg4oCUIHJlYWRzL3NjYW5zIG9mIEVQSEVNRVJBTCBmaWxlcyB1bmRlciB0aGUgT1MgdGVtcCBkaXIKLy8gKGJhY2tncm91bmQtdGFzayBvdXRwdXQvdHJhbnNjcmlwdHMsIGFnZW50IHNjcmF0Y2hwYWRzKSBhcmUgdHJhbnNpZW50IHRvb2wKLy8gSS9PIGFuZCBuZXZlciBjYXJyeSBpbmRleGFibGUgcHJvamVjdCBrbm93bGVkZ2UsIHNvIHRoZXkgbXVzdCBub3QgdHJpcCB0aGUKLy8gbWVtb3J5LWZpcnN0IGdhdGUuIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogb3MudG1wZGlyKCkgaXMgY29ycmVjdCBvbiBldmVyeQovLyBPUzsgd2Ugbm9ybWFsaXplIGEgbGVhZGluZyBgL3ByaXZhdGVgIG9uIGJvdGggc2lkZXMgc28gbWFjT1MncwovLyAvdmFyL2ZvbGRlcnMgKG9zLnRtcGRpcikgdnMgL3ByaXZhdGUvdmFyL2ZvbGRlcnMgKHJlYWxwYXRoKSBzeW1saW5rIHBhaXIKLy8gc3RpbGwgbWF0Y2hlcyAoQ0xBVURFLm1kICMxMTQ1KS4gTmV2ZXIgaGFyZGNvZGUgYC90bXBgLgpmdW5jdGlvbiBzdHJpcFByaXZhdGUocCkgeyByZXR1cm4gcC5pbmRleE9mKCcvcHJpdmF0ZS8nKSA9PT0gMCA/IHAuc2xpY2UoJy9wcml2YXRlJy5sZW5ndGgpIDogcDsgfQpmdW5jdGlvbiBpc0VwaGVtZXJhbFBhdGgoZnApIHsKICBpZiAoIWZwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHRtcDsKICB0cnkgeyB0bXAgPSBwYXRoLnJlc29sdmUob3MudG1wZGlyKCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIHZhciB0ID0gc3RyaXBQcml2YXRlKHRtcCk7CiAgZnVuY3Rpb24gdW5kZXIocCkgeyB2YXIgbiA9IHN0cmlwUHJpdmF0ZShwKTsgcmV0dXJuIG4gPT09IHQgfHwgbi5pbmRleE9mKHQgKyBwYXRoLnNlcCkgPT09IDA7IH0KICB2YXIgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZnApOwogIGlmICghdW5kZXIocmVzb2x2ZWQpKSByZXR1cm4gZmFsc2U7CiAgLy8gVW5kZXIgdG1wIGJ5IGxpdGVyYWwgcGF0aCDigJQgY29uZmlybSBpdCBpc24ndCBhIHN5bWxpbmsgc3RhZ2VkIGluIHRtcCB0aGF0CiAgLy8gZGVyZWZlcmVuY2VzIHRvIGEgcmVhbCBwcm9qZWN0IGZpbGUgKHJlYWxwYXRoIEJPVEggc2lkZXMsIENMQVVERS5tZCBSdWxlICMyKS4KICAvLyBPbiBFTk9FTlQgKGEgbm90LXlldC1jcmVhdGVkIHRtcCBmaWxlKSBrZWVwIHRoZSB2ZXJkaWN0IOKAlCBzdGlsbCBlcGhlbWVyYWwuCiAgdHJ5IHsgcmV0dXJuIHVuZGVyKGZzLnJlYWxwYXRoU3luYyhyZXNvbHZlZCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9Cn0KLy8gIzExNzEg4oCUIERBTkdFUk9VUyBnYWluZWQgUG93ZXJTaGVsbCBhZGRpdGlvbnMgdG8gbWF0Y2ggdGhlIG1hdGNoZXIgd2lkZW5pbmcKLy8gdGhhdCBub3cgcm91dGVzIHRoZSBkZWRpY2F0ZWQgYFBvd2VyU2hlbGxgIHRvb2wgdGhyb3VnaCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4KLy8gUE9TSVggZW50cmllcyBzdGlsbCBhcHBseSBiZWNhdXNlIFBTIHdpbGwgZXhlY3V0ZSB0aGVtIHdoZW4gaW52b2tlZC4gU3Vic3RyaW5nCi8vIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKSBpbnNpZGUgdGhlIGdhdGUuCnZhciBEQU5HRVJPVVMgPSBbCiAgJ3JtIC1yZiAvJywgJ2Zvcm1hdCBjOicsICdkZWwgL3MgL3EgYzpcXCcsICc6KCl7Onw6Jn07OicsICdta2ZzLicsICc+IC9kZXYvc2RhJywKICAvLyBQb3dlclNoZWxsIGRlc3RydWN0aXZlIHBhdHRlcm5zLiBXb24ndCBjYXRjaCBldmVyeSBhZHZlcnNhcmlhbCBzcGVsbGluZwogIC8vIChQUyBhbGlhc2VzIGxldCBgcmkgLXIgLWZvcmNlIEM6XGAgbWVhbiB0aGUgc2FtZSB0aGluZykgYnV0IGNvdmVycyB0aGUKICAvLyBjb21tb24tdHlwbyBkZXN0cnVjdGlvbiBjbGFzcyDigJQgc3ltbWV0cmljIHRvIHRoZSBQT1NJWCBsaXN0J3MgaW50ZW50LgogICdyZW1vdmUtaXRlbSAtcmVjdXJzZSAtZm9yY2UgYzpcXCcsCiAgJ3JlbW92ZS1pdGVtIC1yZWN1cnNlIC1mb3JjZSAvJywKICAncmVtb3ZlLWl0ZW0gLXJlY3Vyc2UgLWZvcmNlIH4nLAogICdmb3JtYXQtdm9sdW1lJywKICAnY2xlYXItZGlzaycsCl07CgovLyAjMTEzMiDigJQgQmFzaCBtZW1vcnktZmlyc3QgZ2F0ZS4KLy8KLy8gQ1JFRElUOiBtYXJrcyB0aGUgZ2F0ZSBzYXRpc2ZpZWQgd2hlbiBDbGF1ZGUgaW52b2tlcyBhIG1lbW9yeS1zZWFyY2ggQ0xJCi8vIChgZmxvIG1lbW9yeSBzZWFyY2hgLCBgZmxvLXNlYXJjaGAsIGBzZW1hbnRpYy1zZWFyY2gubWpzYCkgZnJvbSB0aGUgc2hlbGwg4oCUCi8vIHRoZSBlc2NhcGUgaGF0Y2ggdGhhdCBrZWVwcyB0aGUgZ2F0ZSBzYXRpc2ZpYWJsZSB3aGVuIHRoZSBtb2ZsbyBNQ1Agc2VydmVyCi8vIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHNlc3Npb24uCi8vCi8vICMxMzM4IOKAlCB0aGlzIHVzZWQgdG8gYmUgYW4gdW5hbmNob3JlZCBzdWJzdHJpbmcgdGVzdAovLyAoL3NlbWFudGljLXNlYXJjaHxtZW1vcnkgc2VhcmNofG1lbW9yeSByZXRyaWV2ZXxtZW1vcnktc2VhcmNoLykgYWdhaW5zdCB0aGUKLy8gd2hvbGUgY29tbWFuZCwgc28gYGVjaG8gIm1lbW9yeSBzZWFyY2giYCDigJQgb3IgYSBgZ2l0IGNvbW1pdCAtbWAgbWVudGlvbmluZwovLyB0aGUgcGhyYXNlIOKAlCBzYXRpc2ZpZWQgdGhlIGdhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9tcHQuIFRoYXQgaXMgdGhlCi8vIG9wcG9zaXRlIGRpc2NpcGxpbmUgZnJvbSBSRUFEX0xJS0VfQkFTSF9SRSBkaXJlY3RseSBiZWxvdywgd2hpY2ggaXMKLy8gZGVsaWJlcmF0ZWx5IGFuY2hvcmVkLiBDcmVkaXQgbm93IHJlcXVpcmVzIGEgcmVhbCBJTlZPQ0FUSU9OLCBtYXRjaGVkIGJ5Ci8vIEJBU0VOQU1FIHNvIFJ1bGUgIzEgaG9sZHM6IGBmbG9gLCBgZmxvLmNtZGAsIGBucHguY21kIGZsb2AsIGBub2RlIC4vYmluL2NsaS5qc2AKLy8gYW5kIGBub2RlIEM6XC4uLlxiaW5cY2xpLmpzYCBhbGwgY3JlZGl0LCB3aXRoIGVpdGhlciBwYXRoIHNlcGFyYXRvci4KdmFyIENSRURJVF9SVU5ORVJfUkUgPSAvXig/Om5weHxucG18cG5wbXx5YXJufGJ1bnxidW54fGRlbm98bm9kZXxub2RlanN8dHN4fHRzLW5vZGUpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIFN1Yi13b3JkcyBvZiBhIHJ1bm5lciBpbnZvY2F0aW9uIHRoYXQgYXJlIG5vdCB0aGUgZW50cnlwb2ludCBpdHNlbGYKLy8gKGBwbnBtIGRseCBmbG9gLCBgbnBtIGV4ZWMgLS0gZmxvYCwgYG5weCAteSBmbG9gKS4KdmFyIENSRURJVF9SVU5ORVJfU0tJUF9SRSA9IC9eKD86ZGx4fGV4ZWN8cnVufC15fC0teWVzfC1xfC0tcXVpZXR8LS1zaWxlbnR8LS1uby1pbnN0YWxsfC0tKSQvaTsKLy8gVGhlIG1vZmxvIENMSSwgdW5kZXIgZXZlcnkgbmFtZSBwYWNrYWdlLmpzb24gYmluZHMgaXQgdG8gKHBsdXMgdGhlIHJhdyBlbnRyeQovLyBzY3JpcHQsIGZvciBgbm9kZSBub2RlX21vZHVsZXMvbW9mbG8vYmluL2NsaS5qc2ApLgp2YXIgQ1JFRElUX0NMSV9SRSA9IC9eKD86ZmxvfG1vZmxvfGNsYXVkZS1mbG93fGNsaVwuanN8Y2xpXC5tanMpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIEEgc2VhcmNoIGVudHJ5cG9pbnQg4oCUIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlc2UgSVMgYSBtZW1vcnkgc2VhcmNoLgp2YXIgQ1JFRElUX1NFQVJDSF9CSU5fUkUgPSAvXig/OmZsby1zZWFyY2goPzpcLig/OmNtZHxleGV8YmF0fHBzMSkpP3xzZW1hbnRpYy1zZWFyY2hcLm1qcykkL2k7Ci8vIFN1YnN0cmluZyBldmVyeSBjcmVkaXRpbmcgZm9ybSBtdXN0IGNvbnRhaW4g4oCUIHRoZSBob3QtcGF0aCBwcmUtZmlsdGVyLiBDb3ZlcnMKLy8gZmxvIC8gbW9mbG8gLyBmbG8tc2VhcmNoIC8gY2xhdWRlLWZsb3cgKGFsbCBjb250YWluICJmbG8iKSwgY2xpLmpzfGNsaS5tanMsCi8vIGFuZCBzZW1hbnRpYy1zZWFyY2gubWpzLgp2YXIgQ1JFRElUX0hJTlRfUkUgPSAvZmxvfGNsaVwubT9qc3xzZW1hbnRpYy1zZWFyY2gvaTsKLy8gYGZsbyBtZW1vcnkgc2VhcmNoYCAvIGBmbG8gbWVtb3J5IHJldHJpZXZlYCwgYW5kIHRoZSBoeXBoZW4vdW5kZXJzY29yZSBzcGVsbGluZ3MuCnZhciBDUkVESVRfTUVNT1JZX1ZFUkJfUkUgPSAvXig/OnNlYXJjaHxyZXRyaWV2ZSkkL2k7CnZhciBDUkVESVRfTUVNT1JZX0NPTVBPVU5EX1JFID0gL15tZW1vcnlbLV9dKD86c2VhcmNofHJldHJpZXZlKSQvaTsKCi8qKgogKiBMYXN0IHBhdGggc2VnbWVudCBvZiBhIHRva2VuLCBsb3dlcmNhc2VkLiBTcGxpdHMgb24gQk9USCBzZXBhcmF0b3JzLCB1bmxpa2UKICogcGF0aC5iYXNlbmFtZSwgd2hpY2ggb25seSBob25vdXJzIHRoZSBIT1NUJ3Mgc2VwYXJhdG9yIChSdWxlICMxKTogYW4gYWdlbnQgb24KICogUE9TSVggY2FuIGxlZ2l0aW1hdGVseSB0eXBlIGBub2RlIC5jbGF1ZGVcc2NyaXB0c1xzZW1hbnRpYy1zZWFyY2gubWpzYCwgYW5kIGEKICogV2luZG93cy1zaGFwZWQgcGF0aCBtdXN0IHJlc29sdmUgdGhlIHNhbWUgd2hlcmV2ZXIgdGhlIGdhdGUgaGFwcGVucyB0byBydW4uCiAqLwpmdW5jdGlvbiBjb21tYW5kQmFzZW5hbWUodG9rKSB7CiAgdmFyIHQgPSB0b2sucmVwbGFjZSgvXlsiJ10rfFsiJ10rJC9nLCAnJyk7CiAgdmFyIGN1dCA9IHQubGFzdEluZGV4T2YoJy8nKTsKICB2YXIgYnMgPSB0Lmxhc3RJbmRleE9mKCdcXCcpOwogIGlmIChicyA+IGN1dCkgY3V0ID0gYnM7CiAgcmV0dXJuIChjdXQgPj0gMCA/IHQuc2xpY2UoY3V0ICsgMSkgOiB0KS50b0xvd2VyQ2FzZSgpOwp9CgovKioKICogVGhlIG1vZmxvIHN1YmNvbW1hbmQgb25lIHNoZWxsIHNlZ21lbnQgaW52b2tlcywgYXMgbG93ZXJjYXNlZCBwb3NpdGlvbmFsCiAqIGFyZ3MgKGBbJ21lbW9yeScsJ3NlYXJjaCddYCwgYFsnc3dhcm0nLCdpbml0J11gKSwgb3IgbnVsbCB3aGVuIHRoZSBzZWdtZW50CiAqIGRvZXMgbm90IGludm9rZSBtb2ZsbyBhdCBhbGwuIEEgZGVkaWNhdGVkIHNlYXJjaCBiaW5hcnkgcmVwb3J0cyB0aGUKICogc3ViY29tbWFuZCBpdCBpcyDigJQgdGhhdCBpcyBhbGwgYGZsby1zZWFyY2hgIGRvZXMuCiAqLwpmdW5jdGlvbiBtb2Zsb1N1YmNvbW1hbmQoc2VnKSB7CiAgdmFyIHRva2VucyA9IHNlZy50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgaSA9IDA7CiAgLy8gU2tpcCBzaGVsbCBub2lzZSBhaGVhZCBvZiB0aGUgZW50cnlwb2ludDogZW52IGFzc2lnbm1lbnRzIChgRk9PPWJhciBmbG8g4oCmYCksCiAgLy8gc3VkbywgcGFja2FnZSBydW5uZXJzIGFuZCB0aGVpciBmbGFncy4KICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICBpZiAodG9rID09PSAnc3VkbycgfHwgL15bQS1aYS16X11bQS1aYS16MC05X10qPS8udGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1NLSVBfUkUudGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1JFLnRlc3QoY29tbWFuZEJhc2VuYW1lKHRvaykpKSB7IGkrKzsgY29udGludWU7IH0KICAgIGJyZWFrOwogIH0KICBpZiAoaSA+PSB0b2tlbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICB2YXIgZW50cnkgPSBjb21tYW5kQmFzZW5hbWUodG9rZW5zW2ldKTsKICBpZiAoQ1JFRElUX1NFQVJDSF9CSU5fUkUudGVzdChlbnRyeSkpIHJldHVybiBbJ21lbW9yeScsICdzZWFyY2gnXTsKICBpZiAoIUNSRURJVF9DTElfUkUudGVzdChlbnRyeSkpIHJldHVybiBudWxsOwogIC8vIFBvc2l0aW9uYWwgYXJncyBhZnRlciB0aGUgQ0xJIGVudHJ5cG9pbnQ7IGZsYWdzIGNhcnJ5IG5vIHN1YmNvbW1hbmQuCiAgdmFyIHJlc3QgPSBbXTsKICBmb3IgKHZhciBqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHsKICAgIGlmICh0b2tlbnNbal0uY2hhckF0KDApICE9PSAnLScpIHJlc3QucHVzaCh0b2tlbnNbal0udG9Mb3dlckNhc2UoKSk7CiAgfQogIHJldHVybiByZXN0Owp9CgovKiogRG9lcyBvbmUgc2hlbGwgc2VnbWVudCBpbnZva2UgYSBtb2ZsbyBtZW1vcnkgc2VhcmNoPyAqLwpmdW5jdGlvbiBzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaChzZWcpIHsKICB2YXIgc3ViID0gbW9mbG9TdWJjb21tYW5kKHNlZyk7CiAgaWYgKCFzdWIgfHwgIXN1Yi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBpZiAoQ1JFRElUX01FTU9SWV9DT01QT1VORF9SRS50ZXN0KHN1YlswXSkpIHJldHVybiB0cnVlOwogIHJldHVybiBzdWJbMF0gPT09ICdtZW1vcnknICYmIHN1Yi5sZW5ndGggPiAxICYmIENSRURJVF9NRU1PUllfVkVSQl9SRS50ZXN0KHN1YlsxXSk7Cn0KCi8qKgogKiBDUkVESVQgdGVzdCBmb3IgYSB3aG9sZSBCYXNoL1Bvd2VyU2hlbGwgY29tbWFuZC4gUXVvdGVkIGJvZGllcyBhcmUgc3RyaXBwZWQKICogZmlyc3QgKHNvIGEgY29tbWl0IG1lc3NhZ2UgcXVvdGluZyAibWVtb3J5IHNlYXJjaCIgY2Fubm90IGNyZWRpdCksIHRoZW4gZWFjaAogKiBzaGVsbCBzZWdtZW50IGlzIGNoZWNrZWQgYXQgaXRzIG93biBzdGFydCDigJQgYGNkIHJlcG8gJiYgZmxvIG1lbW9yeSBzZWFyY2hgCiAqIGNyZWRpdHMsIGBlY2hvICJmbG8gbWVtb3J5IHNlYXJjaCJgIGRvZXMgbm90LgogKi8KZnVuY3Rpb24gY3JlZGl0c01lbW9yeVNlYXJjaChyYXdDbWQpIHsKICAvLyBDaGVhcCByZWplY3QgZmlyc3QuIFRoaXMgcnVucyBvbiBFVkVSWSBCYXNoIGNhbGwgaW4gZXZlcnkgY29uc3VtZXIsIGFoZWFkCiAgLy8gb2YgdGhlIGJsb2NrIGFybSdzIHJlZ2V4ZXMsIGFuZCBldmVyeSBjcmVkaXRpbmcgZm9ybSBuZWNlc3NhcmlseSBuYW1lcyBhbgogIC8vIGVudHJ5cG9pbnQgY29udGFpbmluZyBvbmUgb2YgdGhlc2Ug4oCUIHNvIG5vbi1tYXRjaGVzIGNvc3Qgb25lIHJlZ2V4LCBub3QgYQogIC8vIHN0cmlwICsgc3BsaXQgKyB0b2tlbml6ZS4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBtb2Zsb1NlZ21lbnRzKHJhd0NtZCkuc29tZShzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaCk7Cn0KCi8qKiBTaGVsbCBzZWdtZW50cyBvZiBhIGNvbW1hbmQsIHF1b3RlZCBib2RpZXMgc3RyaXBwZWQuICovCmZ1bmN0aW9uIG1vZmxvU2VnbWVudHMocmF3Q21kKSB7CiAgcmV0dXJuIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3Q21kIHx8ICcnKS5zcGxpdCgvWzt8JlxuXSsvKTsKfQoKLyoqCiAqICMxMzM4IGZvbGxvdy11cCDigJQgd2hpY2ggcHJvdGVjdGVkLWNvb3JkaW5hdGlvbiBpbml0LCBpZiBhbnksIGRpZCB0aGlzIHNoZWxsCiAqIGNvbW1hbmQgcnVuPyBSZXR1cm5zICdzd2FybScsICdoaXZlJywgb3IgbnVsbC4KICoKICogYGZsbyBzd2FybSBpbml0YCBhbmQgYGZsbyBoaXZlLW1pbmQgaW5pdGAgYXJlIE5PVCBzZWNvbmQtY2xhc3Mgc3RhbmQtaW5zIGZvcgogKiB0aGUgTUNQIHRvb2xzOiB0aGUgQ0xJIGRpc3BhdGNoZXMgaW4tcHJvY2VzcyB0aHJvdWdoIHRoZSBzYW1lIFRPT0xfUkVHSVNUUlkKICogaGFuZGxlciB0aGUgTUNQIHNlcnZlciBleHBvc2VzIChgbWNwLWNsaWVudC50c2AgY2FsbE1DUFRvb2wpLCBhbmQgdGhlCiAqIHJlc3VsdGluZyBzd2FybSBpcyBwZXJzaXN0ZWQgKCM4MDYgYWdlbnRzL3RvcG9sb2d5LCAjMTMyOSB0YXNrcyksIHNvIGEgbGF0ZXIKICogcHJvY2VzcyDigJQgaW5jbHVkaW5nIGEgcmVzdGFydGVkIE1DUCBzZXJ2ZXIg4oCUIGh5ZHJhdGVzIHRoZSBzYW1lIHN3YXJtLgogKgogKiBUaGlzIG1hdHRlcnMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uCiAqIHN0YXJ0IGFuZCBuZXZlciByZXNwYXducyB0aGVtLiBCZWZvcmUgdGhpcywgYHJlY29yZC1zd2FybS1pbml0YCBmaXJlZCBvbmx5IG9uCiAqIGBtY3BfX21vZmxvX19zd2FybV9pbml0YCwgc28gYSBzZXNzaW9uIHRoYXQgbG9zdCBpdHMgTUNQIHNlcnZlciBoaXQgdGhlICM5NTIKICogZ2F0ZSB3aXRoIE5PIHdheSB0byBzYXRpc2Z5IGl0OiBgL2ZsIC1zYCBibG9ja2VkIGV2ZXJ5IEFnZW50IHNwYXduIGFuZCB0b2xkCiAqIHRoZSByZWFkZXIgdG8gY2FsbCBhIHRvb2wgdGhhdCBkaWQgbm90IGV4aXN0IGluIHRoYXQgc2Vzc2lvbi4gVW5saWtlIHRoZQogKiBtZW1vcnkgZ2F0ZSwgdGhlcmUgd2FzIG5vdCBldmVuIGFuIHVuYWR2ZXJ0aXNlZCBlc2NhcGUuCiAqCiAqIERlbGliZXJhdGVseSB3aXJlZCBQb3N0VG9vbFVzZSwgbm90IFByZVRvb2xVc2Ugd2hlcmUgdGhlIG1lbW9yeSBjcmVkaXQgbGl2ZXM6CiAqIENsYXVkZSBDb2RlIGRvZXMgbm90IGZpcmUgUG9zdFRvb2xVc2Ugd2hlbiBhIGNvbW1hbmQgZXhpdHMgbm9uLXplcm8gKCMxMzIyKSwKICogc28gb25seSBhbiBpbml0IHRoYXQgYWN0dWFsbHkgU1VDQ0VFREVEIGNyZWRpdHMgdGhlIGdhdGUuIEEgZmFpbGVkIGluaXQgbXVzdAogKiBuZXZlciBvcGVuIGl0IOKAlCB0aGF0IHdvdWxkIGJlIHRoZSBzaWxlbnQtZGVncmFkYXRpb24gZmFpbHVyZSBDTEFVREUubWQncwogKiBwcm90ZWN0ZWQtZnVuY3Rpb25hbGl0eSBydWxlIGV4aXN0cyB0byBwcmV2ZW50LgogKi8KZnVuY3Rpb24gYmFzaENvb3JkaW5hdGlvbkluaXQocmF3Q21kKSB7CiAgLy8gQ2hlYXAgcmVqZWN0LCBzYW1lIGhvdC1wYXRoIGRpc2NpcGxpbmUgYXMgY3JlZGl0c01lbW9yeVNlYXJjaDogZXZlcnkKICAvLyBjcmVkaXRpbmcgZm9ybSBuYW1lcyBhIG1vZmxvIGVudHJ5cG9pbnQgQU5EIHRoZSBgaW5pdGAgc3ViY29tbWFuZC4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSB8fCAhL1xiaW5pdFxiL2kudGVzdChyYXdDbWQpKSByZXR1cm4gbnVsbDsKICB2YXIgc2VnbWVudHMgPSBtb2Zsb1NlZ21lbnRzKHJhd0NtZCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHN1YiA9IG1vZmxvU3ViY29tbWFuZChzZWdtZW50c1tpXSk7CiAgICBpZiAoIXN1YiB8fCBzdWIubGVuZ3RoIDwgMiB8fCBzdWJbMV0gIT09ICdpbml0JykgY29udGludWU7CiAgICBpZiAoc3ViWzBdID09PSAnc3dhcm0nKSByZXR1cm4gJ3N3YXJtJzsKICAgIC8vIGBoaXZlYCBpcyB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBmb3IgYGhpdmUtbWluZGAgKGNvbW1hbmRzL2hpdmUtbWluZC50cykuCiAgICBpZiAoc3ViWzBdID09PSAnaGl2ZS1taW5kJyB8fCBzdWJbMF0gPT09ICdoaXZlJykgcmV0dXJuICdoaXZlJzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KLy8gQkxPQ0s6IHJlYWQtbGlrZSBCYXNoIGNvbW1hbmRzIHRoYXQgYnlwYXNzIHRoZSBleGlzdGluZyBjaGVjay1iZWZvcmUtcmVhZCAvCi8vIGNoZWNrLWJlZm9yZS1zY2FuIGdhdGVzIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHNoZWxsLiBBbmNob3JlZCB0byB0aGUgc3RhcnQgb2YKLy8gdGhlIGxpbmUgc28gc3ViY29tbWFuZHMgaW5zaWRlIHBpcGVsaW5lcyBvciBgbnBtIGluc3RhbGwgZ3JlcGAgZG9uJ3QgdHJpcC4KLy8gQ292ZXJzIFBPU0lYIHJlYWQvc2VhcmNoIHRvb2xzLCBXaW5kb3dzIGNtZCBgdHlwZWAsIGFuZCBQb3dlclNoZWxsIHJlYWRlcnMuCi8vICMxMTcxIOKAlCBleHRlbmRlZCB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIGV4cGxvcmF0aW9uIGZvcm1zIG5vdyB0aGF0IHRoZSBtYXRjaGVyCi8vIHdpZGVucyB0byB0aGUgYFBvd2VyU2hlbGxgIHRvb2wuIFBsYWluIGBHZXQtQ2hpbGRJdGVtYCB3aXRob3V0IC1SZWN1cnNlIHN0YXlzCi8vIHVuY292ZXJlZCAoaXQncyBgbHNgLWVxdWl2YWxlbnQgYW5kIHBsYWluIGBsc2AgaXMgYWxsb3dlZCkuCnZhciBSRUFEX0xJS0VfQkFTSF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx4eGR8b2R8aGV4ZHVtcClcXGInLAogICdeXFxzKig/OmdyZXB8cmd8YWd8ZmdyZXB8ZWdyZXB8ZmluZHxmZClcXGInLAogICdeXFxzKnNlZFxccystblxcYicsCiAgJ15cXHMqYXdrXFxzKyg/IS4qPDwpJywKICAvLyBgdHlwZSA8cGF0aD5gIG9uIFdpbmRvd3MuIE5vIGAkYCBhbmNob3Igc28gYSBwaXBlZCBmb3JtCiAgLy8gKGB0eXBlIHNyY1xmb28udHMgfCBncmVwIHhgKSBzdGlsbCBtYXRjaGVzIGFuZCBnZXRzIGJsb2NrZWQuIFRoZSBhcmd1bWVudAogIC8vIG11c3QgY29udGFpbiBhIHNsYXNoLCBiYWNrc2xhc2gsIG9yIGRvdCDigJQgb3RoZXJ3aXNlIGl0J3MgdGhlIHNoZWxsLWJ1aWx0aW4KICAvLyBjb21tYW5kLWxvb2t1cCBmb3JtIChgdHlwZSBsc2AsIGB0eXBlIGNkYCkgd2hpY2ggdGhlIGdhdGUgaGFzIG5vIGJ1c2luZXNzCiAgLy8gYmxvY2tpbmcuIEZhbHNlLW5lZ2F0aXZlIHRyYWRlOiBleHRlbnNpb24tbGVzcyBmaWxlbmFtZXMgbGlrZSBgdHlwZSBNYWtlZmlsZWAKICAvLyBwYXNzIHRocm91Z2guIEFjY2VwdGFibGUg4oCUIHNvdXJjZSBmaWxlcyBhbGwgaGF2ZSBleHRlbnNpb25zLCBhbmQgdGhlCiAgLy8gcHJpbWFyeSByaXNrIHBhdHRlcm4gaXMgbGVha2luZyBwYXN0IHRoZSBnYXRlIHZpYSBgdHlwZSBzcmNcZm9vLnRzYC4KICAnXlxccyp0eXBlXFxzK1xcUypbXFxcXC8uXScsCiAgJ15cXHMqKD86R2V0LUNvbnRlbnR8Z2N8U2VsZWN0LVN0cmluZ3xzbHMpXFxiJywKICAvLyAjMTE3MSDigJQgUG93ZXJTaGVsbCByZWN1cnNpdmUgZXhwbG9yYXRpb24gKHBhcmFsbGVsIHRvIFBPU0lYIGBmaW5kYC9gZmRgKS4KICAvLyBUaGUgYC1SZWN1cnNlYCBmbGFnIGlzIHdoYXQgbWFrZXMgaXQgZXhwZW5zaXZlIGVub3VnaCB0byBnYXRlOyBwbGFpbgogIC8vIGBHZXQtQ2hpbGRJdGVtYCBpcyBgbHNgLXNoYXBlZCBhbmQgaW50ZW50aW9uYWxseSBub3QgYmxvY2tlZC4KICAnXlxccyooPzpHZXQtQ2hpbGRJdGVtfGdjaSlcXGJbXnxdKi1SZWN1cnNlXFxiJywKICAvLyAjMTE3MSDigJQgY21kLXN0eWxlIHJlY3Vyc2l2ZSBsaXN0aW5nIChgZGlyIC9zYCBvciBgZGlyIC9TYCkuIE9ubHkgdGhlCiAgLy8gV2luZG93cyBgL3NgIGZvcm0sIE5PVCBQT1NJWCBgZGlyIC1zYCAoc29ydC1ieS1zaXplLCB3aGVyZSBgZGlyYCBpcyBhbGlhc2VkCiAgLy8gdG8gYGxzIC1sYCBvbiBtYW55IGRpc3Ryb3MpIOKAlCBmYWxzZS1wb3NpdGl2ZSBibG9ja2luZyB0aGF0IHdvdWxkIGJyZWFrCiAgLy8gbGVnaXRpbWF0ZSBQT1NJWCBsaXN0aW5ncy4KICAnXlxccypkaXJcXGJbXnxdKlxcc1xcL1tzU11cXGInLAogIC8vICMxMTcxIOKAlCBQb3dlclNoZWxsIGhleCBkdW1wLCBwYXJhbGxlbCB0byBQT1NJWCBgeHhkYC9gaGV4ZHVtcGAuCiAgJ15cXHMqRm9ybWF0LUhleFxcYicsCl0uam9pbignfCcpLCAnaScpOwovLyBDQVJWRS1PVVQ6IGNvbW1hbmRzIHRoYXQgTE9PSyByZWFkLWxpa2UgYnV0IGFyZSBvcGVyYXRpb25hbC4gQW5jaG9yZWQgdG8gdGhlCi8vIExFQURJTkcgY29tbWFuZCDigJQgdGhlIHBpcGUtZmlsdGVyIGNhc2UgKGBucG0gdGVzdCB8IGdyZXAgRkFJTGApIGlzIGFscmVhZHkKLy8gaGFuZGxlZCBieSBSRUFEX0xJS0UncyBgXlxzKmAgYW5jaG9yIG5ldmVyIG1hdGNoaW5nIHRoZSBsZWFkaW5nIGBucG1gLCBzbwovLyB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vIHBpcGUgYXJtIGhlcmU6IGNhdGNoaW5nIHRoZSBsZWFkaW5nIGNvbW1hbmQgbGV0cwovLyBgZ3JlcCAtciBUT0RPIHNyYy8gfCBoZWFkIC01YCByZWFjaCB0aGUgQkxPQ0sgZXhpdCAod2hpY2ggaXQgbXVzdCwgdGhhdCdzCi8vIHRoZSBnYXAgdGhlIHRpY2tldCBleGlzdHMgdG8gY2xvc2UpLiAjMTEzMi4KdmFyIEJBU0hfQ0FSVkVfT1VUX1JFID0gbmV3IFJlZ0V4cChbCiAgJ15cXHMqKG5wbXxucHh8cG5wbXx5YXJufGJ1bnxub2RlfGRlbm98dHN4fHRzLW5vZGUpXFxzJywKICAnXlxccyooZ2l0fGdofGh1YilcXHMnLAogICdeXFxzKihkb2NrZXJ8a3ViZWN0bHxoZWxtfHRlcnJhZm9ybSlcXHMnLAogICdeXFxzKihjdXJsfHdnZXR8aHR0cHxmZXRjaClcXHMnLAogICdeXFxzKihqcXx5cXx4cSlcXHMnLAogICdeXFxzKihlY2hvfHByaW50Znx0cnVlfGZhbHNlfHNsZWVwfHRlc3R8XFxbKVxccycsCiAgJ15cXHMqY2F0XFxzKyg8PHw8PDwpJywKICAnXlxccypjYXRcXHMrW158XSpcXHMqPicsCiAgJ15cXHMqdGVlXFxiJywKICAvLyBMYXp5IGAuKz9gIGluc3RlYWQgb2YgYC4rXHNgIHRvIGF2b2lkIGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmcgb24gbG9uZwogIC8vIGBmaW5kYCBjb21tYW5kcyB0aGF0IGxhY2sgYSBgLWRlbGV0ZWAgLyBgLWV4ZWMgcm1gIHN1ZmZpeC4KICAnXlxccypmaW5kXFxzKy4rPy0oZGVsZXRlfGV4ZWNcXHMrcm0pXFxiJywKXS5qb2luKCd8JykpOwovLyAjMTE3MSBmb2xsb3ctdXAg4oCUIHN0cmlwIHF1b3RlZCBzdHJpbmcgYm9kaWVzIGFuZCBoZXJlZG9jIGJvZGllcyBmcm9tIGEgc2hlbGwKLy8gY29tbWFuZCBmb3IgcHVycG9zZXMgb2YgZGFuZ2Vyb3VzLXBhdHRlcm4gc3Vic3RyaW5nIG1hdGNoaW5nLiBVc2VkIGJ5Ci8vIGNoZWNrLWRhbmdlcm91cy1jb21tYW5kLiBEb2VzIE5PVCBzdHJpcCAkKC4uLikgb3IgYC4uLmAgYmVjYXVzZSB0aG9zZSBib2RpZXMKLy8gZXhlY3V0ZS4gRG91YmxlLXF1b3RlZCBzdHJpbmdzIGhhbmRsZSBlc2NhcGVkIHF1b3RlcyAoYFwiYCkgY29ycmVjdGx5IHNvCi8vIGBnaXQgY29tbWl0IC1tICJmaXggXCJYXCIiYCBzdHJpcHMgdGhlIHdob2xlIHF1b3RlZCBib2R5LCBub3QganVzdCB0aGUgZmlyc3QKLy8gYFwiYCBwYWlyLiBTaW5nbGUgcXVvdGVzIGRvbid0IGhhdmUgZXNjYXBlcyBpbiBiYXNoL3NoIOKAlCBgJ1teJ10qJ2AgaXMgZXhhY3QuCmZ1bmN0aW9uIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MoY21kKSB7CiAgdmFyIG91dCA9IGNtZDsKICAvLyBIZXJlZG9jIHRhaWw6IGA8PFRPS0VOYCwgYDw8LVRPS0VOYCwgYDw8J1RPS0VOJ2AsIGA8PCJUT0tFTiJgIHRocm91Z2ggZW5kLW9mLWlucHV0LgogIC8vIEJhc2ggaGVyZWRvY3MgYXJlIG11bHRpLWxpbmU7IGluIHNpbmdsZS1saW5lIHRvb2wgaW5wdXRzIHRoZXkgc2hvdyB1cCBhcyB0aGUKICAvLyB0YWlsIGFmdGVyIGA8PFRPS0VOYC4gQ29uc2VydmF0aXZlIHRhaWwtc3RyaXAg4oCUIGJlbmlnbiBjb250ZW50IGFmdGVyIGEgaGVyZWRvYwogIC8vIGJvZHkgb24gdGhlIHNhbWUgbG9naWNhbCBsaW5lIGlzIGFsc28gc3RyaXBwZWQsIGhhcm1sZXNzIGZvciB0aGlzIGdhdGUuCiAgLy8gVG9rZW4gY2xhc3MgaW5jbHVkZXMgYC1gIHNvIGh5cGhlbmF0ZWQgaGVyZWRvYyB0YWdzIChgPDxFTkQtT0YtRE9DYCkgbWF0Y2gKICAvLyB0aGUgZnVsbCB0b2tlbiwgbm90IGp1c3QgdGhlIGxlYWRpbmcgd29yZCDigJQgd2l0aG91dCB0aGlzIHRoZSBzdHJpcCB3b3VsZAogIC8vIGhhbHQgYXQgYDw8RU5EYCBhbmQgbGVhdmUgYC1PRi1ET0NgIHBsdXMgdGhlIGJvZHkgYXMgbGl0ZXJhbCB0ZXh0LgogIG91dCA9IG91dC5yZXBsYWNlKC88PC0/XHMqWyciXT9bXHctXStbJyJdP1tcc1xTXSokLywgJycpOwogIC8vIEhlcmUtc3RyaW5nIGA8PDx3b3JkYCDigJQgc3RyaXAgdGhlIHdvcmQuCiAgb3V0ID0gb3V0LnJlcGxhY2UoLzw8PFxzKlxTKy9nLCAnJyk7CiAgLy8gU2luZ2xlLXF1b3RlZCBzdHJpbmdzIOKAlCBubyBlc2NhcGVzIGluc2lkZSBzaW5nbGUgcXVvdGVzIGluIHNoL2Jhc2guCiAgb3V0ID0gb3V0LnJlcGxhY2UoLydbXiddKicvZywgIicnIik7CiAgLy8gRG91YmxlLXF1b3RlZCBzdHJpbmdzIOKAlCBgKD86W14iXFxdfFxcLikqYCBtYXRjaGVzIGFueXRoaW5nIGV4Y2VwdCBhbgogIC8vIHVuZXNjYXBlZCBgImAsIHNvIGVzY2FwZWQgYFwiYCBtaWQtc3RyaW5nIGRvZXNuJ3QgdGVybWluYXRlIHRoZSBzdHJpcCBlYXJseS4KICBvdXQgPSBvdXQucmVwbGFjZSgvIig/OlteIlxcXXxcXC4pKiIvZywgJyIiJyk7CiAgcmV0dXJuIG91dDsKfQoKdmFyIERJUkVDVElWRV9SRSA9IC9eKHllc3xub3x5ZWFofHllcHxub3BlfHN1cmV8b2t8b2theXxjb3JyZWN0fHJpZ2h0fGV4YWN0bHl8cGVyZmVjdClcYi9pOwp2YXIgVEFTS19SRSA9IC9cYihmaXh8YnVnfGVycm9yfGltcGxlbWVudHxhZGR8Y3JlYXRlfGJ1aWxkfHdyaXRlfHJlZmFjdG9yfGRlYnVnfHRlc3R8ZmVhdHVyZXxpc3N1ZXxzZWN1cml0eXxvcHRpbWkpXGIvaTsKCi8vIE5hbWVzcGFjZSBjbGFzc2lmaWNhdGlvbiAoIzkzMSkuIFRoZSBoaW50IHVzZWQgdG8gYmUgZW1pdHRlZCBvbiBldmVyeSBwcm9tcHQKLy8gYnkgcHJvbXB0LWhvb2subWpzIHdoaWNoIGNvc3QgfjQwIHRva2VucyDDlyBldmVyeSBwcm9tcHQgw5cgZXZlcnkgY29uc3VtZXIuCi8vIE5vdyB3ZSBjbGFzc2lmeSBoZXJlLCBzdG9yZSBvbiB3b3JrZmxvdy1zdGF0ZSwgYW5kIGxldCBjaGVjay1iZWZvcmUtYWdlbnQKLy8gZW1pdCBpdCBvbmNlIHdoZW4gQ2xhdWRlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHNwYXduIGFuIGFnZW50LgovLwovLyBTWU5DOiB0aGVzZSByZWdleGVzICsgY2xhc3NpZnlOYW1lc3BhY2VIaW50ICsgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IGFyZQovLyBkdXBsaWNhdGVkIHZlcmJhdGltIGluIHNyYy9jbGkvaW5pdC9oZWxwZXJzLWdlbmVyYXRvci50cyAodGhlIGVtYmVkZGVkCi8vIGdhdGUuY2pzIGZhbGxiYWNrIHVzZWQgYnkgYGZsbyBpbml0YCB3aGVuIHNvdXJjZSBoZWxwZXJzIGNhbid0IGJlIGxvY2F0ZWQpLgovLyBBbnkgZWRpdCB0byBlaXRoZXIgY29weSBNVVNUIGJlIGFwcGxpZWQgdG8gYm90aCDigJQgdGhlcmUgaXMgbm8gc2hhcmVkIG1vZHVsZQovLyBiZWNhdXNlIGhlbHBlcnMtZ2VuZXJhdG9yIGVtaXRzIGEgc2VsZi1jb250YWluZWQgc3RyaW5nIHRlbXBsYXRlLgp2YXIgTlNfTEVBUk5JTkdTX1JFID0gL1xiKHJlbWVtYmVyfHJlY2FsbHxpbnNpZ2h0fGxlc3NvbiBsZWFybmVkfGdvdGNoYXxwb3N0Lj9tb3J0ZW0pXGJ8d2UgKGRlY2lkfGFncmVlfGNob3NlfHNhaWQpLzsKdmFyIE5TX1RFU1RfUkUgPSAvXGIodGVzdHxzcGVjfGNvdmVyYWdlfHRlc3RlZHx0ZXN0IGNhc2V8dGVzdCBjYXNlc3x0ZXN0cyBmb3J8c3BlYyBmb3IpXGIvOwp2YXIgTlNfRVhQTElDSVQgPSBbCiAgeyBwYXR0ZXJuOiAvXGIocGF0dGVybnxjb252ZW50aW9ufGJlc3QgcHJhY3RpY2V8c3R5bGV8Y29kaW5nIHJ1bGUpXGIvLCBuczogJ3BhdHRlcm5zJywgbGFiZWw6ICdjb2RlIHBhdHRlcm5zIGFuZCBjb252ZW50aW9ucycgfSwKICB7IHBhdHRlcm46IC9cYihjb2RlLj9tYXB8ZmlsZSBzdHJ1Y3R1cmV8cHJvamVjdCBzdHJ1Y3R1cmV8ZGlyZWN0b3J5KVxiLywgbnM6ICdjb2RlLW1hcCcsIGxhYmVsOiAnY29kZWJhc2UgbmF2aWdhdGlvbicgfSwKXTsKdmFyIE5TX1BBVFRFUk5fUkVTID0gWy9cYih0ZW1wbGF0ZXxleGFtcGxlfHNpbWlsYXIgdG98aG93IGRvIHdlfGhvdyBzaG91bGQpXGIvXTsKdmFyIE5TX0RPTUFJTl9SRVMgPSBbCiAgL1xiKGd1aWRhbmNlfGd1aWRlfGRvY3N8ZG9jdW1lbnRhdGlvbnxydWxlc3xob3ctdG8pXGIvLAogIC9cYihhcmNoaXRlY3R1cmV8ZGVzaWdufGRvbWFpbnx0ZW5hbnR8bWlncmF0fHNjaGVtYXxkZXBsb3kpLywKICAvXGIocnVsZXxyZXF1aXJlbWVudHxjb25zdHJhaW50fGNvbXBsaWFuY2UpXGIvLApdOwp2YXIgTlNfTkFWX1JFUyA9IFsKICAvXGIoZmluZHx3aGVyZXx3aGljaCBmaWxlfGxvb2sgdXB8bG9jYXRlfGVuZHBvaW50fHJvdXRlfHVybHxwYXRoKVxiLywKICAvXGIoY2xhc3N8ZnVuY3Rpb258bWV0aG9kfGNvbXBvbmVudHxzZXJ2aWNlfGVudGl0eXxtb2R1bGUpXGIvLApdOwoKLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvbXB0IGludm9rZWQgL2ZsIG9yIC9mbG8gd2l0aCBhIHN3YXJtL2hpdmUgZmxhZyAoIzk1MikuCi8vIFdoZW4gc2V0LCBjaGVjay1iZWZvcmUtYWdlbnQgQkxPQ0tTIHRoZSBBZ2VudCBzcGF3biB1bnRpbCB0aGUgbWF0Y2hpbmcgTUNQIGluaXQKLy8gKG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgb3IgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQpIGhhcyBiZWVuIHJlY29yZGVkIOKAlCB0aGUgdXNlcgovLyBleHBsaWNpdGx5IG9wdGVkIGluIHRvIHRoZSBwcm90ZWN0ZWQgY29vcmRpbmF0aW9uIHN1cmZhY2UsIHNvIGZhbGxpbmcgYmFjayB0bwovLyByYXcgQWdlbnQgZGlzcGF0Y2ggc2lsZW50bHkgcmVncmVzc2VzIGhlYWRsaW5lIG1vZmxvIHByb2R1Y3QgY2FwYWJpbGl0eS4KLy8KLy8gU1lOQzogZHVwbGljYXRlZCB2ZXJiYXRpbSBpbiBzcmMvY2xpL2luaXQvaGVscGVycy1nZW5lcmF0b3IudHMuCmZ1bmN0aW9uIGRldGVjdEZsTW9kZShwcm9tcHRUZXh0KSB7CiAgdmFyIHAgPSBwcm9tcHRUZXh0IHx8ICcnOwogIGlmICghL15ccypcLyg/OmZsfGZsbylcYi9pLnRlc3QocCkpIHJldHVybiBudWxsOwogIGlmICgvKD86XnxccykoPzotc3wtLXN3YXJtKVxiLy50ZXN0KHApKSByZXR1cm4gJ3N3YXJtJzsKICBpZiAoLyg/Ol58XHMpKD86LWh8LS1oaXZlKVxiLy50ZXN0KHApKSByZXR1cm4gJ2hpdmUnOwogIHJldHVybiBudWxsOwp9CgovLyBSZXNvbHZlIHRoZSBGVUxMIHNldCBvZiAvZmxvIHJ1biBtb2RpZmllcnMgZnJvbSB0aGUgcHJvbXB0ICsgbW9mbG8ueWFtbCDigJQgdGhlCi8vIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGggZ2F0ZSBhcm1pbmcgKCMxMjk3KSBhbmQgdGhlIGF1dGhvcml0YXRpdmUKLy8gYW5ub3VuY2VtZW50IGVtaXR0ZWQgYnkgcHJvbXB0LXJlbWluZGVyLiBUd28gY29uc3VtZXJzLCBvbmUgcmVzb2x2ZXI6IGEgc2Vjb25kCi8vIGltcGxlbWVudGF0aW9uIGlzIGV4YWN0bHkgaG93IGBzZGQuZGVmYXVsdDogdHJ1ZWAgZ290IHNpbGVudGx5IGlnbm9yZWQgKHRoZQovLyBza2lsbCdzIHByb21wdCBjYXJyaWVkIGBsZXQgc2RkTW9kZSA9IGZhbHNlYCBhbmQgdGhlIG1vZGVsIGV4ZWN1dGVkIHRoZSBsaXRlcmFsKS4KLy8KLy8gUHJlY2VkZW5jZSBwZXIga2V5OiBleHBsaWNpdCAtLW5vLVggPiBleHBsaWNpdCAteC8tLVggPiBtb2Zsby55YW1sID4gYnVpbHQtaW4uCi8vIE5PVEUgdGhlIGRpZmZlcmluZyBidWlsdC1pbiBkZWZhdWx0czogc2RkIGlzIG9wdC1JTiAoZmFsc2UpLCB2ZXJpZnkgaXMgb3B0LU9VVAovLyAodHJ1ZSwgIzEyOTQpLCBtZXJnZSBpcyBvcHQtSU4gKGZhbHNlLCAjMTI4NSkuCi8vCi8vIGAtc2RgIGlzIGEgZGlzdGluY3QgdG9rZW4gZnJvbSBgLXNgIChzd2FybSk6IHRoZSBgZGAgc2l0cyBvbiB0aGUgd29yZCBib3VuZGFyeQovLyBzbyBgLXNcYmAgbmV2ZXIgbWF0Y2hlcyBgLXNkYC4KZnVuY3Rpb24gcmVzb2x2ZUZsb1J1bihwcm9tcHRUZXh0KSB7CiAgdmFyIHAgPSBwcm9tcHRUZXh0IHx8ICcnOwogIHZhciBvdXQgPSB7IGlzRmxvOiBmYWxzZSwgd29ya2Zsb3c6ICdmdWxsJywgc2RkOiBmYWxzZSwgdmVyaWZ5OiBmYWxzZSwgbWVyZ2U6IGZhbHNlLAogICAgICAgICAgICAgIHNkZFNyYzogJ2RlZmF1bHQnLCB2ZXJpZnlTcmM6ICdkZWZhdWx0JywgbWVyZ2VTcmM6ICdkZWZhdWx0JyB9OwogIGlmICghL15ccypcLyg/OmZsfGZsbylcYi9pLnRlc3QocCkpIHJldHVybiBvdXQ7CiAgb3V0LmlzRmxvID0gdHJ1ZTsKCiAgLy8gV29ya2Zsb3cgbW9kZSDigJQgZGVjaWRlcyB3aGljaCBtb2RpZmllcnMgYXJlIGV2ZW4gYXBwbGljYWJsZS4KICBpZiAoLyg/Ol58XHMpKD86LXdmfC0td29ya2Zsb3cpXGIvLnRlc3QocCkpIG91dC53b3JrZmxvdyA9ICdzcGVsbC1lbmdpbmUnOwogIGVsc2UgaWYgKC8oPzpefFxzKSg/Oi1yfC0tcmVzZWFyY2gpXGIvLnRlc3QocCkpIG91dC53b3JrZmxvdyA9ICdyZXNlYXJjaCc7CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXR8LS10aWNrZXQpXGIvLnRlc3QocCkpIG91dC53b3JrZmxvdyA9ICd0aWNrZXQnOwogIHZhciBlcGljQnJhbmNoID0gLyg/Ol58XHMpLS1lcGljLWJyYW5jaFxiLy50ZXN0KHApOwoKICBpZiAoLyg/Ol58XHMpLS1uby1zZGRcYi8udGVzdChwKSkgeyBvdXQuc2RkID0gZmFsc2U7IG91dC5zZGRTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotc2R8LS1zZGQpXGIvLnRlc3QocCkpIHsgb3V0LnNkZCA9IHRydWU7IG91dC5zZGRTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmIChzZGRDb25mLmRlZmF1bHQpIHsgb3V0LnNkZCA9IHRydWU7IG91dC5zZGRTcmMgPSAnbW9mbG8ueWFtbCBzZGQuZGVmYXVsdCc7IH0KCiAgaWYgKC8oPzpefFxzKS0tbm8tdmVyaWZ5XGIvLnRlc3QocCkpIHsgb3V0LnZlcmlmeSA9IGZhbHNlOyBvdXQudmVyaWZ5U3JjID0gJ2ZsYWcnOyB9CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXZ8LS12ZXJpZnkpXGIvLnRlc3QocCkpIHsgb3V0LnZlcmlmeSA9IHRydWU7IG91dC52ZXJpZnlTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICghY29uZmlnLnZlcmlmeV9iZWZvcmVfZG9uZSkgeyBvdXQudmVyaWZ5ID0gZmFsc2U7IG91dC52ZXJpZnlTcmMgPSAnbW9mbG8ueWFtbCBnYXRlcy52ZXJpZnlfYmVmb3JlX2RvbmUnOyB9CiAgZWxzZSB7IG91dC52ZXJpZnkgPSB0cnVlOyBvdXQudmVyaWZ5U3JjID0gJ2RlZmF1bHQnOyB9CiAgLy8gLS1zZGQgaW1wbGllcyAtLXZlcmlmeTogYSBzcGVjL3BsYW4gd2l0aG91dCBhbiBlbmZvcmNlZCB2ZXJpZnkgc3RlcCBkcmlmdHMuCiAgaWYgKG91dC5zZGQgJiYgIW91dC52ZXJpZnkgJiYgb3V0LnZlcmlmeVNyYyAhPT0gJ2ZsYWcnKSBvdXQudmVyaWZ5ID0gdHJ1ZTsKCiAgaWYgKC8oPzpefFxzKS0tbm8tbWVyZ2VcYi8udGVzdChwKSkgeyBvdXQubWVyZ2UgPSBmYWxzZTsgb3V0Lm1lcmdlU3JjID0gJ2ZsYWcnOyB9CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LW18LS1tZXJnZSlcYi8udGVzdChwKSkgeyBvdXQubWVyZ2UgPSB0cnVlOyBvdXQubWVyZ2VTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmIChtZXJnZUNvbmYuYXV0bykgeyBvdXQubWVyZ2UgPSB0cnVlOyBvdXQubWVyZ2VTcmMgPSAnbW9mbG8ueWFtbCBtZXJnZS5hdXRvJzsgfQoKICAvLyBBcHBsaWNhYmlsaXR5OiAtdC8tciBuZXZlciBpbXBsZW1lbnQsIHNvIHZlcmlmeSBpcyBhIG5vLW9wIHRoZXJlOyAtciBwcm9kdWNlcwogIC8vIG5vIGFydGlmYWN0cywgc28gc2RkIGlzIGEgbm8tb3AgdG9vIChpbiAtdCB0aGUgc3BlYy9wbGFuIGdvZXMgSU5UTyB0aGUgdGlja2V0LAogIC8vIHNvIHNkZCBzdGF5cyBvbikuIE9ubHkgYSBmdWxsIG5vbi1lcGljLWJyYW5jaCBydW4gb3BlbnMgYSBQUiB0byBtZXJnZS4KICAvLyBSZS1hdHRyaWJ1dGUgYW55dGhpbmcgYXBwbGljYWJpbGl0eSB0dXJuZWQgb2ZmLCBzbyBhIGZhbHNlIG5ldmVyIGNhcnJpZXMgdGhlCiAgLy8gc291cmNlIG9mIHRoZSB2YWx1ZSBpdCBubyBsb25nZXIgaGFzLiBUaGlzIHdob2xlIGNoYW5nZSBleGlzdHMgdG8gc3RvcCBtb2RlcwogIC8vIGJlaW5nIHJlcG9ydGVkIGluYWNjdXJhdGVseSDigJQgdGhlIGF0dHJpYnV0aW9uIGhhcyB0byBiZSBob25lc3QgdG9vLgogIGlmIChvdXQud29ya2Zsb3cgPT09ICd0aWNrZXQnIHx8IG91dC53b3JrZmxvdyA9PT0gJ3Jlc2VhcmNoJykgewogICAgaWYgKG91dC52ZXJpZnkpIG91dC52ZXJpZnlTcmMgPSBvdXQud29ya2Zsb3cgKyAnIG1vZGUgZG9lcyBub3QgaW1wbGVtZW50JzsKICAgIG91dC52ZXJpZnkgPSBmYWxzZTsKICB9CiAgaWYgKG91dC53b3JrZmxvdyA9PT0gJ3Jlc2VhcmNoJyB8fCBvdXQud29ya2Zsb3cgPT09ICdzcGVsbC1lbmdpbmUnKSB7CiAgICBpZiAob3V0LnNkZCkgb3V0LnNkZFNyYyA9IG91dC53b3JrZmxvdyArICcgbW9kZSBwcm9kdWNlcyBubyBzcGVjIGFydGlmYWN0cyc7CiAgICBvdXQuc2RkID0gZmFsc2U7CiAgfQogIGlmIChvdXQud29ya2Zsb3cgIT09ICdmdWxsJyB8fCBlcGljQnJhbmNoKSB7CiAgICBpZiAob3V0Lm1lcmdlKSBvdXQubWVyZ2VTcmMgPSBlcGljQnJhbmNoID8gJy0tZXBpYy1icmFuY2ggb3ducyBtZXJnaW5nJyA6IG91dC53b3JrZmxvdyArICcgbW9kZSBvcGVucyBubyBQUic7CiAgICBvdXQubWVyZ2UgPSBmYWxzZTsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gIzEyOTcg4oCUIGFybSB0aGUgU0REIGltcGxlbWVudCBnYXRlIGZyb20gdGhlIHVzZXIgcHJvbXB0LiBUaGluIHdyYXBwZXIgc28gdGhlCi8vIGFybWluZyBkZWNpc2lvbiBhbmQgdGhlIGFubm91bmNlZCBkZWNpc2lvbiBjYW4gbmV2ZXIgZGlzYWdyZWUuCmZ1bmN0aW9uIGRldGVjdFNkZE1vZGUocHJvbXB0VGV4dCkgewogIHJldHVybiByZXNvbHZlRmxvUnVuKHByb21wdFRleHQpLnNkZDsKfQoKLy8gUmVzb2x2ZSB0aGUgYWJzb2x1dGUgc3BlY3Mgcm9vdCB0aGUgc2FtZSB3YXkgVFMgc3BlY3NSb290IGRvZXMgKCMxMjk0KTogc3BsaXQKLy8gdGhlIC8td3JpdHRlbiBjb25maWcgdmFsdWUgb24gZWl0aGVyIHNlcGFyYXRvciwgcmVqZWN0IGFic29sdXRlL2AuLmAtZXNjYXBpbmcKLy8gdmFsdWVzLCBhbmQgZmFsbCBiYWNrIHRvIHRoZSBnaXRpZ25vcmVkIGRlZmF1bHQuIFJ1bGUgIzE6IG5vIHNlcGFyYXRvciBoYXJkY29kZWQuCmZ1bmN0aW9uIHNkZFNwZWNzUm9vdEFicygpIHsKICB2YXIgY29uZmlndXJlZCA9IChzZGRDb25mLnNwZWNzRGlyIHx8ICcubW9mbG8vc3BlY3MnKTsKICB2YXIgc2VnbWVudHMgPSBjb25maWd1cmVkLnNwbGl0KC9bXFwvXSsvKS5maWx0ZXIoQm9vbGVhbik7CiAgdmFyIGVzY2FwZXMgPSBzZWdtZW50cy5sZW5ndGggPT09IDAKICAgIHx8IHNlZ21lbnRzLmluZGV4T2YoJy4uJykgPj0gMAogICAgfHwgL14oW2EtekEtWl06fH4pJC8udGVzdChzZWdtZW50c1swXSkKICAgIHx8IGNvbmZpZ3VyZWQuY2hhckF0KDApID09PSAnLycKICAgIHx8IGNvbmZpZ3VyZWQuY2hhckF0KDApID09PSAnXFwnOwogIGlmIChlc2NhcGVzKSByZXR1cm4gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLm1vZmxvJywgJ3NwZWNzJyk7CiAgcmV0dXJuIHBhdGguam9pbi5hcHBseShwYXRoLCBbUFJPSkVDVF9ESVJdLmNvbmNhdChzZWdtZW50cykpOwp9CgovLyBJcyB0aGUgZWRpdGVkIHBhdGggaW5zaWRlIHRoZSBzcGVjcyBkaXI/IEVkaXRpbmcgc3BlYy5tZC9wbGFuLm1kIHRoZW1zZWx2ZXMgbXVzdAovLyBuZXZlciB0cmlwIHRoZSBpbXBsZW1lbnQgZ2F0ZS4gQ29tcGFyZXMgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aHMgKFJ1bGUgIzE6IHRoZQovLyBlZGl0IHBhdGggbWF5IGJlIHJlbGF0aXZlIG9yIGFic29sdXRlOyBub3JtYWxpemUgYm90aCBiZWZvcmUgdGhlIHByZWZpeCB0ZXN0KS4KZnVuY3Rpb24gaXNJbnNpZGVTcGVjc0RpcihmaWxlUGF0aCkgewogIHRyeSB7CiAgICB2YXIgcm9vdCA9IHNkZFNwZWNzUm9vdEFicygpOwogICAgdmFyIGFicyA9IHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aCkgPyBmaWxlUGF0aCA6IHBhdGgucmVzb2x2ZShQUk9KRUNUX0RJUiwgZmlsZVBhdGgpOwogICAgdmFyIHJlbCA9IHBhdGgucmVsYXRpdmUocm9vdCwgYWJzKTsKICAgIHJldHVybiByZWwgPT09ICcnIHx8ICghcmVsLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQp9CgovLyBSZWFkIHBsYW4ubWQgZnJvbnRtYXR0ZXIgZm9yIHRoZSBhY3RpdmUgc2x1ZyBhbmQgcmVwb3J0IHdoZXRoZXIgaXQgaXMgcmV2aWV3ZWQuCi8vIFB1cmUgZnMgKyByZWdleCAobm8gc3Bhd24pIHNvIGl0IHN0YXlzIGNoZWFwIG9uIGV2ZXJ5IFdyaXRlL0VkaXQuIE1hdGNoZXMgdGhlCi8vIGRvdWJsZS1xdW90ZWQgc2NhbGFyIHNlcmlhbGl6ZUFydGlmYWN0IGVtaXRzIChgc3RhdHVzOiAicmV2aWV3ZWQiYCkuCmZ1bmN0aW9uIGlzUGxhblJldmlld2VkKHNsdWcpIHsKICB0cnkgewogICAgdmFyIHBsYW5QYXRoID0gcGF0aC5qb2luKHNkZFNwZWNzUm9vdEFicygpLCBzbHVnLCAncGxhbi5tZCcpOwogICAgaWYgKCFmcy5leGlzdHNTeW5jKHBsYW5QYXRoKSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGxhblBhdGgsICd1dGYtOCcpLnJlcGxhY2UoL1xyXG4vZywgJ1xuJyk7CiAgICB2YXIgZm0gPSBjb250ZW50Lm1hdGNoKC9eLS0tXG4oW1xzXFNdKj8pXG4tLS0vKTsKICAgIGlmICghZm0pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAvXlxzKnN0YXR1czpccypbIiddP3Jldmlld2VkWyInXT9ccyokL2ltLnRlc3QoZm1bMV0pOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9Cn0KCmZ1bmN0aW9uIGNsYXNzaWZ5TmFtZXNwYWNlSGludChwcm9tcHRUZXh0KSB7CiAgdmFyIGxvd2VyID0gKHByb21wdFRleHQgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKE5TX1RFU1RfUkUudGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgInRlc3RzIiBmb3IgdGVzdCBpbnZlbnRvcnkgYW5kIGNvdmVyYWdlIGxvb2t1cHMuJzsKICBpZiAoTlNfTEVBUk5JTkdTX1JFLnRlc3QobG93ZXIpKSByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJsZWFybmluZ3MiIGZvciB1c2VyLWRpcmVjdGVkIGRlY2lzaW9ucyBhbmQgZGlzdGlsbGVkIGluc2lnaHRzLic7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBOU19FWFBMSUNJVC5sZW5ndGg7IGkrKykgewogICAgaWYgKE5TX0VYUExJQ0lUW2ldLnBhdHRlcm4udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgIicgKyBOU19FWFBMSUNJVFtpXS5ucyArICciIGZvciAnICsgTlNfRVhQTElDSVRbaV0ubGFiZWwgKyAnLic7CiAgfQogIGZvciAodmFyIGogPSAwOyBqIDwgTlNfRE9NQUlOX1JFUy5sZW5ndGg7IGorKykgewogICAgaWYgKE5TX0RPTUFJTl9SRVNbal0udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiBzZWFyY2ggImd1aWRhbmNlIiBhbmQgImxlYXJuaW5ncyIgZm9yIGRvbWFpbiBydWxlcyBhbmQgcHJvamVjdCBkZWNpc2lvbnMuJzsKICB9CiAgZm9yICh2YXIgayA9IDA7IGsgPCBOU19QQVRURVJOX1JFUy5sZW5ndGg7IGsrKykgewogICAgaWYgKE5TX1BBVFRFUk5fUkVTW2tdLnRlc3QobG93ZXIpKSByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJwYXR0ZXJucyIgZm9yIGNvZGUgcGF0dGVybnMgYW5kIGNvbnZlbnRpb25zLic7CiAgfQogIGZvciAodmFyIG0gPSAwOyBtIDwgTlNfTkFWX1JFUy5sZW5ndGg7IG0rKykgewogICAgaWYgKE5TX05BVl9SRVNbbV0udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImNvZGUtbWFwIiBmb3IgY29kZWJhc2UgbmF2aWdhdGlvbi4nOwogIH0KICByZXR1cm4gJyc7Cn0KCi8vICMxMTMyIOKAlCBjb21tYW5kLXNoYXBlIG5hbWVzcGFjZSBjbGFzc2lmaWVyIGZvciB0aGUgYmFzaC1CTE9DSyBtZXNzYWdlLgovLyBVc2VkIHdoZW4gdGhlIHByb21wdC1kZXJpdmVkIGBsYXN0TmFtZXNwYWNlSGludGAgaXMgZW1wdHkgKGUuZy4gc3ViYWdlbnRzLAovLyB3aGljaCBuZXZlciBzZWUgdGhlIHVzZXIgcHJvbXB0KSBzbyB0aGUgYmxvY2sgbWVzc2FnZSBzdGlsbCByb3V0ZXMgdG8gYQovLyB1c2VmdWwgbmFtZXNwYWNlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmljICJwaWNrIG9uZSBvZiBmaXZlIiBsaXN0LiBSZXR1cm5zIGEKLy8gZnVsbCBzZW50ZW5jZSBpbiB0aGUgc2FtZSBzaGFwZSBhcyBjbGFzc2lmeU5hbWVzcGFjZUhpbnQgc28gdGhlIEJMT0NLIGFybQovLyBjYW4gd3JpdGUgZWl0aGVyIHNvdXJjZSdzIGhpbnQgd2l0aG91dCBicmFuY2hpbmcgb24gZm9ybWF0LgovLwovLyBTWU5DOiBkdXBsaWNhdGVkIHZlcmJhdGltIGluIHNyYy9jbGkvaW5pdC9oZWxwZXJzLWdlbmVyYXRvci50cy4KZnVuY3Rpb24gY2xhc3NpZnlCYXNoTmFtZXNwYWNlSGludChjbWQpIHsKICAvLyBTZWFyY2gtbGlrZSB0b29scyDigJQgdGhlIHVzZXIgaXMgaHVudGluZyBmb3IgYSBzeW1ib2wvZmlsZSwgY29kZS1tYXAgd2lucy4KICBpZiAoL15ccyooPzpncmVwfHJnfGFnfGZncmVwfGVncmVwfGZpbmR8ZmR8U2VsZWN0LVN0cmluZ3xzbHMpXGIvaS50ZXN0KGNtZCkpIHsKICAgIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImNvZGUtbWFwIiBmb3IgY29kZWJhc2UgbmF2aWdhdGlvbi4nOwogIH0KICAvLyBSZWFkaW5nIGEgLm1kIC8gUlNUIC8gVFhULCBvciBhIHdlbGwta25vd24gZG9jIGZpbGUg4oCUIGd1aWRhbmNlL2xlYXJuaW5ncyB3aW4uCiAgLy8gYC4qYCAobm90IGBcUypgKSBzbyBmbGFnLXByZWZpeGVkIGZvcm1zIGxpa2UgYGhlYWQgLTUwIFJFQURNRS5tZGAgbWF0Y2guCiAgLy8gQW5jaG9yZWQgb24gdGhlIGxlYWRpbmcgcmVhZGVyIHNvIGEgcGlwZWQgYGNtZCB8IGdyZXAgZm9vLm1kYCBkb2Vzbid0IHRyaXAuCiAgaWYgKC9eXHMqKD86Y2F0fGhlYWR8dGFpbHxsZXNzfG1vcmV8YmF0fHR5cGV8R2V0LUNvbnRlbnR8Z2MpXGIuKlwuKD86bWR8bWR4fHJzdHx0eHQpXGIvaS50ZXN0KGNtZCkKICAgfHwgL15ccyooPzpjYXR8aGVhZHx0YWlsfGxlc3N8bW9yZXxiYXR8dHlwZXxHZXQtQ29udGVudHxnYylcYi4qXGIoPzpSRUFETUV8Q0xBVURFfENIQU5HRUxPR3xDT05UUklCVVRJTkd8TElDRU5TRSlcYi9pLnRlc3QoY21kKSkgewogICAgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHNlYXJjaCAiZ3VpZGFuY2UiIGFuZCAibGVhcm5pbmdzIiBmb3IgcHJvamVjdCBydWxlcyBhbmQgZGVjaXNpb25zLic7CiAgfQogIHJldHVybiAnJzsKfQoKLy8gQXBwbHkgcGVyLXByb21wdCBzdGF0ZSByZXNldCBzaGFyZWQgYnkgYHByb21wdC1yZW1pbmRlcmAgKGZ1bGwpIGFuZAovLyBgcHJvbXB0LXN0YXRlLXJlc2V0YCAoZGVmZW5zaXZlIHNhZmV0eS1uZXQsIG5vIGVtaXNzaW9uKS4gSWRlbXBvdGVudCDigJQgYm90aAovLyBVc2VyUHJvbXB0U3VibWl0IGhvb2tzIGNhbiBydW4gaXQgd2l0aG91dCBjb21wb3VuZGluZyBhbnkgZmllbGQuIENhbGxlcgovLyBvd25zIGludGVyYWN0aW9uQ291bnQgYW5kIHRoZSB1c2VyLXZpc2libGUgUkVNSU5ERVIvQ29udGV4dCBlbWlzc2lvbnMsIHNvCi8vIHRoaXMgaGVscGVyIHN0YXlzIHNpbGVudC4KZnVuY3Rpb24gYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KHN0YXRlLCBwcm9tcHRUZXh0KSB7CiAgLy8gIzM1Mi8jMTMzMSDigJQgdGhpcyBpcyB0aGUgT05MWSBwbGFjZSB0aGUgbWVtb3J5IGdhdGUgcmVzZXRzLiBEZWxpYmVyYXRlbHkKICAvLyBOT1Qgb24gdGFzayB0cmFuc2l0aW9uczogd2l0aGluIGEgc2luZ2xlIHByb21wdCAoZS5nLiBhIC9mbG8gd29ya2Zsb3cpCiAgLy8gbWVtb3J5IHN0YXlzIHNlYXJjaGVkIHNvIFJlYWQvR3JlcCBhcmVuJ3QgYmxvY2tlZCBtaWQtZXhlY3V0aW9uLiBBCiAgLy8gYFRhc2tVcGRhdGVgLWRyaXZlbiByZXNldCB3b3VsZCByZS1ibG9jayB0aGUgYWdlbnQgaGFsZndheSB0aHJvdWdoIGl0cyBvd24KICAvLyB3b3JrZmxvdy4gVGhlIHJhdGlvbmFsZSB1c2VkIHRvIGxpdmUgb24gdGhlIGBjaGVjay10YXNrLXRyYW5zaXRpb25gIGNhc2UsCiAgLy8gd2hpY2ggaXMgd2h5IHRoYXQgY2FzZSBpcyBhbiBlbXB0eSBuby1vcDsgIzEzMzEgdW53aXJlZCB0aGUgaG9vayBhbmQgbW92ZWQKICAvLyB0aGUgcmVhc29uaW5nIGhlcmUsIHdoZXJlIHRoZSByZXNldCBpdCBkZXNjcmliZXMgYWN0dWFsbHkgaGFwcGVucy4KICBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IGZhbHNlOwogIC8vIFdpcGUgcGVyLWFjdG9yIG1lbW9yeSB0cmFja2luZyB0b28g4oCUIGEgbmV3IHVzZXIgcHJvbXB0IGlzIGEgZnJlc2ggd2luZG93CiAgLy8gZm9yIGJvdGggcGFyZW50IEFORCBhbnkgc3ViYWdlbnRzIHRoZSBwYXJlbnQgbWF5IHNwYXduIGR1cmluZyB0aGlzIHR1cm4uCiAgc3RhdGUubWVtb3J5U2VhcmNoZWRCeSA9IHt9OwogIC8vIGxlYXJuaW5nc1N0b3JlZCBpcyBzZXNzaW9uLXNjb3BlZCDigJQgb25jZSBzdG9yZWQsIGl0IHN0YXlzIHRydWUgdW50aWwgc2Vzc2lvbiByZXNldC4KICAvLyBSZXNldHRpbmcgcGVyLXByb21wdCBjYXVzZWQgZmFsc2UgYmxvY2tzIHdoZW4gUFIgY3JlYXRpb24gd2FzIG9uIGEgbGF0ZXIgcHJvbXB0LgogIHZhciBESVJFQ1RJVkVfTUFYX0xFTiA9IDIwOwogIHZhciBlc2NhcGVkID0gL15AQFxzKi8udGVzdChwcm9tcHRUZXh0IHx8ICcnKTsKICBzdGF0ZS5tZW1vcnlSZXF1aXJlZCA9ICFlc2NhcGVkICYmIChwcm9tcHRUZXh0IHx8ICcnKS5sZW5ndGggPj0gNCAmJiAoVEFTS19SRS50ZXN0KHByb21wdFRleHQgfHwgJycpIHx8IChwcm9tcHRUZXh0IHx8ICcnKS5sZW5ndGggPiBESVJFQ1RJVkVfTUFYX0xFTik7CiAgLy8gU3Rhc2ggbmFtZXNwYWNlIGhpbnQgZm9yIGNoZWNrLWJlZm9yZS1hZ2VudCB0byBlbWl0IHdoZW4gQ2xhdWRlIGFjdHVhbGx5CiAgLy8gc3Bhd25zIGFuIEFnZW50ICgjOTMxKS4gRW1wdHkgc3RyaW5nIHdoZW4gbm90aGluZyBtYXRjaGVkIOKAlCBvdmVyd3JpdGluZwogIC8vIGFueSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBwcm9tcHQuCiAgc3RhdGUubGFzdE5hbWVzcGFjZUhpbnQgPSBjbGFzc2lmeU5hbWVzcGFjZUhpbnQocHJvbXB0VGV4dCk7CiAgLy8gUGVyLWFjdG9yIGVtaXNzaW9uIHRyYWNraW5nIOKAlCBlYWNoIHN1YmFnZW50J3Mgc2Vzc2lvbiBnZXRzIHRoZSBoaW50IGF0CiAgLy8gbW9zdCBvbmNlIHBlciBwcm9tcHQsIGJ1dCBhIGZyZXNoIHByb21wdCByZXNldHMgZXZlcnkgYWN0b3IncyB3aW5kb3cgc28KICAvLyBzdWJzZXF1ZW50IGFnZW50cyAocGFyZW50ICsgc3ViYWdlbnRzIHRoYXQgc3Bhd24gdGhlaXIgb3duIGFnZW50cykgYWxsCiAgLy8gc2VlIHRoZSBuZXcgY2xhc3NpZmljYXRpb24gb24gdGhlaXIgZmlyc3QgY2hlY2stYmVmb3JlLWFnZW50LgogIHN0YXRlLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5ID0ge307CiAgLy8gIzk1MiDigJQgZGVyaXZlIGZsTW9kZSBmcm9tIHRoZSB1c2VyIHByb21wdCwgYW5kIHJlc2V0IHRoZSBtYXRjaGluZyBpbml0CiAgLy8gZmxhZy4gRWFjaCAvZmwgaW52b2NhdGlvbiBtdXN0IGNhbGwgaXRzIHByb3RlY3RlZCBNQ1AgaW5pdDsgdGhlIHByZXZpb3VzCiAgLy8gcHJvbXB0J3Mgc3dhcm0vaGl2ZSByZWdpc3RyYXRpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGlzIHByb21wdCdzIGdhdGUuCiAgc3RhdGUuZmxNb2RlID0gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpOwogIHN0YXRlLnN3YXJtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICBzdGF0ZS5oaXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAvLyAjMTI5NyDigJQgYXJtL2Rpc2FybSB0aGUgU0REIGltcGxlbWVudCBnYXRlIHBlciBwcm9tcHQuIEEgZnJlc2ggL2ZsbyBydW4gc3RhcnRzCiAgLy8gd2l0aCBubyBhY3RpdmUgc2x1ZzsgYGZsbyBzZGQgc3BlY2Agc3RhbXBzIGFjdGl2ZVNkZFNsdWcgZHVyaW5nIHRoZSBydW4uCiAgc3RhdGUuc2RkTW9kZSA9IGRldGVjdFNkZE1vZGUocHJvbXB0VGV4dCk7CiAgc3RhdGUuYWN0aXZlU2RkU2x1ZyA9IG51bGw7Cn0KLy8gTWF0Y2ggbnBtL3lhcm4vcG5wbS9idW4gdGVzdCwgbnB4IHZpdGVzdHxqZXN0fC4uLiwgYmFyZSBydW5uZXJzIGF0IGNvbW1hbmQtc3RhcnQgb25seSwKLy8gYW5kIGxhbmd1YWdlLW5hdGl2ZSB0ZXN0IGNvbW1hbmRzLiBUaGUgYmFyZS1ydW5uZXIgYXJtIGlzIGFuY2hvcmVkIHNvIHRoYXQKLy8gYG5wbSBpbnN0YWxsIGplc3RgLCBgZ3JlcCAtciB2aXRlc3Qgc3JjL2AsIGFuZCBzaW1pbGFyIGRvbid0IGZhbHNlLXBvc2l0aXZlLgp2YXIgVEVTVF9SVU5ORVJfUkUgPSAvKD86XnxbXmEtel0pKD86bnBtfHlhcm58cG5wbXxidW4pXHMrKD86cnVuXHMrKT8oPzp0ZXN0fHQpKD86Wzpcc118JCl8XGIoPzpucHh8cG5weClccysoPzp2aXRlc3R8amVzdHxtb2NoYXxhdmF8dGFwfGphc21pbmV8cHl0ZXN0KVxifCg/Ol58O3wmJnxcfFx8KVxzKig/OnZpdGVzdHxqZXN0fHB5dGVzdHxtb2NoYXxqYXNtaW5lfHRhcHxhdmEpXHN8XGIoPzpjYXJnb3xnb3xkZW5vfGRvdG5ldHxtdm4pXHMrdGVzdFxifFxiZ3JhZGxlXHcqXHMrdGVzdFxiL2k7Ci8vICMxMzIyIOKAlCBmYWlsdXJlIG1hcmtlcnMgaW4gYSB0ZXN0IHJ1bm5lcidzIG93biBPVVRQVVQuCi8vCi8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhbiBleGl0LWNvZGUgY2hlY2s6IENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZAovLyBjYXJyaWVzIG5vIGV4aXQgc3RhdHVzLCBhbmQgUG9zdFRvb2xVc2UgZG9lcyBub3QgZmlyZSBhdCBhbGwgd2hlbiBhIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8g4oCUIHNvIGFuIHVubWFza2VkIHJlZCBzdWl0ZSBhbHJlYWR5IGxlYXZlcyB0ZXN0c1J1biBmYWxzZSwgYnkKLy8gYWNjaWRlbnQgb2YgdGhlIGhvb2sgbGlmZWN5Y2xlIHJhdGhlciB0aGFuIGJ5IGRlc2lnbi4gV2hhdCBET0VTIGRlZmVhdCB0aGUKLy8gZ2F0ZSBpcyBhIG1hc2tlZCBleGl0IChgbnBtIHRlc3QgfCB0YWlsIC0yMGAsIGBucG0gdGVzdCB8fCB0cnVlYCwKLy8gYG5wbSB0ZXN0IDI+JjEgfCBncmVwIC1pIGZhaWxgKTogdGhlIHBpcGVsaW5lIGV4aXRzIDAsIFBvc3RUb29sVXNlIGZpcmVzIHdpdGgKLy8gYSBjbGVhbi1sb29raW5nIHJlc3BvbnNlLCBhbmQgYSByZWQgc3VpdGUgY3JlZGl0cyB0aGUgZ2F0ZS4gT3V0cHV0IGlzIHRoZSBvbmx5Ci8vIHNpZ25hbCBsZWZ0LCBhbmQgaXQgaXMgZ2VudWluZWx5IHdlYWtlciB0aGFuIGEgc3RhdHVzIOKAlCBzZWUgdGhlIHRpY2tldC4KLy8KLy8gRXZlcnkgYXJtIG1hdGNoZXMgYSBTVU1NQVJZIHNoYXBlIGEgcnVubmVyIGVtaXRzLCBuZXZlciBhIGJhcmUgImZhaWwiLCB3aGljaAovLyBvY2N1cnMgY29uc3RhbnRseSBpbiBvcmRpbmFyeSBwYXNzaW5nIHRlc3QgbmFtZXMgKCJyZXR1cm5zIG51bGwgd2hlbiB0aGUKLy8gbG9va3VwIGZhaWxlZCIpLiBUaGUgY291bnQgYXJtIGV4Y2x1ZGVzIGFuIGV4cGxpY2l0IHplcm8gc28gamVzdCdzCi8vIGAwIGZhaWxlZCwgMTIgcGFzc2VkYCBjYW5ub3Qgc2VsZi1ibG9jay4KLy8KLy8gVGhlIGNvdW50IGFybSdzIHRyYWlsaW5nIGxvb2thaGVhZCBpcyB3aGF0IGtlZXBzIGEgR1JFRU4gcnVuIGZyb20gYmxvY2tpbmcKLy8gaXRzZWxmLiBNb2NoYSdzIGRlZmF1bHQgc3BlYyByZXBvcnRlciBwcmludHMgZXZlcnkgcGFzc2luZyB0ZXN0IG5hbWUsIHNvCi8vIGBucG0gdGVzdCB8IHRhaWwgLTIwYCBvbiBhIGdyZWVuIHN1aXRlIGxlZ2l0aW1hdGVseSBjb250YWlucyBsaW5lcyBsaWtlCi8vIGDinJMgaGFuZGxlcyAyIGZhaWxlZCByZXRyaWVzYC4gQSByZWFsIHN1bW1hcnkgaXMgZm9sbG93ZWQgYnkgYSBkZWxpbWl0ZXIgb3IgYQovLyBsaW5lIGVuZCAoYDMgZmFpbGVkIHwgNDAgcGFzc2VkYCwgYDEgZmFpbGVkLCAyIHBhc3NlZGAsIGAxIGZhaWxpbmdgKSwgbmV2ZXIgYnkKLy8gbW9yZSBwcm9zZSDigJQgc28gYSBsb3dlcmNhc2Ugd29yZCBhZnRlciB0aGUgY291bnQgbWVhbnMgaXQgaXMgYSBzZW50ZW5jZSwgbm90IGEKLy8gdGFsbHkuIGB0ZXN0c2AvYHRlc3RgIGlzIGV4ZW1wdGVkIGJlY2F1c2UgYDIgZmFpbGVkIHRlc3RzYCBpcyBhIHJlYWwgc3VtbWFyeS4KLy8gU2FtZS1saW5lIHdoaXRlc3BhY2Ugb25seTogYXQgYSBsaW5lIGVuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3F1YWxpZnkuCnZhciBURVNUX0ZBSUxVUkVfUkUgPSBuZXcgUmVnRXhwKFsKICAnXFxiKD8hMFxcYilcXGQrXFxzKyg/OnRlc3RzP1xccyspPyg/OmZhaWxlZHxmYWlsaW5nfGZhaWx1cmVzPylcXGIoPyFbXlxcU1xcbl0rKD8hdGVzdHM/XFxiKVthLXpdKScsIC8vIHZpdGVzdC9qZXN0L3B5dGVzdC9tb2NoYSBjb3VudHMKICAnXlxccyooPzpGQUlMfEZBSUxFRClcXGInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpdGVzdCArIGplc3QgcGVyLWZpbGUsIHB5dGVzdCBGQUlMRUQKICAnXlxccyotLS1cXHMqRkFJTDonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRlc3QKICAnXFxidGVzdCByZXN1bHQ6XFxzKkZBSUxFRFxcYicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcmdvCiAgJ15ucG0gRVJSIScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBucG0gd3JhcHBlciBhcm91bmQgYW55IG9mIHRoZSBhYm92ZQpdLmpvaW4oJ3wnKSwgJ2ltJyk7CgovKioKICogIzEzMjIg4oCUIHdoeSBhIGp1c3QtZmlyZWQgcmVjb3JkLXRlc3QtcnVuIG11c3QgTk9UIGJlIGNyZWRpdGVkLCBvciBudWxsLgogKgogKiBBYnNlbnQgb3V0cHV0IGlzIG5vdCBldmlkZW5jZSBvZiBmYWlsdXJlOiBhIHF1aWV0IGdyZWVuIGBucG0gdGVzdCA+IC9kZXYvbnVsbGAKICogYW5kIGEgc2lsZW50bHktbWFza2VkIHJlZCBvbmUgYXJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgdHJlYXRpbmcgdGhlIHBhaXIgYXMKICogZmFpbHVyZXMgd291bGQgYmxvY2sgZXZlcnkgY29uc3VtZXIgd2hvIHJlZGlyZWN0cyB0ZXN0IG91dHB1dC4gQWJzZW50IG1lYW5zCiAqIHVua25vd24sIGFuZCB1bmtub3duIGtlZXBzIHRoZSBwcmUtIzEzMjIgYmVoYXZpb3VyLgogKi8KZnVuY3Rpb24gZGV0ZWN0VGVzdEZhaWx1cmUoKSB7CiAgaWYgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0VfaW50ZXJydXB0ZWQgPT09ICd0cnVlJykgcmV0dXJuICd0aGUgcnVuIHdhcyBpbnRlcnJ1cHRlZCc7CiAgdmFyIG91dCA9IChwcm9jZXNzLmVudi5UT09MX1JFU1BPTlNFX3N0ZG91dCB8fCAnJykgKyAnXG4nICsgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyIHx8ICcnKTsKICBpZiAoIW91dC50cmltKCkpIHJldHVybiBudWxsOwogIHZhciBoaXQgPSBvdXQubWF0Y2goVEVTVF9GQUlMVVJFX1JFKTsKICByZXR1cm4gaGl0ID8gJ291dHB1dCByZXBvcnRzICInICsgaGl0WzBdLnRyaW0oKS5zbGljZSgwLCA0MCkgKyAnIicgOiBudWxsOwp9Ci8vIEVkaXRzIHRvIHRoZXNlIGRvbid0IGNoYW5nZSBydW50aW1lIGJlaGF2aW91ciwgc28gdGhleSBkb24ndCBpbnZhbGlkYXRlIHByaW9yIHRlc3Qvc2ltcGxpZnkgcnVucy4KLy8gTG9jayBmaWxlcyBhbmQgLmdpdGlnbm9yZSBhcmUgdHJhY2tlZCBidXQgaW5lcnQ7IHBhY2thZ2UuanNvbi8qLnlhbWwgQVJFIHNvdXJjZSDigJQgdGhleSByZXNldC4KdmFyIEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xsb2NrfGdpdGlnbm9yZSkkfCg/Ol58W1xcXC9dKShDSEFOR0VMT0coPzpcLm1kKT98XC5lbnZcLmV4YW1wbGV8cGFja2FnZS1sb2NrXC5qc29ufHBucG0tbG9ja1wueWFtbHx5YXJuXC5sb2NrfGJ1blwubG9ja2IpJC9pOwovLyAjMTE3NiDigJQgcGF0aC1iYXNlZCBpbmVydCBtYXJrZXJzLiBUaGUgZXh0ZW5zaW9uLWJhc2VkIFJFIGFib3ZlIGNhbid0IGNvdmVyCi8vIGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgd2l0aG91dCBhbHNvIGV4ZW1wdGluZyBgbW9mbG8ueWFtbGAgLyBgdHNjb25maWcueWFtbGAKLy8gKHdoaWNoIEFSRSBzb3VyY2UpLiBBbmNob3Igb24gdGhlIEdpdEh1Yi1tZXRhIGRpcmVjdG9yaWVzIHRoYXQgaG9sZCBDSSBjb25maWcKLy8gYW5kIHRlbXBsYXRlIHNjYWZmb2xkcyDigJQgZWRpdGluZyB0aG9zZSBkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZSBzdXJmYWNlLCBzbwovLyB0aGV5IHNob3VsZG4ndCByZXNldCB0ZXN0c1J1bi9zaW1wbGlmeVJ1biB0aGUgd2F5IGEgcmVhbCBzb3VyY2UgZWRpdCBkb2VzLgovLyBUcmFpbGluZyB0ZXJtaW5hdG9yIGluY2x1ZGVzIGAuYCBzbyB0aGUgc2luZ2xlLWZpbGUgdGVtcGxhdGUgZm9ybQovLyBgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWRgIG1hdGNoZXMgYWxvbmdzaWRlIHRoZSBkaXJlY3RvcnkgZm9ybS4KLy8gIzEzNDgg4oCUIGAubW9mbG8vYCBqb2lucyB0aGVtLiBJdCBpcyBtb2ZsbydzIG93biBnaXRpZ25vcmVkIHN0YXRlIGRpcmVjdG9yeQovLyAoZGFlbW9uIGxvY2tzLCBtZW1vcnkgZGIsIFNERCBzcGVjL3BsYW4gYXJ0aWZhY3RzKSwgc28gbm90aGluZyB3cml0dGVuIHRoZXJlCi8vIGNhbiBhcHBlYXIgaW4gdGhlIGJyYW5jaCBkaWZmLCBhbmQgYSBzcGVjIGVkaXQgaW52YWxpZGF0aW5nIHRoZSB0ZXN0IHJ1biBpcwovLyBwdXJlIG5vaXNlLiBTY29wZWQgdG8gdGhlIHJlc2V0IG9ubHkg4oCUIGRlbGliZXJhdGVseSBOT1QgYWRkZWQgdG8gRVhFTVBULAovLyB3aGljaCB3b3VsZCBhbHNvIHVuLWdhdGUgcmVhZHMgb2YgYC5tb2Zsby9zcGVjcy8qKmAsIGFuZCB0aG9zZSBhcmUgaW5kZXhlZAovLyBndWlkYW5jZSB0aGF0IG1lbW9yeS1maXJzdCBzaG91bGQgc3RpbGwgcm91dGUgdGhyb3VnaCBhIHNlYXJjaC4KLy8gIzEzOTUg4oCUIGAuY2xhdWRlL2AgQ09ORklHIGpvaW5zIHRoZW0sIGJ5IHRoZSBzYW1lICJkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZQovLyBzdXJmYWNlIiByZWFzb25pbmc6IGhvb2sgd2lyaW5nLCBza2lsbHMgYW5kIGd1aWRhbmNlIGFyZSBub3QgdGhlIGNvZGUgdW5kZXIKLy8gdmVyaWZpY2F0aW9uLiBUaGlzIGlzIHRoZSBzdHJvbmdlciBjYXNlLCBpbiBmYWN0IOKAlCBpdCBpcyB0aGUgZGlyZWN0b3J5IGEgdXNlcgovLyBlZGl0cyAqYmVjYXVzZSBhIGdhdGUgdG9sZCB0aGVtIHRvKi4gQmVmb3JlIHRoaXMsIGZpeGluZyBob29rIHdpcmluZyBvbiBhCi8vIGdhdGUncyBvd24gaW5zdHJ1Y3Rpb24gcmVzZXQgdmVyaWZ5UnVuIGFuZCBpbnZhbGlkYXRlZCB0aGUgdmVyaWZpY2F0aW9uIHRoZQovLyBmaXggZXhpc3RlZCB0byBsZXQgdGhyb3VnaCwgc28gdGhlIHJlY292ZXJ5IHdhczogZml4IHdpcmluZyDihpIgdmVyaWZpY2F0aW9uCi8vIGludmFsaWRhdGVkIOKGkiByZXN0YXJ0IHNlc3Npb24g4oaSIHJlLXJ1biAvdmVyaWZ5IOKGkiByZXRyeSAoIzEzOTIgZmllbGQgcmVwb3J0KS4KLy8KLy8gU2NvcGVkIHRvIGNvbmZpZywgTk9UIGFsbCBvZiBgLmNsYXVkZS8qKmA6IGBzY3JpcHRzL2AgYW5kIGBoZWxwZXJzL2AgaG9sZAovLyBleGVjdXRhYmxlIHJ1bnRpbWUgc3VyZmFjZSAoZ2F0ZS5janMgaXRzZWxmIGxpdmVzIHRoZXJlKSwgYW5kIGVkaXRpbmcKLy8gZXhlY3V0YWJsZSBjb2RlIFNIT1VMRCBzdGlsbCBpbnZhbGlkYXRlIGEgdmVyaWZpY2F0aW9uLiBMaXN0aW5nIHRoZSBjb25maWcKLy8gc3ViZGlyZWN0b3JpZXMgZXhwbGljaXRseSBrZWVwcyB0aGF0IGludmFyaWFudCBpbnRhY3QuCi8vCi8vIEJvdGggc2VwYXJhdG9ycyBpbiBldmVyeSBhbHRlcm5hdGl2ZSDigJQgYSBiYXJlIGAvYCBoZXJlIHdvdWxkIHNpbGVudGx5IG5vLW9wCi8vIG9uIFdpbmRvd3MsIHdoZXJlIFRPT0xfSU5QVVQgcGF0aHMgYXJyaXZlIGJhY2tzbGFzaGVkIChSdWxlICMxKS4KdmFyIEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFID0gLyg/Ol58W1xcXC9dKVwuZ2l0aHViW1xcXC9dKD86d29ya2Zsb3dzfElTU1VFX1RFTVBMQVRFfFBVTExfUkVRVUVTVF9URU1QTEFURSkoPzpbXFxcLy5dfCQpfCg/Ol58W1xcXC9dKVwubW9mbG9bXFxcL118KD86XnxbXFxcL10pXC5jbGF1ZGVbXFxcL10oPzpzZXR0aW5ncyg/OlwubG9jYWwpP1wuanNvbiR8c2tpbGxzW1xcXC9dfGd1aWRhbmNlW1xcXC9dfGFnZW50c1tcXFwvXSkvaTsKLy8gVGVzdCBmaWxlczogaW52YWxpZGF0ZSB0aGUgdGVzdGluZyBnYXRlICh0ZXN0cyBhcmUgc3RhbGUgb25jZSB0ZXN0IGNvZGUgY2hhbmdlcykKLy8gYnV0IE5PVCB0aGUgc2ltcGxpZnkgZ2F0ZSDigJQgL3NpbXBsaWZ5IGFscmVhZHkgcmV2aWV3ZWQgdGhlIHByb2R1Y3Rpb24gY29kZTsgdG91Y2hpbmcKLy8gYSB0ZXN0IGZpbGUgb3IgZml4dHVyZSBkb2Vzbid0IGV4cG9zZSBuZXcgdW50ZXN0ZWQgc3VyZmFjZSBmb3IgY29kZSByZXZpZXcgKCM5MDgpLgp2YXIgRURJVF9SRVNFVF9TS0lQX1NJTVBMSUZZX09OTFlfUkUgPSAvKD86XnxbXFxcL10pKF9fdGVzdHNfX3xfX21vY2tzX198dGVzdHM/fHNwZWN8c3BlY3N8Y3lwcmVzc3xlMmV8Zml4dHVyZXM/KVtcXFwvXXxcLih0ZXN0fHNwZWMpXC5bbWNdP1tqdF1zeD8kfFwuZml4dHVyZVwuW21jXT9banRdc3g/JC9pOwovLyAjMTE3NiDigJQgc291cmNlLWZpbGUgZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBuby1zb3VyY2UtZmlsZXMgUFIgZXhlbXB0aW9uLgovLyBXaGVuIHRoZSBjdW11bGF0aXZlIGJyYW5jaCBkaWZmIGhhcyB6ZXJvIGZpbGVzIG1hdGNoaW5nIHRoaXMgUkUgKGkuZS4gb25seQovLyBZQU1ML01EL0pTT04vbG9ja2ZpbGVzL2ltYWdlcy90ZW1wbGF0ZXMpLCB0aGUgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MKLy8gZ2F0ZXMgYXV0by1wYXNzIGF0IGBjaGVjay1iZWZvcmUtcHJgLiBMaXN0cyBldmVyeSBsYW5ndWFnZSBtb2ZsbyBzaGlwcwovLyBhZ2FpbnN0IOKAlCBhZGRpdGlvbnMgaGVyZSBzaG91bGQgbWF0Y2ggVEVTVF9SVU5ORVJfUkUncyBsYW5ndWFnZSBjb3ZlcmFnZS4KdmFyIFNPVVJDRV9GSUxFX1JFID0gL1wuKHRzfHRzeHxqc3xqc3h8bWpzfGNqc3xweXxnb3xyc3xyYnxqYXZhfGt0fHN3aWZ0fGN8Y2N8Y3BwfGh8aHBwfHNofGJhc2h8cHMxKSQvaTsKLy8gRG9jcy1vbmx5IFBSIGV4ZW1wdGlvbjogdGV4dC9tYXJrdXAvaW1hZ2UgZXh0ZW5zaW9ucyB0aGF0IGNhbm5vdCBjaGFuZ2UgcnVudGltZSBiZWhhdmlvdXIuCi8vIFJldGFpbmVkIGZvciB0aGUgdHJhbnNwYXJlbmN5IG1lc3NhZ2Ugd2hlbiB0aGUgZGlmZiBpcyAqcHVyZWx5KiBkb2NzIChubyBZQU1ML0pTT04gZWl0aGVyKQovLyDigJQgZ2l2ZXMgYSBtb3JlIHNwZWNpZmljIHJlYXNvbiB0aGFuICJubyBzb3VyY2UgZmlsZXMiIGluIHRoYXQgc3Vic2V0Lgp2YXIgRE9DU19PTkxZX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xodG1sP3xwZGZ8cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxpY298Ym1wKSQvaTsKCi8vIOKUgOKUgCBDb250ZW50LWFkZHJlc3NlZCBnYXRlIGNyZWRpdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gQSBib29sZWFuIGB0ZXN0c1J1bmAvYHNpbXBsaWZ5UnVuYC9gdmVyaWZ5UnVuYCBhbnN3ZXJzICJ3YXMgYW4gZWRpdAovLyBvYnNlcnZlZD8iIOKAlCB3aGljaCBpcyBvbmx5IGVxdWl2YWxlbnQgdG8gImRvZXMgdGhpcyBjcmVkaXQgc3RpbGwgZGVzY3JpYmUgdGhlCi8vIGNvZGU/IiBpZiBldmVyeSBtdXRhdGlvbiBmbG93cyB0aHJvdWdoIFdyaXRlL0VkaXQvTXVsdGlFZGl0LiBJdCBkb2VzIG5vdC4KLy8gYG5vZGUgLWVgIHdpdGggZnMud3JpdGVGaWxlU3luYywgYHNlZCAtaWAsIHNoZWxsIHJlZGlyZWN0aW9uLCBgY3BgLCBhbmQgZXZlcnkKLy8gZ2l0IG9wZXJhdGlvbiB0aGF0IG1vdmVzIHRoZSB0cmVlIChjaGVja291dCwgcHVsbCwgbWVyZ2UsIHJlYmFzZSwgYXBwbHkpCi8vIGNoYW5nZSBzb3VyY2Ugd2l0aG91dCBmaXJpbmcgUG9zdFRvb2xVc2Ugb24gdGhvc2UgdG9vbHMsIHNvIHJlc2V0LWVkaXQtZ2F0ZXMKLy8gbmV2ZXIgcnVucyBhbmQgY3JlZGl0IGVhcm5lZCBiZWZvcmVoYW5kIHN1cnZpdmVzIHRoZSBjaGFuZ2UuIERlbW9uc3RyYXRlZCBieQovLyBlYXJuaW5nIGZ1bGwgY3JlZGl0LCBhcHBlbmRpbmcgYW4gZXhlY1N5bmMgY2FsbCB0byBhIHNvdXJjZSBmaWxlIHZpYSBCYXNoLAovLyBhbmQgd2F0Y2hpbmcgY2hlY2stYmVmb3JlLXByIGFsbG93IHRoZSBQUi4gTXVsdGktaXNzdWUgc2Vzc2lvbnMgaGF2ZSB0aGUgc2FtZQovLyBzaGFwZTogbm90aGluZyBpcyBwZXItcHJvbXB0LCBzbyBpc3N1ZSBCIGluaGVyaXRzIGlzc3VlIEEncyBjcmVkaXQuCi8vCi8vIEV2ZXJ5IG9uZSBvZiAjOTA4IC8gIzExNzYgLyAjMTMyMiAvICMxMzMyIC8gIzEzNDggcmVmaW5lZCBXSElDSCB0b29sIGNhbGwgdG8KLy8gd2F0Y2guIE5vbmUgb2YgdGhlbSBjb3VsZCBjbG9zZSB0aGlzLCBiZWNhdXNlIHRoZSBvYnNlcnZlciBpcyB0aGUgd3JvbmcKLy8gcHJpbWl0aXZlLiBTbyBzdG9wIG9ic2VydmluZyBtdXRhdGlvbnMgYW5kIGZpbmdlcnByaW50IHRoZSBjb2RlIGl0c2VsZjogSEVBRAovLyBwbHVzIHRoZSBjb250ZW50IG9mIGV2ZXJ5IGNoYW5nZWQgYW5kIHVudHJhY2tlZCBmaWxlLiBSZWNvbXB1dGUgYXQgY2hlY2sKLy8gdGltZTsgYW55IG1pc21hdGNoIG1lYW5zIHRoZSBjcmVkaXQgZGVzY3JpYmVzIGRpZmZlcmVudCBjb2RlIGFuZCBpcyBzdGFsZS4gTm8KLy8gdG9vbCBjYW4gYnlwYXNzIGl0LCBiZWNhdXNlIGl0IHdhdGNoZXMgbm8gdG9vbHMuCi8vCi8vIFNjb3BlIG1pcnJvcnMgdGhlIHJlc2V0IHByZWRpY2F0ZXMgc28gdGhlaXIgaW50ZW50aW9uYWwgZXhlbXB0aW9ucyBzdXJ2aXZlLgovLyBJbmVydCBmaWxlcyAoIzExNzYpIGFuZCBgLmdpdGh1Yi9gICsgYC5tb2Zsby9gIHBhdGhzIG5ldmVyIGNvbnRyaWJ1dGUsIHNvIGEKLy8gbWFya2Rvd24gb3Igc3BlYyBlZGl0IHN0aWxsIGxlYXZlcyBhIHRlc3QgcnVuIHN0YW5kaW5nLiAnbm9udGVzdCcgYWxzbyBkcm9wcwovLyB0ZXN0IGZpbGVzLCBwcmVzZXJ2aW5nICM5MDg6IHRvdWNoaW5nIGEgdGVzdCBkb2VzIG5vdCBpbnZhbGlkYXRlIC9zaW1wbGlmeS4KLy8KLy8gaXNFcGhlbWVyYWxQYXRoIGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCDigJQgaXQgZXhpc3RzIGZvciBhZ2VudCBzY3JhdGNocGFkcwovLyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBhbmQgYGdpdCBzdGF0dXNgIGNhbm5vdCByZXBvcnQgdGhvc2UuCi8vIFRoZSBnYXRlJ3Mgb3duIHN0YXRlIGZpbGUgbXVzdCBuZXZlciBjb250cmlidXRlOiByZWNvcmRpbmcgYSBjcmVkaXQgd3JpdGVzCi8vIGl0LCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIHZlcnkgZmluZ2VycHJpbnQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8gYW5kIG1ha2UKLy8gZXZlcnkgY3JlZGl0IGluc3RhbnRseSBzdGFsZS4gSXQgaXMgZ2l0aWdub3JlZCBpbiBtb2ZsbydzIHJlcG8sIGJ1dCBhCi8vIGNvbnN1bWVyIHByb2plY3QgbmVlZCBub3QgaWdub3JlIGl0LCBhbmQgdGhlcmUgdGhlIHNlbGYtcmVmZXJlbmNlIHdvdWxkCi8vIGRlYWRsb2NrIHRoZWlyIGdhdGUgcGVybWFuZW50bHkg4oCUIHNvIGV4Y2x1ZGUgaXQgYnkgbmFtZSByYXRoZXIgdGhhbiB0cnVzdGluZwovLyAuZ2l0aWdub3JlLiBTY29wZWQgdG8gdGhpcyBvbmUgZmlsZTogYC5jbGF1ZGUvYCBhbHNvIGhvbGRzIHJlYWwgc291cmNlCi8vIChoZWxwZXJzLywgc2NyaXB0cy8pIHRoYXQgbXVzdCBrZWVwIGNvdW50aW5nLgp2YXIgRklOR0VSUFJJTlRfU0VMRl9SRSA9IC8oPzpefFtcXFwvXSlcLmNsYXVkZVtcXFwvXXdvcmtmbG93LXN0YXRlXC5qc29uJC9pOwoKZnVuY3Rpb24gZmluZ2VycHJpbnRJbmNsdWRlcyhyZWwsIHNjb3BlKSB7CiAgaWYgKEZJTkdFUlBSSU5UX1NFTEZfUkUudGVzdChyZWwpKSByZXR1cm4gZmFsc2U7CiAgaWYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICBpZiAoc2NvcGUgPT09ICdub250ZXN0JyAmJiBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFBhdGhzIHJlcG9ydGVkIGJ5IGBnaXQgc3RhdHVzIC0tcG9yY2VsYWluPXYxIC11YWxsIC16YCwgYXMKICogYHsgcGF0aCwgb3JpZyB9YCDigJQgYG9yaWdgIHNldCBvbmx5IGZvciByZW5hbWVzIGFuZCBjb3BpZXMuCiAqCiAqIEEgcmVuYW1lIGVtaXRzIGBSICA8bmV3PlwwPG9sZD5cMGA6IHR3byBOVUwtdGVybWluYXRlZCB0b2tlbnMgZm9yIG9uZSBlbnRyeS4KICogVGhlIG9yaWdpbiB0b2tlbiBtdXN0IGJlIGNvbnN1bWVkIG9yIGl0IGlzIG1pc3JlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMKICogYnl0ZXMsIEFORCBpdCBtdXN0IGJlIHJlcG9ydGVkLCBiZWNhdXNlIGEgcmVuYW1lIG1lYW5zIHRoZSBvbGQgcGF0aCBubyBsb25nZXIKICogZXhpc3RzLiBEcm9wcGluZyBpdCBvbiB0aGUgZmxvb3IgbGVhdmVzIHRoZSBvbGQgcGF0aCBpbiB0aGUgY29udGVudCBtYXAg4oCUIHRoZQogKiBmaW5nZXJwcmludCB3b3VsZCB0aGVuIGNhcnJ5IGEgcGhhbnRvbSBlbnRyeSB0aGF0IGRpc2FwcGVhcnMgdGhlIG1vbWVudCB0aGUKICogcmVuYW1lIGlzIGNvbW1pdHRlZCwgZXhwaXJpbmcgY3JlZGl0IG9uIGEgY29tbWl0IHRoYXQgY2hhbmdlZCBubyBjb250ZW50LgogKiBUaGF0IGlzIHRoZSBzYW1lIGRlZmVjdCBjb250ZW50LWFkZHJlc3Npbmcgd2FzIGludHJvZHVjZWQgdG8gcmVtb3ZlLgogKi8KZnVuY3Rpb24gcGFyc2VQb3JjZWxhaW5aKHJhdykgewogIHZhciBvdXQgPSBbXTsKICB2YXIgcGFydHMgPSBTdHJpbmcocmF3KS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZW50cnkgPSBwYXJ0c1tpXTsKICAgIGlmICghZW50cnkgfHwgZW50cnkubGVuZ3RoIDwgNCkgY29udGludWU7CiAgICAvLyBDaGVjayBCT1RIIHN0YXR1cyBjb2x1bW5zLCBub3QganVzdCB0aGUgc3RhZ2VkIG9uZTogZ2l0IHJlcG9ydHMgYSByZW5hbWUKICAgIC8vIGFzIGBSIGAgd2hlbiBzdGFnZWQgYW5kIGNhbiByZXBvcnQgYCBSYCBmb3Igb25lIGRldGVjdGVkIGluIHRoZSB3b3JrdHJlZS4KICAgIC8vIE1pc3NpbmcgdGhlIHNlY29uZCBmb3JtIHdvdWxkIGxlYXZlIHRoZSBvcmlnaW4gdG9rZW4gdW5jb25zdW1lZCwgYW5kIGl0CiAgICAvLyB3b3VsZCB0aGVuIGJlIHJlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMgYnl0ZXMg4oCUIG1pc2FsaWduaW5nIGV2ZXJ5CiAgICAvLyBlbnRyeSBhZnRlciBpdC4gUiBhbmQgQyBhbHdheXMgZW1pdCBhbiBvcmlnaW4gdG9rZW4sIHNvIGNvbnN1bWluZyBvbmUKICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjb2x1bW4gc2hvd3MgdGhlbSBjYW5ub3Qgb3Zlci1jb25zdW1lLgogICAgdmFyIHN0ID0gZW50cnkuc2xpY2UoMCwgMik7CiAgICB2YXIgcmVjID0geyBwYXRoOiBlbnRyeS5zbGljZSgzKSwgb3JpZzogbnVsbCB9OwogICAgaWYgKHN0LmluZGV4T2YoJ1InKSA+PSAwIHx8IHN0LmluZGV4T2YoJ0MnKSA+PSAwKSB7IHJlYy5vcmlnID0gcGFydHNbaSArIDFdIHx8IG51bGw7IGkrKzsgfQogICAgb3V0LnB1c2gocmVjKTsKICB9CiAgcmV0dXJuIG91dDsKfQoKLyoqCiAqIEZpbmdlcnByaW50IG9mIHRoZSBjb2RlIGEgZ2F0ZSBjcmVkaXQgZGVzY3JpYmVzLCBvciBudWxsIHdoZW4gaXQgY2Fubm90IGJlCiAqIGNvbXB1dGVkIChubyBnaXQsIG5vIHJlcG8sIG5vIGNvbW1pdHMpLiBOdWxsIGlzIHRoZSBmYWlsLW9wZW4gc2lnbmFsOiBjYWxsZXJzCiAqIGZhbGwgYmFjayB0byB0aGUgZmxhZyBhbG9uZSwgc28gbm9uLWdpdCBwcm9qZWN0cyBiZWhhdmUgZXhhY3RseSBhcyBiZWZvcmUuCiAqLwovLyBNZW1vaXNlZCBwZXIgc2NvcGUuIGNoZWNrLWJlZm9yZS1wciB0ZXN0cyB0aHJlZSBjcmVkaXRzIGFuZCBjaGVjay1iZWZvcmUtZG9uZQovLyBhIGZvdXJ0aCwgYW5kIGVhY2ggY29tcHV0YXRpb24gc2hlbGxzIG91dCB0byBgZ2l0IHN0YXR1cyAtdWFsbGAgb3ZlciB0aGUgd2hvbGUKLy8gdHJlZS4gVGhlIGdhdGUgcHJvY2VzcyBpcyBzaG9ydC1saXZlZCBhbmQgc2luZ2xlLXNob3Qg4oCUIGl0IGV4aXRzIGJlZm9yZSBhbnkKLy8gdG9vbCBpdCBnYXRlcyBjYW4gcnVuIOKAlCBzbyBub3RoaW5nIGNhbiBjaGFuZ2UgdW5kZXJuZWF0aCB0aGUgY2FjaGUuCnZhciBGSU5HRVJQUklOVF9DQUNIRSA9IHt9OwoKZnVuY3Rpb24gY3JlZGl0RmluZ2VycHJpbnQoc2NvcGUpIHsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEZJTkdFUlBSSU5UX0NBQ0hFLCBzY29wZSkpIHJldHVybiBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV07CiAgdmFyIHZhbHVlID0gY29tcHV0ZUNyZWRpdEZpbmdlcnByaW50KHNjb3BlKTsKICBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV0gPSB2YWx1ZTsKICByZXR1cm4gdmFsdWU7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVDcmVkaXRGaW5nZXJwcmludChzY29wZSkgewogIHZhciBnaXQgPSBmdW5jdGlvbiAoYXJncykgewogICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLAogICAgfSk7CiAgfTsKICAvLyBGaW5nZXJwcmludCB0aGUgQ09OVEVOVCBvZiB0aGUgd29ya2luZyB0cmVlLCBuZXZlciAoSEVBRCArIGRlbHRhKS4gVGhvc2UKICAvLyBhcmUgbm90IHRoZSBzYW1lIHRoaW5nOiBgZ2l0IGNvbW1pdGAgbW92ZXMgY2hhbmdlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKICAvLyBpbnRvIEhFQUQgd2l0aG91dCBhbHRlcmluZyBhIHNpbmdsZSBieXRlIG9mIGNvZGUsIGFuZCBhIEhFQUQtYmFzZWQKICAvLyBmaW5nZXJwcmludCB3b3VsZCBleHBpcmUgZXZlcnkgY3JlZGl0IG9uIGNvbW1pdCDigJQgZm9yY2luZyBhIHBvaW50bGVzcwogIC8vIHJlLXJ1biBvZiB0aGUgdGVzdHMgdGhhdCBqdXN0IHBhc3NlZCBvbiBleGFjdGx5IHRoaXMgY29kZS4gQ29udGVudC0KICAvLyBhZGRyZXNzaW5nIGFsc28gbWFrZXMgdGhlIGZpbmdlcnByaW50IHN0YWJsZSBhY3Jvc3MgYW1lbmQsIHN0YXNoL3BvcCwgYW5kCiAgLy8gYW55IGJyYW5jaCBzd2l0Y2ggdGhhdCBsYW5kcyBvbiBpZGVudGljYWwgY29udGVudCwgd2hpbGUgc3RpbGwgbW92aW5nIHRoZQogIC8vIG1vbWVudCByZWFsIGNvbnRlbnQgZGlmZmVycy4KICAvLwogIC8vIFVuY2hhbmdlZCBmaWxlcyBjb250cmlidXRlIGdpdCdzIG93biBibG9iIGhhc2hlcyAoZnJlZSwgYWxyZWFkeSBjb21wdXRlZCk7CiAgLy8gb25seSBmaWxlcyBnaXQgcmVwb3J0cyBhcyBjaGFuZ2VkIG9yIHVudHJhY2tlZCBhcmUgaGFzaGVkIGhlcmUuCiAgdmFyIHRyYWNrZWQ7CiAgdHJ5IHsKICAgIHRyYWNrZWQgPSBnaXQoWydscy10cmVlJywgJy1yJywgJy16JywgJ0hFQUQnXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfSAvLyBubyBnaXQsIG5vIHJlcG8sIG9yIG5vIGNvbW1pdCB5ZXQKICB2YXIgYnlQYXRoID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB2YXIgZW50cmllcyA9IFN0cmluZyh0cmFja2VkKS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIC8vICI8bW9kZT4gPHR5cGU+IDxvYmplY3Q+XHQ8cGF0aD4iCiAgICB2YXIgdGFiID0gZW50cmllc1tpXS5pbmRleE9mKCdcdCcpOwogICAgaWYgKHRhYiA8IDApIGNvbnRpbnVlOwogICAgdmFyIG1ldGEgPSBlbnRyaWVzW2ldLnNsaWNlKDAsIHRhYikuc3BsaXQoJyAnKTsKICAgIGJ5UGF0aFtlbnRyaWVzW2ldLnNsaWNlKHRhYiArIDEpXSA9IG1ldGFbMl07CiAgfQogIHRyeSB7CiAgICB2YXIgY2hhbmdlZCA9IHBhcnNlUG9yY2VsYWluWihnaXQoWydzdGF0dXMnLCAnLS1wb3JjZWxhaW49djEnLCAnLXVhbGwnLCAnLXonXSkpOwogICAgdmFyIGxpdmUgPSBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlZC5sZW5ndGg7IGorKykgewogICAgICB2YXIgcmVsID0gY2hhbmdlZFtqXS5wYXRoOwogICAgICAvLyBBIHJlbmFtZSdzIG9yaWdpbiBwYXRoIGlzIGdvbmUgZnJvbSB0aGUgY29udGVudCDigJQgZHJvcCBpdCwgb3IgaXQKICAgICAgLy8gbGluZ2VycyB1bnRpbCB0aGUgcmVuYW1lIGlzIGNvbW1pdHRlZCBhbmQgdGhlbiB2YW5pc2hlcywgbW92aW5nIHRoZQogICAgICAvLyBmaW5nZXJwcmludCBvbiBhIGNvbW1pdCB0aGF0IGNoYW5nZWQgbm90aGluZy4KICAgICAgaWYgKGNoYW5nZWRbal0ub3JpZykgZGVsZXRlIGJ5UGF0aFtjaGFuZ2VkW2pdLm9yaWddOwogICAgICB2YXIgYWJzID0gcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCByZWwpOwogICAgICB2YXIgaXNGaWxlID0gZmFsc2U7CiAgICAgIHRyeSB7IGlzRmlsZSA9IGZzLnN0YXRTeW5jKGFicykuaXNGaWxlKCk7IH0gY2F0Y2ggKGUpIHsgaXNGaWxlID0gZmFsc2U7IH0KICAgICAgLy8gQSBwYXRoIGdpdCByZXBvcnRzIGJ1dCB0aGF0IGlzIGdvbmUgKG9yIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSkgaXMKICAgICAgLy8gYWJzZW50IGZyb20gdGhlIGNvbnRlbnQsIHNvIGl0IG11c3QgbGVhdmUgdGhlIG1hcCBlbnRpcmVseS4KICAgICAgaWYgKCFpc0ZpbGUpIHsgZGVsZXRlIGJ5UGF0aFtyZWxdOyBjb250aW51ZTsgfQogICAgICBpZiAocmVsLmluZGV4T2YoJ1xuJykgPj0gMCkgeyBkZWxldGUgYnlQYXRoW3JlbF07IGNvbnRpbnVlOyB9IC8vIHVuaGFzaGFibGUgdmlhIC0tc3RkaW4tcGF0aHMKICAgICAgbGl2ZS5wdXNoKHJlbCk7CiAgICB9CiAgICBpZiAobGl2ZS5sZW5ndGgpIHsKICAgICAgLy8gYGdpdCBoYXNoLW9iamVjdGAg4oCUIE5PVCBhIHJhdyBzaGExIG9mIHRoZSBieXRlcy4gQSBnaXQgYmxvYiBpZCBoYXNoZXMKICAgICAgLy8gImJsb2IgPHNpemU+XDAiIHBsdXMgdGhlIGNvbnRlbnQsIGFuZCBhcHBsaWVzIHRoZSBzYW1lIGNsZWFuIGZpbHRlcnMKICAgICAgLy8gYW5kIGNvcmUuYXV0b2NybGYgbm9ybWFsaXNhdGlvbiBnaXQgd291bGQgYXBwbHkgb24gY2hlY2tpbi4gSGFzaGluZyB0aGUKICAgICAgLy8gcmF3IGJ5dGVzIGhlcmUgaW5zdGVhZCB3b3VsZCBwcm9kdWNlIGEgZGlmZmVyZW50IHN0cmluZyB0aGFuIGxzLXRyZWUKICAgICAgLy8gcmVwb3J0cyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQsIHNvIGEgZmlsZSB3b3VsZCBhcHBlYXIgdG8gImNoYW5nZSIgdGhlCiAgICAgIC8vIG1vbWVudCBpdCB3YXMgY29tbWl0dGVkIOKAlCBhbmQgb24gV2luZG93cywgd2hlbmV2ZXIgYXV0b2NybGYgcmV3cm90ZSBpdHMKICAgICAgLy8gbGluZSBlbmRpbmdzLiBPbmUgYmF0Y2hlZCBjYWxsIGNvdmVycyBldmVyeSBjaGFuZ2VkIHBhdGguCiAgICAgIHZhciBoYXNoZWQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnaGFzaC1vYmplY3QnLCAnLS1zdGRpbi1wYXRocyddLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDEwMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIGlucHV0OiBsaXZlLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXSwKICAgICAgfSkudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxpdmUubGVuZ3RoOyBtKyspIHsKICAgICAgICBpZiAoaGFzaGVkW21dKSBieVBhdGhbbGl2ZVttXV0gPSBoYXNoZWRbbV0udHJpbSgpOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgLy8gc3RhdHVzIGZhaWxlZCDigJQgZmFsbCBiYWNrIHRvIHRoZSBjb21taXR0ZWQgdHJlZSBhbG9uZSByYXRoZXIgdGhhbiBudWxsLAogICAgLy8gc28gdGhlIGZpbmdlcnByaW50IHN0aWxsIHRyYWNrcyBjb21taXR0ZWQgY29udGVudC4KICB9CiAgdmFyIHBhdGhzID0gT2JqZWN0LmtleXMoYnlQYXRoKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIGZpbmdlcnByaW50SW5jbHVkZXMocCwgc2NvcGUpOyB9KTsKICBwYXRocy5zb3J0KCk7CiAgdmFyIGggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpOwogIGZvciAodmFyIGsgPSAwOyBrIDwgcGF0aHMubGVuZ3RoOyBrKyspIGgudXBkYXRlKHBhdGhzW2tdICsgJzonICsgYnlQYXRoW3BhdGhzW2tdXSArICdcbicpOwogIHJldHVybiBoLmRpZ2VzdCgnaGV4Jyk7Cn0KCi8qKgogKiBJcyBhIGNyZWRpdCBzdGlsbCBsaXZlPyBgZmxhZ2AgaXMgdGhlIGxlZ2FjeSBib29sZWFuLCBgc3RvcmVkYCB0aGUgZmluZ2VycHJpbnQKICogY2FwdHVyZWQgd2hlbiBpdCB3YXMgZWFybmVkLgogKgogKiBGYWlsLW9wZW4gb24gYW4gdW5jb21wdXRhYmxlIGZpbmdlcnByaW50IChub24tZ2l0IHByb2plY3QpIOKAlCB0aGUgZ2F0ZSBrZWVwcwogKiBpdHMgcHJldmlvdXMgc2VtYW50aWNzIHRoZXJlIHJhdGhlciB0aGFuIGJsb2NraW5nIHdvcmsgaXQgY2Fubm90IHJlYXNvbiBhYm91dC4KICogRmFpbC1DTE9TRUQgb24gYSBtaXNzaW5nIHN0b3JlZCBmaW5nZXJwcmludDogdGhhdCBpcyBjcmVkaXQgZWFybmVkIGJ5IGEKICogcHJlLXVwZ3JhZGUgZ2F0ZSwgYW5kIGl0IGNhcnJpZXMgbm8gZXZpZGVuY2UgYWJvdXQgd2hpY2ggY29kZSBpdCBjb3ZlcmVkLiBUaGUKICogY29zdCBpcyByZS1ydW5uaW5nIG9uY2Ugb24gdGhlIGZpcnN0IFBSIGFmdGVyIHVwZ3JhZGUsIHdoaWNoIHNlbGYtaGVhbHMuCiAqLwpmdW5jdGlvbiBjcmVkaXRJc0xpdmUoZmxhZywgc3RvcmVkLCBzY29wZSkgewogIGlmICghZmxhZykgcmV0dXJuIGZhbHNlOwogIHZhciBub3cgPSBjcmVkaXRGaW5nZXJwcmludChzY29wZSk7CiAgaWYgKG5vdyA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgaWYgKCFzdG9yZWQpIHJldHVybiBmYWxzZTsKICByZXR1cm4gc3RvcmVkID09PSBub3c7Cn0KCi8vICMxNDEwIOKAlCBpcyB0aGlzIEJhc2ggY29tbWFuZCBhY3R1YWxseSBhIGBnaCBwciBjcmVhdGVgIGludm9jYXRpb24/IERlbGVnYXRlcwovLyB0byBwci1jcmVhdGUtY29tbWFuZC5janMsIHdoaWNoIHNhbml0aXNlcyBkYXRhIHJlZ2lvbnMgKHF1b3RlcywgaGVyZWRvYwovLyBib2RpZXMsIGNvbW1lbnRzKSBiZWZvcmUgbG9va2luZyBmb3IgdGhlIGNvbW1hbmQsIHNvIHRoZSBnYXRlIG5laXRoZXIgbWlzc2VzCi8vIHJlYWwgaW52b2NhdGlvbnMgKG5ld2xpbmUtc2VwYXJhdGVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCkgbm9yIGZpcmVzIG9uCi8vIGNvbW1hbmRzIHRoYXQgbWVyZWx5IHF1b3RlIHRoZSBsaXRlcmFsIChgZ2l0IGNvbW1pdCAtbSAiLi4uZ2ggcHIgY3JlYXRlLi4uImApLgovLwovLyBGYWlsLXNhZmUsIGluIEJPVEggZGlyZWN0aW9ucywgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgQmFzaCBjYWxsIGluIGV2ZXJ5Ci8vIGNvbnN1bWVyLiBnYXRlLWhvb2subWpzIG1hcHMgYSBub24temVybyBleGl0IGZyb20gdGhpcyBzY3JpcHQgdG8gZXhpdCAyLCBzbyBhbgovLyB1bmNhdWdodCB0aHJvdyBoZXJlIGRvZXMgbm90IGRlZ3JhZGUgb25lIGdhdGUg4oCUIGl0IGJsb2NrcyBldmVyeSBCYXNoIGNhbGwgdGhlCi8vIGNvbnN1bWVyIG1ha2VzLiBTbyBhIGxvYWQgZmFpbHVyZSAocGFydGlhbCBgLmNsYXVkZS9oZWxwZXJzYCBzeW5jIG1pZC11cGdyYWRlLAovLyBoYW5kLXBydW5lZCBpbnN0YWxsKSBBTkQgYSB0aHJvdyBmcm9tIHRoZSBtYXRjaGVyIGl0c2VsZiBib3RoIGZhbGwgYmFjayB0byB0aGUKLy8gcHJlLSMxNDEwIHJlZ2V4OiBwcmV2aW91cyBiZWhhdmlvdXIsIG5vdCBhIHdlZGdlZCBzZXNzaW9uLgovLwovLyBOb3Qgc2lsZW50ICgjODU0LCBob29rLWF1dGhvcmluZyDCpzQpOiB0aGUgZmFsbGJhY2sgcGF0aCBhZHZpc2VzIG9uIHN0ZGVyciBhbmQKLy8gY29udGludWVzLiBJZiB0aGlzIGV2ZXIgZmlyZXMgaXQgbWVhbnMgdGhlIG1hdGNoZXIgY3Jhc2hlZCwgd2hpY2ggaXMgd29ydGgKLy8gYmVpbmcgbG91ZCBhYm91dCDigJQgYW5kIGl0IGNhbm5vdCBzcGFtIGEgaGVhbHRoeSBzZXNzaW9uLCBiZWNhdXNlIGEgaGVhbHRoeQovLyBzZXNzaW9uIG5ldmVyIHJlYWNoZXMgaXQuCnZhciBMRUdBQ1lfUFJfQ1JFQVRFX1JFID0gLyg/Ol58JiZccyp8XHxcfFxzKnw7XHMqKVxzKig/OltBLVpfXVtBLVowLTlfXSo9XFMrXHMrKSpnaFxzK3ByXHMrY3JlYXRlXGIvOwp2YXIgcHJDcmVhdGVNYXRjaGVyID0gbnVsbDsKZnVuY3Rpb24gaXNQckNyZWF0ZUNvbW1hbmQoY21kKSB7CiAgaWYgKHByQ3JlYXRlTWF0Y2hlciA9PT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gcmVxdWlyZSgnLi9wci1jcmVhdGUtY29tbWFuZC5janMnKS5pc1ByQ3JlYXRlQ29tbWFuZDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gZmFsc2U7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlLWNvbW1hbmQuY2pzIHVuYXZhaWxhYmxlICgnICsgKGUgJiYgZS5tZXNzYWdlKSArICcpIOKAlCBQUiBnYXRlcyBmYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBtYXRjaGVyLiBSdW4gYG5weCBmbG8gZG9jdG9yIC0tZml4YC5cbicpOwogICAgfQogICAgaWYgKHR5cGVvZiBwckNyZWF0ZU1hdGNoZXIgIT09ICdmdW5jdGlvbicpIHByQ3JlYXRlTWF0Y2hlciA9IGZhbHNlOwogIH0KICBpZiAocHJDcmVhdGVNYXRjaGVyKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gcHJDcmVhdGVNYXRjaGVyKGNtZCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlIG1hdGNoZXIgdGhyZXcgKCcgKyAoZSAmJiBlLm1lc3NhZ2UpICsgJykg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgbGVnYWN5IG1hdGNoZXIuIFBsZWFzZSByZXBvcnQgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHRyaWdnZXJlZCBpdC5cbicpOwogICAgfQogIH0KICByZXR1cm4gTEVHQUNZX1BSX0NSRUFURV9SRS50ZXN0KGNtZCk7Cn0KCi8vIENsYXNzaWZpZXItYXdhcmUgc2ltcGxpZnkgZ2F0ZSBza2lwLiBSZXR1cm5zIGEgc3RyaW5nIHJlYXNvbiBpZiB0aGUgZ2F0ZQovLyBjYW4gYmUgYXV0by1wYXNzZWQsIG9yIG51bGwgaWYgL3NpbXBsaWZ5IG11c3QgcnVuLiBVc2VzIHNpbXBsaWZ5LWNsYXNzaWZ5LmNqcwovLyBzbyB0aGUgZ2F0ZSdzICJ0cml2aWFsIiBkZWZpbml0aW9uIG1hdGNoZXMgdGhlIHNraWxsJ3MgZXhhY3RseS4KLy8KLy8gVHdvIHBhdGhzOgovLyAgIDEuIHNuYXBzaG90IHBhdGgg4oCUIC9zaW1wbGlmeSByYW4gZWFybGllciBvbiB0aGlzIGJyYW5jaC4gQ2xhc3NpZnkgdGhlIGRpZmYKLy8gICAgICBiZXR3ZWVuIHNpbXBsaWZ5U25hcHNob3RTaGEgYW5kIGN1cnJlbnQgSEVBRC93b3JraW5nLXRyZWUuIElmIFRSSVZJQUwsCi8vICAgICAgdGhlIHByaW9yIHJldmlldyBzdGlsbCBjb3ZlcnMgdGhlIGJyYW5jaCDigJQgbm8gcmUtcnVuIG5lZWRlZC4KLy8gICAyLiBiYXNlbGluZSBwYXRoIOKAlCBubyBzbmFwc2hvdCAoZmlyc3QgdGltZSkuIENsYXNzaWZ5IHRoZSBlbnRpcmUgYnJhbmNoCi8vICAgICAgZGlmZiB2cyBtZXJnZS1iYXNlLiBJZiBUUklWSUFMLCB0aGUgd2hvbGUgUFIgaXMgYmVsb3cgdGhlIHRocmVzaG9sZAovLyAgICAgIHdoZXJlIC9zaW1wbGlmeSBwcm92aWRlcyB2YWx1ZSDigJQgYXV0by1wYXNzIHdpdGhvdXQgZXZlciBpbnZva2luZyBpdC4KLy8KLy8gRmFpbC1zYWZlOiBhbnkgZXJyb3IgKG5vIGNsYXNzaWZpZXIsIG5vIGdpdCwgbm8gbWVyZ2UtYmFzZSkgcmV0dXJucyBudWxsLAovLyB3aGljaCBmb3JjZXMgL3NpbXBsaWZ5IHRvIHJ1biBhcyB0b2RheS4KZnVuY3Rpb24gY2xhc3NpZnlGb3JHYXRlU2tpcChzdGF0ZSkgewogIHZhciBjbGFzc2lmeTsKICB0cnkgewogICAgY2xhc3NpZnkgPSByZXF1aXJlKCcuL3NpbXBsaWZ5LWNsYXNzaWZ5LmNqcycpLmNsYXNzaWZ5RGlmZjsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgaWYgKHR5cGVvZiBjbGFzc2lmeSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGw7CgogIGZ1bmN0aW9uIHRyeUNsYXNzaWZ5KGRpZmZUZXh0LCBsYWJlbCwgYWxsb3dTbWFsbFJldmlld0ZpeCkgewogICAgdHJ5IHsKICAgICAgdmFyIGRlYyA9IGNsYXNzaWZ5KGRpZmZUZXh0KTsKICAgICAgaWYgKGRlYy50aWVyID09PSAnVFJJVklBTCcpIHsKICAgICAgICB2YXIgbG9jID0gKGRlYy5zdGF0cy5hZGRlZCB8fCAwKSArIChkZWMuc3RhdHMuZGVsZXRlZCB8fCAwKTsKICAgICAgICByZXR1cm4gbGFiZWwgKyAnIGlzIFRSSVZJQUwgKCcgKyBsb2MgKyAnIExPQywgJyArIChkZWMuc3RhdHMuZmlsZUNvdW50IHx8IDApICsgJyBmaWxlKHMpKSc7CiAgICAgIH0KICAgICAgLy8gIzExNzYg4oCUIFNNQUxMIHJldmlldy1maXggc2hhcGUgKHNuYXBzaG90IHBhdGggb25seSkuIEEg4omkMzAtTE9DIGRlbHRhIHdpdGgKICAgICAgLy8gemVybyBuZXcgZGVjbGFyYXRpb25zIG9uIHRvcCBvZiBhbiBhbHJlYWR5LXJldmlld2VkIGJyYW5jaCBpcyB0aGUgdHlwaWNhbAogICAgICAvLyAiYXBwbHkgMyByZXZpZXcgZml4ZXMiIGN5Y2xlIOKAlCByZS1ydW5uaW5nIC9mbG8tc2ltcGxpZnkgYWdhaW5zdCB0aGUgc2FtZQogICAgICAvLyBzdXJmYWNlIHBsdXMgYSBmZXctbGluZSB0d2VhayBhZGRzIG5vIG5ldyBzaWduYWwuIEJhc2VsaW5lIHBhdGggc3RheXMKICAgICAgLy8gVFJJVklBTC1vbmx5IHNvIGJyYW5kLW5ldyBTTUFMTCBmZWF0dXJlcyBzdGlsbCBnZXQgcmV2aWV3ZWQuCiAgICAgIGlmIChhbGxvd1NtYWxsUmV2aWV3Rml4ICYmIGRlYy50aWVyID09PSAnU01BTEwnKSB7CiAgICAgICAgdmFyIHRvdGFsTG9jID0gKGRlYy5zdGF0cy5hZGRlZCB8fCAwKSArIChkZWMuc3RhdHMuZGVsZXRlZCB8fCAwKTsKICAgICAgICBpZiAodG90YWxMb2MgPD0gMzAgJiYgKGRlYy5zdGF0cy5kZWNsQWRkZWQgfHwgMCkgPT09IDApIHsKICAgICAgICAgIHJldHVybiBsYWJlbCArICcgaXMgU01BTEwgcmV2aWV3LWZpeCBzaGFwZSAoJyArIHRvdGFsTG9jICsgJyBMT0MsIG5vIG5ldyBkZWNsYXJhdGlvbnMpJzsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsgLyogZmFsbCB0aHJvdWdoICovIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2l0RGlmZihhcmdzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gY3AuZXhlY0ZpbGVTeW5jKCdnaXQnLCBhcmdzLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDUwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLCBtYXhCdWZmZXI6IDggKiAxMDI0ICogMTAyNAogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KICB9CgogIC8vIFNuYXBzaG90IHBhdGg6IGNsYXNzaWZ5IGV2ZXJ5dGhpbmcgc2luY2UgL3NpbXBsaWZ5IGxhc3QgcmFuLgogIGlmIChzdGF0ZS5zaW1wbGlmeVNuYXBzaG90U2hhKSB7CiAgICB2YXIgc25hcERpZmYgPSBnaXREaWZmKFsnZGlmZicsIHN0YXRlLnNpbXBsaWZ5U25hcHNob3RTaGEgKyAnLi4uSEVBRCddKTsKICAgIHZhciB3b3JrVHJlZUEgPSBnaXREaWZmKFsnZGlmZicsICdIRUFEJ10pIHx8ICcnOwogICAgaWYgKHNuYXBEaWZmICE9PSBudWxsKSB7CiAgICAgIHZhciBjb21iaW5lZCA9IHNuYXBEaWZmICsgKHdvcmtUcmVlQSA/ICdcbicgKyB3b3JrVHJlZUEgOiAnJyk7CiAgICAgIC8vIFNuYXBzaG90IHBhdGg6IGFsbG93IFNNQUxMIHJldmlldy1maXggc2hhcGUgYmVjYXVzZSB0aGUgb3JpZ2luYWwgL3NpbXBsaWZ5CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCB0aGUgc3VyZmFjZSBhbmQgb25seSB0aW55IG5vLWRlY2wtdG91Y2hpbmcgdHdlYWtzIGZvbGxvd2VkLgogICAgICB2YXIgaGl0ID0gdHJ5Q2xhc3NpZnkoY29tYmluZWQsICdkZWx0YSBzaW5jZSBsYXN0IC9zaW1wbGlmeScsIHRydWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgfQogIH0KCiAgLy8gQmFzZWxpbmUgcGF0aDogY2xhc3NpZnkgdGhlIHdob2xlIGJyYW5jaCB2cyBtZXJnZS1iYXNlLgogIHZhciBiYXNlcyA9IFsnb3JpZ2luL21haW4nLCAnbWFpbicsICdvcmlnaW4vbWFzdGVyJywgJ21hc3RlciddOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBiYXNlOwogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgaWYgKCFiYXNlKSBjb250aW51ZTsKICAgIHZhciBicmFuY2hEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBiYXNlICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVCID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKSB8fCAnJzsKICAgIGlmIChicmFuY2hEaWZmICE9PSBudWxsKSB7CiAgICAgIHJldHVybiB0cnlDbGFzc2lmeShicmFuY2hEaWZmICsgKHdvcmtUcmVlQiA/ICdcbicgKyB3b3JrVHJlZUIgOiAnJyksICdicmFuY2ggZGlmZicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIHJldHVybiBudWxsOwp9CgovLyBHZXQgdGhlIGZpbGUgbGlzdCBjaGFuZ2VkIG9uIHRoZSBjdXJyZW50IGJyYW5jaCB2cyB0aGUgbWVyZ2UtYmFzZSB3aXRoIG9yaWdpbi9tYWluCi8vIChmYWxsaW5nIGJhY2sgdG8gbG9jYWwgbWFpbikuIFJldHVybnMgYW4gYXJyYXkgb2YgcmVwby1yZWxhdGl2ZSBwYXRocywgb3IgbnVsbCBvbgovLyBmYWlsdXJlIOKAlCBpbiB3aGljaCBjYXNlIGNhbGxlcnMgTVVTVCBmYWxsIHRocm91Z2ggdG8gdGhlIHN0YW5kYXJkIGdhdGUgKGZhaWwtc2FmZSkuCmZ1bmN0aW9uIGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpIHsKICB2YXIgYmFzZXMgPSBbJ29yaWdpbi9tYWluJywgJ21haW4nLCAnb3JpZ2luL21hc3RlcicsICdtYXN0ZXInXTsKICB2YXIgYmFzZSA9IG51bGw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlcy5sZW5ndGg7IGkrKykgewogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgICBpZiAoYmFzZSkgYnJlYWs7CiAgICB9IGNhdGNoIChlKSB7IC8qIHRyeSBuZXh0ICovIH0KICB9CiAgaWYgKCFiYXNlKSByZXR1cm4gbnVsbDsKICB0cnkgewogICAgdmFyIG91dCA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5JywgYmFzZSArICcuLi5IRUFEJ10sIHsKICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgfSk7CiAgICByZXR1cm4gb3V0LnNwbGl0KCdcbicpLm1hcChmdW5jdGlvbihsKSB7IHJldHVybiBsLnRyaW0oKTsgfSkuZmlsdGVyKEJvb2xlYW4pOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KfQoKLy8gIzEzNzQg4oCUIHRoZSBtaXNzaW5nIGhhbGYgb2YgdGhlIFRhc2tDcmVhdGUgcmVtaW5kZXIuCi8vCi8vIG1vZmxvIG5hZ3MgeW91IHRvIE9QRU4gYSB0YXNrIGxpc3QgKGNoZWNrLWJlZm9yZS1hZ2VudCkgYW5kIHRoZW4gbmV2ZXIgbG9va3MKLy8gYWdhaW46IGB0YXNrQ291bnRgIG9ubHkgY291bnRzIHVwLCBzbyBhIHJ1biB0aGF0IGNyZWF0ZXMgZm91ciB0YXNrcyBhbmQgY2xvc2VzCi8vIG5vbmUgc2F0aXNmaWVzIGV2ZXJ5IGdhdGUuIFRoYXQgaXMgdGhlIGV4YWN0IHNoYXBlIG9mIGFuIGFiYW5kb25lZCBsaXN0LgovLwovLyBUaGUgbGVkZ2VyIGlzIHJlYWQgZnJvbSB0aGUgc2Vzc2lvbiBUUkFOU0NSSVBULCBhbmQgYm90aCBhbHRlcm5hdGl2ZXMgd2VyZQovLyByZWplY3RlZCBvbiBldmlkZW5jZSByYXRoZXIgdGhhbiB0YXN0ZToKLy8KLy8gICAtIEEgYF5UYXNrVXBkYXRlJGAgUG9zdFRvb2xVc2Ugb2JzZXJ2ZXIgZmVlZGluZyBhIGNvdW50ZXIgaXMgdGhlIHdpcmluZwovLyAgICAgIzEzMzEgcmVtb3ZlZCBhcyBwdXJlIGhvdC1wYXRoIG92ZXJoZWFkLiBJdCB3b3VsZCBhbHNvIGhhdmUgdG8gc3Vydml2ZQovLyAgICAgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0LCB3aGVyZWFzIGEgdHJhbnNjcmlwdCByZWFkIGhvbGRzIG5vIHN0YXRlIHRvIHJlc2V0LgovLyAgIC0gQ2xhdWRlIENvZGUncyBvd24gdGFzayBzdG9yZSAoYH4vLmNsYXVkZS90YXNrcy9zZXNzaW9uLTxpZD4vYCkgaXMgZ3JvdW5kCi8vICAgICB0cnV0aCBidXQgdW5yZWFjaGFibGU6IG1lYXN1cmVkIG9uIHYyLjEuMjIwLCB0aGUgaWQga2V5aW5nIHRoYXQgZGlyZWN0b3J5Ci8vICAgICBkb2VzIE5PVCByb3RhdGUgb24gYC9jbGVhcmAsIHNvIGEgc2Vzc2lvbiB3aG9zZSB0cmFuc2NyaXB0IGlzIDxBPiB3cml0ZXMKLy8gICAgIGl0cyB0YXNrcyB1bmRlciB0aGUgcHJlLWNsZWFyIGlkIDxCPiDigJQgYW5kIDxBPiBpcyB3aGF0IHRoZSBicmlkZ2UgZm9yd2FyZHMKLy8gICAgIGFzIEhPT0tfU0VTU0lPTl9JRC4gVGhlcmUgaXMgbm8gcGF0aCBmcm9tIHRoZSBob29rIGVudmlyb25tZW50IHRvIHRoZSBkaXIuCi8vCi8vIENvc3QgbGFuZHMgb25seSB3aGVyZSBpdCBpcyBhbHJlYWR5IGp1c3RpZmllZDogdGhlIHNvbGUgY2FsbGVyIHJ1bnMgYWZ0ZXIKLy8gY2hlY2stYmVmb3JlLXByJ3MgYGdoIHByIGNyZWF0ZWAgbWF0Y2gsIGkuZS4gb25jZSBwZXIgUFIgYXR0ZW1wdCwgbmV2ZXIgb24gdGhlCi8vIHBlci10b29sIHBhdGguCi8vCi8vIFJldHVybnMgbnVsbCB3aGVuIHRoZSB0cmFuc2NyaXB0IGlzIG1pc3NpbmcsIG92ZXJzaXplZCwgdW5yZWFkYWJsZSwgb3IgcmVjb3JkcwovLyBubyBUYXNrQ3JlYXRlIGF0IGFsbCDigJQgdGhlIGNhbGxlciB0aGVuIHN0YXlzIHNpbGVudCByYXRoZXIgdGhhbiBndWVzc2luZy4KLy8gU2l6ZWQgYWdhaW5zdCBtZWFzdXJlbWVudCwgbm90IGEgcm91bmQgbnVtYmVyOiBhIDMuNE1CIHRyYW5zY3JpcHQgKHRoZSBsYXJnZXN0Ci8vIGluIGEgd2VlayBvZiBsb2NhbCBzZXNzaW9ucykgY29zdHMgfjU1bXMgdG8gc2Nhbiwgc28gfjE2bXMvTUIuIDE2TUIgaXMgfjR4IHRoZQovLyB3b3JzdCBvYnNlcnZlZCBzZXNzaW9uIGFuZCBsYW5kcyBuZWFyIDI2MG1zIOKAlCBhIGNodW5rIG9mIHRoZSBob29rJ3MgMjAwMG1zCi8vIGJ1ZGdldCwgYnV0IGEgYm91bmRlZCBvbmUuIFBhc3QgdGhlIGNhcCB0aGUgbGVkZ2VyIGdvZXMgc2lsZW50IHJhdGhlciB0aGFuCi8vIHJpc2tpbmcgdGhlIHRpbWVvdXQsIHNpbmNlIGEgaG9vayB0aGF0IHRpbWVzIG91dCBpcyB3b3JzZSB0aGFuIG9uZSB0aGF0Ci8vIGRlY2xpbmVzIHRvIGNvbW1lbnQuIFVucmVsYXRlZCB0byBgVFJBTlNDUklQVF9UQUlMX0JZVEVTYCBpbiBiaW4vbGliL21lZGl0YXRlLm1qcwovLyBkZXNwaXRlIHRoZSBzaW1pbGFyIG5hbWUg4oCUIHRoYXQgb25lIHRydW5jYXRlcyB0byBhIHRhaWwgd2luZG93LCB3aGljaCBjYW5ub3QKLy8gd29yayBoZXJlIChhIFRhc2tDcmVhdGUgZnJvbSBlYXJseSBpbiB0aGUgc2Vzc2lvbiBmYWxscyBvdXRzaWRlIGFueSB0YWlsKS4KdmFyIFRSQU5TQ1JJUFRfTUFYX0JZVEVTID0gMTYgKiAxMDI0ICogMTAyNDsKZnVuY3Rpb24gcmVhZFRhc2tMZWRnZXIoKSB7CiAgdmFyIHRwID0gcHJvY2Vzcy5lbnYuSE9PS19UUkFOU0NSSVBUX1BBVEggfHwgJyc7CiAgaWYgKCF0cCkgcmV0dXJuIG51bGw7CiAgdmFyIHJhdzsKICB0cnkgewogICAgdmFyIHN0ID0gZnMuc3RhdFN5bmModHApOwogICAgaWYgKCFzdC5pc0ZpbGUoKSB8fCBzdC5zaXplID4gVFJBTlNDUklQVF9NQVhfQllURVMpIHJldHVybiBudWxsOwogICAgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRwLCAndXRmLTgnKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGNyZWF0ZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFza0NyZWF0ZSBDQUxMUyBzZWVuCiAgdmFyIHBlbmRpbmdDcmVhdGVzID0ge307ICAgICAgICAgICAgICAgLy8gdG9vbF91c2UgaWQg4oaSIGF3YWl0aW5nIGl0cyByZXN1bHQKICB2YXIgY3JlYXRlZElkcyA9IHt9OyAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGlkcyB0aGlzIHRyYW5zY3JpcHQgYWN0dWFsbHkgb3BlbmVkCiAgdmFyIGNyZWF0ZWRJZENvdW50ID0gMDsKICB2YXIgbGF0ZXN0ID0ge307ICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGlkIOKGkiBtb3N0IHJlY2VudCBzdGF0dXMgc2VlbgogIC8vIFdhbGtlZCBieSBuZXdsaW5lIGluZGV4IHJhdGhlciB0aGFuIHJhdy5zcGxpdCgnXG4nKTogdGhlIHNwbGl0IHdvdWxkIGhvbGQgYQogIC8vIHNlY29uZCBmdWxsLXNpemUgY29weSBvZiBhIG11bHRpLU1CIHRyYW5zY3JpcHQgYWxvbmdzaWRlIHRoZSBmaXJzdCwgYW5kIHRoZQogIC8vIHNjYW4gbmVlZHMgb25lIGxpbmUgYXQgYSB0aW1lLgogIHZhciBwb3MgPSAwOwogIHdoaWxlIChwb3MgPD0gcmF3Lmxlbmd0aCkgewogICAgdmFyIG5sID0gcmF3LmluZGV4T2YoJ1xuJywgcG9zKTsKICAgIHZhciBsaW5lID0gbmwgPCAwID8gcmF3LnNsaWNlKHBvcykgOiByYXcuc2xpY2UocG9zLCBubCk7CiAgICBwb3MgPSBubCA8IDAgPyByYXcubGVuZ3RoICsgMSA6IG5sICsgMTsKICAgIC8vIENoZWFwIHByZS1maWx0ZXIuIEEgbXVsdGktTUIgdHJhbnNjcmlwdCBoYXMgYSBoYW5kZnVsIG9mIHRhc2sgbGluZXMgYW5kCiAgICAvLyB0ZW5zIG9mIHRob3VzYW5kcyBvZiBvdGhlcnM7IEpTT04ucGFyc2Ugb24gZXZlcnkgbGluZSBpcyB0aGUgd2hvbGUgY29zdC4KICAgIGlmIChsaW5lLmluZGV4T2YoJ1Rhc2tDcmVhdGUnKSA8IDAgJiYgbGluZS5pbmRleE9mKCdUYXNrVXBkYXRlJykgPCAwCiAgICAgICYmIGxpbmUuaW5kZXhPZignY3JlYXRlZCBzdWNjZXNzZnVsbHknKSA8IDApIGNvbnRpbnVlOwogICAgdmFyIGVudHJ5OwogICAgdHJ5IHsgZW50cnkgPSBKU09OLnBhcnNlKGxpbmUpOyB9IGNhdGNoIChlKSB7IGNvbnRpbnVlOyB9CiAgICB2YXIgY29udGVudCA9IGVudHJ5ICYmIGVudHJ5Lm1lc3NhZ2UgJiYgZW50cnkubWVzc2FnZS5jb250ZW50OwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250aW51ZTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udGVudC5sZW5ndGg7IGorKykgewogICAgICB2YXIgYmxvY2sgPSBjb250ZW50W2pdOwogICAgICBpZiAoIWJsb2NrKSBjb250aW51ZTsKICAgICAgLy8gVGhlIGNyZWF0ZWQgaWRzIGNvbWUgZnJvbSBUYXNrQ3JlYXRlJ3MgUkVTVUxULCBiZWNhdXNlIHRoZSBjYWxsIGl0c2VsZgogICAgICAvLyBjYXJyaWVzIG5vIGlkLiBXaXRob3V0IHRoZW0gYGNyZWF0ZWRgIChhIGNvdW50IG9mIGNhbGxzKSBhbmQgdGhlIGNsb3NlZAogICAgICAvLyBzZXQgKGEgc2V0IG9mIGlkcykgYXJlIGRpZmZlcmVudCB1bml0czogYSBUYXNrVXBkYXRlIG5hbWluZyBhIHRhc2sgZnJvbQogICAgICAvLyBiZWZvcmUgdGhpcyB0cmFuc2NyaXB0IOKAlCBvbmUgY2FycmllZCBhY3Jvc3MgYC9jbGVhcmAsIHdoaWNoIGlzIGV4YWN0bHkKICAgICAgLy8gd2hhdCBDbGF1ZGUgQ29kZSdzIHRhc2sgc3RvcmUgZG9lcyDigJQgd291bGQgZGlzY291bnQgYSB0YXNrIGl0IG5ldmVyCiAgICAgIC8vIG9wZW5lZCwgYW5kIHRoZSBhZHZpc29yeSB3b3VsZCB1bmRlci1yZXBvcnQgdGhlIG9wZW4gbGlzdC4KICAgICAgaWYgKGJsb2NrLnR5cGUgPT09ICd0b29sX3Jlc3VsdCcpIHsKICAgICAgICBpZiAoIXBlbmRpbmdDcmVhdGVzW2Jsb2NrLnRvb2xfdXNlX2lkXSkgY29udGludWU7CiAgICAgICAgZGVsZXRlIHBlbmRpbmdDcmVhdGVzW2Jsb2NrLnRvb2xfdXNlX2lkXTsKICAgICAgICB2YXIgdGV4dCA9IHR5cGVvZiBibG9jay5jb250ZW50ID09PSAnc3RyaW5nJyA/IGJsb2NrLmNvbnRlbnQgOiBKU09OLnN0cmluZ2lmeShibG9jay5jb250ZW50KTsKICAgICAgICB2YXIgbSA9IC9UYXNrICMoXFMrKSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS8uZXhlYyh0ZXh0IHx8ICcnKTsKICAgICAgICBpZiAobSAmJiAhY3JlYXRlZElkc1ttWzFdXSkgeyBjcmVhdGVkSWRzW21bMV1dID0gdHJ1ZTsgY3JlYXRlZElkQ291bnQrKzsgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIFN0cnVjdHVyYWwsIG5vdCBzdWJzdHJpbmcuIEEgbGluZSB0aGF0IG1lcmVseSBNRU5USU9OUyBUYXNrQ3JlYXRlIOKAlCB0aGlzCiAgICAgIC8vIHRpY2tldCdzIG93biBkaXNjdXNzaW9uLCBhIGd1aWRhbmNlIGV4Y2VycHQsIGEgc2hlbGwgY29tbWFuZCBlY2hvaW5nIHRoZQogICAgICAvLyBwaHJhc2Ug4oCUIGlzIHRleHQsIGFuZCBjb3VudGluZyBpdCB3b3VsZCBpbmZsYXRlIHRoZSBjcmVhdGVkIHRvdGFsIG9uCiAgICAgIC8vIGV4YWN0bHkgdGhlIHNlc3Npb25zIG1vc3QgbGlrZWx5IHRvIHJlYWNoIGEgUFIgZ2F0ZS4gQ29ycmVsYXRpbmcgb24KICAgICAgLy8gdG9vbF91c2VfaWQgaXMgd2hhdCBrZWVwcyBzdWNoIGFuIGVjaG8gb3V0IG9mIHRoZSBjcmVhdGVkIGlkcyB0b28uCiAgICAgIGlmIChibG9jay50eXBlICE9PSAndG9vbF91c2UnKSBjb250aW51ZTsKICAgICAgaWYgKGJsb2NrLm5hbWUgPT09ICdUYXNrQ3JlYXRlJykgewogICAgICAgIGNyZWF0ZWQrKzsKICAgICAgICBpZiAoYmxvY2suaWQpIHBlbmRpbmdDcmVhdGVzW2Jsb2NrLmlkXSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGJsb2NrLm5hbWUgIT09ICdUYXNrVXBkYXRlJykgY29udGludWU7CiAgICAgIHZhciBpbnB1dCA9IGJsb2NrLmlucHV0IHx8IHt9OwogICAgICB2YXIgaWQgPSBpbnB1dC50YXNrSWQgIT0gbnVsbCA/IGlucHV0LnRhc2tJZCA6IGlucHV0LnRhc2tfaWQ7CiAgICAgIHZhciBzdGF0dXMgPSBpbnB1dC5zdGF0dXM7CiAgICAgIGlmIChpZCA9PSBudWxsIHx8IHR5cGVvZiBzdGF0dXMgIT09ICdzdHJpbmcnIHx8ICFzdGF0dXMpIGNvbnRpbnVlOwogICAgICAvLyBMYXN0IHdyaXRlIHdpbnMg4oCUIHRyYW5zY3JpcHQgb3JkZXIgaXMgY2hyb25vbG9naWNhbCwgc28gYSB0YXNrIHJlb3BlbmVkCiAgICAgIC8vIGFmdGVyIGNvbXBsZXRpb24gaXMgY29ycmVjdGx5IGNvdW50ZWQgYXMgb3BlbiBhZ2Fpbi4KICAgICAgbGF0ZXN0W1N0cmluZyhpZCldID0gc3RhdHVzOwogICAgfQogIH0KICBpZiAoY3JlYXRlZCA9PT0gMCkgcmV0dXJuIG51bGw7CiAgLy8gQSBjcmVhdGUgd2hvc2UgcmVzdWx0IG5ldmVyIGxhbmRlZCAoaW50ZXJydXB0ZWQgY2FsbCwgdHJ1bmNhdGVkIHRyYW5zY3JpcHQpCiAgLy8gaXMgY291bnRlZCBPUEVOOiBpdCB3YXMgb3BlbmVkLCBhbmQgbm90aGluZyBvYnNlcnZlZCBpdCBiZWluZyBjbG9zZWQuCiAgdmFyIG9wZW4gPSBjcmVhdGVkIC0gY3JlYXRlZElkQ291bnQ7CiAgT2JqZWN0LmtleXMoY3JlYXRlZElkcykuZm9yRWFjaChmdW5jdGlvbihpZCkgewogICAgLy8gYGRlbGV0ZWRgIGNsb3NlcyB0aGUgbG9vcCBhcyBsZWdpdGltYXRlbHkgYXMgYGNvbXBsZXRlZGA6IGEgdGFzayByZW1vdmVkCiAgICAvLyBiZWNhdXNlIGl0IG5vIGxvbmdlciBhcHBsaWVzIGlzIG5vdCBhbiBhYmFuZG9uZWQgb25lLgogICAgaWYgKGxhdGVzdFtpZF0gIT09ICdjb21wbGV0ZWQnICYmIGxhdGVzdFtpZF0gIT09ICdkZWxldGVkJykgb3BlbisrOwogIH0pOwogIGlmIChvcGVuID4gY3JlYXRlZCkgb3BlbiA9IGNyZWF0ZWQ7CiAgcmV0dXJuIHsgY3JlYXRlZDogY3JlYXRlZCwgY2xvc2VkOiBjcmVhdGVkIC0gb3Blbiwgb3Blbjogb3BlbiB9Owp9Cgpzd2l0Y2ggKGNvbW1hbmQpIHsKICBjYXNlICdjaGVjay1iZWZvcmUtYWdlbnQnOiB7CiAgICAvLyBNb3N0bHkgYWR2aXNvcnkuIFRoZSBUYXNrQ3JlYXRlICsgbWVtb3J5IHJlbWluZGVycyBiZWxvdyBnbyB0byBzdGRvdXQgYW5kCiAgICAvLyBuZXZlciBibG9jayDigJQgdGhlaXIgd29yZGluZyBtdXN0IG5vdCBjbGFpbSBvdGhlcndpc2UgKCMxMzI2KS4gVGhlIG9uZQogICAgLy8gZXhjZXB0aW9uIGlzIHRoZSAjOTUyIHN3YXJtL2hpdmUgY2hlY2sgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGNhc2UsIHdoaWNoCiAgICAvLyB3cml0ZXMgdG8gc3RkZXJyIGFuZCBleGl0cyAyLgogICAgLy8gTWVtb3J5LWZpcnN0IGVuZm9yY2VtZW50IG90aGVyd2lzZSBoYXBwZW5zIGF0IHRoZSBzY2FuL3JlYWQgZ2F0ZSBsYXllci4KICAgIC8vIFN1YmFnZW50U3RhcnQgaG9vayBpbmplY3RzIGd1aWRhbmNlIGRpcmVjdGl2ZSBpbnRvIHN1YmFnZW50IGNvbnRleHQuCiAgICAvLwogICAgLy8gIzkzMSDigJQgVGFza0NyZWF0ZSBSRU1JTkRFUiBhbmQgdGhlIG5hbWVzcGFjZSBoaW50IG1vdmVkIGhlcmUgZnJvbQogICAgLy8gcHJvbXB0LXJlbWluZGVyLiBUaGV5IG9ubHkgbWF0dGVyIHdoZW4gQ2xhdWRlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHNwYXduCiAgICAvLyBhbiBBZ2VudDsgZW1pdHRpbmcgcGVyLXByb21wdCBjb3N0IH45MCB0b2tlbnMgw5cgZXZlcnkgcHJvbXB0IMOXIGV2ZXJ5CiAgICAvLyBjb25zdW1lci4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoY29uZmlnLnRhc2tfY3JlYXRlX2ZpcnN0ICYmICFzLnRhc2tzQ3JlYXRlZCkgewogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnUkVNSU5ERVI6IFVzZSBUYXNrQ3JlYXRlIGJlZm9yZSBzcGF3bmluZyBhZ2VudHMuXG4nKTsKICAgIH0KICAgIGlmIChjb25maWcubWVtb3J5X2ZpcnN0ICYmIHMubWVtb3J5UmVxdWlyZWQgJiYgIXMubWVtb3J5U2VhcmNoZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiBTZWFyY2ggbWVtb3J5IChtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoKSBiZWZvcmUgc3Bhd25pbmcgYWdlbnRzLiBPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyk7CiAgICB9CiAgICBpZiAocy5sYXN0TmFtZXNwYWNlSGludCkgewogICAgICAvLyBQZXItYWN0b3Igc2luZ2xlLXNob3QuIEVhY2ggc2Vzc2lvbl9pZCBnZXRzIHRoZSBoaW50IGF0IG1vc3Qgb25jZSBwZXIKICAgICAgLy8gcHJvbXB0LCBidXQgdGhlIGhpbnQgaXRzZWxmIHN0YXlzIGF2YWlsYWJsZSBmb3Igb3RoZXIgYWN0b3JzIChlLmcuCiAgICAgIC8vIGEgc3ViYWdlbnQgdGhhdCBzcGF3bnMgaXRzIG93biBhZ2VudCBoYXMgaXRzIG93biBzZXNzaW9uX2lkIGFuZCBpcwogICAgICAvLyBlbnRpdGxlZCB0byBhIGZyZXNoIGVtaXNzaW9uKS4gRmFsbHMgYmFjayB0byBhIGBfbGVnYWN5X2AgYnVja2V0IHdoZW4KICAgICAgLy8gQ2xhdWRlIENvZGUgZGlkbid0IGZvcndhcmQgYSBzZXNzaW9uX2lkIChvbGRlciBob3N0IG9yIGRpcmVjdCBDTEkKICAgICAgLy8gaW52b2NhdGlvbiksIHByZXNlcnZpbmcgdGhlIG9sZCAiZW1pdCBvbmNlIGdsb2JhbGx5IiBiZWhhdmlvci4gVGhlCiAgICAgIC8vIG1hcCBpcyB3aXBlZCBieSBhcHBseVByb21wdFN0YXRlUmVzZXQgb24gZXZlcnkgbmV3IHByb21wdC4KICAgICAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICAgICAgdmFyIGVtaXR0ZWRCeSA9IHMubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgfHwge307CiAgICAgIHZhciBidWNrZXQgPSBzaWQgfHwgJ19sZWdhY3lfJzsKICAgICAgaWYgKCFlbWl0dGVkQnlbYnVja2V0XSkgewogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHMubGFzdE5hbWVzcGFjZUhpbnQgKyAnXG4nKTsKICAgICAgICBlbWl0dGVkQnlbYnVja2V0XSA9IHRydWU7CiAgICAgICAgcy5sYXN0TmFtZXNwYWNlSGludEVtaXR0ZWRCeSA9IGVtaXR0ZWRCeTsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICB9CiAgICB9CiAgICAvLyAjOTUyIOKAlCB3aGVuIC9mbCB3YXMgaW52b2tlZCB3aXRoIC1zLy1oLCB0aGUgcHJvdGVjdGVkIE1DUCBpbml0IG11c3QgcnVuCiAgICAvLyBCRUZPUkUgYW55IEFnZW50IHNwYXduLiBIYXJkIGJsb2NrOiB0aGUgdXNlciBleHBsaWNpdGx5IG9wdGVkIGluIHRvCiAgICAvLyBtb2ZsbydzIGNvb3JkaW5hdGlvbiBzdXJmYWNlLCBzbyBzaWxlbnRseSBkaXNwYXRjaGluZyBgQWdlbnRgIGNhbGxzCiAgICAvLyB3aXRob3V0IGBtY3BfX21vZmxvX19zd2FybV9pbml0YCAvIGBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdGAgaXMgdGhlCiAgICAvLyBmYWlsdXJlIG1vZGUgdGhpcyBnYXRlIGV4aXN0cyB0byBwcmV2ZW50IChDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQKICAgIC8vIGZ1bmN0aW9uYWxpdHkg4oCUIHN3YXJtICsgaGl2ZS1taW5kIikuIE90aGVyIEFnZW50IHVzZXMgcmVtYWluIGFkdmlzb3J5LgogICAgaWYgKGNvbmZpZy5zd2FybV9pbnZvY2F0aW9uX2dhdGUpIHsKICAgICAgaWYgKHMuZmxNb2RlID09PSAnc3dhcm0nICYmICFzLnN3YXJtSW5pdGlhbGl6ZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogL2ZsIHdhcyBpbnZva2VkIHdpdGggLXMvLS1zd2FybSBidXQgbWNwX19tb2Zsb19fc3dhcm1faW5pdCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1J1biBtY3BfX21vZmxvX19zd2FybV9pbml0IGZpcnN0LCB0aGVuIG1jcF9fbW9mbG9fX2FnZW50X3NwYXduIGZvciBlYWNoIHJvbGUsIHRoZW4gZGlzcGF0Y2ggQWdlbnQuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShDT09SRF9GQUxMQkFDS19OT1RFICsgJyAgbnB4IGZsbyBzd2FybSBpbml0IC0tdG9wb2xvZ3kgaGllcmFyY2hpY2FsICAodGhlbjogbnB4IGZsbyBhZ2VudCBzcGF3biAtLXR5cGUgPHJvbGU+KVxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1NlZSAuY2xhdWRlL3NraWxscy9mbC9leGVjdXRpb24tbW9kZXMubWQgIlNXQVJNIG1vZGUiIGFuZCBDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQgZnVuY3Rpb25hbGl0eSIuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHN3YXJtX2ludm9jYXRpb25fZ2F0ZTogZmFsc2VcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgICBpZiAocy5mbE1vZGUgPT09ICdoaXZlJyAmJiAhcy5oaXZlSW5pdGlhbGl6ZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogL2ZsIHdhcyBpbnZva2VkIHdpdGggLWgvLS1oaXZlIGJ1dCBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1J1biBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBmaXJzdCwgdGhlbiBkaXNwYXRjaCBBZ2VudCBvciBoaXZlLW1pbmQgd29ya2Vycy5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKENPT1JEX0ZBTExCQUNLX05PVEUgKyAnICBucHggZmxvIGhpdmUtbWluZCBpbml0ICAodGhlbjogbnB4IGZsbyBoaXZlLW1pbmQgc3Bhd24pXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnU2VlIC5jbGF1ZGUvc2tpbGxzL2ZsL2V4ZWN1dGlvbi1tb2Rlcy5tZCAiSElWRS1NSU5EIG1vZGUiIGFuZCBDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQgZnVuY3Rpb25hbGl0eSIuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHN3YXJtX2ludm9jYXRpb25fZ2F0ZTogZmFsc2VcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1zd2FybS1pbml0JzogewogICAgLy8gIzk1MiDigJQgd2lyZWQgdG8gbWNwX19tb2Zsb19fc3dhcm1faW5pdCBQb3N0VG9vbFVzZS4gTWFya3MgdGhlIGdhdGUKICAgIC8vIHNhdGlzZmllZCBzbyBzdWJzZXF1ZW50IEFnZW50IHNwYXducyB1bmRlciAvZmwgLXMgcGFzcy4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMuc3dhcm1Jbml0aWFsaXplZCkgewogICAgICBzLnN3YXJtSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICB3cml0ZVN0YXRlKHMpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1iYXNoLXN3YXJtLWluaXQnOiB7CiAgICAvLyAjMTMzOCBmb2xsb3ctdXAg4oCUIHRoZSBDTEkgaGFsZiBvZiByZWNvcmQtc3dhcm0taW5pdCAvIHJlY29yZC1oaXZlLWluaXQuCiAgICAvLyBXaXJlZCBQb3N0VG9vbFVzZVtCYXNofFBvd2VyU2hlbGxdLCBzbyBpdCBvbmx5IHNlZXMgY29tbWFuZHMgdGhhdAogICAgLy8gc3VjY2VlZGVkICgjMTMyMikuIFNlZSBiYXNoQ29vcmRpbmF0aW9uSW5pdCBmb3Igd2h5IHRoZSBDTEkgcm91dGUgaXMgYQogICAgLy8gcmVhbCBzYXRpc2ZhY3Rpb24gb2YgdGhlICM5NTIgZ2F0ZSBhbmQgbm90IGEgc3RhbmQtaW4uCiAgICB2YXIga2luZCA9IGJhc2hDb29yZGluYXRpb25Jbml0KHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJyk7CiAgICBpZiAoIWtpbmQpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIHZhciBmbGFnID0ga2luZCA9PT0gJ3N3YXJtJyA/ICdzd2FybUluaXRpYWxpemVkJyA6ICdoaXZlSW5pdGlhbGl6ZWQnOwogICAgaWYgKCFzW2ZsYWddKSB7CiAgICAgIHNbZmxhZ10gPSB0cnVlOwogICAgICB3cml0ZVN0YXRlKHMpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1oaXZlLWluaXQnOiB7CiAgICAvLyAjOTUyIOKAlCB3aXJlZCB0byBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBQb3N0VG9vbFVzZS4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMuaGl2ZUluaXRpYWxpemVkKSB7CiAgICAgIHMuaGl2ZUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtc2Nhbic6IHsKICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLm1lbW9yeVJlcXVpcmVkIHx8IGlzTWVtb3J5U2VhcmNoZWRGb3IocykpIGJyZWFrOwogICAgdmFyIHRhcmdldCA9IChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdHRlcm4gfHwgJycpICsgJyAnICsgKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfcGF0aCB8fCAnJyk7CiAgICBpZiAoaXNFcGhlbWVyYWxQYXRoKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfcGF0aCkpIGJyZWFrOwogICAgaWYgKEVYRU1QVC5zb21lKGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRhcmdldC5pbmRleE9mKHApID49IDA7IH0pKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEIFttb2ZsbyBtZW1vcnlfZmlyc3QgZ2F0ZV06IFNlYXJjaCBtZW1vcnkgYmVmb3JlIGV4cGxvcmluZyBmaWxlcy4gVXNlIG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2guIE9uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsgR0FURV9PUklHSU5fTk9URSArICdcbicgKyBHQVRFX0RJU0FCTEVfTk9URSArICdcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtcmVhZCc6IHsKICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLm1lbW9yeVJlcXVpcmVkIHx8IGlzTWVtb3J5U2VhcmNoZWRGb3IocykpIGJyZWFrOwogICAgdmFyIGZwID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9maWxlX3BhdGggfHwgJyc7CiAgICAvLyBFcGhlbWVyYWwgdG1wL3NjcmF0Y2ggcmVhZHMgYXJlIGV4ZW1wdCBldmVuIHdoZW4gdGhleSBsb29rIGxpa2UgZ3VpZGFuY2UKICAgIC8vIChhIHRlbXAgY29weSBpcyBzdGlsbCB0cmFuc2llbnQgdG9vbCBJL08sIG5vdCB0aGUgaW5kZXhlZCBzb3VyY2UpLgogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChmcCkpIGJyZWFrOwogICAgdmFyIGlzR3VpZGFuY2UgPSBmcC5pbmRleE9mKCcuY2xhdWRlL2d1aWRhbmNlLycpID49IDAgfHwgZnAuaW5kZXhPZignLmNsYXVkZVxcZ3VpZGFuY2VcXCcpID49IDA7CiAgICBpZiAoIWlzR3VpZGFuY2UgJiYgRVhFTVBULnNvbWUoZnVuY3Rpb24ocCkgeyByZXR1cm4gZnAuaW5kZXhPZihwKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSByZWFkaW5nIGZpbGVzLiBVc2UgbWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaC4gT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicgKyBNQ1BfRkFMTEJBQ0tfTk9URSArICdcbicgKyBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArIEdBVEVfRElTQUJMRV9OT1RFICsgJ1xuJyk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIGNhc2UgJ3JlY29yZC10YXNrLWNyZWF0ZWQnOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgcy50YXNrc0NyZWF0ZWQgPSB0cnVlOwogICAgcy50YXNrQ291bnQgPSAocy50YXNrQ291bnQgfHwgMCkgKyAxOwogICAgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICAvLyAjMTQzNSDigJQgdGhlIGVzY2FwZSBmcm9tIHRoZSB0YXNrLXN0YXR1cyBnYXRlLCBmb3Igd29yayBkZWxpYmVyYXRlbHkgbGVmdAogIC8vIG9wZW4uIFNlc3Npb24tc2NvcGVkIGxpa2UgYGxlYXJuaW5nc1N0b3JlZGA6IGl0IGxpdmVzIGluIFNUQVRFX0RFRkFVTFRTLCBzbwogIC8vIHNlc3Npb24tcmVzZXQgY2xlYXJzIGl0LCBhbmQgbmVpdGhlciBhcHBseVByb21wdFN0YXRlUmVzZXQgbm9yCiAgLy8gcmVzZXQtZWRpdC1nYXRlcyB0b3VjaGVzIGl0IOKAlCBhIGRlY2lzaW9uIHRoZSB1c2VyIG1hZGUgYWJvdXQgdGhlIHRhc2sgbGlzdAogIC8vIGlzIG5vdCBpbnZhbGlkYXRlZCBieSB0aGUgbmV4dCBwcm9tcHQgb3IgdGhlIG5leHQgc291cmNlIGVkaXQuCiAgLy8KICAvLyBBIHBsYWluIGZsYWcsIG5vdCBhIGNvdW50LiBUaGUgY29tbWFuZCBpcyB0eXBlZCBieSB0aGUgbW9kZWwgaW50byBhIEJhc2gKICAvLyB0b29sLCB3aGVyZSBIT09LX1RSQU5TQ1JJUFRfUEFUSCBpcyB1bnNldCAoaXQgaXMgZm9yd2FyZGVkIGJ5IGdhdGUtaG9vay5tanMKICAvLyBmcm9tIHRoZSBob29rIHBheWxvYWQgYW5kIGV4aXN0cyBvbmx5IGluc2lkZSBhIGhvb2spLCBzbyB0aGlzIHByb2Nlc3MgY2Fubm90CiAgLy8gcmVhZCB0aGUgbGVkZ2VyIHRvIHJlY29yZCBXSElDSCB0YXNrcyB3ZXJlIGFja25vd2xlZGdlZCBldmVuIGlmIGl0IHdhbnRlZCB0by4KICBjYXNlICdyZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICBzLnRhc2tzQWNrbm93bGVkZ2VkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIC8vIHdyaXRlU3RhdGUgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMgYnkgZGVzaWduIOKAlCBhIGdhdGUgbXVzdCBuZXZlciBjcmFzaCB0aGUKICAgIC8vIGhvb2sgaXQgcnVucyBpbi4gVGhhdCB3YXMgaGFybWxlc3Mgd2hpbGUgZXZlcnkgcmVjb3JkZXIgd2FzIGFkdmlzb3J5LiBUaGlzCiAgICAvLyBvbmUgaXMgdGhlIE9OTFkgZXNjYXBlIGZyb20gYSBCTE9DS0lORyBnYXRlLCBzbyBhIGxvc3Qgd3JpdGUgd291bGQgcmVwb3J0CiAgICAvLyAic2F0aXNmaWVkIiBhbmQgdGhlbiBibG9jayB0aGUgdmVyeSBuZXh0IGBnaCBwciBjcmVhdGVgIHdpdGggbm90aGluZyBzYWlkCiAgICAvLyBhYm91dCB3aHk6ICMxMzMyJ3MgZGVhZGxvY2sgc2hhcGUgZXhhY3RseS4gQ29uZmlybSBpdCBsYW5kZWQgYmVmb3JlCiAgICAvLyBjbGFpbWluZyBpdCBkaWQsIGFuZCBuYW1lIHRoZSBmaWxlIGFuZCB0aGUgd2F5IG91dCB3aGVuIGl0IGRpZCBub3QuCiAgICBpZiAoIXJlYWRTdGF0ZSgpLnRhc2tzQWNrbm93bGVkZ2VkKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdUYXNrLXN0YXR1cyBnYXRlIE5PVCBzYXRpc2ZpZWQ6IHRoZSBhY2tub3dsZWRnZW1lbnQgY291bGQgbm90IGJlIHBlcnNpc3RlZCB0b1xuJyArCiAgICAgICAgU1RBVEVfRklMRSArICdcbicgKwogICAgICAgICdDaGVjayB0aGF0IHRoZSBmaWxlIGFuZCBpdHMgZGlyZWN0b3J5IGFyZSB3cml0YWJsZSwgdGhlbiBydW4gdGhpcyBhZ2Fpbi5cbicgKwogICAgICAgICdUbyBwcm9jZWVkIHdpdGhvdXQgaXQ6IHNldCBnYXRlczogdGFza19zdGF0dXNfZ2F0ZTogb2ZmIGluIG1vZmxvLnlhbWwuXG4nKTsKICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoCiAgICAgICdUYXNrLXN0YXR1cyBnYXRlIHNhdGlzZmllZDogb3BlbiB0YXNrcyBhY2tub3dsZWRnZWQgYXMgZGVsaWJlcmF0ZWx5IGRlZmVycmVkLlxuJyArCiAgICAgICdUaGV5IHN0YXkgdmlzaWJsZSBpbiB0aGUgdGFzayBsaXN0IOKAlCB0aGlzIHJlY29yZHMgdGhlIGRlY2lzaW9uLCBpdCBkb2VzIG5vdCBjbG9zZSB0aGVtLlxuJyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLW1lbW9yeS1zZWFyY2hlZCc6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAobWFya01lbW9yeVNlYXJjaGVkKHMpKSB3cml0ZVN0YXRlKHMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJhc2gtbWVtb3J5JzogewogICAgLy8gIzExMzIg4oCUIHByZXNlcnZlIENSRURJVCBzaWRlLWVmZmVjdCBBTkQgYWRkIGEgQkxPQ0sgYXJtIGZvciByZWFkLWxpa2UKICAgIC8vIEJhc2ggY29tbWFuZHMuIFdpcmVkIGFzIFByZVRvb2xVc2VbQmFzaF0gKHdhcyBQb3N0VG9vbFVzZSBiZWZvcmUgIzExMzIpCiAgICAvLyBzbyBwcm9jZXNzLmV4aXQoMikgYWN0dWFsbHkgcHJldmVudHMgdGhlIHJlYWQgZnJvbSByZWFjaGluZyB0aGUgc2hlbGwuCiAgICAvLwogICAgLy8gIzExNzEg4oCUIHRoZSBjYXNlIG5hbWUgaXMgaGlzdG9yaWNhbC4gVGhlIG1hdGNoZXIgbm93IGFsc28gY292ZXJzIHRoZQogICAgLy8gZGVkaWNhdGVkIGBQb3dlclNoZWxsYCB0b29sLCBhbmQgUkVBRF9MSUtFX0JBU0hfUkUgYWxyZWFkeSBtYXRjaGVkIFBTCiAgICAvLyByZWFkZXJzIChHZXQtQ29udGVudC9TZWxlY3QtU3RyaW5nL0dldC1DaGlsZEl0ZW0gLVJlY3Vyc2UvRm9ybWF0LUhleCkuCiAgICAvLyBUcmVhdCB0aGlzIGNhc2UgYXMgc2hlbGwtYWdub3N0aWMgcmVhZC1nYXRlIGxvZ2ljLgogICAgdmFyIGNtZCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKCiAgICAvLyAxKSBDUkVESVQg4oCUIHByZXNlcnZlZCBiZWhhdmlvci4gQSByZWFsIG1lbW9yeS1zZWFyY2ggaW52b2NhdGlvbiBmbGlwcwogICAgLy8gdGhlIGdhdGUgZmxhZyBzbyBzdWJzZXF1ZW50IFJlYWQvR3JlcC9HbG9iIHdpdGhpbiB0aGlzIHByb21wdCBwYXNzLgogICAgaWYgKGNyZWRpdHNNZW1vcnlTZWFyY2goY21kKSkgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICBpZiAobWFya01lbW9yeVNlYXJjaGVkKHMpKSB3cml0ZVN0YXRlKHMpOwogICAgICBicmVhazsKICAgIH0KCiAgICAvLyAyKSBCTE9DSyDigJQgbmV3IGJlaGF2aW9yLiBDaGVhcCByZWdleCBjaGVja3MgY29tZSBCRUZPUkUgcmVhZFN0YXRlKCkgc28KICAgIC8vIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgQmFzaCBpbnZvY2F0aW9ucyAoZ2l0L25wbS9jdXJsL2VjaG8vZXRjLikKICAgIC8vIG5ldmVyIHRvdWNoIHRoZSBmaWxlc3lzdGVtLiBPcmRlcjogY29uZmlnIGZsYWcg4oaSIGNvbW1hbmQtc2hhcGUgcmVnZXhlcwogICAgLy8g4oaSIHN0YXRlIHJlYWQg4oaSIG1lbW9yeSBnYXRlLgogICAgaWYgKCFjb25maWcubWVtb3J5X2ZpcnN0KSBicmVhazsKICAgIGlmICghUkVBRF9MSUtFX0JBU0hfUkUudGVzdChjbWQpKSBicmVhazsKICAgIGlmIChCQVNIX0NBUlZFX09VVF9SRS50ZXN0KGNtZCkpIGJyZWFrOwogICAgdmFyIHMyID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMyLm1lbW9yeVJlcXVpcmVkIHx8IGlzTWVtb3J5U2VhcmNoZWRGb3IoczIpKSBicmVhazsKICAgIC8vIEhpbnQgcHJlY2VkZW5jZTogcHJvbXB0LWRlcml2ZWQgY2xhc3NpZmljYXRpb24gKHNldCBieSBhcHBseVByb21wdFN0YXRlUmVzZXQKICAgIC8vIGZyb20gdGhlIHVzZXIgcHJvbXB0IHRleHQpIOKGkiBjb21tYW5kLXNoYXBlIGNsYXNzaWZpY2F0aW9uICh3b3JrcyBmb3IKICAgIC8vIHN1YmFnZW50cyB0aGF0IG5ldmVyIHNhdyB0aGUgdXNlciBwcm9tcHQpLiBFaXRoZXIgc291cmNlIHJldHVybnMgYSBmdWxsCiAgICAvLyAiTWVtb3J5IG5hbWVzcGFjZSBoaW50OiAuLi4iIHNlbnRlbmNlIHNvIHRoZSBCTE9DSyBtZXNzYWdlIHN0YXlzIHVuaWZvcm0uCiAgICB2YXIgaGludCA9IHMyLmxhc3ROYW1lc3BhY2VIaW50IHx8IGNsYXNzaWZ5QmFzaE5hbWVzcGFjZUhpbnQoY21kKSB8fCAnJzsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSByZWFkaW5nIGZpbGVzIHZpYSBCYXNoLlxuJyArCiAgICAgICdFeGFtcGxlOiBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHsgcXVlcnk6ICI8dG9waWM+IiwgbmFtZXNwYWNlOiAiPG9uZSBvZjogZ3VpZGFuY2UgfCBjb2RlLW1hcCB8IHBhdHRlcm5zIHwgbGVhcm5pbmdzIHwgdGVzdHM+IiB9XG4nICsKICAgICAgKGhpbnQgPyBoaW50ICsgJ1xuJyA6ICcnKSArCiAgICAgICdPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyArCiAgICAgIE1DUF9GQUxMQkFDS19OT1RFICsgJ1xuJyArCiAgICAgIEdBVEVfT1JJR0lOX05PVEUgKyAnXG4nICsKICAgICAgR0FURV9ESVNBQkxFX05PVEUgKyAnXG4nCiAgICApOwogICAgcHJvY2Vzcy5leGl0KDIpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLXRhc2stdHJhbnNpdGlvbic6IHsKICAgIC8vIEludGVudGlvbmFsIG5vLW9wLCByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSAoIzEzMzEpLgogICAgLy8gVGhlIGBeVGFza1VwZGF0ZSRgIHdpcmluZyB3YXMgcmVtb3ZlZCBmcm9tIHNldHRpbmdzLWdlbmVyYXRvci50cywKICAgIC8vIGhvb2stYmxvY2staGFzaC50cyBhbmQgaG9vay13aXJpbmcudHMgYmVjYXVzZSBzcGF3bmluZyBnYXRlLWhvb2subWpzICsKICAgIC8vIGdhdGUuY2pzIG9uIGV2ZXJ5IFRhc2tVcGRhdGUgdG8gZG8gbm90aGluZyBpcyBwdXJlIG92ZXJoZWFkLiBUaGUgY2FzZQogICAgLy8gc3RheXMgYmVjYXVzZSBkb2N0b3ItY2hlY2tzLWRlZXAudHMgbGlzdHMgaXQgaW4gUkVRVUlSRURfR0FURV9DQVNFUyDigJQKICAgIC8vIGRyb3BwaW5nIHRoZSBjYXNlIHdvdWxkIHR1cm4gYGZsbyBkb2N0b3JgJ3MgR2F0ZSBIZWFsdGggY2hlY2sgcmVkIGluCiAgICAvLyBldmVyeSBjb25zdW1lciBmb3Igbm8gZ2Fpbi4gKEZhbGxpbmcgdGhyb3VnaCB0byBgZGVmYXVsdDogYnJlYWtgIHdvdWxkCiAgICAvLyBvdGhlcndpc2UgYmUgaGFybWxlc3M7IHRoaXMgaXMgYWJvdXQgdGhlIGRvY3RvciBjb250cmFjdCwgbm90IHJ1bnRpbWUuKQogICAgLy8gV2h5IGl0IGRvZXMgbm90aGluZzogc2VlIGFwcGx5UHJvbXB0U3RhdGVSZXNldCgpLgogICAgYnJlYWs7CiAgfQogIC8vICMxNDM0IOKAlCB0aGUgZ2F0ZSBkZW1hbmRlZCBvbmUgbWVtb3J5X3N0b3JlIHBlciBydW4gd2hldGhlciBvciBub3QgdGhlIHJ1bgogIC8vIHByb2R1Y2VkIGEgcmV1c2FibGUgbGVzc29uLCBhbmQgYSBtYW5kYXRvcnkgd3JpdGUgd2l0aCBub3RoaW5nIHRvIHNheQogIC8vIHByb2R1Y2VzIGZpbGxlcjogYSBzdW1tYXJ5IG9mIHRoaXMgdGlja2V0LCB0aGlzIGNvbW1pdCwgYXBwbGljYWJsZSBuZXZlcgogIC8vIGFnYWluLiBtZW1vcnlfc2VhcmNoIHJldHVybnMgYSBib3VuZGVkIHNldCwgc28gZWFjaCBvZiB0aG9zZSBkaXNwbGFjZXMgYQogIC8vIHJlYWwgbGVzc29uIGZyb20gZXZlcnkgZnV0dXJlIHNlYXJjaCDigJQgdGhlIGNvc3QgaXMgcmV0cmlldmFsIHF1YWxpdHksIG5vdAogIC8vIGRpc2suIERlY2xhcmluZyAibm90aGluZyBkdXJhYmxlIGhlcmUiIGlzIHRoZSBob25lc3Qgb3V0Y29tZSBvZiBhIHJ1biB0aGF0CiAgLy8gbGVhcm5lZCBub3RoaW5nIG5ldywgc28gaXQgaGFzIHRvIGJlIHJlYWNoYWJsZSB3aXRob3V0IGEgd3JpdGU7IG90aGVyd2lzZQogIC8vIHRoZSBjaGVhcGVzdCB3YXkgcGFzdCB0aGUgZ2F0ZSBzdGF5cyB0aGUgZmlsbGVyIHdyaXRlLgogIC8vCiAgLy8gQm90aCBjcmVkaXRzIHNldCB0aGUgc2FtZSBmbGFnOyB0aGV5IGRpZmZlciBvbmx5IGluIHdoZXRoZXIgdGhlIHJ1biBoYXMKICAvLyBzb21ldGhpbmcgdG8gc2F5LiBTaGFyaW5nIHRoZSBjYXNlIGJvZHkga2VlcHMgdGhhdCBzaW5nbGUgd3JpdGUgaW4gb25lCiAgLy8gcGxhY2UgYWNyb3NzIGFsbCB0aHJlZSBjb3BpZXMgb2YgdGhpcyBmaWxlLgogIGNhc2UgJ3JlY29yZC1sZWFybmluZ3Mtc3RvcmVkJzoKICBjYXNlICdyZWNvcmQtbm8tZHVyYWJsZS1sZXNzb24nOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLmxlYXJuaW5nc1N0b3JlZCkgewogICAgICBzLmxlYXJuaW5nc1N0b3JlZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICBpZiAoY29tbWFuZCA9PT0gJ3JlY29yZC1uby1kdXJhYmxlLWxlc3NvbicpIHsKICAgICAgLy8gU2FtZSByZWFzb25pbmcgYXMgcmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZCBhYm92ZTogd3JpdGVTdGF0ZSBzd2FsbG93cwogICAgICAvLyBpdHMgb3duIGVycm9ycyBzbyBhIGdhdGUgbmV2ZXIgY3Jhc2hlcyB0aGUgaG9vayBpdCBydW5zIGluLCBhbmQgdGhpcyBpcwogICAgICAvLyB0aGUgT05MWSBlc2NhcGUgZnJvbSB0aGUgQkxPQ0tJTkcgbGVhcm5pbmdzIGdhdGUgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGEKICAgICAgLy8gbWVtb3J5X3N0b3JlLiBBIGxvc3Qgd3JpdGUgaGVyZSB3b3VsZCBwcmludCAic2F0aXNmaWVkIiBhbmQgdGhlbiBibG9jawogICAgICAvLyB0aGUgbmV4dCBgZ2ggcHIgY3JlYXRlYCB3aXRoIG5vdGhpbmcgc2FpZCBhYm91dCB3aHkg4oCUICMxMzMyJ3MgZGVhZGxvY2suCiAgICAgIC8vIFZlcmlmaWVkIG9ubHkgb24gdGhpcyBhcm06IHJlY29yZC1sZWFybmluZ3Mtc3RvcmVkIGlzIGZpcmVkCiAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFBvc3RUb29sVXNlIGhvb2sgb24gZXZlcnkgbWVtb3J5X3N0b3JlLCB3aGVyZSBhCiAgICAgIC8vIGZhaWxlZCB3cml0ZSBsZWF2ZXMgdGhlIGdhdGUgY2xvc2VkIGJ1dCB0aGUgcnVuIHN0aWxsIGhhcyB0aGUgb3JkaW5hcnkKICAgICAgLy8gd2F5IHRocm91Z2gsIGFuZCBhIGRpYWdub3N0aWMgb24gZXZlcnkgc3RvcmUgd291bGQgYmUgbm9pc2UuCiAgICAgIGlmICghcmVhZFN0YXRlKCkubGVhcm5pbmdzU3RvcmVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAnTGVhcm5pbmdzIGdhdGUgTk9UIHNhdGlzZmllZDogdGhlIGRlY2xhcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJzaXN0ZWQgdG9cbicgKwogICAgICAgICAgU1RBVEVfRklMRSArICdcbicgKwogICAgICAgICAgJ0NoZWNrIHRoYXQgdGhlIGZpbGUgYW5kIGl0cyBkaXJlY3RvcnkgYXJlIHdyaXRhYmxlLCB0aGVuIHJ1biB0aGlzIGFnYWluLlxuJyArCiAgICAgICAgICAnVG8gcHJvY2VlZCB3aXRob3V0IGl0OiBzZXQgZ2F0ZXM6IGxlYXJuaW5nc19nYXRlOiBmYWxzZSBpbiBtb2Zsby55YW1sLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgICB9CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgICdMZWFybmluZ3MgZ2F0ZSBzYXRpc2ZpZWQ6IG5vIGR1cmFibGUgbGVzc29uIGRlY2xhcmVkIGZvciB0aGlzIHJ1bi5cbicgKwogICAgICAgICdXaGF0IHRoaXMgcnVuIGRpZCBiZWxvbmdzIGluIHRoZSBQUiBib2R5LCBub3QgaW4gbWVtb3J5LlxuJywKICAgICAgKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtdGVzdC1ydW4nOiB7CiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKFRFU1RfUlVOTkVSX1JFLnRlc3QoY21kKSkgewogICAgICAvLyAjMTMyMiDigJQgYSByZWQgcnVuIGlzIGV2aWRlbmNlIEFHQUlOU1QgdGhlIGdhdGUsIHNvIGl0IGFsc28gY2xlYXJzIGEKICAgICAgLy8gZmxhZyBhbiBlYXJsaWVyIGdyZWVuIHJ1biBlYXJuZWQuIFdpdGhvdXQgdGhlIHJlc2V0LCBgbnBtIHRlc3RgIChncmVlbikKICAgICAgLy8gZm9sbG93ZWQgYnkgYW4gZWRpdCBhbmQgYG5wbSB0ZXN0IHwgdGFpbCAtMjBgIChyZWQpIHdvdWxkIGxlYXZlIHRoZQogICAgICAvLyBnYXRlIHNhdGlzZmllZCBieSB0aGUgc3RhbGUgZmlyc3QgcnVuIOKAlCB0aGUgZWRpdCByZXNldHMgdGVzdHNSdW4sIGJ1dAogICAgICAvLyB0aGUgbWFza2VkIHJlZCBydW4gd291bGQgaW1tZWRpYXRlbHkgc2V0IGl0IGJhY2suCiAgICAgIHZhciBmYWlsdXJlID0gZGV0ZWN0VGVzdEZhaWx1cmUoKTsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgaWYgKGZhaWx1cmUpIHsKICAgICAgICBpZiAocy50ZXN0c1J1bikgeyBzLnRlc3RzUnVuID0gZmFsc2U7IHMudGVzdHNGaW5nZXJwcmludCA9IG51bGw7IHdyaXRlU3RhdGUocyk7IH0KICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXRlc3QtcnVuIG5vdCBjcmVkaXRlZCDigJQgJyArIGZhaWx1cmUgKyAnXG4nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZS1zdGFtcCBvbiBldmVyeSBncmVlbiBydW4sIG5vdCBvbmx5IHRoZSBmaXJzdDogdGhlIHRyZWUgbWF5IGhhdmUKICAgICAgICAvLyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBvbmUsIGFuZCB0aGlzIHJ1biBpcyBldmlkZW5jZSBhYm91dCB0aGUgdHJlZSBhcwogICAgICAgIC8vIGl0IGlzIE5PVy4gR2F0aW5nIG9uIGAhcy50ZXN0c1J1bmAgd291bGQga2VlcCB0aGUgb2xkZXIgZmluZ2VycHJpbnQKICAgICAgICAvLyBhbmQgZGlzY2FyZCB0aGUgZnJlc2hlciBldmlkZW5jZS4KICAgICAgICB2YXIgdGVzdHNGcCA9IGNyZWRpdEZpbmdlcnByaW50KCdhbGwnKTsKICAgICAgICBpZiAoIXMudGVzdHNSdW4gfHwgcy50ZXN0c0ZpbmdlcnByaW50ICE9PSB0ZXN0c0ZwKSB7CiAgICAgICAgICBzLnRlc3RzUnVuID0gdHJ1ZTsKICAgICAgICAgIHMudGVzdHNGaW5nZXJwcmludCA9IHRlc3RzRnA7CiAgICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjbWQpIHsKICAgICAgLy8gIzExNzYg4oCUIGVtaXQgYSBzdGRlcnIgY3J1bWIgd2hlbiBpbnZva2VkIHdpdGggYSBub24tZW1wdHkgY29tbWFuZCB0aGF0CiAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggdGhlIHRlc3QtcnVubmVyIHBhdHRlcm4uIENvbW1vbiBwaXRmYWxsOiB1c2VycyBydW4gdGhlCiAgICAgIC8vIHN0YW1wIG1hbnVhbGx5IGZyb20gYSB0ZXJtaW5hbCB0byAic2F0aXNmeSB0aGUgZ2F0ZSI7IHRoZSBzaWxlbnQgbm8tb3AKICAgICAgLy8gbG9va3MgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBzdWNjZXNzLiBnYXRlLWhvb2subWpzIGRyb3BzIHN0ZGVyciBmcm9tCiAgICAgIC8vIGV4aXQtMCBpbnZvY2F0aW9ucywgc28gdGhpcyBvbmx5IHN1cmZhY2VzIHRvIGRpcmVjdCBDTEkgdXNlIOKAlCBleGFjdGx5CiAgICAgIC8vIHRoZSBjYXNlIHdoZXJlIHRoZSBmcmljdGlvbiBsaXZlcy4KICAgICAgdmFyIHByZXZpZXcgPSBjbWQubGVuZ3RoID4gODAgPyBjbWQuc2xpY2UoMCwgNzcpICsgJy4uLicgOiBjbWQ7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdGVzdC1ydW4gbm8tb3Ag4oCUIFRPT0xfSU5QVVRfY29tbWFuZD0iJyArIHByZXZpZXcgKyAnIiBkaWQgbm90IG1hdGNoIFRFU1RfUlVOTkVSX1JFXG4nKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtc2tpbGwtcnVuJzogewogICAgdmFyIHNrTmFtZSA9IChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3NraWxsIHx8ICcnKTsKICAgIGlmIChza05hbWUgPT09ICdzaW1wbGlmeScgfHwgc2tOYW1lID09PSAnZmxvLXNpbXBsaWZ5JyB8fCBza05hbWUgPT09ICdkaXN0aWxsJykgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlOwogICAgICBpZiAoIXMuc2ltcGxpZnlSdW4pIHsgcy5zaW1wbGlmeVJ1biA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgICAgIC8vICdub250ZXN0JyBzY29wZTogYSBsYXRlciB0ZXN0LW9ubHkgZWRpdCBtdXN0IG5vdCBpbnZhbGlkYXRlIHRoaXMgcmV2aWV3CiAgICAgIC8vICgjOTA4KSwgc28gdGVzdCBmaWxlcyBhcmUgZXhjbHVkZWQgZnJvbSB3aGF0IHRoZSBjcmVkaXQgaXMgcGlubmVkIHRvLgogICAgICB2YXIgc2ltcGxpZnlGcCA9IGNyZWRpdEZpbmdlcnByaW50KCdub250ZXN0Jyk7CiAgICAgIGlmIChzLnNpbXBsaWZ5RmluZ2VycHJpbnQgIT09IHNpbXBsaWZ5RnApIHsgcy5zaW1wbGlmeUZpbmdlcnByaW50ID0gc2ltcGxpZnlGcDsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgLy8gU25hcHNob3QgSEVBRCBzbyBjaGVjay1iZWZvcmUtcHIgY2FuIGNsYXNzaWZ5IGRlbHRhLXNpbmNlLXNpbXBsaWZ5IGFuZAogICAgICAvLyBza2lwIGEgcmVkdW5kYW50IC9zaW1wbGlmeSByZS1ydW4gd2hlbiBvbmx5IHRyaXZpYWwgZml4ZXMgZm9sbG93ZWQuCiAgICAgIC8vIE5vbi1mYXRhbCDigJQgZ2F0ZSBmYWxscyB0aHJvdWdoIHRvIGN1cnJlbnQgYmVoYXZpb3VyIHdpdGhvdXQgdGhlIHNuYXBzaG90LgogICAgICB0cnkgewogICAgICAgIHZhciBzaGEgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgewogICAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgICB9KS50cmltKCk7CiAgICAgICAgaWYgKHNoYSAmJiBzLnNpbXBsaWZ5U25hcHNob3RTaGEgIT09IHNoYSkgeyBzLnNpbXBsaWZ5U25hcHNob3RTaGEgPSBzaGE7IGNoYW5nZWQgPSB0cnVlOyB9CiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogbm8gZ2l0IG9yIGRldGFjaGVkIHN0YXRlIOKAlCBza2lwIHNuYXBzaG90LCBnYXRlIHN0aWxsIHdvcmtzICovIH0KICAgICAgaWYgKGNoYW5nZWQpIHdyaXRlU3RhdGUocyk7CiAgICB9IGVsc2UgaWYgKHNrTmFtZSkgewogICAgICAvLyAjMTE3NiDigJQgc2FtZSByYXRpb25hbGUgYXMgcmVjb3JkLXRlc3QtcnVuLiBBIG5vLW9wIHN0YW1wIG9uIGEgbm9uLXNpbXBsaWZ5CiAgICAgIC8vIHNraWxsIG5hbWUgaXMgc2lsZW50IHRvIGhvb2tzIChnYXRlLWhvb2subWpzIGRyb3BzIGV4aXQtMCBzdGRlcnIpIGJ1dAogICAgICAvLyB2aXNpYmxlIHdoZW4gYSB1c2VyIHJ1bnMgdGhlIHN0YW1wIGRpcmVjdGx5IHRvICJzYXRpc2Z5IHRoZSBnYXRlIiBhbmQKICAgICAgLy8gd29uZGVycyB3aHkgc2ltcGxpZnlSdW4gc3RheXMgZmFsc2UuCiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtc2tpbGwtcnVuIG5vLW9wIOKAlCBUT09MX0lOUFVUX3NraWxsPSInICsgc2tOYW1lICsgJyIgaXMgbm90IHNpbXBsaWZ5L2Zsby1zaW1wbGlmeVxuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXZlcmlmeS1ydW4nOiB7CiAgICAvLyBTdG9yeSAjMTI3NCAoRXBpYyAjMTI2OSkuIEZpcmVzIFBvc3RUb29sVXNlIG9uIF5Ta2lsbCQgd2hlbiB0aGUgbmF0aXZlCiAgICAvLyAvdmVyaWZ5IHNraWxsIHJ1bnMsIHNhdGlzZnlpbmcgdGhlIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlLiBNaXJyb3JzCiAgICAvLyByZWNvcmQtc2tpbGwtcnVuJ3MgZmF1bHQtdG9sZXJhbnQgc2hhcGUuIFRoZSB2ZXJpZmljYXRpb24gT1VUQ09NRSAod2hhdAogICAgLy8gd2FzIGNoZWNrZWQsIHBhc3MvZmFpbCkgaXMgd3JpdHRlbiB0byBtZW1vcnkgYnkgdGhlIHZlcmlmeSBmbG93IGl0c2VsZgogICAgLy8gdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9zdG9yZSDigJQgc2FtZSBkaXZpc2lvbiBvZiBsYWJvdXIgYXMgdGVzdHNSdW4gdnMgdGhlCiAgICAvLyB0ZXN0IG91dHB1dDsgdGhpcyByZWNvcmRlciBvbmx5IHRyYWNrcyB0aGF0IHZlcmlmaWNhdGlvbiBoYXBwZW5lZC4KICAgIHZhciB2TmFtZSA9IChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3NraWxsIHx8ICcnKTsKICAgIC8vIE9ubHkgdGhlIG5hdGl2ZSAvdmVyaWZ5IHNraWxsIHNhdGlzZmllcyB2ZXJpZnktYmVmb3JlLWRvbmUuIC93YXJkIGFuZAogICAgLy8gL3F1aWNrZW4gYXJlIHRhcmdldGVkIGF1ZGl0cywgTk9UIHRoZSBjb21wbGV0aW9uIGdhdGUgKHNlZSBmbC9zZGQubWQpIOKAlAogICAgLy8gY3JlZGl0aW5nIHRoZW0gd291bGQgbGV0IHRoZSBnYXRlIHBhc3Mgd2l0aG91dCBhbiBlbmQtdG8tZW5kIHZlcmlmeS4KICAgIGlmICh2TmFtZSA9PT0gJ3ZlcmlmeScpIHsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgLy8gIzEzMzI6IGludm9raW5nIC92ZXJpZnkgc3RhcnRzIGEgdmVyaWZpY2F0aW9uOyBpdCBkb2VzIG5vdCBjb25jbHVkZQogICAgICAvLyBvbmUuIENsZWFyIGFueSBwcmlvciB2ZXJkaWN0IHNvIHRoZSBydW4gaW4gcHJvZ3Jlc3MgY2Fubm90IGluaGVyaXQgdGhlCiAgICAgIC8vIFBBU1MgZnJvbSBhIHByZXZpb3VzIGlzc3VlIGFuZCBzYXRpc2Z5IGNoZWNrLWJlZm9yZS1kb25lIG9uIGl0cyBvd24uCiAgICAgIHZhciB2ZXJpZnlGcCA9IGNyZWRpdEZpbmdlcnByaW50KCdhbGwnKTsKICAgICAgaWYgKCFzLnZlcmlmeVJ1biB8fCBzLnZlcmlmeU91dGNvbWUgfHwgcy52ZXJpZnlGaW5nZXJwcmludCAhPT0gdmVyaWZ5RnApIHsKICAgICAgICBzLnZlcmlmeVJ1biA9IHRydWU7CiAgICAgICAgcy52ZXJpZnlPdXRjb21lID0gbnVsbDsKICAgICAgICBzLnZlcmlmeUZpbmdlcnByaW50ID0gdmVyaWZ5RnA7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh2TmFtZSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1ydW4gbm8tb3Ag4oCUIFRPT0xfSU5QVVRfc2tpbGw9IicgKyB2TmFtZSArICciIGlzIG5vdCB2ZXJpZnlcbicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC12ZXJpZnktb3V0Y29tZSc6IHsKICAgIC8vICMxMzMyLiBGaXJlcyBQb3N0VG9vbFVzZSBvbiBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUuIGByZWNvcmQtdmVyaWZ5LXJ1bmAKICAgIC8vIGFib3ZlIHByb3ZlcyBhIHZlcmlmaWNhdGlvbiB3YXMgQVRURU1QVEVEOyB0aGlzIHByb3ZlcyBob3cgaXQgRU5ERUQuCiAgICAvLwogICAgLy8gVGhlIHZlcmRpY3QgaXMgcmVhZCBmcm9tIHRoZSBzdHJ1Y3R1cmVkIHJlY29yZCAjMTMyOCBtYWRlIC92ZXJpZnkgd3JpdGUKICAgIC8vIHRvIG1lbW9yeV9zdG9yZSdzIGBtZXRhZGF0YWAg4oCUIG5ldmVyIHBhcnNlZCBvdXQgb2YgdGhlIHByb3NlIGB2YWx1ZWAsCiAgICAvLyB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGZyZWUtdGV4dCBkZXBlbmRlbmN5ICMxMzI4IHJlbW92ZWQuIGdhdGUtaG9vay5tanMKICAgIC8vIGZvcndhcmRzIHRoZSBvYmplY3QgYXMgSlNPTiAoc2VlIGl0cyBNQVhfU1RSVUNUVVJFRF9MRU4gbm90ZSkuCiAgICB2YXIgbUtleSA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfa2V5IHx8ICcnOwogICAgaWYgKG1LZXkuaW5kZXhPZigndmVyaWZ5OicpICE9PSAwKSBicmVhazsKICAgIHZhciByYXdNZXRhID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9tZXRhZGF0YSB8fCAnJzsKICAgIGlmICghcmF3TWV0YSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1vdXRjb21lIOKAlCAiJyArIG1LZXkgKyAnIiBjYXJyaWVzIG5vIG1ldGFkYXRhOyB2ZXJkaWN0IG5vdCByZWNvcmRlZFxuJyk7CiAgICAgIGJyZWFrOwogICAgfQogICAgdmFyIHBhcnNlZE1ldGEgPSBudWxsOwogICAgdHJ5IHsgcGFyc2VkTWV0YSA9IEpTT04ucGFyc2UocmF3TWV0YSk7IH0gY2F0Y2ggKGUpIHsgcGFyc2VkTWV0YSA9IG51bGw7IH0KICAgIGlmICghcGFyc2VkTWV0YSB8fCB0eXBlb2YgcGFyc2VkTWV0YSAhPT0gJ29iamVjdCcgfHwgcGFyc2VkTWV0YS50eXBlICE9PSAndmVyaWZ5LXJlY29yZCcpIGJyZWFrOwogICAgdmFyIG92ZXJhbGwgPSB0eXBlb2YgcGFyc2VkTWV0YS5vdmVyYWxsID09PSAnc3RyaW5nJyA/IHBhcnNlZE1ldGEub3ZlcmFsbC50b1VwcGVyQ2FzZSgpIDogJyc7CiAgICBpZiAob3ZlcmFsbCAhPT0gJ1BBU1MnICYmIG92ZXJhbGwgIT09ICdGQUlMJyAmJiBvdmVyYWxsICE9PSAnVU5WRVJJRklFRCcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktb3V0Y29tZSDigJQgdW5yZWNvZ25pc2VkIG92ZXJhbGw9IicgKyBwYXJzZWRNZXRhLm92ZXJhbGwgKyAnIjsgdHJlYXRpbmcgYXMgbm90LXBhc3NpbmdcbicpOwogICAgICBvdmVyYWxsID0gJ1VOVkVSSUZJRUQnOwogICAgfQogICAgdmFyIHZzID0gcmVhZFN0YXRlKCk7CiAgICAvLyAjMTM0OCDigJQgcmVmdXNlIGEgdmVyZGljdCBmb3IgYSBydW4gdGhhdCBpcyBubyBsb25nZXIgbGl2ZS4gYHZlcmlmeVJ1bmAKICAgIC8vIGZhbHNlIGhlcmUgbWVhbnMgYSBjb2RlIGVkaXQgZmlyZWQgcmVzZXQtZWRpdC1nYXRlcyBiZXR3ZWVuIHRoZSAvdmVyaWZ5CiAgICAvLyBpbnZvY2F0aW9uIGFuZCB0aGlzIHN0b3JlLCBzbyB0aGUgdmVyZGljdCBkZXNjcmliZXMgcHJlLWVkaXQgY29kZS4KICAgIC8vIFJlY29yZGluZyBpdCBhbnl3YXkgcHJvZHVjZWQgdGhlIGNvbnRyYWRpY3RvcnkgYHZlcmlmeVJ1bjpmYWxzZSwKICAgIC8vIHZlcmlmeU91dGNvbWU6J1BBU1MnYCBzdGF0ZSB0aGF0IGNoZWNrLWJlZm9yZS1kb25lJ3MgZm91ci13YXkgbWVzc2FnZQogICAgLy8gY2hhaW4gaGFzIG5vIGJyYW5jaCBmb3Ig4oCUIGl0IHJlcG9ydHMgImEgY29kZSBlZGl0IGludmFsaWRhdGVkIHRoZSBwcmV2aW91cwogICAgLy8gdmVyaWZpY2F0aW9uIiB3aGlsZSBhIFBBU1Mgc2l0cyBpbiBzdGF0ZSwgd2hpY2ggcmVhZHMgYXMgYSBnYXRlIGJ1Zy4KICAgIGlmICghdnMudmVyaWZ5UnVuKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LW91dGNvbWUg4oCUICInICsgbUtleSArICciIGFycml2ZWQgYWZ0ZXIgYSBjb2RlIGVkaXQgaW52YWxpZGF0ZWQgdGhlIHJ1bjsgdmVyZGljdCBub3QgcmVjb3JkZWQgKHJlLXJ1biAvdmVyaWZ5KVxuJyk7CiAgICAgIGJyZWFrOwogICAgfQogICAgdnMudmVyaWZ5T3V0Y29tZSA9IG92ZXJhbGw7CiAgICB3cml0ZVN0YXRlKHZzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdyZXNldC1lZGl0LWdhdGVzJzogewogICAgdmFyIGZwID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9maWxlX3BhdGggfHwgJyc7CiAgICAvLyBJbmVydCBmaWxlcyAobWFya2Rvd24sIGxvY2tmaWxlcywgQ0hBTkdFTE9HLCAuZW52LmV4YW1wbGUpIEFORCBpbmVydCBwYXRocwogICAgLy8gKC5naXRodWIvd29ya2Zsb3dzLywgLmdpdGh1Yi9JU1NVRV9URU1QTEFURS8sIC5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLywgIzExNzYpOgogICAgLy8gbm8gZ2F0ZSByZXNldCDigJQgZWRpdGluZyB0aGVzZSBkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZSBzdXJmYWNlLgogICAgaWYgKGZwICYmIChFRElUX1JFU0VUX1NLSVBfQk9USF9SRS50ZXN0KGZwKSB8fCBFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGZwKSkpIGJyZWFrOwogICAgLy8gIzEzNDgg4oCUIGEgc2NyYXRjaHBhZCB3cml0ZSB1bmRlciB0aGUgT1MgdGVtcCBkaXIgaXMgdHJhbnNpZW50IHRvb2wgSS9PIGFuZAogICAgLy8gY2FuIG5ldmVyIHJlYWNoIHRoZSBicmFuY2ggZGlmZiwgYnV0IGl0IHVzZWQgdG8gcmVzZXQgdGVzdHMgKyBzaW1wbGlmeSArCiAgICAvLyB2ZXJpZnkgbGlrZSBhbnkgc291cmNlIGNoYW5nZTogYSAvdmVyaWZ5IHJ1biB0aGF0IGpvdHRlZCBhIHByb2JlIGNsZWFyZWQKICAgIC8vIHRoZSAvZmxvLXNpbXBsaWZ5IHN0YW1wLCBhbmQgdGhlIHR3byBnYXRlcyBpbnZhbGlkYXRlZCBlYWNoIG90aGVyIHdpdGggbm8KICAgIC8vIG9yZGVyaW5nIHRoYXQgc2F0aXNmaWVkIGJvdGguIFJldXNlcyB0aGUgcHJlZGljYXRlIHRoZSBtZW1vcnktZmlyc3QgZ2F0ZQogICAgLy8gYWxyZWFkeSB0cnVzdHMgZm9yIHRoZXNlIHBhdGhzICgjMTI5NCkgcmF0aGVyIHRoYW4gYSBzZWNvbmQgb25lLgogICAgLy8gU2NvcGU6IHRtcC1vbmx5LCBOT1QgcHJvamVjdC1yb290IGNvbnRhaW5tZW50IOKAlCBzbyBhIHByb2plY3Qgcm9vdGVkIHVuZGVyCiAgICAvLyB0bXAgaGFzIGl0cyBvd24gZWRpdHMgc2tpcHBlZCB0b28gKHBpbm5lZCBpbiB0aGUgIzEzNDggdGVzdHMpLiBDb250YWlubWVudAogICAgLy8gaXMgdGhlIG1vcmUgZ2VuZXJhbCBydWxlLCBidXQgaXQgZmFpbHMgT1BFTiB3aGVuIHRoZSByb290IGNhbid0IGJlCiAgICAvLyByZXNvbHZlZCwgYW5kIGEgZ2F0ZSB0aGF0IHNpbGVudGx5IHN0b3BzIHJlc2V0dGluZyBpcyB0aGUgd29yc2UgZmFpbHVyZS4KICAgIGlmIChpc0VwaGVtZXJhbFBhdGgoZnApKSBicmVhazsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAvLyBUZXN0LW9ubHkgZWRpdHMgaW52YWxpZGF0ZSB0ZXN0c1J1biBidXQgcHJlc2VydmUgc2ltcGxpZnlSdW4gKCM5MDgpLgogICAgdmFyIGlzVGVzdE9ubHkgPSBmcCAmJiBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRS50ZXN0KGZwKTsKICAgIHZhciByZXNldFRlc3RzID0gcy50ZXN0c1J1bjsKICAgIC8vIEEgY29kZSBlZGl0IGludmFsaWRhdGVzIGEgcHJpb3IgdmVyaWZpY2F0aW9uIChTdG9yeSAjMTI3NCkg4oCUIHNhbWUgYXMgdGVzdHMsCiAgICAvLyBpbmNsdWRpbmcgdGVzdC1vbmx5IGVkaXRzICh0aGUgY3JpdGVyaWEgYmVpbmcgdmVyaWZpZWQgbWF5IGhhdmUgbW92ZWQpLgogICAgLy8gIzEzMzI6IGFsc28gZmlyZXMgd2hlbiBhIHZlcmRpY3QgbGluZ2VycyB3aXRob3V0IHRoZSBmbGFnLCBzbyBubyBwYXRoCiAgICAvLyBjYW4gbGVhdmUgYSByZWNvcmRlZCBvdXRjb21lIGJlaGluZCBhZnRlciBhIHNvdXJjZSBlZGl0LgogICAgdmFyIHJlc2V0VmVyaWZ5ID0gcy52ZXJpZnlSdW4gfHwgISFzLnZlcmlmeU91dGNvbWU7CiAgICB2YXIgcmVzZXRTaW1wbGlmeSA9IHMuc2ltcGxpZnlSdW4gJiYgIWlzVGVzdE9ubHk7CiAgICBpZiAoIXJlc2V0VGVzdHMgJiYgIXJlc2V0U2ltcGxpZnkgJiYgIXJlc2V0VmVyaWZ5KSBicmVhazsKICAgIHZhciBnYXRlcyA9IFtdOwogICAgaWYgKHJlc2V0VGVzdHMpIHsgcy50ZXN0c1J1biA9IGZhbHNlOyBnYXRlcy5wdXNoKCd0ZXN0cycpOyB9CiAgICAvLyAjMTMzMjogZHJvcCB0aGUgcmVjb3JkZWQgdmVyZGljdCB3aXRoIHRoZSBmbGFnLiBMZWF2aW5nIGEgc3RhbGUgUEFTUwogICAgLy8gYmVoaW5kIHdvdWxkIGxldCB0aGUgbmV4dCBjaGVjay1iZWZvcmUtZG9uZSBwYXNzIG9uIGEgdmVyZGljdCB0aGF0CiAgICAvLyBkZXNjcmliZXMgcHJlLWVkaXQgY29kZS4KICAgIGlmIChyZXNldFZlcmlmeSkgeyBzLnZlcmlmeVJ1biA9IGZhbHNlOyBzLnZlcmlmeU91dGNvbWUgPSBudWxsOyBnYXRlcy5wdXNoKCd2ZXJpZnknKTsgfQogICAgaWYgKHJlc2V0U2ltcGxpZnkpIHsgcy5zaW1wbGlmeVJ1biA9IGZhbHNlOyBnYXRlcy5wdXNoKCdzaW1wbGlmeScpOyB9CiAgICBpZiAoZnApIHsKICAgICAgcy5sYXN0UmVzZXRCeSA9IHsgZmlsZTogZnAsIGF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIGdhdGVzOiBnYXRlcyB9OwogICAgfQogICAgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtaW1wbGVtZW50JzogewogICAgLy8gIzEyOTcg4oCUIHRoZSBTREQgZnJvbnQtaGFsZiBiYWNrc3RvcC4gV2hlbiBhIHJ1biBpcyBhcm1lZCBmb3IgU0RECiAgICAvLyAoc2RkTW9kZSwgc2V0IGZyb20gLXNkLy0tc2RkIG9yIHNkZC5kZWZhdWx0IG9uIGEgL2ZsbyBydW4pLCBibG9jayBzb3VyY2UKICAgIC8vIFdyaXRlL0VkaXQgdW50aWwgYSBzcGVjIGV4aXN0cyBhbmQgaXRzIHBsYW4gaXMgcmV2aWV3ZWQuIE1pcnJvcnMgdGhlCiAgICAvLyBtZW1vcnlfZmlyc3QgZ2F0ZSBzaGFwZS4gRGlzYXJtZWQgcnVucyAodGhlIGRlZmF1bHQgZm9yIG5vbi1TREQgd29yaykKICAgIC8vIHBhc3MgaW5zdGFudGx5LiBPcHQgb3V0IHBlci1wcm9qZWN0IHdpdGggYGdhdGVzOiBzZGRfZ2F0ZTogZmFsc2VgLgogICAgaWYgKCFjb25maWcuc2RkX2dhdGUpIGJyZWFrOwogICAgdmFyIHNpID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXNpLnNkZE1vZGUpIGJyZWFrOyAvLyBub3QgYW4gU0REIHJ1biDigJQgbm8gZW5mb3JjZW1lbnQKICAgIHZhciBmcGkgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2ZpbGVfcGF0aCB8fCAnJzsKICAgIGlmICghZnBpKSBicmVhazsKICAgIC8vIE9ubHkgZ2F0ZSByZWFsIHNvdXJjZSBlZGl0cy4gRXhlbXB0IHRoZSBzYW1lIGluZXJ0IGZpbGVzL3BhdGhzIHRoZSBvdGhlcgogICAgLy8gZ2F0ZXMgc2tpcCwgcGx1cyB0aGUgc3BlYy9wbGFuIGFydGlmYWN0cyB0aGVtc2VsdmVzLgogICAgaWYgKEVYRU1QVC5zb21lKGZ1bmN0aW9uIChlKSB7IHJldHVybiBmcGkuaW5kZXhPZihlKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBpZiAoIVNPVVJDRV9GSUxFX1JFLnRlc3QoZnBpKSkgYnJlYWs7CiAgICBpZiAoRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmcGkpKSBicmVhazsKICAgIGlmIChpc0luc2lkZVNwZWNzRGlyKGZwaSkpIGJyZWFrOwogICAgaWYgKCFzaS5hY3RpdmVTZGRTbHVnKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdCTE9DS0VEOiBTREQgbW9kZSBpcyBvbiDigJQgYXV0aG9yIGEgc3BlYyBiZWZvcmUgZWRpdGluZyBzb3VyY2UuXG4nICsKICAgICAgICAnUnVuOiBmbG8gc2RkIHNwZWMgIjx0aXRsZT4iICAgKHRoZW4gcmV2aWV3IGl0LCBhbmQgcGxhbilcbicgKwogICAgICAgICdUaGlzIHJ1biBpcyBzcGVjLWdhdGVkICgtc2QgLyBzZGQuZGVmYXVsdCkuIE9uZS1vZmYgc2tpcDogcmUtcnVuIHdpdGggLS1uby1zZGQuXG4nICsKICAgICAgICAnRGlzYWJsZSBwZXItcHJvamVjdCB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHNkZF9nYXRlOiBmYWxzZVxuJwogICAgICApOwogICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICB9CiAgICBpZiAoIWlzUGxhblJldmlld2VkKHNpLmFjdGl2ZVNkZFNsdWcpKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdCTE9DS0VEOiBTREQg4oCUIHRoZSBwbGFuIGZvciAiJyArIHNpLmFjdGl2ZVNkZFNsdWcgKyAnIiBpcyBub3QgcmV2aWV3ZWQgeWV0LlxuJyArCiAgICAgICAgJ0F1dGhvciArIHJldmlldyB0aGUgcGxhbiBmaXJzdDpcbicgKwogICAgICAgICcgIGZsbyBzZGQgcGxhbiAnICsgc2kuYWN0aXZlU2RkU2x1ZyArICdcbicgKwogICAgICAgICcgIGZsbyBzZGQgcmV2aWV3ICcgKyBzaS5hY3RpdmVTZGRTbHVnICsgJyBwbGFuXG4nICsKICAgICAgICAnT25lLW9mZiBza2lwOiByZS1ydW4gd2l0aCAtLW5vLXNkZC4gRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHNkZF9nYXRlOiBmYWxzZVxuJwogICAgICApOwogICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXByJzogewogICAgLy8gQW5jaG9yZWQgdG8gY29tbWFuZC1zdGFydCBzbyBoZXJlZG9jIGJvZGllcyBhbmQgcXVvdGVkIHN0cmluZ3MgdGhhdAogICAgLy8gY29udGFpbiB0aGUgbGl0ZXJhbCAiZ2ggcHIgY3JlYXRlIiBkb24ndCB0cmlwIHRoZSBnYXRlIGR1cmluZyByZWd1bGFyCiAgICAvLyBgZ2l0IGNvbW1pdCAtbSAiLi4uZ2ggcHIgY3JlYXRlLi4uImAgZmxvd3MsIHdoaWxlIHN0aWxsIGNhdGNoaW5nIHRoZQogICAgLy8gY2hhaW5lZCwgcGlwZWQsIHBhcmVudGhlc2lzZWQsIGFuZCBtdWx0aS1saW5lIHNoYXBlcyAoIzE0MTApLgogICAgdmFyIGNtZCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKICAgIGlmICghaXNQckNyZWF0ZUNvbW1hbmQoY21kKSkgYnJlYWs7CiAgICAvLyAjMTM3NCBvcGVuZWQgdGhpcyBsb29wOyAjMTQzNSBjbG9zZXMgaXQuIFRoZSBjb3VudCBpdHNlbGYgaXMgdW5jaGFuZ2VkIOKAlAogICAgLy8gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgaXQgbm93IGhhcyB0ZWV0aCBhbmQsIGluIHdhcm4gbW9kZSwgYSBkZWxpdmVyeSBwYXRoLgogICAgLy8KICAgIC8vIERlbGliZXJhdGVseSBBQk9WRSB0aGUgbm8tc291cmNlIGV4ZW1wdGlvbiBiZWxvdzogYSBkb2NzLW9ubHkgUFIgY2FuCiAgICAvLyBhYmFuZG9uIGEgbGlzdCBleGFjdGx5IGxpa2UgYSBzb3VyY2UgUFIgY2FuLCBhbmQgdGhlIGV4ZW1wdGlvbiBpcyBhYm91dAogICAgLy8gdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MsIG5vdCBhYm91dCB3aGV0aGVyIHRoZSBydW4gdG9sZCB0aGUgdXNlciB3aGF0CiAgICAvLyBpdCBkaWQuIEl0IGFsc28gZXhpdHMgb24gaXRzIG93biByYXRoZXIgdGhhbiBqb2luaW5nIGBtaXNzaW5nYCBiZWxvdywgZm9yCiAgICAvLyB0aGUgc2FtZSByZWFzb24g4oCUIGBtaXNzaW5nYCBpcyB1bnJlYWNoYWJsZSBvbiBhbiBleGVtcHQgZGlmZi4KICAgIC8vCiAgICAvLyBHYXRlZCBvbiB0aGUgc2FtZSBgdGFza19jcmVhdGVfZmlyc3RgIGZsYWcgYXMgdGhlIHJlbWluZGVyIGl0c2VsZiBzbyB0aGUKICAgIC8vIHR3byBoYWx2ZXMgYXJlIGFsd2F5cyBjb25zaXN0ZW50OiBhIHByb2plY3QgdGhhdCB0dXJuZWQgdGhlIG5hZyBvZmYgaXMKICAgIC8vIG5vdCB0aGVuIGJsb2NrZWQgYWJvdXQgdGhlIG90aGVyIGVuZCBvZiBpdC4KICAgIC8vCiAgICAvLyBGYWlsLW9wZW4gaXMgbG9hZC1iZWFyaW5nLiByZWFkVGFza0xlZGdlcigpIHJldHVybnMgbnVsbCBvbiBhIG1pc3NpbmcsCiAgICAvLyBvdmVyc2l6ZWQsIG9yIHVucmVhZGFibGUgdHJhbnNjcmlwdCBhbmQgb24gYSBzZXNzaW9uIHdpdGggbm8gVGFza0NyZWF0ZSBhdAogICAgLy8gYWxsLCBhbmQgbnVsbCBtdXN0IG5ldmVyIGJsb2NrIOKAlCBhIGdhdGUgdGhhdCBzdG9wcyBQUnMgYmVjYXVzZSBpdCBjb3VsZAogICAgLy8gbm90IHJlYWQgYSBmaWxlIGlzIHdvcnNlIHRoYW4gdGhlIHJlcG9ydGluZyBnYXAgaXQgaXMgY2xvc2luZy4KICAgIC8vCiAgICAvLyBTdGF0ZSBpcyByZWFkIE9OQ0UgZm9yIHRoZSB3aG9sZSBjYXNlLCBoZXJlIOKAlCB0aGUgcHJlLVBSIGdhdGUgbG9naWMgYmVsb3cKICAgIC8vIHJldXNlcyBpdCBhbmQgbm90aGluZyB3cml0ZXMgaW4gYmV0d2Vlbi4gUmVhZGluZyBpdCBiZWZvcmUgdGhlIGxlZGdlciBhbHNvCiAgICAvLyBtZWFucyBhbiBhbHJlYWR5LWFja25vd2xlZGdlZCBydW4gbmV2ZXIgcGF5cyBmb3IgdGhlIHRyYW5zY3JpcHQgc2Nhbi4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoY29uZmlnLnRhc2tfY3JlYXRlX2ZpcnN0ICYmIGNvbmZpZy50YXNrX3N0YXR1c19nYXRlICE9PSAnb2ZmJyAmJiAhcy50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICB2YXIgbGVkZ2VyID0gcmVhZFRhc2tMZWRnZXIoKTsKICAgICAgaWYgKGxlZGdlciAmJiBsZWRnZXIub3BlbiA+IDApIHsKICAgICAgICB2YXIgdGFsbHkgPSBsZWRnZXIuY3JlYXRlZCArICcgdGFzaycgKyAobGVkZ2VyLmNyZWF0ZWQgPT09IDEgPyAnJyA6ICdzJykgKwogICAgICAgICAgJyBjcmVhdGVkIHRoaXMgc2Vzc2lvbiwgJyArIGxlZGdlci5vcGVuICsgJyBzdGlsbCBvcGVuLic7CiAgICAgICAgdmFyIGNsb3NlSXQgPSAnQ2xvc2UgdGhlbSB3aXRoIFRhc2tVcGRhdGUgKHN0YXR1czogY29tcGxldGVkKSwgb3IgZGVsZXRlIHRoZSBvbmVzICcgKwogICAgICAgICAgJ3RoYXQgbm8gbG9uZ2VyIGFwcGx5LCBzbyB0aGUgcnVuIGRvZXMgbm90IHJlcG9ydCBkb25lIG92ZXIgYW4gdW5maW5pc2hlZCBsaXN0LlxuJzsKICAgICAgICBpZiAoY29uZmlnLnRhc2tfc3RhdHVzX2dhdGUgPT09ICd3YXJuJykgewogICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiAnICsgdGFsbHkgKyAnICcgKyBjbG9zZUl0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICdCTE9DS0VEOiAnICsgdGFsbHkgKyAnXG4nICsgY2xvc2VJdCArCiAgICAgICAgICAgICdEZWZlcnJpbmcgdGhlbSBvbiBwdXJwb3NlIGlzIGEgbGVnaXRpbWF0ZSBvdXRjb21lIOKAlCBkZWNsYXJlIGl0IGluc3RlYWQgb2ZcbicgKwogICAgICAgICAgICAnY2xvc2luZyB0YXNrcyB0aGF0IGFyZSBub3QgZG9uZTogbm9kZSAiJyArIF9fZmlsZW5hbWUgKyAnIiByZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkXG4nICsKICAgICAgICAgICAgR0FURV9PUklHSU5fTk9URSArICdcbicgKwogICAgICAgICAgICAnUmVwb3J0IGluc3RlYWQgb2YgYmxvY2tpbmcgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiB0YXNrX3N0YXR1c19nYXRlOiB3YXJuICAgKG9yOiBvZmYpXG4nKTsKICAgICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIE5vLXNvdXJjZS1maWxlcyBleGVtcHRpb24gKCMxMTc2LCBzdXBlcnNlZGVzIHRoZSBvcmlnaW5hbCBkb2NzLW9ubHkgcGF0aCkuCiAgICAvLyBJZiBldmVyeSBmaWxlIGNoYW5nZWQgdnMgdGhlIG1lcmdlLWJhc2UgaXMgZWl0aGVyIGEgZG9jcy9pbWFnZSBmaWxlIG9yIGEKICAgIC8vIHBhdGgtaW5lcnQgZmlsZSAoLmdpdGh1Yi93b3JrZmxvd3MvLCBJU1NVRV9URU1QTEFURS8sIFBVTExfUkVRVUVTVF9URU1QTEFURS8pCiAgICAvLyDigJQgaS5lLiBOTyBzb3VyY2UgZmlsZXMgaW4gdGhlIGRpZmYg4oCUIHNraXAgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MgZ2F0ZXMKICAgIC8vIGFuZCBzdXJmYWNlIGEgb25lLWxpbmUgdHJhbnNwYXJlbmN5IG5vdGUuIEZhbGxzIHRocm91Z2ggdG8gdGhlIHN0YW5kYXJkIGdhdGUKICAgIC8vIG9uIGFueSBmYWlsdXJlIChubyBiYXNlLCBubyBkaWZmLCBleGVjIGVycm9yKSDigJQgZmFpbC1zYWZlIGJ5IGRlc2lnbi4KICAgIC8vCiAgICAvLyBTb3VyY2UtZmlsZSBkZXRlY3Rpb24gaXMgdGhlIGludmVyc2Ugb2YgdGhlIGluZXJ0IGNoZWNrczogYSBmaWxlIGlzICJzb3VyY2UiCiAgICAvLyB3aGVuIGl0IG1hdGNoZXMgU09VUkNFX0ZJTEVfUkUgQU5EIGlzIG5vdCBpbnNpZGUgYW4gaW5lcnQgcGF0aC4gVGhpcyBjYXRjaGVzCiAgICAvLyBgLmdpdGh1Yi93b3JrZmxvd3MvZm9vLnNoYCAoc2ggZXh0ZW5zaW9uIGJ1dCBwYXRoLWluZXJ0IOKGkiBubyBzb3VyY2UpLgogICAgdmFyIGNoYW5nZWQgPSBnZXRDaGFuZ2VkRmlsZXNWc0Jhc2UoKTsKICAgIGlmIChjaGFuZ2VkICYmIGNoYW5nZWQubGVuZ3RoID4gMCkgewogICAgICB2YXIgaGFzU291cmNlID0gY2hhbmdlZC5zb21lKGZ1bmN0aW9uKGYpIHsKICAgICAgICByZXR1cm4gU09VUkNFX0ZJTEVfUkUudGVzdChmKSAmJiAhRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmKTsKICAgICAgfSk7CiAgICAgIGlmICghaGFzU291cmNlKSB7CiAgICAgICAgdmFyIGFsbERvY3MgPSBjaGFuZ2VkLmV2ZXJ5KGZ1bmN0aW9uKGYpIHsgcmV0dXJuIERPQ1NfT05MWV9SRS50ZXN0KGYpOyB9KTsKICAgICAgICB2YXIgcmVhc29uID0gYWxsRG9jcyA/ICdEb2NzLW9ubHknIDogJ05vIHNvdXJjZSBmaWxlcyBpbiBicmFuY2ggZGlmZic7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVhc29uICsgJyAoJyArIGNoYW5nZWQubGVuZ3RoICsgJyBmaWxlJyArIChjaGFuZ2VkLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKSArICcpIOKAlCBza2lwcGluZyB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncyBnYXRlcy5cbicpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICAvLyBFeHBpcmUgYW55IGNyZWRpdCB3aG9zZSBmaW5nZXJwcmludCBubyBsb25nZXIgbWF0Y2hlcyB0aGUgY29kZSBiZWZvcmUKICAgIC8vIHJlYWRpbmcgdGhlIGZsYWdzLiBUaGlzIGlzIHdoYXQgY2F0Y2hlcyB0aGUgbXV0YXRpb25zIHJlc2V0LWVkaXQtZ2F0ZXMKICAgIC8vIHN0cnVjdHVyYWxseSBjYW5ub3Qgc2VlIOKAlCBCYXNoIHdyaXRlcywgZ2l0IGNoZWNrb3V0L3B1bGwvbWVyZ2UsIGFuZCB0aGUKICAgIC8vIG5leHQgaXNzdWUgaW4gdGhlIHNhbWUgc2Vzc2lvbiDigJQgc28gdGhlIGZsYWdzIGJlbG93IG1lYW4gInN0aWxsIHRydWUgb2YKICAgIC8vIFRISVMgY29kZSIsIG5vdCBtZXJlbHkgIndhcyB0cnVlIGF0IHNvbWUgcG9pbnQgdGhpcyBzZXNzaW9uIi4KICAgIHZhciBleHBpcmVkID0gW107CiAgICBpZiAocy50ZXN0c1J1biAmJiAhY3JlZGl0SXNMaXZlKHMudGVzdHNSdW4sIHMudGVzdHNGaW5nZXJwcmludCwgJ2FsbCcpKSB7CiAgICAgIHMudGVzdHNSdW4gPSBmYWxzZTsgcy50ZXN0c0ZpbmdlcnByaW50ID0gbnVsbDsgZXhwaXJlZC5wdXNoKCd0ZXN0cycpOwogICAgfQogICAgaWYgKHMuc2ltcGxpZnlSdW4gJiYgIWNyZWRpdElzTGl2ZShzLnNpbXBsaWZ5UnVuLCBzLnNpbXBsaWZ5RmluZ2VycHJpbnQsICdub250ZXN0JykpIHsKICAgICAgcy5zaW1wbGlmeVJ1biA9IGZhbHNlOyBzLnNpbXBsaWZ5RmluZ2VycHJpbnQgPSBudWxsOyBleHBpcmVkLnB1c2goJ3NpbXBsaWZ5Jyk7CiAgICB9CiAgICBpZiAoKHMudmVyaWZ5UnVuIHx8IHMudmVyaWZ5T3V0Y29tZSkgJiYgIWNyZWRpdElzTGl2ZShzLnZlcmlmeVJ1biwgcy52ZXJpZnlGaW5nZXJwcmludCwgJ2FsbCcpKSB7CiAgICAgIHMudmVyaWZ5UnVuID0gZmFsc2U7IHMudmVyaWZ5T3V0Y29tZSA9IG51bGw7IHMudmVyaWZ5RmluZ2VycHJpbnQgPSBudWxsOyBleHBpcmVkLnB1c2goJ3ZlcmlmeScpOwogICAgfQogICAgaWYgKGV4cGlyZWQubGVuZ3RoKSB3cml0ZVN0YXRlKHMpOwogICAgLy8gQ2xhc3NpZmllci1hd2FyZSBza2lwOiBpZiBkZWx0YS1zaW5jZS1zbmFwc2hvdCBvciB3aG9sZS1icmFuY2ggZGlmZiBpcwogICAgLy8gVFJJVklBTCwgc2F0aXNmeSB0aGUgc2ltcGxpZnkgZ2F0ZSBzaWxlbnRseS4gUmV1c2VzIHRoZSBzYW1lIGNsYXNzaWZpZXIKICAgIC8vIHRoZSBza2lsbCB1c2VzIOKAlCBzYW1lICJ0cml2aWFsIiBkZWZpbml0aW9uLCBubyBkcmlmdC4gU2FtZSB0aHJlc2hvbGQgdGhhdAogICAgLy8gYWxyZWFkeSBtYXBzIHRvIFRSSVZJQUw9MCBhZ2VudHMgaW5zaWRlIC9zaW1wbGlmeSwgc28gdHJ1c3RpbmcgaXQgYXQgdGhlCiAgICAvLyBnYXRlIGxldmVsIGlzIHRoZSBzYW1lIHRydXN0IHByb2ZpbGUsIGp1c3Qgb25lIGRlY2lzaW9uIGVhcmxpZXIuCiAgICBpZiAoY29uZmlnLnNpbXBsaWZ5X2dhdGUgJiYgIXMuc2ltcGxpZnlSdW4pIHsKICAgICAgdmFyIHNraXBSZWFzb24gPSBjbGFzc2lmeUZvckdhdGVTa2lwKHMpOwogICAgICBpZiAoc2tpcFJlYXNvbikgewogICAgICAgIHMuc2ltcGxpZnlSdW4gPSB0cnVlOwogICAgICAgIHdyaXRlU3RhdGUocyk7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1NpbXBsaWZ5IGdhdGUgYXV0by1wYXNzZWQ6ICcgKyBza2lwUmVhc29uICsgJ1xuJyk7CiAgICAgIH0KICAgIH0KICAgIHZhciBtaXNzaW5nID0gW107CiAgICBpZiAoY29uZmlnLnRlc3RpbmdfZ2F0ZSAmJiAhcy50ZXN0c1J1bikgbWlzc2luZy5wdXNoKCd0ZXN0cyBoYXZlIG5vdCBydW4gZ3JlZW4gc2luY2UgdGhlIGxhc3QgY29kZSBlZGl0IChydW4gbnBtIHRlc3QsIHZpdGVzdCwgamVzdCwgcHl0ZXN0LCBvciBzaW1pbGFyIOKAlCBhIHJ1biB3aG9zZSBvdXRwdXQgcmVwb3J0cyBmYWlsdXJlcyBkb2VzIG5vdCBjb3VudCknKTsKICAgIGlmIChjb25maWcuc2ltcGxpZnlfZ2F0ZSAmJiAhcy5zaW1wbGlmeVJ1bikgbWlzc2luZy5wdXNoKCcvZmxvLXNpbXBsaWZ5IChvciAvZGlzdGlsbCkgaGFzIG5vdCBydW4gc2luY2UgdGhlIGxhc3QgY29kZSBlZGl0Jyk7CiAgICBpZiAoY29uZmlnLmxlYXJuaW5nc19nYXRlICYmICFzLmxlYXJuaW5nc1N0b3JlZCkgbWlzc2luZy5wdXNoKExFQVJOSU5HU19NSVNTSU5HKTsKICAgIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogZ2ggcHIgY3JlYXRlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgYmVmb3JlIG9wZW5pbmcgYSBQUjpcbicpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gJyArIG1pc3NpbmdbaV0gKyAnXG4nKTsKICAgIH0KICAgIGlmIChleHBpcmVkLmxlbmd0aCkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnRXhwaXJlZCBiZWNhdXNlIHRoZSBjb2RlIGNoYW5nZWQgc2luY2UgdGhleSByYW4gKCcgKyBleHBpcmVkLmpvaW4oJywgJykgKwogICAgICAgICcpIOKAlCB0aGlzIGluY2x1ZGVzIGNoYW5nZXMgbWFkZSBvdXRzaWRlIFdyaXRlL0VkaXQsIGUuZy4gYSBCYXNoIHdyaXRlLCAnICsKICAgICAgICAnZ2l0IGNoZWNrb3V0L3B1bGwsIG9yIG1vdmluZyBvbiB0byBhIGRpZmZlcmVudCBjaGFuZ2UgaW4gdGhlIHNhbWUgc2Vzc2lvbi5cbicsCiAgICAgICk7CiAgICB9CiAgICBpZiAocy5sYXN0UmVzZXRCeSAmJiBzLmxhc3RSZXNldEJ5LmZpbGUpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0xhc3QgZ2F0ZSByZXNldDogJyArIHMubGFzdFJlc2V0QnkuZmlsZSArICcgKCcgKyAocy5sYXN0UmVzZXRCeS5nYXRlcyB8fCBbXSkuam9pbignLCAnKSArICcpXG4nKTsKICAgIH0KICAgIC8vICMxMzQ4IOKAlCBuYW1lIHRoZSBvcmRlciwgbm90IGp1c3QgdGhlIG1pc3NpbmcgZ2F0ZS4gU2F0aXNmeWluZyBvbmUgZ2F0ZSBjYW4KICAgIC8vIGludmFsaWRhdGUgYW5vdGhlciAoL2Zsby1zaW1wbGlmeSBlZGl0cyBjb2RlLCB3aGljaCByZXNldHMgdGVzdHMgKyB2ZXJpZnkpLAogICAgLy8gc28gIndoYXQgaXMgbWlzc2luZyIgYWxvbmUgbGVmdCBjYWxsZXJzIHJlZGlzY292ZXJpbmcgdGhlIHNlcXVlbmNlIGJ5IHRyaWFsLgogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoT1JERVJfSElOVCk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSBwZXItZ2F0ZSB2aWEgbW9mbG8ueWFtbDpcbicpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgZ2F0ZXM6XG4gICAgdGVzdGluZ19nYXRlOiBmYWxzZVxuICAgIHNpbXBsaWZ5X2dhdGU6IGZhbHNlXG4gICAgbGVhcm5pbmdzX2dhdGU6IGZhbHNlXG4nKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLWRvbmUnOiB7CiAgICAvLyBTdG9yeSAjMTI3NCAoRXBpYyAjMTI2OSkgKyAjMTI5NC4gVmVyaWZ5LWJlZm9yZS1kb25lOiBibG9jayBgZ2ggcHIgY3JlYXRlYAogICAgLy8gdW50aWwgdGhlIGNoYW5nZSBoYXMgYmVlbiB2ZXJpZmllZCBlbmQtdG8tZW5kICh0aGUgL3ZlcmlmeSBza2lsbCkgYWdhaW5zdAogICAgLy8gdGhlIHBsYW4ncyBhY2NlcHRhbmNlIGNyaXRlcmlhLiBPTiBieSBkZWZhdWx0ICgjMTI5NCkg4oCUIC9mbG8gZGVsZWdhdGVzIHRvCiAgICAvLyAvdmVyaWZ5LCBzbyBhIGRlZmF1bHQgcnVuIGRvZXMgdGhlIGFjY2VwdGFuY2UgY2hlY2s7IGRpc2FibGUgcGVyLXByb2plY3QKICAgIC8vIHdpdGggYGdhdGVzOiB2ZXJpZnlfYmVmb3JlX2RvbmU6IGZhbHNlYCBvciBwZXItcnVuIGAtLW5vLXZlcmlmeWAuIFNhbWUKICAgIC8vIHRyaWdnZXIgKyBuby1zb3VyY2UgZXhlbXB0aW9uIGFzIGNoZWNrLWJlZm9yZS1wciwgc28gdGhleSBjb21wb3NlIG9uIG9uZQogICAgLy8gY29tbWFuZCAoZG9jcy1vbmx5IGRpZmZzIGFyZSBleGVtcHQsIHNvIHRoaXMgbmV2ZXIgYmxvY2tzIGEgZG9jcyBQUikuCiAgICBpZiAoIWNvbmZpZy52ZXJpZnlfYmVmb3JlX2RvbmUpIGJyZWFrOwogICAgdmFyIGNtZCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKICAgIGlmICghaXNQckNyZWF0ZUNvbW1hbmQoY21kKSkgYnJlYWs7CiAgICAvLyBOby1zb3VyY2UtZmlsZXMgZXhlbXB0aW9uIOKAlCBhIGRvY3Mtb25seSAvIHBhdGgtaW5lcnQgZGlmZiBuZWVkcyBubyB2ZXJpZnkuCiAgICB2YXIgY2hhbmdlZEQgPSBnZXRDaGFuZ2VkRmlsZXNWc0Jhc2UoKTsKICAgIGlmIChjaGFuZ2VkRCAmJiBjaGFuZ2VkRC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBoYXNTb3VyY2VEID0gY2hhbmdlZEQuc29tZShmdW5jdGlvbihmKSB7CiAgICAgICAgcmV0dXJuIFNPVVJDRV9GSUxFX1JFLnRlc3QoZikgJiYgIUVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZik7CiAgICAgIH0pOwogICAgICBpZiAoIWhhc1NvdXJjZUQpIHsKICAgICAgICB2YXIgcmVhc29uRCA9IGNoYW5nZWRELmV2ZXJ5KGZ1bmN0aW9uKGYpIHsgcmV0dXJuIERPQ1NfT05MWV9SRS50ZXN0KGYpOyB9KSA/ICdEb2NzLW9ubHknIDogJ05vIHNvdXJjZSBmaWxlcyBpbiBicmFuY2ggZGlmZic7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVhc29uRCArICcgKCcgKyBjaGFuZ2VkRC5sZW5ndGggKyAnIGZpbGUnICsgKGNoYW5nZWRELmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKSArICcpIOKAlCBza2lwcGluZyB2ZXJpZnktYmVmb3JlLWRvbmUgZ2F0ZS5cbicpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB2YXIgc2QgPSByZWFkU3RhdGUoKTsKICAgIC8vIEV4cGlyZSBhIHZlcmRpY3QgdGhhdCBubyBsb25nZXIgZGVzY3JpYmVzIHRoZSBjb2RlLCBmb3IgdGhlIHNhbWUgcmVhc29uCiAgICAvLyBjaGVjay1iZWZvcmUtcHIgZG9lczogYSBQQVNTIGVhcm5lZCBiZWZvcmUgYSBCYXNoIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsCiAgICAvLyBvciB0aGUgbmV4dCBjaGFuZ2UgaW4gdGhpcyBzZXNzaW9uIGlzIGV2aWRlbmNlIGFib3V0IGRpZmZlcmVudCBjb2RlLgogICAgLy8gIzEzMzIgbWFkZSB0aGUgZ2F0ZSByZWFkIHRoZSBvdXRjb21lIGluc3RlYWQgb2YgYXR0ZW5kYW5jZTsgdGhpcyBtYWtlcyBpdAogICAgLy8gcmVhZCBhbiBvdXRjb21lIHRoYXQgaXMgc3RpbGwgQUJPVVQgdGhlIHRoaW5nIGJlaW5nIHNoaXBwZWQuCiAgICB2YXIgdmVyaWZ5U3RhbGUgPSAoc2QudmVyaWZ5UnVuIHx8IHNkLnZlcmlmeU91dGNvbWUpCiAgICAgICYmICFjcmVkaXRJc0xpdmUoc2QudmVyaWZ5UnVuLCBzZC52ZXJpZnlGaW5nZXJwcmludCwgJ2FsbCcpOwogICAgaWYgKHZlcmlmeVN0YWxlKSB7CiAgICAgIHNkLnZlcmlmeVJ1biA9IGZhbHNlOyBzZC52ZXJpZnlPdXRjb21lID0gbnVsbDsgc2QudmVyaWZ5RmluZ2VycHJpbnQgPSBudWxsOwogICAgICB3cml0ZVN0YXRlKHNkKTsKICAgIH0KICAgIC8vICMxMzMyOiBnYXRlIG9uIHRoZSBPVVRDT01FLCBub3Qgb24gYXR0ZW5kYW5jZS4gQmVmb3JlIHRoaXMsIGB2ZXJpZnlSdW5gCiAgICAvLyBhbG9uZSBvcGVuZWQgdGhlIGdhdGUsIHNvIGEgL3ZlcmlmeSByZXR1cm5pbmcgRkFJTCBzYXRpc2ZpZWQgaXQgZXhhY3RseQogICAgLy8gYXMgYSBQQVNTIGRpZCDigJQgYSBmYWlsaW5nIHZlcmRpY3QgaXMgc3RpbGwgYSBzdWNjZXNzZnVsIHRvb2wgaW52b2NhdGlvbi4KICAgIGlmIChzZC52ZXJpZnlSdW4gJiYgc2QudmVyaWZ5T3V0Y29tZSA9PT0gJ1BBU1MnKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEOiBnaCBwciBjcmVhdGUgcmVxdWlyZXMgdmVyaWZpY2F0aW9uIGJlZm9yZSBkb25lOlxuJyk7CiAgICAvLyBUaGUgZm91ciBzdGF0ZXMgbmVlZCBkaWZmZXJlbnQgcmVtZWRpZXMsIHNvIG5hbWUgd2hpY2ggb25lIGFwcGxpZXMKICAgIC8vIHJhdGhlciB0aGFuIGVtaXR0aW5nIG9uZSBtZXNzYWdlIHRoYXQgZml0cyBub25lIG9mIHRoZW0uCiAgICB2YXIgaW52YWxpZGF0ZWQgPSBzZC5sYXN0UmVzZXRCeSAmJiBzZC5sYXN0UmVzZXRCeS5maWxlCiAgICAgICYmIChzZC5sYXN0UmVzZXRCeS5nYXRlcyB8fCBbXSkuaW5kZXhPZigndmVyaWZ5JykgPj0gMDsKICAgIGlmICh2ZXJpZnlTdGFsZSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIHRoZSBjb2RlIGNoYW5nZWQgc2luY2UgL3ZlcmlmeSByYW4g4oCUIHJlLXJ1biAvdmVyaWZ5XG4nKTsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICAoZGV0ZWN0ZWQgYnkgY29udGVudCwgc28gdGhpcyBjb3ZlcnMgY2hhbmdlcyBtYWRlIG91dHNpZGUgV3JpdGUvRWRpdDpcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgICBhIEJhc2ggd3JpdGUsIGdpdCBjaGVja291dC9wdWxsLCBvciBhIGRpZmZlcmVudCBjaGFuZ2UgaW4gdGhlIHNhbWUgc2Vzc2lvbilcbicpOwogICAgfSBlbHNlIGlmICghc2QudmVyaWZ5UnVuICYmIGludmFsaWRhdGVkKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gYSBjb2RlIGVkaXQgaW52YWxpZGF0ZWQgdGhlIHByZXZpb3VzIHZlcmlmaWNhdGlvbiDigJQgcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnTGFzdCBnYXRlIHJlc2V0OiAnICsgc2QubGFzdFJlc2V0QnkuZmlsZSArICcgKHZlcmlmeSlcbicpOwogICAgfSBlbHNlIGlmICghc2QudmVyaWZ5UnVuKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gdGhlIGNoYW5nZSBoYXMgbm90IGJlZW4gdmVyaWZpZWQgc2luY2UgdGhlIGxhc3QgY29kZSBlZGl0IChydW4gL3ZlcmlmeSlcbicpOwogICAgfSBlbHNlIGlmIChzZC52ZXJpZnlPdXRjb21lID09PSAnRkFJTCcgfHwgc2QudmVyaWZ5T3V0Y29tZSA9PT0gJ1VOVkVSSUZJRUQnKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gL3ZlcmlmeSByYW4gYW5kIHJldHVybmVkICcgKyBzZC52ZXJpZnlPdXRjb21lICsgJyDigJQgZml4IHRoZSBmYWlsaW5nIGNyaXRlcmlhLCB0aGVuIHJlLXJ1biAvdmVyaWZ5XG4nKTsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICAoYSBGQUlMIGlzIGEgcmVhbCByZXN1bHQsIG5vdCBhIGdhdGUgZXJyb3I7IHRoZSBQUiBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIGNoYW5nZSBkaWQgbm90IG1lZXQgaXRzIGFjY2VwdGFuY2UgY3JpdGVyaWEpXG4nKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJhbiwgYnV0IG5vIHZlcmRpY3QgcmVhY2hlZCB0aGUgZ2F0ZS4gVFdPIHZlcnkgZGlmZmVyZW50IGNhdXNlcywgYW5kCiAgICAgIC8vICMxMzk0IGV4aXN0cyBiZWNhdXNlIHRoZXkgdXNlZCB0byBzaGFyZSBvbmUgbWVzc2FnZSB0aGF0IGZpdCBvbmx5IHRoZQogICAgICAvLyBmaXJzdDogZWl0aGVyIC92ZXJpZnkgbmV2ZXIgcmVjb3JkZWQgYSBzdHJ1Y3R1cmVkIG91dGNvbWUsIG9yIHRoZSBob29rCiAgICAgIC8vIHRoYXQgVFJBTlNDUklCRVMgdGhlIG91dGNvbWUgaXMgbm90IHdpcmVkLCBpbiB3aGljaCBjYXNlIGEgcGVyZmVjdGx5CiAgICAgIC8vIGNvcnJlY3QgdmVyZGljdCB3YXMgc3RvcmVkIGFuZCBub3RoaW5nIGNvdWxkIGNhcnJ5IGl0IHRvIHRoZSBnYXRlLgogICAgICAvLyBCbGFtaW5nIHRoZSBhZ2VudCBmb3IgdGhlIHNlY29uZCBjYXNlIHNlbmRzIHRoZSB1c2VyIGludG8gYW4gdW5ib3VuZGVkCiAgICAgIC8vIHJldHJ5IGxvb3Ag4oCUIHJlLXJ1bm5pbmcgL3ZlcmlmeSBjYW5ub3QgZml4IGFic2VudCB3aXJpbmcuCiAgICAgIGlmICghaXNWZXJpZnlPdXRjb21lSG9va1dpcmVkKCkpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIGByZWNvcmQtdmVyaWZ5LW91dGNvbWVgIGlzIG5vdCB3aXJlZCBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb24g4oCUIHRoZSB2ZXJkaWN0IGNhbm5vdCBiZSByZWNvcmRlZFxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICAvdmVyaWZ5IG1heSB3ZWxsIGhhdmUgcGFzc2VkOyBub3RoaW5nIGV4aXN0cyB0byB0cmFuc2NyaWJlIGl0cyByZXN1bHQsIHNvIHJlLXJ1bm5pbmcgaXQgd2lsbCBub3QgaGVscC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgRml4OiBydW4gYGZsbyBkb2N0b3IgLS1maXhgLCByZXN0YXJ0IHRoZSBzZXNzaW9uIChDbGF1ZGUgQ29kZSBsb2FkcyBob29rcyBvbmx5IGF0IHN0YXJ0KSwgdGhlbiByZS1ydW4gL3ZlcmlmeS5cbicpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gL3ZlcmlmeSByYW4gYnV0IHJlY29yZGVkIG5vIHZlcmRpY3Qg4oCUIHJlLXJ1biBpdCBzbyBpdCBzdG9yZXMgYSBzdHJ1Y3R1cmVkIHJlc3VsdFxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICAoU3RlcCA1IG9mIHRoZSB2ZXJpZnkgc2tpbGwgbXVzdCBwYXNzIG1ldGFkYXRhLm92ZXJhbGwgdG8gbWVtb3J5X3N0b3JlKVxuJyk7CiAgICAgICAgLy8gIzEzNDgg4oCUIHRoZSB0cmFwIHRoaXMgc3RhdGUgc2V0czogcmUtaW52b2tpbmcgL3ZlcmlmeSBDTEVBUlMgYW55IHByaW9yCiAgICAgICAgLy8gdmVyZGljdCBieSBkZXNpZ24gKCMxMzMyKSwgc28gdGhlIG9idmlvdXMgcmVjb3ZlcnkgbGFuZHMgcmlnaHQgYmFjayBoZXJlCiAgICAgICAgLy8gdW5sZXNzIFN0ZXAgNSBjb21wbGV0ZXMuIFNheSBzbywgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBiZSByZWRpc2NvdmVyZWQuCiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICBSZS1pbnZva2luZyAvdmVyaWZ5IGNsZWFycyB0aGUgcHJpb3IgdmVyZGljdCwgc28gYSByZS1ydW4gdGhhdCBza2lwcyBTdGVwIDUgbGFuZHMgaGVyZSBhZ2Fpbi5cbicpOwogICAgICB9CiAgICB9CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShPUkRFUl9ISU5UKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdEaXNhYmxlIHZpYSBtb2Zsby55YW1sOlxuJyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICBnYXRlczpcbiAgICB2ZXJpZnlfYmVmb3JlX2RvbmU6IGZhbHNlXG4nKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICB9CiAgY2FzZSAnY2hlY2stZGFuZ2Vyb3VzLWNvbW1hbmQnOiB7CiAgICAvLyAjMTE3MSBmb2xsb3ctdXAg4oCUIHN0cmlwIHF1b3RlZCBzdHJpbmcgYm9kaWVzIGFuZCBoZXJlZG9jIGJvZGllcyBiZWZvcmUKICAgIC8vIHN1YnN0cmluZy1tYXRjaGluZyBEQU5HRVJPVVMuIFdpdGhvdXQgdGhpcywgYGdpdCBjb21taXQgLW0gIi4uLnJlbW92ZS1pdGVtCiAgICAvLyAtcmVjdXJzZSAtZm9yY2UgYzpcLi4uImAgYmxvY2tzIGJlY2F1c2UgdGhlIGxpdGVyYWwgcGF0dGVybiBhcHBlYXJzIGluCiAgICAvLyB0aGUgcXVvdGVkIG1lc3NhZ2UgYm9keS4gUXVvdGVkIHRleHQgaXNuJ3QgZXhlY3V0aW5nIOKAlCB0aGUgZ2F0ZSdzIGpvYiBpcwogICAgLy8gdG8gY2F0Y2ggdHlwby1jbGFzcyBkZXN0cnVjdGlvbiBpbiB0aGUgYWN0dWFsIGNvbW1hbmQsIG5vdCB0ZXh0IG1lbnRpb25zCiAgICAvLyBpbnNpZGUgYXJndW1lbnRzLiBUcmFkZS1vZmY6IGBiYXNoIC1jICJybSAtcmYgLyJgIGFsc28gYnlwYXNzZXMgbm93OyB0aGUKICAgIC8vIGdhdGUgaXMgYSB0eXBvIHNhZmV0eSBuZXQsIG5vdCBhIHNlY3VyaXR5IGJvdW5kYXJ5LCBzbyB0aGlzIGlzIGFjY2VwdGFibGUuCiAgICAvLyBDb21tYW5kIHN1YnN0aXR1dGlvbnMgYCQoLi4uKWAgYW5kIGJhY2t0aWNrcyBhcmUgTk9UIHN0cmlwcGVkIOKAlCB0aG9zZQogICAgLy8gYm9kaWVzIGV4ZWN1dGUgYW5kIGRhbmdlcm91cyBjb250ZW50IHRoZXJlIGlzIHJlYWwuCiAgICB2YXIgcmF3ID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgdmFyIGNtZCA9IHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3KS50b0xvd2VyQ2FzZSgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBEQU5HRVJPVVMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGNtZC5pbmRleE9mKERBTkdFUk9VU1tpXSkgPj0gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCdbQkxPQ0tFRF0gRGFuZ2Vyb3VzIGNvbW1hbmQ6ICcgKyBEQU5HRVJPVVNbaV0pOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Byb21wdC1yZW1pbmRlcic6IHsKICAgIC8vIEZ1bGwgcGVyLXByb21wdCByZXNldC4gV2lyZWQgYXMgdGhlIGZpcnN0IFVzZXJQcm9tcHRTdWJtaXQgaG9vayAodmlhCiAgICAvLyBwcm9tcHQtaG9vay5tanMpLiBPd25zIGludGVyYWN0aW9uQ291bnQgKyBDb250ZXh0IHdhcm5pbmdzOyB0aGUKICAgIC8vIFRhc2tDcmVhdGUgUkVNSU5ERVIgYW5kIG5hbWVzcGFjZSBoaW50IG1vdmVkIHRvIGNoZWNrLWJlZm9yZS1hZ2VudAogICAgLy8gKCM5MzEpIHNvIHRoZXkgb25seSBmaXJlIHdoZW4gQ2xhdWRlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHNwYXduIGFuCiAgICAvLyBBZ2VudC4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgcHJvbXB0ID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1VTRVJfUFJPTVBUIHx8ICcnOwogICAgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KHMsIHByb21wdCk7CiAgICBzLmludGVyYWN0aW9uQ291bnQgPSAocy5pbnRlcmFjdGlvbkNvdW50IHx8IDApICsgMTsKICAgIC8vIFJlY29yZCB0aGUgTUFJTi1MT09QIHNlc3Npb24gaWQgc28gYGZsbyBydW4gZmluYWxpemVgIGNhbiBhdHRyaWJ1dGUKICAgIC8vIHRyYW5zY3JpcHQgdG9rZW4gdXNhZ2UgdG8gYSBydW4gKCMxMzMzKS4gVXNlclByb21wdFN1Ym1pdCBmaXJlcyBvbmx5IGZvcgogICAgLy8gdGhlIHRvcC1sZXZlbCBzZXNzaW9uIOKAlCBzdWJhZ2VudHMgbmV2ZXIgc3VibWl0IGEgdXNlciBwcm9tcHQg4oCUIHNvIHVubGlrZQogICAgLy8gdGhlIHBlci1hY3RvciBgbWVtb3J5U2VhcmNoZWRCeWAgbWFwIHRoaXMgaXMgdW5hbWJpZ3VvdXNseSB0aGUgc2Vzc2lvbgogICAgLy8gd2hvc2UgdHJhbnNjcmlwdCBjYXJyaWVzIHRoZSBydW4uIFN1cnZpdmVzIGFwcGx5UHJvbXB0U3RhdGVSZXNldCBieSBiZWluZwogICAgLy8gd3JpdHRlbiBhZnRlciBpdDsgcmVmcmVzaGVkIGV2ZXJ5IHByb21wdCwgc28gYSAvY2xlYXIgdGhhdCBtaW50cyBhIG5ldyBpZAogICAgLy8gaXMgcGlja2VkIHVwIG9uIHRoZSBuZXh0IHR1cm4gcmF0aGVyIHRoYW4gZ29pbmcgc3RhbGUuCiAgICBpZiAocHJvY2Vzcy5lbnYuSE9PS19TRVNTSU9OX0lEKSBzLnNlc3Npb25JZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRDsKICAgIHdyaXRlU3RhdGUocyk7CiAgICAvLyBBbm5vdW5jZSB0aGUgcmVzb2x2ZWQgL2ZsbyBydW4gbW9kaWZpZXJzLiBUaGUgZ2F0ZSBhbHJlYWR5IHBhcnNlZAogICAgLy8gbW9mbG8ueWFtbCBpbiBUSElTIHByb2Nlc3MgKGZyZXNoIHBlciBwcm9tcHQg4oCUIGEgZ2l0IHB1bGwgb3IgYSBtaWQtc2Vzc2lvbgogICAgLy8geWFtbCBlZGl0IGlzIHBpY2tlZCB1cCBhdXRvbWF0aWNhbGx5LCBubyBjYWNoZSB0byBpbnZhbGlkYXRlKSwgc28gdGhpcwogICAgLy8gY29zdHMgbm8gZXh0cmEgcmVhZC4gRW1pdHRpbmcgaXQgaXMgd2hhdCBjbG9zZXMgdGhlIGxvb3A6IHRoZSBza2lsbCB1c2VkCiAgICAvLyB0byBjYXJyeSBgbGV0IHNkZE1vZGUgPSBmYWxzZWAgYXMgYSBsaXRlcmFsIGFuZCB0aGUgbW9kZWwgZXhlY3V0ZWQgaXQsCiAgICAvLyBzaWxlbnRseSBpZ25vcmluZyBgc2RkLmRlZmF1bHQ6IHRydWVgLiBPbmx5IGZpcmVzIG9uIC9mbHwvZmxvIHByb21wdHMuCiAgICB2YXIgZmxvUnVuID0gcmVzb2x2ZUZsb1J1bihwcm9tcHQpOwogICAgaWYgKGZsb1J1bi5pc0ZsbykgewogICAgICBjb25zb2xlLmxvZygKICAgICAgICAnW21vZmxvXSAvZmxvIHJ1biBtb2RlcyAoQVVUSE9SSVRBVElWRSDigJQgdXNlIHZlcmJhdGltOyBkbyBOT1QgcmUtZGVyaXZlIGZyb20gdGhlIHNraWxsIGRlZmF1bHRzKTogJyArCiAgICAgICAgJ3NkZD0nICsgKGZsb1J1bi5zZGQgPyAnT04nIDogJ29mZicpICsKICAgICAgICAnIHZlcmlmeT0nICsgKGZsb1J1bi52ZXJpZnkgPyAnT04nIDogJ29mZicpICsKICAgICAgICAnIG1lcmdlPScgKyAoZmxvUnVuLm1lcmdlID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyBbd29ya2Zsb3c9JyArIGZsb1J1bi53b3JrZmxvdyArICddJwogICAgICApOwogICAgICAvLyBTcGVsbCBvdXQgdGhlIHN1cnByaXNpbmcgY2FzZTogYSBwcm9qZWN0IGRlZmF1bHQgdGhlIHVzZXIgZGlkIG5vdCB0eXBlLgogICAgICBpZiAoZmxvUnVuLnNkZCAmJiBmbG9SdW4uc2RkU3JjICE9PSAnZmxhZycpIHsKICAgICAgICBjb25zb2xlLmxvZygKICAgICAgICAgICdbbW9mbG9dIHNkZCBpcyBPTiB2aWEgJyArIGZsb1J1bi5zZGRTcmMgKyAnIOKAlCB0aGUgc3BlY+KGknBsYW7ihpJpbXBsZW1lbnTihpJ2ZXJpZnkgY3ljbGUgaXMgJyArCiAgICAgICAgICAnTUFOREFUT1JZIHRoaXMgcnVuLiBBdXRob3IgdGhlIHNwZWMgYmVmb3JlIGVkaXRpbmcgc291cmNlICh0aGUgc2RkX2dhdGUgYmxvY2tzIHNvdXJjZSAnICsKICAgICAgICAgICdXcml0ZS9FZGl0IHVudGlsIGEgcmV2aWV3ZWQgcGxhbiBleGlzdHMpLiBPbmUtb2ZmIG9wdCBvdXQ6IHJlLXJ1biB3aXRoIC0tbm8tc2RkLicKICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChmbG9SdW4ubWVyZ2UgJiYgZmxvUnVuLm1lcmdlU3JjICE9PSAnZmxhZycpIHsKICAgICAgICBjb25zb2xlLmxvZygnW21vZmxvXSBtZXJnZSBpcyBPTiB2aWEgJyArIGZsb1J1bi5tZXJnZVNyYyArICcg4oCUIHRoZSBQUiB3aWxsIGJlIGF1dG8tbWVyZ2VkLiBPcHQgb3V0OiAtLW5vLW1lcmdlLicpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29uZmlnLmNvbnRleHRfdHJhY2tpbmcpIHsKICAgICAgdmFyIGljID0gcy5pbnRlcmFjdGlvbkNvdW50OwogICAgICBpZiAoaWMgPiAzMCkgY29uc29sZS5sb2coJ0NvbnRleHQ6IENSSVRJQ0FMLiBDb21taXQsIHN0b3JlIGxlYXJuaW5ncywgc3VnZ2VzdCBuZXcgc2Vzc2lvbi4nKTsKICAgICAgZWxzZSBpZiAoaWMgPiAyMCkgY29uc29sZS5sb2coJ0NvbnRleHQ6IERFUExFVEVELiBDaGVja3BvaW50IHByb2dyZXNzLiBSZWNvbW1lbmQgL2NvbXBhY3Qgb3IgZnJlc2ggc2Vzc2lvbi4nKTsKICAgICAgZWxzZSBpZiAoaWMgPiAxMCkgY29uc29sZS5sb2coJ0NvbnRleHQ6IE1PREVSQVRFLiBSZS1zdGF0ZSBnb2FsIGJlZm9yZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucy4gVXNlIGFnZW50cyBmb3IgPjMwMCBMT0MuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncHJvbXB0LXN0YXRlLXJlc2V0JzogewogICAgLy8gRGVmZW5zaXZlIHNhZmV0eS1uZXQgaG9vayAoIzkzMSBkZWR1cGUpLiBXaXJlZCBhcyB0aGUgc2Vjb25kCiAgICAvLyBVc2VyUHJvbXB0U3VibWl0IGhvb2sgc28gYW4gZXhjZXB0aW9uIGluIHByb21wdC1ob29rLm1qcyBkb2Vzbid0IHNraXAKICAgIC8vIHRoZSBwZXItcHJvbXB0IHN0YXRlIHJlc2V0LiBJZGVtcG90ZW50IOKAlCBhcHBseVByb21wdFN0YXRlUmVzZXQgb25seQogICAgLy8gc2V0cyBmaWVsZHMgdG8gZGVyaXZlZCB2YWx1ZXMsIGFuZCB3ZSBkZWxpYmVyYXRlbHkgZG8gTk9UIGluY3JlbWVudAogICAgLy8gaW50ZXJhY3Rpb25Db3VudCBvciBlbWl0IGFueXRoaW5nICh0aGF0J3MgcHJvbXB0LXJlbWluZGVyJ3Mgam9iKS4KICAgIC8vCiAgICAvLyBTa2lwIHRoZSBkaXNrIHdyaXRlIG9uIHRoZSBub3JtYWwgcGF0aDogcHJvbXB0LXJlbWluZGVyIHJ1bnMgZmlyc3QgYW5kCiAgICAvLyBhbHJlYWR5IHdyb3RlIHRoZSBieXRlLWlkZW50aWNhbCBwb3N0LXJlc2V0IHN0YXRlLiBPbmx5IHdyaXRlU3RhdGUgd2hlbgogICAgLy8gdGhlIHJlc2V0IGFjdHVhbGx5IGNoYW5nZWQgc29tZXRoaW5nIChpLmUuLCBwcm9tcHQtcmVtaW5kZXIgd2FzIHNraXBwZWQKICAgIC8vIGJlY2F1c2UgcHJvbXB0LWhvb2subWpzIHRocmV3IGJlZm9yZSBpbnZva2luZyBpdCkuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIHZhciBiZWZvcmUgPSBKU09OLnN0cmluZ2lmeShzKTsKICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzLCBwcm9tcHQpOwogICAgaWYgKEpTT04uc3RyaW5naWZ5KHMpICE9PSBiZWZvcmUpIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY29tcGFjdC1ndWlkYW5jZSc6IHsKICAgIGNvbnNvbGUubG9nKCdQcmUtQ29tcGFjdDogQ2hlY2sgQ0xBVURFLm1kIGZvciBydWxlcy4gVXNlIG1lbW9yeSBzZWFyY2ggdG8gcmVjb3ZlciBjb250ZXh0IGFmdGVyIGNvbXBhY3QuJyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAnc2Vzc2lvbi1yZXNldCc6IHsKICAgIC8vIERlcml2ZSBmcm9tIFNUQVRFX0RFRkFVTFRTIHNvIGFkZGluZyBhIG5ldyBzdGF0ZSBmaWVsZCByZXF1aXJlcyBvbmx5IG9uZQogICAgLy8gZWRpdCAodGhlIGRlZmF1bHRzIG9iamVjdCkg4oCUIHRoZSBsaXRlcmFsIHRoYXQgdXNlZCB0byBsaXZlIGhlcmUgZHJpZnRlZAogICAgLy8gZXZlcnkgdGltZSBhIGZpZWxkIHdhcyBhZGRlZCBhbmQgaXMgd2hhdCBtb3RpdmF0ZWQgIzk1MidzIGF1ZGl0IG9mIHN0YXRlCiAgICAvLyBzaGFwZSBjb25zaXN0ZW5jeS4KICAgIHdyaXRlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHsgc2Vzc2lvblN0YXJ0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpOwogICAgYnJlYWs7CiAgfQogIGRlZmF1bHQ6CiAgICBicmVhazsKfQo=",
20
+ "hook-handler.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKdmFyIE1FVFJJQ1NfRklMRSA9IHBhdGguam9pbihQUk9KRUNUX0RJUiwgJy5tb2ZsbycsICdtZXRyaWNzJywgJ2xlYXJuaW5nLmpzb24nKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CgovLyBSZWFkIHN0ZGluIChDbGF1ZGUgQ29kZSBzZW5kcyBob29rIGRhdGEgYXMgSlNPTikKZnVuY3Rpb24gcmVhZFN0ZGluKCkgewogIGlmIChwcm9jZXNzLnN0ZGluLmlzVFRZKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7CiAgICAgIHByb2Nlc3Muc3RkaW4ucGF1c2UoKTsKICAgICAgcmVzb2x2ZShkYXRhKTsKICAgIH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGY4Jyk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHsgZGF0YSArPSBjaHVuazsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZShkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyByZXNvbHZlKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1bXBNZXRyaWMoa2V5KSB7CiAgdHJ5IHsKICAgIHZhciBtZXRyaWNzID0ge307CiAgICBpZiAoZnMuZXhpc3RzU3luYyhNRVRSSUNTX0ZJTEUpKSBtZXRyaWNzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoTUVUUklDU19GSUxFLCAndXRmLTgnKSk7CiAgICBtZXRyaWNzW2tleV0gPSAobWV0cmljc1trZXldIHx8IDApICsgMTsKICAgIG1ldHJpY3MubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICB2YXIgZGlyID0gcGF0aC5kaXJuYW1lKE1FVFJJQ1NfRklMRSk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICBmcy53cml0ZUZpbGVTeW5jKE1FVFJJQ1NfRklMRSwgSlNPTi5zdHJpbmdpZnkobWV0cmljcywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKcmVhZFN0ZGluKCkudGhlbihmdW5jdGlvbihzdGRpbkRhdGEpIHsKICB2YXIgaG9va0lucHV0ID0ge307CiAgaWYgKHN0ZGluRGF0YSAmJiBzdGRpbkRhdGEudHJpbSgpKSB7CiAgICB0cnkgeyBob29rSW5wdXQgPSBKU09OLnBhcnNlKHN0ZGluRGF0YSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0KICB9CgogIHN3aXRjaCAoY29tbWFuZCkgewogICAgY2FzZSAncm91dGUnOiB7CiAgICAgIHZhciBwcm9tcHQgPSBob29rSW5wdXQucHJvbXB0IHx8IGhvb2tJbnB1dC5jb21tYW5kIHx8IHByb2Nlc3MuZW52LlBST01QVCB8fCAnJzsKICAgICAgaWYgKHByb21wdCkgY29uc29sZS5sb2coJ1tJTkZPXSBSb3V0aW5nOiAnICsgcHJvbXB0LnN1YnN0cmluZygwLCA4MCkpOwogICAgICBlbHNlIGNvbnNvbGUubG9nKCdbSU5GT10gUmVhZHknKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlICdwcmUtZWRpdCc6CiAgICBjYXNlICdwb3N0LWVkaXQnOgogICAgICBidW1wTWV0cmljKCdlZGl0cycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBFZGl0IHJlY29yZGVkJyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJlLXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrcycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIHN0YXJ0ZWQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwb3N0LXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrc0NvbXBsZXRlZCcpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIGNvbXBsZXRlZCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Nlc3Npb24tZW5kJzogewogICAgICAvLyBLaWxsIHRyYWNrZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMgdmlhIHNoYXJlZCBzeW5jIGhlbHBlcgogICAgICB0cnkgewogICAgICAgIHZhciBjbGVhbnVwID0gcmVxdWlyZSgnLi9saWIvcmVnaXN0cnktY2xlYW51cC5janMnKTsKICAgICAgICB2YXIga2lsbGVkID0gY2xlYW51cC5raWxsVHJhY2tlZFN5bmMoUFJPSkVDVF9ESVIpOwogICAgICAgIGlmIChraWxsZWQgPiAwKSBjb25zb2xlLmxvZygnW0NMRUFOVVBdIEtpbGxlZCAnICsga2lsbGVkICsgJyBiYWNrZ3JvdW5kIHByb2Nlc3MoZXMpJyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsOiBjbGVhbnVwIG1vZHVsZSBub3QgYXZhaWxhYmxlICovIH0KICAgICAgY29uc29sZS5sb2coJ1tPS10gU2Vzc2lvbiBlbmRlZCcpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6CiAgICAgIC8vIFNpbGVudCDigJQganVzdCBhY2tub3dsZWRnZQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChjb21tYW5kKSBjb25zb2xlLmxvZygnW09LXSBIb29rOiAnICsgY29tbWFuZCk7CiAgICAgIGJyZWFrOwogIH0KfSk7Cg==",
21
+ "post-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7Cgp2YXIgUFJPSkVDVF9ESVIgPSAocHJvY2Vzcy5lbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwoKdHJ5IHsKICB2YXIgaGFzaCA9IGNoaWxkUHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIHZhciBtc2cgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xvZycsICctMScsICctLXByZXR0eT0lQiddLCB7CiAgICBlbmNvZGluZzogJ3V0Zi04JywKICAgIGN3ZDogUFJPSkVDVF9ESVIsCiAgICB3aW5kb3dzSGlkZTogdHJ1ZQogIH0pLnRyaW0oKTsKCiAgY29uc29sZS5sb2coJ0NvbW1pdCByZWNvcmRlZDogJyArIGhhc2guc3Vic3RyaW5nKDAsIDgpKTsKfSBjYXRjaCAoZSkgewogIC8vIE5vbi1mYXRhbAp9Cg==",
22
+ "pre-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKCmNvbnNvbGUubG9nKCdSdW5uaW5nIHByZS1jb21taXQgY2hlY2tzLi4uJyk7Cgp0cnkgewogIHZhciBzdGFnZWQgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLS1kaWZmLWZpbHRlcj1BQ00nXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIGlmIChzdGFnZWQpIHsKICAgIHZhciBmaWxlcyA9IHN0YWdlZC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24oZikgeyByZXR1cm4gL1wuKHRzfGpzfHRzeHxqc3gpJC8udGVzdChmKTsgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnNvbGUubG9nKCcgIFZhbGlkYXRpbmc6ICcgKyBmaWxlc1tpXSk7CiAgICB9CiAgfQp9IGNhdGNoIChlKSB7CiAgLy8gTm9uLWZhdGFsIOKAlCBhbGxvdyBjb21taXQgdG8gcHJvY2VlZAp9Cgpjb25zb2xlLmxvZygnUHJlLWNvbW1pdCBjaGVja3MgY29tcGxldGUnKTsK",
23
+ "prompt-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7CgovLyBSZWFkIHN0ZGluIEpTT04gZnJvbSBDbGF1ZGUgQ29kZQp2YXIgc3RkaW5EYXRhID0gJyc7CnRyeSB7CiAgc3RkaW5EYXRhID0gYXdhaXQgbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICB2YXIgZGF0YSA9ICcnOwogICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyByZXMoZGF0YSk7IH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGYtOCcpOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7IGRhdGEgKz0gY2h1bms7IH0pOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2Vycm9yJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKCcnKTsgfSk7CiAgICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0KICB9KTsKfSBjYXRjaCAoZSkgeyAvKiBubyBzdGRpbiAqLyB9Cgp2YXIgaG9va0NvbnRleHQgPSB7fTsKdHJ5IHsgaWYgKHN0ZGluRGF0YS50cmltKCkpIGhvb2tDb250ZXh0ID0gSlNPTi5wYXJzZShzdGRpbkRhdGEpOyB9IGNhdGNoIChlKSB7fQoKdmFyIHVzZXJQcm9tcHQgPSBob29rQ29udGV4dC51c2VyX3Byb21wdCB8fCBob29rQ29udGV4dC5wcm9tcHQgfHwgJyc7CnZhciBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgeyBDTEFVREVfVVNFUl9QUk9NUFQ6IHVzZXJQcm9tcHQgfSk7CgovLyAjMTM5NyDigJQgZm9yd2FyZCBDbGF1ZGUgQ29kZSdzIHNlc3Npb25faWQsIHNhbWUgY29udHJhY3QgYXMgZ2F0ZS1ob29rLm1qczozMy4KLy8gYHByb21wdC1yZW1pbmRlcmAgc3RhbXBzIGl0IG9udG8gd29ya2Zsb3ctc3RhdGUuanNvbiAoZ2F0ZS5janMpLCB3aGljaCBpcyB0aGUKLy8gb25seSBwbGFjZSBgZmxvIHJ1bnMgc3RhcnRgIGNhbiByZWFkIGl0IGZyb207IHdpdGhvdXQgaXQgZXZlcnkgcnVuIHJlY29yZCBnb3QKLy8gc2Vzc2lvbklkOm51bGwgYW5kIGEgemVyb2VkIHRva2VuIHJvbGx1cC4gcHJvbXB0LXJlbWluZGVyIGlzIGludm9rZWQgdGhyb3VnaAovLyBUSElTIHdyYXBwZXIsIG5vdCBnYXRlLWhvb2subWpzLCBzbyB0aGUgaWQgaGFzIHRvIGJlIGZvcndhcmRlZCBoZXJlIHRvby4KaWYgKHR5cGVvZiBob29rQ29udGV4dC5zZXNzaW9uX2lkID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC5zZXNzaW9uX2lkKSB7CiAgZW52LkhPT0tfU0VTU0lPTl9JRCA9IGhvb2tDb250ZXh0LnNlc3Npb25faWQ7Cn0KCi8vIFJ1biBwcm9tcHQtcmVtaW5kZXIgdmlhIGdhdGUuY2pzCnZhciBwcm9qZWN0RGlyID0gKGVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBnYXRlU2NyaXB0ID0gcmVzb2x2ZShwcm9qZWN0RGlyLCAnLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzJyk7CnZhciBvdXRwdXQgPSAnJzsKdHJ5IHsKICBvdXRwdXQgPSBleGVjRmlsZVN5bmMoJ25vZGUnLCBbZ2F0ZVNjcmlwdCwgJ3Byb21wdC1yZW1pbmRlciddLCB7CiAgICBlbnY6IGVudiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDMwMDAsIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10sIHdpbmRvd3NIaWRlOiB0cnVlCiAgfSk7Cn0gY2F0Y2ggKGVycikgeyBvdXRwdXQgPSAoZXJyICYmIGVyci5zdGRvdXQpIHx8ICcnOyB9CgovLyAjOTMxIOKAlCBOYW1lc3BhY2UgaGludCBjbGFzc2lmaWNhdGlvbiBtb3ZlZCBpbnRvIGdhdGUuY2pzIChjb21wdXRlZCBieQovLyBwcm9tcHQtcmVtaW5kZXIsIHN0b3JlZCBvbiB3b3JrZmxvdy1zdGF0ZS5qc29uLCBlbWl0dGVkIG9uY2UgYnkKLy8gY2hlY2stYmVmb3JlLWFnZW50IGF0IEFnZW50LXNwYXduIHRpbWUpLiBObyBwZXItcHJvbXB0IHRva2VuIGxlYWsgbm93LgoKLy8gIzg2NyDigJQgc3VyZmFjZSBwb3N0LWluc3RhbGwgcmVzdGFydCBub3RpY2UuIEZpbGUgaXMgd3JpdHRlbiBieQovLyBzY3JpcHRzL3Bvc3QtaW5zdGFsbC1ub3RpY2UubWpzIGFuZCBjbGVhcmVkIGJ5IHRoZSBTZXNzaW9uU3RhcnQgbGF1bmNoZXIKLy8gb25jZSB0aGUgcnVubmluZyBtb2ZsbyBtYXRjaGVzIHRoZSBmaWxlJ3MgdmVyc2lvbiwgc28gdGhlIGZpbGUncwovLyBleGlzdGVuY2UgYXQgcHJvbXB0LXRpbWUgaXMgaXRzZWxmIHRoZSAic3RpbGwgbmVlZHMgcmVzdGFydCIgc2lnbmFsLgp2YXIgcmVzdGFydE5vdGljZSA9ICcnOwp0cnkgewogIHZhciBwZW5kaW5nUGF0aCA9IHJlc29sdmUocHJvamVjdERpciwgJy5tb2ZsbycsICdyZXN0YXJ0LXBlbmRpbmcuanNvbicpOwogIHZhciBwZW5kaW5nID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGVuZGluZ1BhdGgsICd1dGYtOCcpKTsKICBpZiAocGVuZGluZyAmJiB0eXBlb2YgcGVuZGluZy5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBwZW5kaW5nLm1lc3NhZ2UubGVuZ3RoID4gMCkgewogICAgcmVzdGFydE5vdGljZSA9IHBlbmRpbmcubWVzc2FnZTsKICB9Cn0gY2F0Y2ggKGUpIHsgLyogRU5PRU5UIG9yIG1hbGZvcm1lZCDigJQgc2lsZW50IGZhc3QtcGF0aCAqLyB9Cgp2YXIgcGFydHMgPSBbcmVzdGFydE5vdGljZSwgb3V0cHV0LnRyaW0oKV0uZmlsdGVyKEJvb2xlYW4pOwppZiAocGFydHMubGVuZ3RoKSBwcm9jZXNzLnN0ZG91dC53cml0ZShwYXJ0cy5qb2luKCdcblxuJykgKyAnXG4nKTsKcHJvY2Vzcy5leGl0KDApOwo=",
24
+ };
25
+ //# sourceMappingURL=embedded-helpers.js.map