diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index fa423d9..2d3a89a 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2264,11 +2264,11 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) free(_agentinstaller); // identifer: Refer to modules/identifers.js - char *_identifiers = ILibMemory_Allocate(35974, 0, NULL, NULL); - memcpy_s(_identifiers + 0, 20556, "LyoNCkNvcHlyaWdodCAyMDE5LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHRyaW1JZGVudGlmaWVycyh2YWwpDQp7DQogICAgZm9yKHZhciB2IGluIHZhbCkNCiAgICB7DQogICAgICAgIGlmICghdmFsW3ZdIHx8IHZhbFt2XSA9PSAnTm9uZScgfHwgdmFsW3ZdID09ICcnKSB7IGRlbGV0ZSB2YWxbdl07IH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgaWRlbnRpZmllcnMgPSB7fTsNCiAgICB2YXIgcmV0ID0ge307DQogICAgdmFyIHZhbHVlcyA9IHt9Ow0KICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvc3lzL2NsYXNzL2RtaS9pZCcpKSB7IHRocm93ICgndGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIERNSSBzdGF0aXN0aWNzJyk7IH0NCiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7DQogICAgZm9yKHZhciBpIGluIGVudHJpZXMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRbZW50cmllc1tpXV0gPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLnRvU3RyaW5nKCkudHJpbSgpOw0KDQogICAgICAgICAgICBpZiAocmV0W2VudHJpZXNbaV1dID09ICdOb25lJykgeyBkZWxldGUgcmV0W2VudHJpZXNbaV1dO30NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZGVudGlmaWVyc1snYmlvc19kYXRlJ10gPSByZXRbJ2Jpb3NfZGF0ZSddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlbmRvciddID0gcmV0WydiaW9zX3ZlbmRvciddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX25hbWUnXSA9IHJldFsnYm9hcmRfbmFtZSddOw0KICAgIGlkZW50aWZpZXJzWydib2FyZF9zZXJpYWwnXSA9IHJldFsnYm9hcmRfc2VyaWFsJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsNCiAgICBpZGVudGlmaWVyc1snYm9hcmRfdmVyc2lvbiddID0gcmV0Wydib2FyZF92ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ3Byb2R1Y3RfdXVpZCddID0gcmV0Wydwcm9kdWN0X3V1aWQnXTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgIm1vZGVsIG5hbWUiIHwgJyArICJ0ciAnXFxuJyAnOicgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGlkZW50aWZpZXJzWydjcHVfbmFtZSddID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCg0KICAgIC8vIEZldGNoIEdQVSBpbmZvDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoImxzcGNpIHwgZ3JlcCAnIFZHQSAnIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICd7IGE9c3BsaXQoJDAsbGluZXMiICsgJywiYCIpOyBwcmludGYgIlsiOyBmb3IoaT0xO2k8YTsrK2kpIHsgc3BsaXQobGluZXNbaV0sZ3B1LCJyOiAiKTsgcHJpbnRmICIlc1xcIiVzXFwiIiwgKGk9PTE/IiI6IiwiKSxncHVbMl07IH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHRyeSB7IGlkZW50aWZpZXJzWydncHVfbmFtZSddID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0gY2F0Y2ggKHh4KSB7IH0NCg0KICAgIC8vIEZldGNoIFN0b3JhZ2UgSW5mbw0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJsc2h3IC1jbGFzcyBkaXNrIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICciICsgJ3sgbGVuPXNwbGl0KCQwLGxpbmVzLCIqIik7IHByaW50ZiAiWyI7IGZvcihpPTI7aTw9bGVuOysraSkgeyBtb2RlbD0iIjsgY2FwdGlvbj0iIjsgc2l6ZT0iIjsgY2xlbj1zcGxpdChsaW5lc1tpXSxpdGVtLCJgIik7IGZvcihqPTI7ajxjbGVuOysraikgeyBzcGxpdChpdGVtW2pdLHRva2VucywiOiIpOyBzcGxpdCh0b2tlbnNbMV0sa2V5LCIgIik7IGlmKGtleVsxXT09ImRlc2NyaXB0aW9uIikgeyBjYXB0aW9uPXN1YnN0cih0b2tlbnNbMl0sMik7IH0gaWYoa2V5WzFdPT0icHJvZHVjdCIpIHsgbW9kZWw9c3Vic3RyKHRva2Vuc1syXSwyKTsgfSBpZihrZXlbMV09PSJzaXplIikgeyBzaXplPXN1YnN0cih0b2tlbnNbMl0sMik7ICB9IH0gaWYobW9kZWw9PSIiKSB7IG1vZGVsPWNhcHRpb247IH0gaWYoY2FwdGlvbiE9IiIgfHwgbW9kZWwhPSIiKSB7IHByaW50ZiAiJXN7XFwiQ2FwdGlvblxcIjpcXCIlc1xcIixcXCJNb2RlbFxcIjpcXCIlc1xcIixcXCJTaXplXFwiOlxcIiVzXFwifSIsKGk9PTI/IiI6IiwiKSxjYXB0aW9uLG1vZGVsLHNpemU7IH0gIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHRyeSB7IGlkZW50aWZpZXJzWydzdG9yYWdlX2RldmljZXMnXSA9IEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9IGNhdGNoICh4eCkgeyB9DQoNCiAgICB2YWx1ZXMuaWRlbnRpZmllcnMgPSBpZGVudGlmaWVyczsNCiAgICB2YWx1ZXMubGludXggPSByZXQ7DQogICAgdHJpbUlkZW50aWZpZXJzKHZhbHVlcy5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuICh2YWx1ZXMpOw0KfQ0KDQpmdW5jdGlvbiB3aW5kb3dzX3dtaWNfcmVzdWx0cyhzdHIpDQp7DQogICAgdmFyIGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXHJcbicpOw0KICAgIHZhciBrZXlzID0gbGluZXNbMF0uc3BsaXQoJywnKTsNCiAgICB2YXIgaSwga2V5LCBrZXl2YWw7DQogICAgdmFyIHRva2VuczsNCiAgICB2YXIgcmVzdWx0ID0gW107DQoNCiAgICBmb3IgKGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpDQogICAgew0KICAgICAgICB2YXIgb2JqID0ge307DQogICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcsJyk7DQogICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwga2V5cy5sZW5ndGg7ICsra2V5KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodG9rZW5zW2tleV0udHJpbSgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialtrZXlzW2tleV0udHJpbSgpXSA9IHRva2Vuc1trZXldLnRyaW0oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBkZWxldGUgb2JqLk5vZGU7DQogICAgICAgIHJlc3VsdC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmVzdWx0KTsNCn0NCg0KDQpmdW5jdGlvbiB3aW5kb3dzX2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgcmV0ID0geyB3aW5kb3dzOiB7fX07IHZhbHVlcyA9IHt9OyB2YXIgaXRlbXM7IHZhciBpOyB2YXIgaXRlbTsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Jpb3MnLCAnZ2V0JywgJy9WQUxVRSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOw0KICAgIGZvcihpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KDQogICAgcmV0WydpZGVudGlmaWVycyddID0ge307DQogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX2RhdGUnXSA9IHZhbHVlc1snUmVsZWFzZURhdGUnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZXJzaW9uJ10gPSB2YWx1ZXNbJ1NNQklPU0JJT1NWZXJzaW9uJ107DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQkFTRUJPQVJEJywgJ2dldCcsICcvVkFMVUUnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB2YXIgaXRlbXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcclxyXG4nKTsNCiAgICBmb3IgKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQogICAgcmV0WydpZGVudGlmaWVycyddWydib2FyZF9uYW1lJ10gPSB2YWx1ZXNbJ1Byb2R1Y3QnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3NlcmlhbCddID0gdmFsdWVzWydTZXJpYWxOdW1iZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlbmRvciddID0gdmFsdWVzWydNYW51ZmFjdHVyZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlcnNpb24nXSA9IHZhbHVlc1snVmVyc2lvbiddOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ0NTUHJvZHVjdCcsICdnZXQnLCAnL1ZBTFVFJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7DQogICAgZm9yIChpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsncHJvZHVjdF91dWlkJ10gPSB2YWx1ZXNbJ1VVSUQnXTsNCiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdNRU1PUllDSElQJywgJ0xJU1QnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3MubWVtb3J5ID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cik7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnT1MnLCAnR0VUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLm9zaW5mbyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpWzBdOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBUlRJVElPTicsICdMSVNUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLnBhcnRpdGlvbnMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdDUFUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5jcHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdQQVRIJywgJ1dpbjMyX1ZpZGVvQ29udHJvbGxlcicsICdHRVQnLCAnTmFtZSxDdXJyZW50SG9yaXpvbnRhbFJlc29sdXRpb24sQ3VycmVudFZlcnRpY2FsUmVzb2x1dGlvbicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5ncHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdkaXNrZHJpdmUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5kcml2ZXMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIC8vIEluc2VydCBHUFUgbmFtZXMNCiAgICByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUgPSBbXTsNCiAgICBmb3IgKHZhciBncHVpbmZvIGluIHJldC53aW5kb3dzLmdwdSkNCiAgICB7DQogICAgICAgIGlmIChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSkgeyByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUucHVzaChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSk7IH0NCiAgICB9DQoNCiAgICAvLyBJbnNlcnQgU3RvcmFnZSBEZXZpY2VzDQogICAgcmV0LmlkZW50aWZpZXJzLnN0b3JhZ2VfZGV2aWNlcyA9IFtdOw0KICAgIGZvciAodmFyIGR2IGluIHJldC53aW5kb3dzLmRyaXZlcykNCiAgICB7DQogICAgICAgIHJldC5pZGVudGlmaWVycy5zdG9yYWdlX2RldmljZXMucHVzaCh7IENhcHRpb246IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uQ2FwdGlvbiwgTW9kZWw6IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uTW9kZWwsIFNpemU6IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uU2l6ZSB9KTsNCiAgICB9DQoNCiAgICB0cnkgeyByZXQuaWRlbnRpZmllcnMuY3B1X25hbWUgPSByZXQud2luZG93cy5jcHVbMF0uTmFtZTsgfSBjYXRjaCAoeCkgeyB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gbWFjb3NfaWRlbnRpZmllcnMoKQ0Kew0KICAgIHZhciByZXQgPSB7IGlkZW50aWZpZXJzOiB7fSB9Ow0KICAgIHZhciBjaGlsZDsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBib2FyZC1pZCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX25hbWUgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtU2VyaWFsTnVtYmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfc2VyaWFsID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgbWFudWZhY3R1cmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgdmVyc2lvbiB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX3ZlcnNpb24gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtVVVJRCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLnByb2R1Y3RfdXVpZCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzY3RsIC1uIG1hY2hkZXAuY3B1LmJyYW5kX3N0cmluZ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuY3B1X25hbWUgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KDQogICAgdHJpbUlkZW50aWZpZXJzKHJldC5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogbGludXhfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IHdpbmRvd3NfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiBtYWNvc19pZGVudGlmaWVycyB9Ow0KICAgICAgICBicmVhazsNCiAgICBkZWZhdWx0Og0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHRocm93ICgnVW5zdXBwb3J0ZWQgUGxhdGZvcm0nKTsgfSB9Ow0KICAgICAgICBicmVhazsNCn0NCm1v", 16000); - memcpy_s(_identifiers + 16000, 4556, "ZHVsZS5leHBvcnRzLmlzRG9ja2VyID0gZnVuY3Rpb24gaXNEb2NrZXIoKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICdsaW51eCcpIHsgcmV0dXJuIChmYWxzZSk7IH0NCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2Mvc2VsZi9jZ3JvdXAgfCB0ciAnXG4nICdgJyB8IGF3ayAtRidgJyAneyBzcGxpdCgkMSwgcmVzLCAiICsgJyIvIik7IGlmKHJlc1syXT09ImRvY2tlciIpe3ByaW50ICIxIjt9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfTsNCm1vZHVsZS5leHBvcnRzLmlzQmF0dGVyeVBvd2VyZWQgPSBmdW5jdGlvbiBpc0JhdHRlcnlPcGVyYXRlZCgpDQp7DQogICAgdmFyIHJldCA9IGZhbHNlOw0KICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgIHsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgICAgICB2YXIgZGV2aWNlcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5Jyk7DQogICAgICAgICAgICBmb3IgKHZhciBpIGluIGRldmljZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8nICsgZGV2aWNlc1tpXSArICcvdHlwZScpLnRvU3RyaW5nKCkudHJpbSgpID09ICdCYXR0ZXJ5JykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd3aW4zMic6DQogICAgICAgICAgICB2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsNCiAgICAgICAgICAgIHZhciBzdGF0cyA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEyKTsNCiAgICAgICAgICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsNCiAgICAgICAgICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0U3lzdGVtUG93ZXJTdGF0dXMnKTsNCiAgICAgICAgICAgIGlmIChrZXJuZWwzMi5HZXRTeXN0ZW1Qb3dlclN0YXR1cyhzdGF0cykuVmFsICE9IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYoc3RhdHMudG9CdWZmZXIoKVsxXSAhPSAxMjggJiYgc3RhdHMudG9CdWZmZXIoKVsxXSAhPSAyNTUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9Ow0KbW9kdWxlLmV4cG9ydHMuaXNWTSA9IGZ1bmN0aW9uIGlzVk0oKQ0Kew0KICAgIHZhciByZXQgPSBmYWxzZTsNCiAgICB2YXIgaWQgPSB0aGlzLmdldCgpOw0KICAgIGlmIChpZC5saW51eCAmJiBpZC5saW51eC5zeXNfdmVuZG9yKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoIChpZC5saW51eC5zeXNfdmVuZG9yKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdWTXdhcmUsIEluYy4nOg0KICAgICAgICAgICAgY2FzZSAnUUVNVSc6DQogICAgICAgICAgICBjYXNlICdYZW4nOg0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChpZC5pZGVudGlmaWVycy5iaW9zX3ZlbmRvcikNCiAgICB7DQogICAgICAgIHN3aXRjaChpZC5pZGVudGlmaWVycy5iaW9zX3ZlbmRvcikNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnVk13YXJlLCBJbmMuJzoNCiAgICAgICAgICAgIGNhc2UgJ1hlbic6DQogICAgICAgICAgICBjYXNlICdTZWFCSU9TJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaWQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yICYmIGlkLmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciA9PSAnVk13YXJlLCBJbmMuJykgeyByZXQgPSB0cnVlOyB9DQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX25hbWUpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGlkLmlkZW50aWZpZXJzLmJvYXJkX25hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWxCb3gnOg0KICAgICAgICAgICAgY2FzZSAnVmlydHVhbCBNYWNoaW5lJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgJiYgIXJldCkNCiAgICB7DQogICAgICAgIGZvcih2YXIgaSBpbiBpZC5pZGVudGlmaWVycy5ncHVfbmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYoaWQuaWRlbnRpZmllcnMuZ3B1X25hbWVbaV0uc3RhcnRzV2l0aCgnVk13YXJlICcpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGlmICghcmV0KSB7IHJldCA9IHRoaXMuaXNEb2NrZXIoKTsgfQ0KICAgIHJldHVybiAocmV0KTsNCn07DQoNCg0KLy8gYmlvc19kYXRlID0gQklPUy0+UmVsZWFzZURhdGUNCi8vIGJpb3NfdmVuZG9yID0gQklPUy0+TWFudWZhY3R1cmVyDQovLyBiaW9zX3ZlcnNpb24gPSBCSU9TLT5TTUJJT1NCSU9TVmVyc2lvbg0KLy8gYm9hcmRfbmFtZSA9IEJBU0VCT0FSRC0+UHJvZHVjdCA9IGlvcmVnL2JvYXJkLWlkDQovLyBib2FyZF9zZXJpYWwgPSBCQVNFQk9BUkQtPlNlcmlhbE51bWJlciA9IGlvcmVnL3NlcmlhbC1udW1iZXIgfCBpb3JlZy9JT1BsYXRmb3JtU2VyaWFsTnVtYmVyDQovLyBib2FyZF92ZW5kb3IgPSBCQVNFQk9BUkQtPk1hbnVmYWN0dXJlciA9IGlvcmVnL21hbnVmYWN0dXJlcg0KLy8gYm9hcmRfdmVyc2lvbiA9IEJBU0VCT0FSRC0+VmVyc2lvbg0KDQo=", 4556); - ILibBase64DecodeEx((unsigned char*)_identifiers, 20556, (unsigned char*)_identifiers + 20556); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "identifiers"); duk_push_string(ctx, _identifiers + 20556); + char *_identifiers = ILibMemory_Allocate(36352, 0, NULL, NULL); + memcpy_s(_identifiers + 0, 20772, "LyoKQ29weXJpZ2h0IDIwMTktMjAyMCBJbnRlbCBDb3Jwb3JhdGlvbgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoqLwoKZnVuY3Rpb24gdHJpbUlkZW50aWZpZXJzKHZhbCkKewogICAgZm9yKHZhciB2IGluIHZhbCkKICAgIHsKICAgICAgICBpZiAoIXZhbFt2XSB8fCB2YWxbdl0gPT0gJ05vbmUnIHx8IHZhbFt2XSA9PSAnJykgeyBkZWxldGUgdmFsW3ZdOyB9CiAgICB9Cn0KCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkKewogICAgdmFyIGlkZW50aWZpZXJzID0ge307CiAgICB2YXIgcmV0ID0ge307CiAgICB2YXIgdmFsdWVzID0ge307CiAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3N5cy9jbGFzcy9kbWkvaWQnKSkgeyB0aHJvdyAoJ3RoaXMgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBETUkgc3RhdGlzdGljcycpOyB9CiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7CiAgICBmb3IodmFyIGkgaW4gZW50cmllcykKICAgIHsKICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0W2VudHJpZXNbaV1dID0gcmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkLycgKyBlbnRyaWVzW2ldKS50b1N0cmluZygpLnRyaW0oKTsKCiAgICAgICAgICAgIGlmIChyZXRbZW50cmllc1tpXV0gPT0gJ05vbmUnKSB7IGRlbGV0ZSByZXRbZW50cmllc1tpXV07fQogICAgICAgIH0KICAgIH0KICAgIGlkZW50aWZpZXJzWydiaW9zX2RhdGUnXSA9IHJldFsnYmlvc19kYXRlJ107CiAgICBpZGVudGlmaWVyc1snYmlvc192ZW5kb3InXSA9IHJldFsnYmlvc192ZW5kb3InXTsKICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107CiAgICBpZGVudGlmaWVyc1snYm9hcmRfbmFtZSddID0gcmV0Wydib2FyZF9uYW1lJ107CiAgICBpZGVudGlmaWVyc1snYm9hcmRfc2VyaWFsJ10gPSByZXRbJ2JvYXJkX3NlcmlhbCddOwogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsKICAgIGlkZW50aWZpZXJzWydib2FyZF92ZXJzaW9uJ10gPSByZXRbJ2JvYXJkX3ZlcnNpb24nXTsKICAgIGlkZW50aWZpZXJzWydwcm9kdWN0X3V1aWQnXSA9IHJldFsncHJvZHVjdF91dWlkJ107CgogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgIm1vZGVsIG5hbWUiIHwgJyArICJ0ciAnXFxuJyAnOicgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICBpZGVudGlmaWVyc1snY3B1X25hbWUnXSA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKCiAgICAvLyBGZXRjaCBHUFUgaW5mbwogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCJsc3BjaSB8IGdyZXAgJyBWR0EgJyB8IHRyICdcXG4nICdgJyB8IGF3ayAneyBhPXNwbGl0KCQwLGxpbmVzIiArICcsImAiKTsgcHJpbnRmICJbIjsgZm9yKGk9MTtpPGE7KytpKSB7IHNwbGl0KGxpbmVzW2ldLGdwdSwicjogIik7IHByaW50ZiAiJXNcXCIlc1xcIiIsIChpPT0xPyIiOiIsIiksZ3B1WzJdOyB9IHByaW50ZiAiXSI7IH1cJ1xuZXhpdFxuJyk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgdHJ5IHsgaWRlbnRpZmllcnNbJ2dwdV9uYW1lJ10gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfSBjYXRjaCAoeHgpIHsgfQoKICAgIC8vIEZldGNoIFN0b3JhZ2UgSW5mbwogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCJsc2h3IC1jbGFzcyBkaXNrIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICciICsgJ3sgbGVuPXNwbGl0KCQwLGxpbmVzLCIqIik7IHByaW50ZiAiWyI7IGZvcihpPTI7aTw9bGVuOysraSkgeyBtb2RlbD0iIjsgY2FwdGlvbj0iIjsgc2l6ZT0iIjsgY2xlbj1zcGxpdChsaW5lc1tpXSxpdGVtLCJgIik7IGZvcihqPTI7ajxjbGVuOysraikgeyBzcGxpdChpdGVtW2pdLHRva2VucywiOiIpOyBzcGxpdCh0b2tlbnNbMV0sa2V5LCIgIik7IGlmKGtleVsxXT09ImRlc2NyaXB0aW9uIikgeyBjYXB0aW9uPXN1YnN0cih0b2tlbnNbMl0sMik7IH0gaWYoa2V5WzFdPT0icHJvZHVjdCIpIHsgbW9kZWw9c3Vic3RyKHRva2Vuc1syXSwyKTsgfSBpZihrZXlbMV09PSJzaXplIikgeyBzaXplPXN1YnN0cih0b2tlbnNbMl0sMik7ICB9IH0gaWYobW9kZWw9PSIiKSB7IG1vZGVsPWNhcHRpb247IH0gaWYoY2FwdGlvbiE9IiIgfHwgbW9kZWwhPSIiKSB7IHByaW50ZiAiJXN7XFwiQ2FwdGlvblxcIjpcXCIlc1xcIixcXCJNb2RlbFxcIjpcXCIlc1xcIixcXCJTaXplXFwiOlxcIiVzXFwifSIsKGk9PTI/IiI6IiwiKSxjYXB0aW9uLG1vZGVsLHNpemU7IH0gIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICB0cnkgeyBpZGVudGlmaWVyc1snc3RvcmFnZV9kZXZpY2VzJ10gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfSBjYXRjaCAoeHgpIHsgfQoKICAgIHZhbHVlcy5pZGVudGlmaWVycyA9IGlkZW50aWZpZXJzOwogICAgdmFsdWVzLmxpbnV4ID0gcmV0OwogICAgdHJpbUlkZW50aWZpZXJzKHZhbHVlcy5pZGVudGlmaWVycyk7CiAgICByZXR1cm4gKHZhbHVlcyk7Cn0KCmZ1bmN0aW9uIHdpbmRvd3Nfd21pY19yZXN1bHRzKHN0cikKewogICAgdmFyIGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXHJcbicpOwogICAgdmFyIGtleXMgPSBsaW5lc1swXS5zcGxpdCgnLCcpOwogICAgdmFyIGksIGtleSwga2V5dmFsOwogICAgdmFyIHRva2VuczsKICAgIHZhciByZXN1bHQgPSBbXTsKCiAgICBmb3IgKGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcsJyk7CiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBrZXlzLmxlbmd0aDsgKytrZXkpCiAgICAgICAgewogICAgICAgICAgICBpZiAodG9rZW5zW2tleV0udHJpbSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvYmpba2V5c1trZXldLnRyaW0oKV0gPSB0b2tlbnNba2V5XS50cmltKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVsZXRlIG9iai5Ob2RlOwogICAgICAgIHJlc3VsdC5wdXNoKG9iaik7CiAgICB9CiAgICByZXR1cm4gKHJlc3VsdCk7Cn0KCgpmdW5jdGlvbiB3aW5kb3dzX2lkZW50aWZpZXJzKCkKewogICAgdmFyIHJldCA9IHsgd2luZG93czoge319OyB2YWx1ZXMgPSB7fTsgdmFyIGl0ZW1zOyB2YXIgaTsgdmFyIGl0ZW07CiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Jpb3MnLCAnZ2V0JywgJy9WQUxVRSddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7CiAgICBmb3IoaSBpbiBpdGVtcykKICAgIHsKICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICB2YWx1ZXNbaXRlbVswXV0gPSBpdGVtWzFdOwogICAgfQoKICAgIHJldFsnaWRlbnRpZmllcnMnXSA9IHt9OwogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX2RhdGUnXSA9IHZhbHVlc1snUmVsZWFzZURhdGUnXTsKICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZW5kb3InXSA9IHZhbHVlc1snTWFudWZhY3R1cmVyJ107CiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfdmVyc2lvbiddID0gdmFsdWVzWydTTUJJT1NCSU9TVmVyc2lvbiddOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdCQVNFQk9BUkQnLCAnZ2V0JywgJy9WQUxVRSddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7CiAgICBmb3IgKGkgaW4gaXRlbXMpCiAgICB7CiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsKICAgIH0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfbmFtZSddID0gdmFsdWVzWydQcm9kdWN0J107CiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3NlcmlhbCddID0gdmFsdWVzWydTZXJpYWxOdW1iZXInXTsKICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOwogICAgcmV0WydpZGVudGlmaWVycyddWydib2FyZF92ZXJzaW9uJ10gPSB2YWx1ZXNbJ1ZlcnNpb24nXTsKCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQ1NQcm9kdWN0JywgJ2dldCcsICcvVkFMVUUnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOwogICAgZm9yIChpIGluIGl0ZW1zKQogICAgewogICAgICAgIGl0ZW0gPSBpdGVtc1tpXS5zcGxpdCgnPScpOwogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07CiAgICB9CiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ3Byb2R1Y3RfdXVpZCddID0gdmFsdWVzWydVVUlEJ107CiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsKCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnTUVNT1JZQ0hJUCcsICdMSVNUJywgJy9GT1JNQVQ6Q1NWJ10pOwogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC53aW5kb3dzLm1lbW9yeSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdPUycsICdHRVQnLCAnL0ZPUk1BVDpDU1YnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgcmV0LndpbmRvd3Mub3NpbmZvID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cilbMF07CgogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBUlRJVElPTicsICdMSVNUJywgJy9GT1JNQVQ6Q1NWJ10pOwogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC53aW5kb3dzLnBhcnRpdGlvbnMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsKCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQ1BVJywgJ0xJU1QnLCAnQlJJRUYnLCAnL0ZPUk1BVDpDU1YnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgcmV0LndpbmRvd3MuY3B1ID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cik7CgogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBVEgnLCAnV2luMzJfVmlkZW9Db250cm9sbGVyJywgJ0dFVCcsICdOYW1lLEN1cnJlbnRIb3Jpem9udGFsUmVzb2x1dGlvbixDdXJyZW50VmVydGljYWxSZXNvbHV0aW9uJywgJy9GT1JNQVQ6Q1NWJ10pOwogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC53aW5kb3dzLmdwdSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdkaXNrZHJpdmUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICByZXQud2luZG93cy5kcml2ZXMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsKCiAgICAvLyBJbnNlcnQgR1BVIG5hbWVzCiAgICByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUgPSBbXTsKICAgIGZvciAodmFyIGdwdWluZm8gaW4gcmV0LndpbmRvd3MuZ3B1KQogICAgewogICAgICAgIGlmIChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSkgeyByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUucHVzaChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSk7IH0KICAgIH0KCiAgICAvLyBJbnNlcnQgU3RvcmFnZSBEZXZpY2VzCiAgICByZXQuaWRlbnRpZmllcnMuc3RvcmFnZV9kZXZpY2VzID0gW107CiAgICBmb3IgKHZhciBkdiBpbiByZXQud2luZG93cy5kcml2ZXMpCiAgICB7CiAgICAgICAgcmV0LmlkZW50aWZpZXJzLnN0b3JhZ2VfZGV2aWNlcy5wdXNoKHsgQ2FwdGlvbjogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5DYXB0aW9uLCBNb2RlbDogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5Nb2RlbCwgU2l6ZTogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5TaXplIH0pOwogICAgfQoKICAgIHRyeSB7IHJldC5pZGVudGlmaWVycy5jcHVfbmFtZSA9IHJldC53aW5kb3dzLmNwdVswXS5OYW1lOyB9IGNhdGNoICh4KSB7IH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBtYWNvc19pZGVudGlmaWVycygpCnsKICAgIHZhciByZXQgPSB7IGlkZW50aWZpZXJzOiB7fSB9OwogICAgdmFyIGNoaWxkOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgYm9hcmQtaWQgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfbmFtZSA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgSU9QbGF0Zm9ybVNlcmlhbE51bWJlciB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF9zZXJpYWwgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIG1hbnVmYWN0dXJlciB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIHZlcnNpb24gfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfdmVyc2lvbiA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgSU9QbGF0Zm9ybVVVSUQgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICByZXQuaWRlbnRpZmllcnMucHJvZHVjdF91dWlkID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CgogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c2N0bCAtbiBtYWNoZGVwLmNwdS5icmFuZF9zdHJpbmdcbmV4aXRcbicpOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldC5pZGVudGlmaWVycy5jcHVfbmFtZSA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKCiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsKICAgIHJldHVybiAocmV0KTsKfQoKc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCnsKICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IGxpbnV4X2lkZW50aWZpZXJzIH07CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICd3aW4zMic6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiB3aW5kb3dzX2lkZW50aWZpZXJzIH07CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogbWFjb3NfaWRlbnRpZmllcnMgfTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IGdldDogZnVuY3Rpb24gKCkgeyB0aHJvdyAoJ1Vuc3VwcG9ydGVkIFBsYXRmb3JtJyk7IH0gfTsKICAgICAgICBicmVhazsKfQptb2R1bGUuZXhwb3J0cy5pc0RvY2tlciA9IGZ1bmN0aW9uIGlzRG9ja2VyKCkKewogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2xpbnV4JykgeyByZXR1cm4gKGZhbHNlKTsgfQoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9T", 16000); + memcpy_s(_identifiers + 16000, 4772, "dHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9wcm9jL3NlbGYvY2dyb3VwIHwgdHIgJ1xuJyAnYCcgfCBhd2sgLUYnYCcgJ3sgc3BsaXQoJDEsIHJlcywgIiArICciLyIpOyBpZihyZXNbMl09PSJkb2NrZXIiKXtwcmludCAiMSI7fSB9XCdcbmV4aXRcbicpOwogICAgY2hpbGQud2FpdEV4aXQoKTsKICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciAhPSAnJyk7Cn07Cm1vZHVsZS5leHBvcnRzLmlzQmF0dGVyeVBvd2VyZWQgPSBmdW5jdGlvbiBpc0JhdHRlcnlPcGVyYXRlZCgpCnsKICAgIHZhciByZXQgPSBmYWxzZTsKICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgdmFyIGRldmljZXMgPSByZXF1aXJlKCdmcycpLnJlYWRkaXJTeW5jKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseScpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIGRldmljZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvJyArIGRldmljZXNbaV0gKyAnL3R5cGUnKS50b1N0cmluZygpLnRyaW0oKSA9PSAnQmF0dGVyeScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd3aW4zMic6CiAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgICAgICB2YXIgc3RhdHMgPSBHTS5DcmVhdGVWYXJpYWJsZSgxMik7CiAgICAgICAgICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsKICAgICAgICAgICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRTeXN0ZW1Qb3dlclN0YXR1cycpOwogICAgICAgICAgICBpZiAoa2VybmVsMzIuR2V0U3lzdGVtUG93ZXJTdGF0dXMoc3RhdHMpLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihzdGF0cy50b0J1ZmZlcigpWzFdICE9IDEyOCAmJiBzdGF0cy50b0J1ZmZlcigpWzFdICE9IDI1NSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24oYyl7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24oYyl7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwbXNldCAtZyBiYXR0IHwgdHIgJ1xcbicgJ2AnIHwgYXdrIC1GJ2AnICd7IGlmKE5GPjIpIHsgcHJpbnQgXCJ0cnVlXCI7IH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKSB7IHJldCA9IHRydWU7IH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gKHJldCk7Cn07Cm1vZHVsZS5leHBvcnRzLmlzVk0gPSBmdW5jdGlvbiBpc1ZNKCkKewogICAgdmFyIHJldCA9IGZhbHNlOwogICAgdmFyIGlkID0gdGhpcy5nZXQoKTsKICAgIGlmIChpZC5saW51eCAmJiBpZC5saW51eC5zeXNfdmVuZG9yKQogICAgewogICAgICAgIHN3aXRjaCAoaWQubGludXguc3lzX3ZlbmRvcikKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ1ZNd2FyZSwgSW5jLic6CiAgICAgICAgICAgIGNhc2UgJ1FFTVUnOgogICAgICAgICAgICBjYXNlICdYZW4nOgogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJpb3NfdmVuZG9yKQogICAgewogICAgICAgIHN3aXRjaChpZC5pZGVudGlmaWVycy5iaW9zX3ZlbmRvcikKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ1ZNd2FyZSwgSW5jLic6CiAgICAgICAgICAgIGNhc2UgJ1hlbic6CiAgICAgICAgICAgIGNhc2UgJ1NlYUJJT1MnOgogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciAmJiBpZC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgPT0gJ1ZNd2FyZSwgSW5jLicpIHsgcmV0ID0gdHJ1ZTsgfQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX25hbWUpCiAgICB7CiAgICAgICAgc3dpdGNoIChpZC5pZGVudGlmaWVycy5ib2FyZF9uYW1lKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnVmlydHVhbEJveCc6CiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWwgTWFjaGluZSc6CiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyAmJiAhcmV0KQogICAgewogICAgICAgIGZvcih2YXIgaSBpbiBpZC5pZGVudGlmaWVycy5ncHVfbmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGlkLmlkZW50aWZpZXJzLmdwdV9uYW1lW2ldLnN0YXJ0c1dpdGgoJ1ZNd2FyZSAnKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBpZiAoIXJldCkgeyByZXQgPSB0aGlzLmlzRG9ja2VyKCk7IH0KICAgIHJldHVybiAocmV0KTsKfTsKCgovLyBiaW9zX2RhdGUgPSBCSU9TLT5SZWxlYXNlRGF0ZQovLyBiaW9zX3ZlbmRvciA9IEJJT1MtPk1hbnVmYWN0dXJlcgovLyBiaW9zX3ZlcnNpb24gPSBCSU9TLT5TTUJJT1NCSU9TVmVyc2lvbgovLyBib2FyZF9uYW1lID0gQkFTRUJPQVJELT5Qcm9kdWN0ID0gaW9yZWcvYm9hcmQtaWQKLy8gYm9hcmRfc2VyaWFsID0gQkFTRUJPQVJELT5TZXJpYWxOdW1iZXIgPSBpb3JlZy9zZXJpYWwtbnVtYmVyIHwgaW9yZWcvSU9QbGF0Zm9ybVNlcmlhbE51bWJlcgovLyBib2FyZF92ZW5kb3IgPSBCQVNFQk9BUkQtPk1hbnVmYWN0dXJlciA9IGlvcmVnL21hbnVmYWN0dXJlcgovLyBib2FyZF92ZXJzaW9uID0gQkFTRUJPQVJELT5WZXJzaW9uCgo=", 4772); + ILibBase64DecodeEx((unsigned char*)_identifiers, 20772, (unsigned char*)_identifiers + 20772); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "identifiers"); duk_push_string(ctx, _identifiers + 20772); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_identifiers); diff --git a/modules/identifiers.js b/modules/identifiers.js index 4fb0bac..6b9c81a 100644 --- a/modules/identifiers.js +++ b/modules/identifiers.js @@ -296,6 +296,14 @@ module.exports.isBatteryPowered = function isBatteryOperated() } } break; + case 'darwin': + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function(c){ this.str += c.toString(); }); + child.stderr.str = ''; child.stderr.on('data', function(c){ this.str += c.toString(); }); + child.stdin.write("pmset -g batt | tr '\\n' '`' | awk -F'`' '{ if(NF>2) { print \"true\"; }}'\nexit\n"); + child.waitExit(); + if(child.stdout.str.trim() != '') { ret = true; } + break; } return (ret); };