From 61de975f3a8974dc302dcb3d1c68800d4519073c Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Mon, 28 Jan 2019 15:56:41 -0800 Subject: [PATCH] 1. Unified how JS modules can be integrated, by creating an ILibDuktape_Polyfills_JS_Init() method. 2. Updated behavior so when modules are queried, local filesystem takes precedence on search results 3. Updated 'promise' integration to use the new method above 4. Added 'win-registry' integration on windows, so it can be used by agentcore.c --- microscript/ILibDuktapeModSearch.c | 37 ++-- microscript/ILibDuktape_Polyfills.c | 219 ++-------------------- microscript/ILibDuktape_Polyfills.h | 1 + microscript/ILibDuktape_ScriptContainer.c | 2 + 4 files changed, 37 insertions(+), 222 deletions(-) diff --git a/microscript/ILibDuktapeModSearch.c b/microscript/ILibDuktapeModSearch.c index 8484fa4..cbe677f 100644 --- a/microscript/ILibDuktapeModSearch.c +++ b/microscript/ILibDuktapeModSearch.c @@ -136,7 +136,6 @@ int ILibDuktape_ModSearch_AddModule(duk_context *ctx, char *id, char *module, in } duk_pop(ctx); // ... - //if (ILibHashtable_Get(table, NULL, id, idLen) != NULL || ILibHashtable_Get(table, ILibDuktape_ModSearch_ModuleFile, id, idLen) != NULL) { return 1; } char *newModule = (char*)ILibDuktape_Memory_Alloc(ctx, moduleLen+1); memcpy_s(newModule, moduleLen + 1, module, moduleLen); newModule[moduleLen] = 0; @@ -194,22 +193,10 @@ duk_ret_t mod_Search_Files(duk_context *ctx, char* id) duk_push_lstring(ctx, data, dataLen); free(data); return 1; - //if (duk_peval_string(ctx, data) == 0) - //{ - // duk_put_prop_string(ctx, 3, "exports"); - // return 0; - //} - //else - //{ - // snprintf(fileName, sizeof(fileName), "Module: %s (ERROR)", id); - // duk_push_string(ctx, fileName); - // duk_throw(ctx); - // return DUK_RET_ERROR; - //} } else { - return(ILibDuktape_Error(ctx, "Module: %s (NOT FOUND)", id)); + return(0); } } void ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(duk_context *ctx, char *js, size_t jsLen) @@ -245,7 +232,7 @@ duk_ret_t mod_Search(duk_context *ctx) duk_get_prop_string(ctx, -1, "ModSearchTable"); table = (ILibHashtable)duk_to_pointer(ctx, -1); - // First check if there is a JS override + // First check if there is a JS Object override j = ILibHashtable_Get(table, ILibDuktape_ModSearch_ModuleObject, id, (int)idLen); if (j != NULL) { @@ -253,21 +240,32 @@ duk_ret_t mod_Search(duk_context *ctx) duk_put_prop_string(ctx, 3, "exports"); return(0); } - + + // Check if there is a native handler func = (ILibDuktape_ModSearch_PUSH_Object)ILibHashtable_Get(table, NULL, id, (int)idLen); if (func == NULL) { + // then check the local filesystem, becuase if present, those should take precedence + if(mod_Search_Files(ctx, id) == 1) + { + return(1); + } + + + // Next check if a handler was added via ILibDuktape_ModSearch_AddModule() if ((module = (char*)ILibHashtable_Get(table, ILibDuktape_ModSearch_ModuleFile, id, (int)idLen)) != NULL) { duk_push_string(ctx, module); return(1); } else if (mDS == NULL) - { - return mod_Search_Files(ctx, id); + { + // If No database, then nothing more we can do + return(ILibDuktape_Error(ctx, "Module: %s (NOT FOUND)", id)); } else { + // Next Check the database char key[255]; int keyLen; char *value; @@ -284,7 +282,8 @@ duk_ret_t mod_Search(duk_context *ctx) } else { - return mod_Search_Files(ctx, id); + // Not in database, then nothing more we can do + return(ILibDuktape_Error(ctx, "Module: %s (NOT FOUND)", id)); } } } diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index a4b768f..7d4c05d 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -46,208 +46,6 @@ typedef enum ILibDuktape_Console_DestinationFlags ILibDuktape_Console_DestinationFlags_LogFile = 8 }ILibDuktape_Console_DestinationFlags; - -// refer to ../modules/promise.js for the human readable source -char promise[] = -{ - 0x2F,0x2A,0x0A,0x43,0x6F,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,0x31,0x38,0x20,0x49,0x6E,0x74,0x65,0x6C,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74, - 0x69,0x6F,0x6E,0x0A,0x0A,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x64,0x20,0x75,0x6E,0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x41,0x70,0x61,0x63,0x68,0x65,0x20,0x4C, - 0x69,0x63,0x65,0x6E,0x73,0x65,0x2C,0x20,0x56,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x32,0x2E,0x30,0x20,0x28,0x74,0x68,0x65,0x20,0x22,0x4C,0x69,0x63,0x65,0x6E,0x73, - 0x65,0x22,0x29,0x3B,0x0A,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20,0x74,0x68,0x69,0x73,0x20,0x66,0x69,0x6C,0x65,0x20,0x65, - 0x78,0x63,0x65,0x70,0x74,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x69,0x61,0x6E,0x63,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63, - 0x65,0x6E,0x73,0x65,0x2E,0x0A,0x59,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x6F,0x62,0x74,0x61,0x69,0x6E,0x20,0x61,0x20,0x63,0x6F,0x70,0x79,0x20,0x6F,0x66,0x20,0x74, - 0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x20,0x61,0x74,0x0A,0x0A,0x20,0x20,0x20,0x20,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x61,0x70, - 0x61,0x63,0x68,0x65,0x2E,0x6F,0x72,0x67,0x2F,0x6C,0x69,0x63,0x65,0x6E,0x73,0x65,0x73,0x2F,0x4C,0x49,0x43,0x45,0x4E,0x53,0x45,0x2D,0x32,0x2E,0x30,0x0A,0x0A,0x55, - 0x6E,0x6C,0x65,0x73,0x73,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x70,0x70,0x6C,0x69,0x63,0x61,0x62,0x6C,0x65,0x20,0x6C,0x61,0x77, - 0x20,0x6F,0x72,0x20,0x61,0x67,0x72,0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x69,0x6E,0x20,0x77,0x72,0x69,0x74,0x69,0x6E,0x67,0x2C,0x20,0x73,0x6F,0x66,0x74,0x77,0x61, - 0x72,0x65,0x0A,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x75,0x6E,0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65, - 0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x6F,0x6E,0x20,0x61,0x6E,0x20,0x22,0x41,0x53,0x20,0x49,0x53,0x22,0x20,0x42,0x41, - 0x53,0x49,0x53,0x2C,0x0A,0x57,0x49,0x54,0x48,0x4F,0x55,0x54,0x20,0x57,0x41,0x52,0x52,0x41,0x4E,0x54,0x49,0x45,0x53,0x20,0x4F,0x52,0x20,0x43,0x4F,0x4E,0x44,0x49, - 0x54,0x49,0x4F,0x4E,0x53,0x20,0x4F,0x46,0x20,0x41,0x4E,0x59,0x20,0x4B,0x49,0x4E,0x44,0x2C,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x20,0x65,0x78,0x70,0x72,0x65,0x73, - 0x73,0x20,0x6F,0x72,0x20,0x69,0x6D,0x70,0x6C,0x69,0x65,0x64,0x2E,0x0A,0x53,0x65,0x65,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x20,0x66,0x6F, - 0x72,0x20,0x74,0x68,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x6C,0x61,0x6E,0x67,0x75,0x61,0x67,0x65,0x20,0x67,0x6F,0x76,0x65,0x72,0x6E,0x69,0x6E, - 0x67,0x20,0x70,0x65,0x72,0x6D,0x69,0x73,0x73,0x69,0x6F,0x6E,0x73,0x20,0x61,0x6E,0x64,0x0A,0x6C,0x69,0x6D,0x69,0x74,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x75,0x6E, - 0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x2E,0x0A,0x2A,0x2F,0x0A,0x0A,0x76,0x61,0x72,0x20,0x72,0x65,0x66,0x54,0x61,0x62,0x6C, - 0x65,0x20,0x3D,0x20,0x7B,0x7D,0x3B,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72, - 0x5F,0x68,0x65,0x6C,0x70,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x0A, - 0x7B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x20,0x3D,0x20,0x27,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77, - 0x69,0x74,0x63,0x68,0x65,0x72,0x27,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x66,0x75,0x6E,0x63,0x28,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67, - 0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x61,0x72, - 0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x66,0x75,0x6E,0x63,0x2E,0x74,0x61,0x72,0x67,0x65, - 0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x66,0x75,0x6E,0x63,0x2E,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x29,0x3B,0x0D,0x0A,0x20, - 0x20,0x20,0x20,0x7D,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x20,0x3D,0x20,0x64, - 0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x74,0x61, - 0x72,0x67,0x65,0x74,0x20,0x3D,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x73,0x65, - 0x6C,0x66,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0D,0x0A,0x7D,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69, - 0x74,0x63,0x68,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x0A,0x7B,0x0D, - 0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x6E,0x65,0x77,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x5F, - 0x68,0x65,0x6C,0x70,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x29,0x3B, - 0x0D,0x0A,0x7D,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E, - 0x63,0x29,0x0A,0x7B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x20,0x3D,0x20,0x27,0x70,0x72,0x6F,0x6D,0x69, - 0x73,0x65,0x27,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0A,0x20,0x20, - 0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x3D,0x20,0x7B,0x20,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x3A,0x20, - 0x27,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x27,0x2C,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x3A,0x20,0x74,0x68,0x69, - 0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x3A,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E,0x63,0x2C,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x3A, - 0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x65,0x72,0x72,0x6F,0x72,0x73,0x3A,0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64, - 0x41,0x72,0x67,0x73,0x3A,0x20,0x5B,0x5D,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x27,0x65,0x76,0x65,0x6E,0x74,0x73,0x27, - 0x29,0x2E,0x45,0x76,0x65,0x6E,0x74,0x45,0x6D,0x69,0x74,0x74,0x65,0x72,0x2E,0x63,0x61,0x6C,0x6C,0x28,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, - 0x61,0x6C,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x28,0x27,0x5F,0x65,0x76,0x65, - 0x6E,0x74,0x48,0x6F,0x6F,0x6B,0x27,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x2C,0x20,0x65,0x76, - 0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x63,0x6F,0x6E, - 0x73,0x6F,0x6C,0x65,0x2E,0x6C,0x6F,0x67,0x28,0x27,0x68,0x6F,0x6F,0x6B,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x2C,0x20,0x27,0x65,0x72,0x72, - 0x6F,0x72,0x73,0x2F,0x27,0x20,0x2B,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x2B,0x20,0x27,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65, - 0x64,0x2F,0x27,0x20,0x2B,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, - 0x61,0x72,0x20,0x72,0x20,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E, - 0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x21,0x74,0x68,0x69,0x73,0x2E,0x65,0x72,0x72,0x6F,0x72, - 0x73,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x20,0x3D,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x2E,0x61,0x70,0x70, - 0x6C,0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x21,0x3D,0x6E,0x75,0x6C,0x6C,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65, - 0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x2C,0x20,0x72,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76, - 0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x72, - 0x72,0x6F,0x72,0x73,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x2E,0x61,0x70,0x70,0x6C, - 0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20, - 0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B, - 0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x5B,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20, - 0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x20, - 0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x66,0x61, - 0x6C,0x73,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D, - 0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72, - 0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x20,0x26,0x26, - 0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64, - 0x27,0x29,0x20,0x21,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x2E, - 0x70,0x75,0x73,0x68,0x28,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F, - 0x6C,0x76,0x65,0x64,0x27,0x29,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x74, - 0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x29, - 0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6C,0x73,0x65,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x61,0x20,0x69,0x6E,0x20,0x61,0x72, - 0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64, - 0x41,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29, - 0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x5F,0x72,0x65, - 0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65, - 0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20, - 0x20,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, - 0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x28,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x74, - 0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D, - 0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, - 0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x61,0x20,0x69,0x6E,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0A,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65, - 0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B, - 0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D, - 0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65, - 0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F, - 0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F, - 0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A, - 0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x61,0x74,0x63,0x68,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x28,0x66,0x75,0x6E,0x63,0x29,0x0A, - 0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63, - 0x65,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69, - 0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66, - 0x69,0x6E,0x61,0x6C,0x6C,0x79,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x66,0x75,0x6E,0x63,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x73,0x65,0x74,0x74, - 0x6C,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x29, - 0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x74,0x68,0x65,0x6E,0x20,0x3D,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x2C,0x20,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20, - 0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x29,0x20,0x7B,0x20,0x74,0x68,0x69,0x73,0x2E, - 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74, - 0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B, - 0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x20,0x7B,0x20,0x74,0x68,0x69,0x73,0x2E, - 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74, - 0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B, - 0x20,0x7D,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F, - 0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64, - 0x27,0x2C,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x29,0x3B,0x0A,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x6A,0x65, - 0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, - 0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x70,0x61,0x72,0x65,0x6E,0x74,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x20, - 0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x29,0x3B, - 0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F, - 0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x0A,0x20,0x20,0x20, - 0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x20,0x3D, - 0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x74,0x72,0x79,0x0A,0x20,0x20,0x20,0x20,0x7B, - 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E,0x63,0x2E,0x63,0x61,0x6C,0x6C,0x28,0x74,0x68,0x69,0x73,0x2C,0x20, - 0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69, - 0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x63,0x61,0x74, - 0x63,0x68,0x28,0x65,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, - 0x61,0x6C,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F, - 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20, - 0x3D,0x20,0x5B,0x65,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x65,0x6D, - 0x69,0x74,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E, - 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D, - 0x0A,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x21,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74, - 0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x20,0x53,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x65,0x72,0x65, - 0x6E,0x63,0x65,0x20,0x6F,0x66,0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x62,0x6A,0x65,0x63,0x74,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x66,0x54,0x61, - 0x62,0x6C,0x65,0x5B,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x5F,0x68,0x61,0x73,0x68,0x43,0x6F,0x64,0x65,0x28,0x29,0x5D,0x20, - 0x3D,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F, - 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x28,0x29,0x20,0x7B,0x20,0x72,0x65,0x66,0x54,0x61,0x62,0x6C,0x65,0x5B,0x74,0x68,0x69,0x73,0x2E,0x5F,0x68,0x61,0x73,0x68,0x43,0x6F,0x64,0x65,0x28,0x29, - 0x5D,0x20,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x3B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x7D,0x0A,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x72, - 0x65,0x73,0x6F,0x6C,0x76,0x65,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x28,0x29,0x0A,0x7B,0x0A,0x20,0x20, - 0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20, - 0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29, - 0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E, - 0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, - 0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, - 0x61,0x6C,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x29,0x3B,0x0A, - 0x7D,0x3B,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x6A, - 0x65,0x63,0x74,0x28,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F, - 0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x76, - 0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20, - 0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61, - 0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F, - 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F, - 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74, - 0x56,0x61,0x6C,0x29,0x3B,0x0A,0x7D,0x3B,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x61,0x6C,0x6C,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, - 0x61,0x6C,0x6C,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x0D,0x0A,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74, - 0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x65,0x73,0x2C,0x20,0x72,0x65, - 0x6A,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74, - 0x6F,0x72,0x20,0x3D,0x20,0x72,0x65,0x6A,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76, - 0x65,0x72,0x20,0x3D,0x20,0x72,0x65,0x73,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x70,0x72,0x6F,0x6D,0x69,0x73, - 0x65,0x4C,0x69,0x73,0x74,0x20,0x3D,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68, - 0x69,0x73,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73, - 0x2E,0x5F,0x5F,0x63,0x6F,0x75,0x6E,0x74,0x20,0x3D,0x20,0x30,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x29,0x3B,0x0D,0x0A,0x0D,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F, - 0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D, - 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x5B,0x69,0x5D,0x2E,0x74,0x68,0x65,0x6E,0x28,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x2F,0x2F,0x20,0x53,0x75,0x63,0x63,0x65,0x73,0x73,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x2B,0x2B,0x72,0x65, - 0x74,0x2E,0x5F,0x5F,0x63,0x6F,0x75,0x6E,0x74,0x20,0x3D,0x3D,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x2E,0x6C, - 0x65,0x6E,0x67,0x74,0x68,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x72,0x65,0x74,0x2E,0x5F,0x5F, - 0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x61,0x72,0x67,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x20,0x46,0x61,0x69,0x6C,0x75,0x72,0x65,0x0D,0x0A,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x21,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F, - 0x6E,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E, - 0x5F,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x28,0x61,0x72,0x67,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0D, - 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x72,0x6F, - 0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x2E,0x6C,0x65,0x6E,0x67,0x74,0x68,0x20,0x3D,0x3D,0x20,0x30,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74, - 0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x29,0x3B,0x0D,0x0A,0x7D,0x3B, - 0x0A,0x0A,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x2E,0x65,0x78,0x70,0x6F,0x72,0x74,0x73,0x20,0x3D,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x3B }; - - int g_displayStreamPipeMessages = 0; int g_displayFinalizerMessages = 0; @@ -1997,6 +1795,21 @@ void ILibDuktape_dataGenerator_Push(duk_context *ctx, void *chain) } #endif +void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) +{ + // The following can be overriden by calling addModule() or by having a .js file in the module path + + // Promise: This is very important, as it is used everywhere. Refer to /modules folder to see a human readable version of promise.js + duk_peval_string_noresult(ctx, "addModule('promise', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciByZWZUYWJsZSA9IHt9OwoKZnVuY3Rpb24gZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ2V2ZW50X3N3aXRjaGVyJzsKICAgIHRoaXMuZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKQogICAgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yKHZhciBpIGluIGFyZ3VtZW50cykKICAgICAgICB7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGZ1bmMudGFyZ2V0LmFwcGx5KGZ1bmMuZGVzaXJlZCwgYXJncykpOwogICAgfTsKICAgIHRoaXMuZnVuYy5kZXNpcmVkID0gZGVzaXJlZF9jYWxsZWU7CiAgICB0aGlzLmZ1bmMudGFyZ2V0ID0gdGFyZ2V0OwogICAgdGhpcy5mdW5jLnNlbGYgPSB0aGlzOwp9CmZ1bmN0aW9uIGV2ZW50X3N3aXRjaGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHJldHVybiAobmV3IGV2ZW50X3N3aXRjaGVyX2hlbHBlcihkZXNpcmVkX2NhbGxlZSwgdGFyZ2V0KSk7Cn0KCmZ1bmN0aW9uIFByb21pc2UocHJvbWlzZUZ1bmMpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3Byb21pc2UnOwogICAgdGhpcy5wcm9taXNlID0gdGhpczsKICAgIHRoaXMuX2ludGVybmFsID0geyBfT2JqZWN0SUQ6ICdwcm9taXNlLmludGVybmFsJywgcHJvbWlzZTogdGhpcywgZnVuYzogcHJvbWlzZUZ1bmMsIGNvbXBsZXRlZDogZmFsc2UsIGVycm9yczogZmFsc2UsIGNvbXBsZXRlZEFyZ3M6IFtdIH07CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLl9pbnRlcm5hbCk7CiAgICB0aGlzLl9pbnRlcm5hbC5vbignX2V2ZW50SG9vaycsIGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spCiAgICB7CiAgICAgICAgLy9jb25zb2xlLmxvZygnaG9vaycsIGV2ZW50TmFtZSwgJ2Vycm9ycy8nICsgdGhpcy5lcnJvcnMgKyAnIGNvbXBsZXRlZC8nICsgdGhpcy5jb21wbGV0ZWQpOwogICAgICAgIHZhciByID0gbnVsbDsKCiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PSAncmVzb2x2ZWQnICYmICF0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHIgPSBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgICAgIGlmKHIhPW51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnLCByKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnROYW1lID09ICdyZWplY3RlZCcgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5jb21wbGV0ZWQpCiAgICAgICAgewogICAgICAgICAgICBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3NldHRsZWQnICYmIHRoaXMuY29tcGxldGVkKQogICAgICAgIHsKICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh0aGlzLCBbXSk7CiAgICAgICAgfQogICAgfSk7CiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlciA9IGZ1bmN0aW9uIF9yZXNvbHZlcigpCiAgICB7CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVycm9ycyA9IGZhbHNlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3Jlc29sdmVkJ107CiAgICAgICAgaWYgKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSAmJiB0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzLnB1c2godGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcpKTsKICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGEgaW4gYXJndW1lbnRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2FdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuZW1pdC5hcHBseShfcmVzb2x2ZXIuX3NlbGYsIGFyZ3MpOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5lbWl0KCdzZXR0bGVkJyk7CiAgICB9OwogICAgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IgPSBmdW5jdGlvbiBfcmVqZWN0b3IoKQogICAgewogICAgICAgIF9yZWplY3Rvci5fc2VsZi5lcnJvcnMgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3JlamVjdGVkJ107CiAgICAgICAgZm9yICh2YXIgYSBpbiBhcmd1bWVudHMpCiAgICAgICAgewogICAgICAgICAgICBfcmVqZWN0b3IuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbYV0pOwogICAgICAgIH0KCiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmVtaXQuYXBwbHkoX3JlamVjdG9yLl9zZWxmLCBhcmdzKTsKICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdCgnc2V0dGxlZCcpOwogICAgfTsKICAgIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbihmdW5jKQogICAgewogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9CiAgICB0aGlzLmZpbmFsbHkgPSBmdW5jdGlvbiAoZnVuYykKICAgIHsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdzZXR0bGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9OwogICAgdGhpcy50aGVuID0gZnVuY3Rpb24gKHJlc29sdmVkLCByZWplY3RlZCkKICAgIHsKICAgICAgICBpZiAocmVzb2x2ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVzb2x2ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZXNvbHZlZCkuZnVuYyk7IH0KICAgICAgICBpZiAocmVqZWN0ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZWplY3RlZCkuZnVuYyk7IH0KCiAgICAgICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOwogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3Jlc29sdmVkJywgcmV0VmFsLl9pbnRlcm5hbC5yZXNvbHZlcik7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCByZXRWYWwuX2ludGVybmFsLnJlamVjdG9yKTsKICAgICAgICByZXRWYWwucGFyZW50UHJvbWlzZSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKCiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlci5fc2VsZiA9IHRoaXMuX2ludGVybmFsOwogICAgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IuX3NlbGYgPSB0aGlzLl9pbnRlcm5hbDs7CgogICAgdHJ5CiAgICB7CiAgICAgICAgcHJvbWlzZUZ1bmMuY2FsbCh0aGlzLCB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlciwgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IpOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5lcnJvcnMgPSB0cnVlOwogICAgICAgIHRoaXMuX2ludGVybmFsLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5faW50ZXJuYWwuY29tcGxldGVkQXJncyA9IFtlXTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5lbWl0KCdyZWplY3RlZCcsIGUpOwogICAgICAgIHRoaXMuX2ludGVybmFsLmVtaXQoJ3NldHRsZWQnKTsKICAgIH0KCiAgICBpZighdGhpcy5faW50ZXJuYWwuY29tcGxldGVkKQogICAgewogICAgICAgIC8vIFNhdmUgcmVmZXJlbmNlIG9mIHRoaXMgb2JqZWN0CiAgICAgICAgcmVmVGFibGVbdGhpcy5faW50ZXJuYWwuX2hhc2hDb2RlKCldID0gdGhpcy5faW50ZXJuYWw7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgnc2V0dGxlZCcsIGZ1bmN0aW9uICgpIHsgcmVmVGFibGVbdGhpcy5faGFzaENvZGUoKV0gPSBudWxsOyB9KTsKICAgIH0KfQoKUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZSgpCnsKICAgIHZhciByZXRWYWwgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgaikgeyB9KTsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBpIGluIGFyZ3VtZW50cykKICAgIHsKICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldFZhbC5faW50ZXJuYWwucmVzb2x2ZXIuYXBwbHkocmV0VmFsLl9pbnRlcm5hbCwgYXJncyk7CiAgICByZXR1cm4gKHJldFZhbCk7Cn07ClByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gcmVqZWN0KCkgewogICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOwogICAgdmFyIGFyZ3MgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gYXJndW1lbnRzKSB7CiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICByZXRWYWwuX2ludGVybmFsLnJlamVjdG9yLmFwcGx5KHJldFZhbC5faW50ZXJuYWwsIGFyZ3MpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9OwpQcm9taXNlLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlTGlzdCkKewogICAgdmFyIHJldCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikKICAgIHsKICAgICAgICB0aGlzLl9fcmVqZWN0b3IgPSByZWo7CiAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOwogICAgICAgIHRoaXMuX19wcm9taXNlTGlzdCA9IHByb21pc2VMaXN0OwogICAgICAgIHRoaXMuX19kb25lID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2NvdW50ID0gMDsKICAgIH0pOwoKICAgIGZvciAodmFyIGkgaW4gcHJvbWlzZUxpc3QpCiAgICB7CiAgICAgICAgcHJvbWlzZUxpc3RbaV0udGhlbihmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU3VjY2VzcwogICAgICAgICAgICBpZigrK3JldC5fX2NvdW50ID09IHJldC5fX3Byb21pc2VMaXN0Lmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0Ll9fZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXQuX19yZXNvbHZlcihyZXQuX19wcm9taXNlTGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKQogICAgICAgIHsKICAgICAgICAgICAgLy8gRmFpbHVyZQogICAgICAgICAgICBpZighcmV0Ll9fZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0Ll9fZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXQuX19yZWplY3RvcihhcmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBpZiAocHJvbWlzZUxpc3QubGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgcmV0Ll9fcmVzb2x2ZXIocHJvbWlzZUxpc3QpOwogICAgfQogICAgcmV0dXJuIChyZXQpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlOw==', 'base64').toString());"); + +#ifdef WIN32 + // Adding win-registry, since it is very useful for windows... Refer to /modules folder to see a human readable version of win-registry.js + duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4QScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4QScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlQScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4QScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5QScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4QScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleUEnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlQScpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeEEnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSk7IH0KICAgICAgICBpZiAoIXBhdGgpIHsgcGF0aCA9ICcnOyB9CgoKICAgICAgICBpZiAoKGVyciA9IHRoaXMuX0FkdkFwaS5SZWdPcGVuS2V5RXhBKEhLLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgpLCAwLCBLRVlfUVVFUllfVkFMVUUgfCBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTLCBoKS5WYWwpICE9IDApCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyAoJ09wZW5pbmcgUmVnaXN0cnkgS2V5OiAnICsgcGF0aCArICcgPT4gUmV0dXJuZWQgRXJyb3I6ICcgKyBlcnIpOwogICAgICAgIH0KICAKICAgICAgICBpZiAoKHBhdGggPT0gJycgJiYgIWtleSkgfHwgIWtleSkKICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmVzdWx0ID0geyBzdWJrZXlzOiBbXSwgdmFsdWVzOiBbXSB9Ow0KDQogICAgICAgICAgICAvLyBFbnVtZXJhdGUgIGtleXMNCiAgICAgICAgICAgIHZhciBhY2hDbGFzcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoMTAyNCk7DQogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBhY2hWYWx1ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoMzI3NjgpOw0KICAgICAgICAgICAgdmFyIGFjaFZhbHVlU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyANCiAgICAgICAgICAgIHZhciBhY2hDbGFzc1NpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyBhY2hDbGFzc1NpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEwMjQpOw0KICAgICAgICAgICAgdmFyIG51bVN1YktleXMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICB2YXIgbG9uZ2VzdFN1YmtleVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIGxvbmdlc3RDbGFzc1N0cmluZyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlRGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICB2YXIgc2VjdXJpdHlEZXNjcmlwdG9yID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsNCg0KICAgICAgICAgICAgcmV0VmFsID0gdGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5SW5mb0tleUEoaC5EZXJlZigpLCBhY2hDbGFzcywgYWNoQ2xhc3NTaXplLCAwLA0KICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywNCiAgICAgICAgICAgICAgICBsb25nZXN0VmFsdWVOYW1lLCBsb25nZXN0VmFsdWVEYXRhLCBzZWN1cml0eURlc2NyaXB0b3IsIGxhc3RXcml0ZVRpbWUpOw0KICAgICAgICAgICAgaWYgKHJldFZhbC5WYWwgIT0gMCkgeyB0aHJvdyAoJ1JlZ1F1ZXJ5SW5mb0tleUEoKSByZXR1cm5lZCBlcnJvcjogJyArIHJldFZhbC5WYWwpOyB9DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbmFtZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEwMjQpOw0KICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhBKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7DQogICAgICAgICAgICAgICAgaWYocmV0VmFsLlZhbCA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuU3RyaW5nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFjaFZhbHVlU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzI3NjgpOw0KICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVBKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWVzLnB1c2goYWNoVmFsdWUuU3RyaW5nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7DQogICAgICAgIH0KCiAgICAgICAgaWYodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeEEoaC5EZXJlZigpLCBrZXksIDAsIDAsIDAsIGxlbikuVmFsID09IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeEEoaC5EZXJlZigpLCBrZXksIDAsIHZhbFR5cGUsIGRhdGEsIGxlbikuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCh2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS5TdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZX0RBVEFfVFlQRVMuUkVHX0JJTkFSWToKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBkYXRhLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX0FkdkFwaS5SZWdDbG9zZUtleShoLkRlcmVmKCkpOwogICAgICAgICAgICB0aHJvdyAoJ05vdCBGb3VuZCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICB9OwogICAgdGhpcy5Xcml0ZUtleSA9IGZ1bmN0aW9uIFdyaXRlS2V5KGhrZXksIHBhdGgsIGtleSwgdmFsdWUpCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ0NyZWF0ZUtleUV4QSh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCksIDAsIDAsIDAsIEtFWV9XUklURSwgMCwgaCwgMCkuVmFsICE9IDApCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIE9wZW5pbmcgUmVnaXN0cnkgS2V5OiAnICsgcGF0aCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZGF0YTsKICAgICAgICB2YXIgZGF0YVR5cGU7CgogICAgICAgIHN3aXRjaCh0eXBlb2YodmFsdWUpKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19EV09SRDsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICAgICAgZGF0YS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodmFsdWUgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX1NaOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUodmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZih0aGlzLl9BZHZBcGkuUmVnU2V0VmFsdWVFeEEoaC5EZXJlZigpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSksIDAsIGRhdGFUeXBlLCBkYXRhLCBkYXRhLl9zaXplKS5WYWwgIT0gMCkKICAgICAgICB7ICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3Igd3JpdGluZyByZWcga2V5OiAnICsga2V5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICB9OwogICAgdGhpcy5EZWxldGVLZXkgPSBmdW5jdGlvbiBEZWxldGVLZXkoaGtleSwgcGF0aCwga2V5KQogICAgewogICAgICAgIGlmKCFrZXkpCiAgICAgICAgewogICAgICAgICAgICBpZih0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5QSh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCkpLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIERlbGV0aW5nIEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4QSh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9XUklURSwgaCkuVmFsICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHRoaXMuX0FkdkFwaS5SZWdEZWxldGVWYWx1ZUEoaC5EZXJlZigpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyB3aW5kb3dzX3JlZ2lzdHJ5KCk7Cgo=', 'base64').toString());"); +#endif + +} + + void ILibDuktape_Polyfills_Init(duk_context *ctx) { ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push); @@ -2005,7 +1818,7 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) #ifndef MICROSTACK_NOTLS ILibDuktape_ModSearch_AddHandler(ctx, "pkcs7", ILibDuktape_PKCS7_Push); #endif - ILibDuktape_ModSearch_AddModule(ctx, "promise", promise, sizeof(promise) - 1); + #ifndef MICROSTACK_NOTLS ILibDuktape_ModSearch_AddHandler(ctx, "bignum", ILibDuktape_bignum_Push); ILibDuktape_ModSearch_AddHandler(ctx, "dataGenerator", ILibDuktape_dataGenerator_Push); diff --git a/microscript/ILibDuktape_Polyfills.h b/microscript/ILibDuktape_Polyfills.h index 6782b52..0dff2de 100644 --- a/microscript/ILibDuktape_Polyfills.h +++ b/microscript/ILibDuktape_Polyfills.h @@ -22,5 +22,6 @@ limitations under the License. extern int g_displayStreamPipeMessages; extern int g_displayFinalizerMessages; void ILibDuktape_Polyfills_Init(duk_context *ctx); +void ILibDuktape_Polyfills_JS_Init(duk_context *ctx); #endif diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index ec4aeae..9a81586 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -1885,6 +1885,8 @@ duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx3(duk_conte ILibLifeTime_Add(ILibGetBaseTimer(Duktape_GetChain(ctx)), timeoutKey, executionTimeout, ILibDuktape_ScriptContainer_ExecTimeout, NULL); } + ILibDuktape_Polyfills_JS_Init(ctx); + return ctx; }