diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index dcacbd9..ef7da1f 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -3770,6 +3770,14 @@ void MeshAgent_AgentMode_Core_ServerTimeout(duk_context *ctx, void ** args, int } } +void MeshAgent_AgentInstallerCTX_Finalizer(duk_context *ctx, void *user) +{ + if (ILibIsChainBeingDestroyed(user) == 0) + { + ILibStopChain(user); + } +} + int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **param, int parseCommands) { int resetNodeId = 0; @@ -3878,7 +3886,7 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** { int bufLen = 0; char *buf; - duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, agentHost->chain, NULL, NULL, agentHost->exePath, NULL, NULL, NULL); + duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, agentHost->chain, NULL, NULL, agentHost->exePath, NULL, MeshAgent_AgentInstallerCTX_Finalizer, agentHost->chain); duk_eval_string(ctxx, "require('user-sessions').isRoot();"); if (!duk_get_boolean(ctxx, -1)) { @@ -3890,19 +3898,22 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** switch (installFlag) { case 1: - - - - - bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0); buf = (char*)ILibMemory_SmartAllocate(bufLen); bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, buf, bufLen); - - - + + duk_eval_string(ctxx, "require('agent-installer');"); + duk_get_prop_string(ctxx, -1, "fullInstall"); + duk_swap_top(ctxx, -2); + duk_push_string(ctxx, buf); + if (duk_pcall_method(ctxx, 1) != 0) + { + printf("%s\n", duk_safe_to_string(ctxx, -1)); + } + duk_pop(ctxx); ILibMemory_Free(buf); + return(1); break; default: break; diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 7efccac..7815a5e 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2208,6 +2208,11 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // default_route: Refer to modules/default_route.js duk_peval_string_noresult(ctx, "addModule('default_route', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gd2luZG93c19kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciByZXQgPSBudWxsOw0KICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgIElQID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0lwaGxwYXBpLmRsbCcpOw0KICAgIElQLkNyZWF0ZU1ldGhvZCgnR2V0SXBGb3J3YXJkVGFibGUnKTsNCg0KICAgIHZhciBzaXplID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgdmFyIHJlc3VsdCA9IElQLkdldElwRm9yd2FyZFRhYmxlKDAsIHNpemUsIDEpOw0KICAgIGlmKHJlc3VsdC5WYWwgPT0gMTIyKQ0KICAgIHsNCiAgICAgICAgdmFyIHRhYmxlID0gR00uQ3JlYXRlVmFyaWFibGUoc2l6ZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCiAgICAgICAgcmVzdWx0ID0gSVAuR2V0SXBGb3J3YXJkVGFibGUodGFibGUsIHNpemUsIDEpOw0KICAgICAgICBpZihyZXN1bHQuVmFsID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGFibGUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICAgICAgICAgIHZhciByb3c7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8ZW50cmllczsrK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcm93ID0gdGFibGUuRGVyZWYoNCArIChpICogNTYpLCA1Nik7DQogICAgICAgICAgICAgICAgaWYgKHJvdy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IFJvdXRlDQogICAgICAgICAgICAgICAgICAgIGlmICghcmV0IHx8IHJldC5tZXRyaWMgPiByb3cuRGVyZWYoMzYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgaW50ZXJmYWNlOiByb3cuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCksIG1ldHJpYzogcm93LkRlcmVmKDM2LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBsaW51eF9kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpcCByb3V0ZSB8IGdyZXAgZGVmYXVsdCB8IGF3ayBcJ3sgaWYoICQxPT0iZGVmYXVsdCIgJiYgJDQ9PSJkZXYiICkgeyBwcmludCAkNTsgfSB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0KZnVuY3Rpb24gYnNkX2RlZmF1bHRSb3V0ZSgpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ25ldHN0YXQgLXJuIC1mIGluZXQgfCBncmVwIGRlZmF1bHQgfCBhd2sgXCd7IHByaW50ICRORiB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0Kc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd3NfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGludXhfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdmcmVlYnNkJzoNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGJzZF9kZWZhdWx0Um91dGU7DQogICAgICAgIGJyZWFrOw0KfQ0KDQo=', 'base64').toString());"); + + // agent-instaler: Refer to modules/agent-installer.js + duk_peval_string_noresult(ctx, "addModule('agent-installer', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLi4uSW5zdGFsbGluZyBzZXJ2aWNlJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgIHRhcmdldDogcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2hBZ2VudCcgOiAnbWVzaGFnZW50JywNCiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgYmFja2dyb3VuZCBzZXJ2aWNlJywNCiAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwNCiAgICAgICAgICAgICAgICBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywNCiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIGNhdGNoKHNpZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXSAnICsgc2llKTsNCiAgICAgICAgcHJvY2Vzcy5leGl0KCk7DQogICAgfQ0KICAgIHZhciBzdmMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJz8nTWVzaCBBZ2VudCc6J21lc2hhZ2VudCcpOw0KDQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdmFyIGxvYyA9IHN2Yy5hcHBMb2NhdGlvbigpOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gV3JpdGluZyBmaXJld2FsbCBydWxlcyBmb3IgTWVzaCBBZ2VudCBTZXJ2aWNlLi4uJyk7DQoNCiAgICAgICAgdmFyIHJ1bGUgPSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IE1hbmFnZW1lbnQgVHJhZmZpYyAoVENQLTEpJywKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2luYm91bmQnLAogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLAogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdUQ1AnLAogICAgICAgICAgICAgICAgUHJvZmlsZTogJ1B1YmxpYywgUHJpdmF0ZSwgRG9tYWluJywKICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMnLAogICAgICAgICAgICAgICAgRWRnZVRyYXZlcnNhbFBvbGljeTogJ2FsbG93JywKICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5hZGRGaXJld2FsbFJ1bGUocnVsZSk7CgogICAgICAgIHJ1bGUgPSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IE1hbmFnZW1lbnQgVHJhZmZpYyAoVENQLTIpJywKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2luYm91bmQnLAogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLAogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdUQ1AnLAogICAgICAgICAgICAgICAgUHJvZmlsZTogJ1B1YmxpYywgUHJpdmF0ZSwgRG9tYWluJywKICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTEsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMnLAogICAgICAgICAgICAgICAgRWRnZVRyYXZlcnNhbFBvbGljeTogJ2FsbG93JywKICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5hZGRGaXJld2FsbFJ1bGUocnVsZSk7IAoKICAgICAgICBydWxlID0KICAgICAgICB7DQogICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0xKScsCiAgICAgICAgICAgIGRpcmVjdGlvbjogJ2luYm91bmQnLAogICAgICAgICAgICBQcm9ncmFtOiBsb2MsCiAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywKICAgICAgICAgICAgUHJvZmlsZTogJ1B1YmxpYywgUHJpdmF0ZSwgRG9tYWluJywKICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MCwKICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLAogICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLAogICAgICAgICAgICBFbmFibGVkOiB0cnVlDQogICAgICAgIH07CiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOwoKICAgICAgICBydWxlID0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBQZWVyLXRvLVBlZXIgVHJhZmZpYyAoVURQLTIpJywKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2luYm91bmQnLAogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLAogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdVRFAnLAogICAgICAgICAgICAgICAgUHJvZmlsZTogJ1B1YmxpYywgUHJpdmF0ZSwgRG9tYWluJywKICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTEsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBQZWVyLXRvLVBlZXIgVHJhZmZpYycsCiAgICAgICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLAogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsKICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5hZGRGaXJld2FsbFJ1bGUocnVsZSk7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOw0KICAgIH0NCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gU3RhcnRpbmcgc2VydmljZS4uLicpOw0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgc3ZjLnN0YXJ0KCk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW09LXVxuJyk7DQogICAgfQ0KICAgIGNhdGNoKGVlKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdXG4nKTsNCiAgICB9DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSB7IHN2Yy5jbG9zZSgpOyB9DQogICAgcHJvY2Vzcy5leGl0KCk7DQp9DQpmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlMihwYXJhbXMpDQp7DQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBwcmV2aW91cyBpbnN0YWxsYXRpb24uLi4nKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCiAgICBpbnN0YWxsU2VydmljZShwYXJhbXMpOw0KfQ0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZShwYXJhbXMpDQp7DQogICAgdmFyIHN2YyA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7DQogICAgaWYgKHN2Yy5pc1J1bm5pbmcoKSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBTdG9wcGluZyBTZXJ2aWNlLi4uJyk7DQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm09PSd3aW4zMicpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN2Yy5zdG9wKCkudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW1NUT1BQRURdXG4nKTsNCiAgICAgICAgICAgICAgICBzdmMuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlMih0aGlzLl9wYXJhbXMpOw0KICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHRoaXMuX3BhcmFtcyk7DQogICAgICAgICAgICB9KS5wYXJlbnRQcm9taXNlLl9wYXJhbXMgPSBwYXJhbXM7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBzdmMuc3RvcCgpOw0KICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSB7IHN2Yy5jbG9zZSgpOyB9DQogICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcyk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gc2VydmljZUV4aXN0cyhsb2MsIHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtGT1VORDogJyArIGxvYyArICddXG4nKTsNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gQ2hlY2tpbmcgZmlyZXdhbGwgcnVsZXMgZm9yIHByZXZpb3VzIGluc3RhbGxhdGlvbi4uLicpOw0KICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5yZW1vdmVGaXJld2FsbFJ1bGUoeyBwcm9ncmFtOiBsb2MgfSkudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBTVUNDRVNTDQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtERUxFVEVEXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZBSUxFRA0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTm8gUnVsZXMgRm91bmRdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOw0KICAgIH0NCn0NCg0KDQoNCmZ1bmN0aW9uIGZ1bGxJbnN0YWxsKGpzb25TdHJpbmcpDQp7DQogICAgY29uc29sZS5zZXREZXN0aW5hdGlvbihjb25zb2xlLkRlc3RpbmF0aW9ucy5ESVNBQkxFRCk7DQogICAgdmFyIHBhcm1zID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4uLkNoZWNraW5nIGZvciBwcmV2aW91cyBpbnN0YWxsYXRpb24nKTsNCiAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2ggQWdlbnQnIDogJ21lc2hhZ2VudCcpOw0KICAgICAgICB2YXIgbG9jID0gcy5hcHBMb2NhdGlvbigpOw0KICAgICAgICBzLmNsb3NlKCk7DQogICAgICAgIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJtcyk7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTk9ORV1cbicpOw0KICAgICAgICBpbnN0YWxsU2VydmljZShwYXJtcyk7DQogICAgfQ0KDQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZnVsbEluc3RhbGw6IGZ1bGxJbnN0YWxsDQogICAgfTs=', 'base64').toString());"); + + } void ILibDuktape_ChainViewer_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)