11b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Modified embenchen to direct to asm-wasm.
21b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Flags: --expose-wasm
31b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar EXPECTED_OUTPUT =
51b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '123456789\n' +
61b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '213456789\n' +
71b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '231456789\n' +
81b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '321456789\n' +
91b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '312456789\n' +
101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '132456789\n' +
111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '234156789\n' +
121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '324156789\n' +
131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '342156789\n' +
141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '432156789\n' +
151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '423156789\n' +
161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '243156789\n' +
171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '341256789\n' +
181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '431256789\n' +
191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '413256789\n' +
201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '143256789\n' +
211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '134256789\n' +
221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '314256789\n' +
231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '412356789\n' +
241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '142356789\n' +
251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '124356789\n' +
261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '214356789\n' +
271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '241356789\n' +
281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '421356789\n' +
291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '234516789\n' +
301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '324516789\n' +
311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '342516789\n' +
321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '432516789\n' +
331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '423516789\n' +
341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  '243516789\n' +
351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  'Pfannkuchen(9) = 30.\n';
361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Module = {
371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  arguments: [1],
381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  print: function(x) {Module.printBuffer += x + '\n';},
391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  preRun: [function() {Module.printBuffer = ''}],
401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  postRun: [function() {
411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    assertEquals(EXPECTED_OUTPUT, Module.printBuffer);
421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }],
431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch};
441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// The Module object: Our interface to the outside world. We import
451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// and export values on it, and do the work to get that through
461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// closure compiler if necessary. There are various ways Module can be used:
471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 1. Not defined. We create it here
481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 2. A function parameter, function(Module) { ..generated code.. }
491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 3. pre-run appended it, var Module = {}; ..generated code..
501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 4. External script tag defines var Module.
511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// We need to do an eval in order to handle the closure compiler
521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// case, where this code here is minified but Module was defined
531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// elsewhere (e.g. case 4 above). We also need to check if Module
541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// already exists (e.g. case 3 above).
551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that if you want to run closure, and also to use Module
561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// after the generated code, you will need to define   var Module = {};
571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// before the code. Then that object will be used in the code, and you
581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// can continue to use Module afterwards as well.
591b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Module;
601b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};
611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Sometimes an existing Module object exists with properties
631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// meant to overwrite the default module functionality. Here
641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// we collect those properties and reapply _after_ we configure
651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// the current environment's defaults to avoid having to be so
661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// defensive during initialization.
671b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar moduleOverrides = {};
681b268ca467c924004286c97bac133db489cf43d0Ben Murdochfor (var key in Module) {
691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module.hasOwnProperty(key)) {
701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    moduleOverrides[key] = Module[key];
711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// The environment setup code below is customized to use Module.
751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// *** Environment setup code ***
761b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
771b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_WEB = typeof window === 'object';
781b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
791b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
811b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (ENVIRONMENT_IS_NODE) {
821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Expose functionality in the same simple way that the shells work
831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Note that we pollute the global namespace here, otherwise we break in node
841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!Module['print']) Module['print'] = function print(x) {
851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    process['stdout'].write(x + '\n');
861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!Module['printErr']) Module['printErr'] = function printErr(x) {
881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    process['stderr'].write(x + '\n');
891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var nodeFS = require('fs');
921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var nodePath = require('path');
931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['read'] = function read(filename, binary) {
951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    filename = nodePath['normalize'](filename);
961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var ret = nodeFS['readFileSync'](filename);
971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // The path is absolute if the normalized version is the same as the resolved.
981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!ret && filename != nodePath['resolve'](filename)) {
991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      filename = path.join(__dirname, '..', 'src', filename);
1001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ret = nodeFS['readFileSync'](filename);
1011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
1021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (ret && !binary) ret = ret.toString();
1031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ret;
1041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
1051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };
1071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['load'] = function load(f) {
1091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    globalEval(read(f));
1101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
1111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['arguments'] = process['argv'].slice(2);
1131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  module['exports'] = Module;
1151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1161b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse if (ENVIRONMENT_IS_SHELL) {
1171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!Module['print']) Module['print'] = print;
1181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
1191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof read != 'undefined') {
1211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['read'] = read;
1221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
1231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['read'] = function read() { throw 'no read() available (jsc?)' };
1241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
1251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['readBinary'] = function readBinary(f) {
1271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return read(f, 'binary');
1281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
1291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof scriptArgs != 'undefined') {
1311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['arguments'] = scriptArgs;
1321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else if (typeof arguments != 'undefined') {
1331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['arguments'] = arguments;
1341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
1351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  this['Module'] = Module;
1371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)
1391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1401b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
1411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['read'] = function read(url) {
1421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var xhr = new XMLHttpRequest();
1431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    xhr.open('GET', url, false);
1441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    xhr.send(null);
1451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return xhr.responseText;
1461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
1471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof arguments != 'undefined') {
1491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['arguments'] = arguments;
1501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
1511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof console !== 'undefined') {
1531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Module['print']) Module['print'] = function print(x) {
1541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      console.log(x);
1551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    };
1561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Module['printErr']) Module['printErr'] = function printErr(x) {
1571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      console.log(x);
1581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    };
1591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
1601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // Probably a worker, and without console.log. We can do very little here...
1611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var TRY_USE_DUMP = false;
1621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
1631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      dump(x);
1641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }) : (function(x) {
1651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // self.postMessage(x); // enable this if you want stdout to be sent as messages
1661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }));
1671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
1681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (ENVIRONMENT_IS_WEB) {
1701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    window['Module'] = Module;
1711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
1721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['load'] = importScripts;
1731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
1741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1751b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse {
1761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Unreachable because SHELL is dependant on the others
1771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  throw 'Unknown runtime environment. Where are we?';
1781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1801b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction globalEval(x) {
1811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  eval.call(null, x);
1821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1831b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['load'] == 'undefined' && Module['read']) {
1841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['load'] = function load(f) {
1851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    globalEval(Module['read'](f));
1861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
1871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1881b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['print']) {
1891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['print'] = function(){};
1901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1911b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['printErr']) {
1921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['printErr'] = Module['print'];
1931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1941b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['arguments']) {
1951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module['arguments'] = [];
1961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
1971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// *** Environment setup code ***
1981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
1991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Closure helpers
2001b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule.print = Module['print'];
2011b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule.printErr = Module['printErr'];
2021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Callbacks
2041b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['preRun'] = [];
2051b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['postRun'] = [];
2061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Merge back in the overrides
2081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfor (var key in moduleOverrides) {
2091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (moduleOverrides.hasOwnProperty(key)) {
2101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module[key] = moduleOverrides[key];
2111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
2121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
2131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Auto-generated preamble library stuff ===
2171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//========================================
2191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Runtime code shared with compiler
2201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//========================================
2211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2221b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Runtime = {
2231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  stackSave: function () {
2241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return STACKTOP;
2251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  stackRestore: function (stackTop) {
2271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = stackTop;
2281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  forceAlign: function (target, quantum) {
2301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    quantum = quantum || 4;
2311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (quantum == 1) return target;
2321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (isNumber(target) && isNumber(quantum)) {
2331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return Math.ceil(target/quantum)*quantum;
2341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
2351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
2361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
2371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
2381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  isNumberType: function (type) {
2401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
2411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  isPointerType: function isPointerType(type) {
2431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return type[type.length-1] == '*';
2441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch},
2451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  isStructType: function isStructType(type) {
2461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (isPointerType(type)) return false;
2471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (isArrayType(type)) return true;
2481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
2491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // See comment in isStructPointerType()
2501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return type[0] == '%';
2511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch},
2521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
2531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  FLOAT_TYPES: {"float":0,"double":0},
2541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  or64: function (x, y) {
2551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var l = (x | 0) | (y | 0);
2561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
2571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return l + h;
2581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  and64: function (x, y) {
2601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var l = (x | 0) & (y | 0);
2611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
2621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return l + h;
2631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  xor64: function (x, y) {
2651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var l = (x | 0) ^ (y | 0);
2661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
2671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return l + h;
2681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getNativeTypeSize: function (type) {
2701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    switch (type) {
2711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i1': case 'i8': return 1;
2721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i16': return 2;
2731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i32': return 4;
2741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i64': return 8;
2751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'float': return 4;
2761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'double': return 8;
2771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      default: {
2781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (type[type.length-1] === '*') {
2791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return Runtime.QUANTUM_SIZE; // A pointer
2801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (type[0] === 'i') {
2811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var bits = parseInt(type.substr(1));
2821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          assert(bits % 8 === 0);
2831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return bits/8;
2841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
2851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 0;
2861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
2871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
2881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
2891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getNativeFieldSize: function (type) {
2911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
2921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
2931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  dedup: function dedup(items, ident) {
2941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var seen = {};
2951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (ident) {
2961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return items.filter(function(item) {
2971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (seen[item[ident]]) return false;
2981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      seen[item[ident]] = true;
2991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return true;
3001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    });
3011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
3021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return items.filter(function(item) {
3031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (seen[item]) return false;
3041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      seen[item] = true;
3051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return true;
3061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    });
3071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
3081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch},
3091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  set: function set() {
3101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
3111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret = {};
3121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (var i = 0; i < args.length; i++) {
3131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret[args[i]] = 0;
3141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
3151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret;
3161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch},
3171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACK_ALIGN: 8,
3181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getAlignSize: function (type, size, vararg) {
3191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // we align i64s and doubles on 64-bit boundaries, unlike x86
3201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!vararg && (type == 'i64' || type == 'double')) return 8;
3211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!type) return Math.min(size, 8); // align structures internally to 64 bits
3221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
3231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
3241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  calculateStructAlignment: function calculateStructAlignment(type) {
3251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type.flatSize = 0;
3261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type.alignSize = 0;
3271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var diffs = [];
3281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var prev = -1;
3291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var index = 0;
3301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type.flatIndexes = type.fields.map(function(field) {
3311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      index++;
3321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var size, alignSize;
3331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
3341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
3351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        alignSize = Runtime.getAlignSize(field, size);
3361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else if (Runtime.isStructType(field)) {
3371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (field[1] === '0') {
3381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // this is [0 x something]. When inside another structure like here, it must be at the end,
3391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // and it adds no size
3401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
3411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          size = 0;
3421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Types.types[field]) {
3431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
3441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
3451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            alignSize = type.alignSize || QUANTUM_SIZE;
3461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
3471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
3481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          size = Types.types[field].flatSize;
3491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
3501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
3511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else if (field[0] == 'b') {
3521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // bN, large number field, like a [N x i8]
3531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        size = field.substr(1)|0;
3541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        alignSize = 1;
3551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else if (field[0] === '<') {
3561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // vector type
3571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        size = alignSize = Types.types[field].flatSize; // fully aligned
3581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else if (field[0] === 'i') {
3591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // illegal integer field, that could not be legalized because it is an internal structure field
3601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
3611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        size = alignSize = parseInt(field.substr(1))/8;
3621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
3631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
3641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(false, 'invalid type for calculateStructAlignment');
3651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
3661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (type.packed) alignSize = 1;
3671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type.alignSize = Math.max(type.alignSize, alignSize);
3681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
3691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type.flatSize = curr + size;
3701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (prev >= 0) {
3711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        diffs.push(curr-prev);
3721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
3731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      prev = curr;
3741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return curr;
3751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    });
3761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type.name_ && type.name_[0] === '[') {
3771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
3781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // allocating a potentially huge array for [999999 x i8] etc.
3791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
3801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
3811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
3821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (diffs.length == 0) {
3831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type.flatFactor = type.flatSize;
3841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else if (Runtime.dedup(diffs).length == 1) {
3851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type.flatFactor = diffs[0];
3861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
3871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type.needsFlattening = (type.flatFactor != 1);
3881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return type.flatIndexes;
3891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
3901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  generateStructInfo: function (struct, typeName, offset) {
3911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var type, alignment;
3921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeName) {
3931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      offset = offset || 0;
3941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
3951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!type) return null;
3961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (type.fields.length != struct.length) {
3971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
3981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return null;
3991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
4001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      alignment = type.flatIndexes;
4011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
4021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var type = { fields: struct.map(function(item) { return item[0] }) };
4031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      alignment = Runtime.calculateStructAlignment(type);
4041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var ret = {
4061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      __size__: type.flatSize
4071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    };
4081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeName) {
4091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      struct.forEach(function(item, i) {
4101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof item === 'string') {
4111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret[item] = alignment[i] + offset;
4121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
4131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // embedded struct
4141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var key;
4151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var k in item) key = k;
4161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
4171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
4181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      });
4191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
4201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      struct.forEach(function(item, i) {
4211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ret[item[1]] = alignment[i];
4221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      });
4231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ret;
4251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  dynCall: function (sig, ptr, args) {
4271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (args && args.length) {
4281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!args.splice) args = Array.prototype.slice.call(args);
4291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      args.splice(0, 0, ptr);
4301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return Module['dynCall_' + sig].apply(null, args);
4311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
4321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return Module['dynCall_' + sig].call(null, ptr);
4331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  functionPointers: [],
4361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  addFunction: function (func) {
4371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    for (var i = 0; i < Runtime.functionPointers.length; i++) {
4381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!Runtime.functionPointers[i]) {
4391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Runtime.functionPointers[i] = func;
4401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 2*(1 + i);
4411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
4421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
4441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  removeFunction: function (index) {
4461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Runtime.functionPointers[(index-2)/2] = null;
4471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getAsmConst: function (code, numArgs) {
4491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // code is a constant string on the heap, so we can cache these
4501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
4511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var func = Runtime.asmConstCache[code];
4521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func) return func;
4531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var args = [];
4541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    for (var i = 0; i < numArgs; i++) {
4551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      args.push(String.fromCharCode(36) + i); // $0, $1 etc
4561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var source = Pointer_stringify(code);
4581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (source[0] === '"') {
4591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
4601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (source.indexOf('"', 1) === source.length-1) {
4611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        source = source.substr(1, source.length-2);
4621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
4631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // something invalid happened, e.g. EM_ASM("..code($0)..", input)
4641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
4651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
4661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    try {
4681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })'); // new Function does not allow upvars in node
4691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } catch(e) {
4701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module.printErr('error in executing inline EM_ASM code: ' + e + ' on: \n\n' + source + '\n\nwith args |' + args + '| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)');
4711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      throw e;
4721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return Runtime.asmConstCache[code] = evalled;
4741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  warnOnce: function (text) {
4761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
4771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Runtime.warnOnce.shown[text]) {
4781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Runtime.warnOnce.shown[text] = 1;
4791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module.printErr(text);
4801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  funcWrappers: {},
4831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getFuncWrapper: function (func, sig) {
4841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    assert(sig);
4851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Runtime.funcWrappers[func]) {
4861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Runtime.funcWrappers[func] = function dynCall_wrapper() {
4871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return Runtime.dynCall(sig, func, arguments);
4881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      };
4891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
4901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return Runtime.funcWrappers[func];
4911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
4921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  UTF8Processor: function () {
4931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var buffer = [];
4941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var needed = 0;
4951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    this.processCChar = function (code) {
4961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      code = code & 0xFF;
4971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
4981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (buffer.length == 0) {
4991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((code & 0x80) == 0x00) {        // 0xxxxxxx
5001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return String.fromCharCode(code);
5011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
5021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        buffer.push(code);
5031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((code & 0xE0) == 0xC0) {        // 110xxxxx
5041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          needed = 1;
5051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
5061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          needed = 2;
5071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {                            // 11110xxx
5081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          needed = 3;
5091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
5101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return '';
5111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
5121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (needed) {
5141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        buffer.push(code);
5151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        needed--;
5161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (needed > 0) return '';
5171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
5181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var c1 = buffer[0];
5201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var c2 = buffer[1];
5211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var c3 = buffer[2];
5221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var c4 = buffer[3];
5231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret;
5241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (buffer.length == 2) {
5251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));
5261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else if (buffer.length == 3) {
5271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));
5281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
5291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
5301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
5311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);
5321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ret = String.fromCharCode(
5331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
5341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          (codePoint - 0x10000) % 0x400 + 0xDC00);
5351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
5361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      buffer.length = 0;
5371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
5381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
5391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    this.processJSString = function processJSString(string) {
5401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      /* TODO: use TextEncoder when present,
5411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var encoder = new TextEncoder();
5421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        encoder['encoding'] = "utf-8";
5431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var utf8Array = encoder['encode'](aMsg.data);
5441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      */
5451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      string = unescape(encodeURIComponent(string));
5461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = [];
5471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      for (var i = 0; i < string.length; i++) {
5481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ret.push(string.charCodeAt(i));
5491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
5501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
5511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
5521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
5531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  getCompilerSetting: function (name) {
5541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';
5551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  },
5561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },
5571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
5581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
5591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
5601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },
5611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  GLOBAL_BASE: 8,
5621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  QUANTUM_SIZE: 4,
5631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __dummy__: 0
5641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
5651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5671b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['Runtime'] = Runtime;
5681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//========================================
5781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Runtime essentials
5791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//========================================
5801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5811b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __THREW__ = 0; // Used in checking for thrown exceptions.
5821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5831b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
5841b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar EXITSTATUS = 0;
5851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5861b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar undef = 0;
5871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
5881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
5891b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
5901b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempI64, tempI64b;
5911b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
5921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction assert(condition, text) {
5941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!condition) {
5951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    abort('Assertion failed: ' + text);
5961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
5971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
5981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
5991b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar globalScope = this;
6001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
6011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// C calling interface. A convenient way to call C functions (in C files, or
6021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// defined with extern "C").
6031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//
6041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note: LLVM optimizations can inline and remove functions, after which you will not be
6051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//       able to call them. Closure can also do so. To avoid that, add your function to
6061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//       the exports using something like
6071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//
6081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//         -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
6091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//
6101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern "C")
6111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
6121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
6131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,
6141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//                   except that 'array' is not possible (there is no way for us to know the length of the array)
6151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param args       An array of the arguments to the function, as native JS values (as in returnType)
6161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
6171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @return           The return value, as a native JS value (as in returnType)
6181b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ccall(ident, returnType, argTypes, args) {
6191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ccallFunc(getCFunc(ident), returnType, argTypes, args);
6201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
6211b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["ccall"] = ccall;
6221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
6231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
6241b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction getCFunc(ident) {
6251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  try {
6261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var func = Module['_' + ident]; // closure exported function
6271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!func) func = eval('_' + ident); // explicit lookup
6281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } catch(e) {
6291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
6301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
6311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return func;
6321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
6331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
6341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Internal function that does a C call using a function, not an identifier
6351b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ccallFunc(func, returnType, argTypes, args) {
6361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var stack = 0;
6371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function toC(value, type) {
6381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type == 'string') {
6391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (value === null || value === undefined || value === 0) return 0; // null string
6401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      value = intArrayFromString(value);
6411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      type = 'array';
6421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
6431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type == 'array') {
6441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!stack) stack = Runtime.stackSave();
6451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = Runtime.stackAlloc(value.length);
6461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      writeArrayToMemory(value, ret);
6471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
6481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
6491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return value;
6501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
6511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function fromC(value, type) {
6521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type == 'string') {
6531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return Pointer_stringify(value);
6541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
6551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    assert(type != 'array');
6561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return value;
6571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
6581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0;
6591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var cArgs = args ? args.map(function(arg) {
6601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return toC(arg, argTypes[i++]);
6611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }) : [];
6621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret = fromC(func.apply(null, cArgs), returnType);
6631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (stack) Runtime.stackRestore(stack);
6641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret;
6651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
6661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
6671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Returns a native JS wrapper for a C function. This is similar to ccall, but
6681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// returns a function you can call repeatedly in a normal way. For example:
6691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//
6701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
6711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//   alert(my_function(5, 22));
6721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//   alert(my_function(99, 12));
6731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//
6741b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction cwrap(ident, returnType, argTypes) {
6751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var func = getCFunc(ident);
6761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return function() {
6771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
6781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
6791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
6801b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["cwrap"] = cwrap;
6811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
6821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Sets a value in memory in a dynamic way at run-time. Uses the
6831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// type data. This is the same as makeSetValue, except that
6841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// makeSetValue is done at compile-time and generates the needed
6851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// code then, whereas this function picks the right code at
6861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// run-time.
6871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that setValue and getValue only do *aligned* writes and reads!
6881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that ccall uses JS types as for defining types, while setValue and
6891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
6901b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setValue(ptr, value, type, noSafe) {
6911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  type = type || 'i8';
6921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
6931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    switch(type) {
6941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i1': HEAP8[(ptr)]=value; break;
6951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i8': HEAP8[(ptr)]=value; break;
6961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i16': HEAP16[((ptr)>>1)]=value; break;
6971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i32': HEAP32[((ptr)>>2)]=value; break;
6981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
6991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'float': HEAPF32[((ptr)>>2)]=value; break;
7001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'double': HEAPF64[((ptr)>>3)]=value; break;
7011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      default: abort('invalid type for setValue: ' + type);
7021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
7041b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['setValue'] = setValue;
7051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Parallel to setValue.
7071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction getValue(ptr, type, noSafe) {
7081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  type = type || 'i8';
7091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
7101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    switch(type) {
7111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i1': return HEAP8[(ptr)];
7121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i8': return HEAP8[(ptr)];
7131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i16': return HEAP16[((ptr)>>1)];
7141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i32': return HEAP32[((ptr)>>2)];
7151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'i64': return HEAP32[((ptr)>>2)];
7161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'float': return HEAPF32[((ptr)>>2)];
7171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'double': return HEAPF64[((ptr)>>3)];
7181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      default: abort('invalid type for setValue: ' + type);
7191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return null;
7211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
7221b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['getValue'] = getValue;
7231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7241b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_NORMAL = 0; // Tries to use _malloc()
7251b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_STACK = 1; // Lives for the duration of the current function call
7261b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_STATIC = 2; // Cannot be freed
7271b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
7281b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_NONE = 4; // Do not allocate
7291b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_NORMAL'] = ALLOC_NORMAL;
7301b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_STACK'] = ALLOC_STACK;
7311b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_STATIC'] = ALLOC_STATIC;
7321b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
7331b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_NONE'] = ALLOC_NONE;
7341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// allocate(): This is for internal use. You can use it yourself as well, but the interface
7361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//             is a little tricky (see docs right below). The reason is that it is optimized
7371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//             for multiple syntaxes to save space in generated code. So you should
7381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//             normally not use allocate(), and instead allocate memory using _malloc(),
7391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//             initialize it with setValue(), and so forth.
7401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
7411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//        in *bytes* (note that this is sometimes confusing: the next parameter does not
7421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//        affect this!)
7431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @types: Either an array of types, one for each byte (or 0 if no type at that position),
7441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//         or a single type which is used for the entire block. This only matters if there
7451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//         is initial data - if @slab is a number, then this does not matter at all and is
7461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//         ignored.
7471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @allocator: How to allocate memory, see ALLOC_*
7481b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction allocate(slab, types, allocator, ptr) {
7491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var zeroinit, size;
7501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof slab === 'number') {
7511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    zeroinit = true;
7521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    size = slab;
7531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
7541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    zeroinit = false;
7551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    size = slab.length;
7561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
7571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var singleType = typeof types === 'string' ? types : null;
7591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret;
7611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (allocator == ALLOC_NONE) {
7621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret = ptr;
7631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
7641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
7651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
7661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (zeroinit) {
7681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var ptr = ret, stop;
7691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    assert((ret & 3) == 0);
7701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    stop = ret + (size & ~3);
7711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    for (; ptr < stop; ptr += 4) {
7721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[((ptr)>>2)]=0;
7731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    stop = ret + size;
7751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (ptr < stop) {
7761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP8[((ptr++)|0)]=0;
7771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ret;
7791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
7801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (singleType === 'i8') {
7821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (slab.subarray || slab.slice) {
7831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAPU8.set(slab, ret);
7841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
7851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAPU8.set(new Uint8Array(slab), ret);
7861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ret;
7881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
7891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0, type, typeSize, previousType;
7911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (i < size) {
7921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var curr = slab[i];
7931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof curr === 'function') {
7951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      curr = Runtime.getFunctionIndex(curr);
7961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
7971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
7981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    type = singleType || types[i];
7991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type === 0) {
8001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i++;
8011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      continue;
8021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
8031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
8051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    setValue(ret+i, curr, type);
8071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // no need to look up size unless type changes, so cache it
8091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (previousType !== type) {
8101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      typeSize = Runtime.getNativeTypeSize(type);
8111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      previousType = type;
8121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
8131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i += typeSize;
8141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret;
8171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
8181b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['allocate'] = allocate;
8191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8201b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction Pointer_stringify(ptr, /* optional */ length) {
8211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // TODO: use TextDecoder
8221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Find the length, and check for UTF while doing so
8231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var hasUtf = false;
8241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var t;
8251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0;
8261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
8271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    t = HEAPU8[(((ptr)+(i))|0)];
8281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (t >= 128) hasUtf = true;
8291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    else if (t == 0 && !length) break;
8301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i++;
8311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (length && i == length) break;
8321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!length) length = i;
8341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret = '';
8361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!hasUtf) {
8381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
8391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var curr;
8401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (length > 0) {
8411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
8421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ret = ret ? ret + curr : curr;
8431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ptr += MAX_CHUNK;
8441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      length -= MAX_CHUNK;
8451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
8461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return ret;
8471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var utf8 = new Runtime.UTF8Processor();
8501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (i = 0; i < length; i++) {
8511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    t = HEAPU8[(((ptr)+(i))|0)];
8521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret += utf8.processCChar(t);
8531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret;
8551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
8561b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['Pointer_stringify'] = Pointer_stringify;
8571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
8591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// a copy of that string as a Javascript String object.
8601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction UTF16ToString(ptr) {
8611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0;
8621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var str = '';
8641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
8651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
8661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (codeUnit == 0)
8671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return str;
8681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ++i;
8691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
8701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    str += String.fromCharCode(codeUnit);
8711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
8731b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['UTF16ToString'] = UTF16ToString;
8741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
8761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
8771b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stringToUTF16(str, outPtr) {
8781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for(var i = 0; i < str.length; ++i) {
8791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
8801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
8811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
8821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
8831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Null-terminate the pointer to the HEAP.
8841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
8851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
8861b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['stringToUTF16'] = stringToUTF16;
8871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
8891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// a copy of that string as a Javascript String object.
8901b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction UTF32ToString(ptr) {
8911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0;
8921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
8931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var str = '';
8941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
8951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
8961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (utf32 == 0)
8971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return str;
8981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ++i;
8991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
9001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (utf32 >= 0x10000) {
9011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ch = utf32 - 0x10000;
9021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
9031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
9041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      str += String.fromCharCode(utf32);
9051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
9061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
9071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
9081b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['UTF32ToString'] = UTF32ToString;
9091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
9101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
9111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
9121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.
9131b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stringToUTF32(str, outPtr) {
9141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var iChar = 0;
9151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
9161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
9171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
9181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
9191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var trailSurrogate = str.charCodeAt(++iCodeUnit);
9201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
9211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
9221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
9231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ++iChar;
9241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
9251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // Null-terminate the pointer to the HEAP.
9261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
9271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
9281b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['stringToUTF32'] = stringToUTF32;
9291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
9301b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction demangle(func) {
9311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 3;
9321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // params, etc.
9331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var basicTypes = {
9341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'v': 'void',
9351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'b': 'bool',
9361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'c': 'char',
9371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    's': 'short',
9381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'i': 'int',
9391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'l': 'long',
9401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'f': 'float',
9411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'd': 'double',
9421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'w': 'wchar_t',
9431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'a': 'signed char',
9441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'h': 'unsigned char',
9451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    't': 'unsigned short',
9461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'j': 'unsigned int',
9471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'm': 'unsigned long',
9481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'x': 'long long',
9491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'y': 'unsigned long long',
9501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    'z': '...'
9511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
9521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var subs = [];
9531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var first = true;
9541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function dump(x) {
9551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    //return;
9561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (x) Module.print(x);
9571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module.print(func);
9581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var pre = '';
9591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    for (var a = 0; a < i; a++) pre += ' ';
9601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module.print (pre + '^');
9611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
9621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function parseNested() {
9631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i++;
9641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[i] === 'K') i++; // ignore const
9651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var parts = [];
9661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (func[i] !== 'E') {
9671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (func[i] === 'S') { // substitution
9681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i++;
9691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var next = func.indexOf('_', i);
9701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var num = func.substring(i, next) || 0;
9711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parts.push(subs[num] || '?');
9721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i = next+1;
9731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        continue;
9741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
9751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (func[i] === 'C') { // constructor
9761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parts.push(parts[parts.length-1]);
9771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i += 2;
9781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        continue;
9791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
9801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var size = parseInt(func.substr(i));
9811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var pre = size.toString().length;
9821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!size || !pre) { i--; break; } // counter i++ below us
9831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var curr = func.substr(i + pre, size);
9841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      parts.push(curr);
9851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      subs.push(curr);
9861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i += pre + size;
9871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
9881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i++; // skip E
9891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return parts;
9901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
9911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function parse(rawList, limit, allowVoid) { // main parser
9921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    limit = limit || Infinity;
9931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var ret = '', list = [];
9941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    function flushList() {
9951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return '(' + list.join(', ') + ')';
9961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
9971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var name;
9981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[i] === 'N') {
9991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // namespaced N-E
10001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      name = parseNested().join('::');
10011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      limit--;
10021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (limit === 0) return rawList ? [name] : name;
10031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
10041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // not namespaced
10051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
10061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var size = parseInt(func.substr(i));
10071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (size) {
10081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var pre = size.toString().length;
10091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        name = func.substr(i + pre, size);
10101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i += pre + size;
10111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
10121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    first = false;
10141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[i] === 'I') {
10151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i++;
10161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var iList = parse(true);
10171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var iRet = parse(true, 1, true);
10181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
10191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
10201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ret = name;
10211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    paramLoop: while (i < func.length && limit-- > 0) {
10231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      //dump('paramLoop');
10241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var c = func[i++];
10251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (c in basicTypes) {
10261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        list.push(basicTypes[c]);
10271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
10281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        switch (c) {
10291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
10301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
10311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          case 'L': { // literal
10321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i++; // skip basic type
10331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var end = func.indexOf('E', i);
10341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var size = end - i;
10351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            list.push(func.substr(i, size));
10361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i += size + 2; // size + 'EE'
10371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break;
10381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
10391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          case 'A': { // array
10401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var size = parseInt(func.substr(i));
10411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i += size.toString().length;
10421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (func[i] !== '_') throw '?';
10431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i++; // skip _
10441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            list.push(parse(true, 1, true)[0] + ' [' + size + ']');
10451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break;
10461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
10471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          case 'E': break paramLoop;
10481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          default: ret += '?' + c; break paramLoop;
10491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
10501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
10511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
10531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (rawList) {
10541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (ret) {
10551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        list.push(ret + '?');
10561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
10571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return list;
10581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
10591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret + flushList();
10601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
10621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  try {
10631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // Special-case the entry point, since its name differs from other name mangling.
10641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func == 'Object._main' || func == '_main') {
10651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return 'main()';
10661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof func === 'number') func = Pointer_stringify(func);
10681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[0] !== '_') return func;
10691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[1] !== '_') return func; // C function
10701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (func[2] !== 'Z') return func;
10711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    switch (func[3]) {
10721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'n': return 'operator new()';
10731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      case 'd': return 'operator delete()';
10741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
10751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return parse();
10761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } catch(e) {
10771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return func;
10781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
10791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
10801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
10811b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction demangleAll(text) {
10821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
10831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
10841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
10851b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackTrace() {
10861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var stack = new Error().stack;
10871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
10881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
10891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
10901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Memory management
10911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
10921b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar PAGE_SIZE = 4096;
10931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction alignMemoryPage(x) {
10941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return (x+4095)&-4096;
10951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
10961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
10971b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar HEAP;
10981b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
10991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11001b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
11011b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
11021b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
11031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11041b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction enlargeMemory() {
11051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');
11061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11081b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
11091b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728;
11101b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
11111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11121b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar totalMemory = 4096;
11131b268ca467c924004286c97bac133db489cf43d0Ben Murdochwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
11141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (totalMemory < 16*1024*1024) {
11151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    totalMemory *= 2;
11161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
11171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    totalMemory += 16*1024*1024
11181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
11191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11201b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (totalMemory !== TOTAL_MEMORY) {
11211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');
11221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  TOTAL_MEMORY = totalMemory;
11231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Initialize the runtime's memory
11261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
11271b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
11281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       'JS engine does not provide full typed array support');
11291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11301b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar buffer = new ArrayBuffer(TOTAL_MEMORY);
11311b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP8 = new Int8Array(buffer);
11321b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP16 = new Int16Array(buffer);
11331b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP32 = new Int32Array(buffer);
11341b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU8 = new Uint8Array(buffer);
11351b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU16 = new Uint16Array(buffer);
11361b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU32 = new Uint32Array(buffer);
11371b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPF32 = new Float32Array(buffer);
11381b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPF64 = new Float64Array(buffer);
11391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Endianness check (note: assumes compiler arch was little-endian)
11411b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP32[0] = 255;
11421b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
11431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11441b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP'] = HEAP;
11451b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP8'] = HEAP8;
11461b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP16'] = HEAP16;
11471b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP32'] = HEAP32;
11481b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU8'] = HEAPU8;
11491b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU16'] = HEAPU16;
11501b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU32'] = HEAPU32;
11511b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPF32'] = HEAPF32;
11521b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPF64'] = HEAPF64;
11531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11541b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction callRuntimeCallbacks(callbacks) {
11551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while(callbacks.length > 0) {
11561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var callback = callbacks.shift();
11571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof callback == 'function') {
11581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      callback();
11591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      continue;
11601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
11611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var func = callback.func;
11621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof func === 'number') {
11631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (callback.arg === undefined) {
11641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Runtime.dynCall('v', func);
11651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
11661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Runtime.dynCall('vi', func, [callback.arg]);
11671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
11681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
11691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      func(callback.arg === undefined ? null : callback.arg);
11701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
11711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
11721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11741b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATPRERUN__  = []; // functions called before the runtime is initialized
11751b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATINIT__    = []; // functions called during startup
11761b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATMAIN__    = []; // functions called when main() is to be run
11771b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATEXIT__    = []; // functions called during shutdown
11781b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATPOSTRUN__ = []; // functions called after the runtime has exited
11791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11801b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runtimeInitialized = false;
11811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11821b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction preRun() {
11831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // compatibility - merge in anything from Module['preRun'] at this time
11841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['preRun']) {
11851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
11861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (Module['preRun'].length) {
11871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      addOnPreRun(Module['preRun'].shift());
11881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
11891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
11901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  callRuntimeCallbacks(__ATPRERUN__);
11911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ensureInitRuntime() {
11941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (runtimeInitialized) return;
11951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  runtimeInitialized = true;
11961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  callRuntimeCallbacks(__ATINIT__);
11971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
11981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
11991b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction preMain() {
12001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  callRuntimeCallbacks(__ATMAIN__);
12011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12031b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction exitRuntime() {
12041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  callRuntimeCallbacks(__ATEXIT__);
12051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction postRun() {
12081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // compatibility - merge in anything from Module['postRun'] at this time
12091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['postRun']) {
12101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
12111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (Module['postRun'].length) {
12121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      addOnPostRun(Module['postRun'].shift());
12131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
12141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  callRuntimeCallbacks(__ATPOSTRUN__);
12161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12181b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPreRun(cb) {
12191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __ATPRERUN__.unshift(cb);
12201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12211b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;
12221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12231b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnInit(cb) {
12241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __ATINIT__.unshift(cb);
12251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12261b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnInit'] = Module.addOnInit = addOnInit;
12271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12281b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPreMain(cb) {
12291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __ATMAIN__.unshift(cb);
12301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12311b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;
12321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12331b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnExit(cb) {
12341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __ATEXIT__.unshift(cb);
12351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12361b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnExit'] = Module.addOnExit = addOnExit;
12371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12381b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPostRun(cb) {
12391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __ATPOSTRUN__.unshift(cb);
12401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12411b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;
12421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Tools
12441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// This processes a JS string into a C-line array of numbers, 0-terminated.
12461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// For LLVM-originating strings, see parser.js:parseLLVMString function
12471b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {
12481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
12491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (length) {
12501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret.length = length;
12511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!dontAddNull) {
12531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret.push(0);
12541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret;
12561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12571b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['intArrayFromString'] = intArrayFromString;
12581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12591b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction intArrayToString(array) {
12601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ret = [];
12611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (var i = 0; i < array.length; i++) {
12621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var chr = array[i];
12631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (chr > 0xFF) {
12641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      chr &= 0xFF;
12651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
12661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ret.push(String.fromCharCode(chr));
12671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return ret.join('');
12691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12701b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['intArrayToString'] = intArrayToString;
12711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Write a Javascript array to somewhere in the heap
12731b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeStringToMemory(string, buffer, dontAddNull) {
12741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var array = intArrayFromString(string, dontAddNull);
12751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var i = 0;
12761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (i < array.length) {
12771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var chr = array[i];
12781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP8[(((buffer)+(i))|0)]=chr;
12791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i = i + 1;
12801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12821b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeStringToMemory'] = writeStringToMemory;
12831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12841b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeArrayToMemory(array, buffer) {
12851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (var i = 0; i < array.length; i++) {
12861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP8[(((buffer)+(i))|0)]=array[i];
12871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12891b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeArrayToMemory'] = writeArrayToMemory;
12901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12911b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeAsciiToMemory(str, buffer, dontAddNull) {
12921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (var i = 0; i < str.length; i++) {
12931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
12941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
12951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
12961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
12971b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeAsciiToMemory'] = writeAsciiToMemory;
12981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
12991b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction unSign(value, bits, ignore) {
13001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (value >= 0) {
13011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return value;
13021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
13041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    : Math.pow(2, bits)         + value;
13051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
13061b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction reSign(value, bits, ignore) {
13071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (value <= 0) {
13081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return value;
13091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
13111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                        : Math.pow(2, bits-1);
13121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
13131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
13141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                                       // TODO: In i64 mode 1, resign the two parts separately and safely
13151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
13161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return value;
13181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
13191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
13211b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
13221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ah  = a >>> 16;
13231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var al = a & 0xffff;
13241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var bh  = b >>> 16;
13251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var bl = b & 0xffff;
13261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return (al*bl + ((ah*bl + al*bh) << 16))|0;
13271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch};
13281b268ca467c924004286c97bac133db489cf43d0Ben MurdochMath.imul = Math['imul'];
13291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13311b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_abs = Math.abs;
13321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_cos = Math.cos;
13331b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_sin = Math.sin;
13341b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_tan = Math.tan;
13351b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_acos = Math.acos;
13361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_asin = Math.asin;
13371b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_atan = Math.atan;
13381b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_atan2 = Math.atan2;
13391b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_exp = Math.exp;
13401b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_log = Math.log;
13411b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_sqrt = Math.sqrt;
13421b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_ceil = Math.ceil;
13431b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_floor = Math.floor;
13441b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_pow = Math.pow;
13451b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_imul = Math.imul;
13461b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_fround = Math.fround;
13471b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_min = Math.min;
13481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// A counter of dependencies for calling run(). If we need to
13501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// do asynchronous work before running, increment this and
13511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// decrement it. Incrementing must happen in a place like
13521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
13531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that you can add dependencies in preRun, even though
13541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// it happens right before run - run will be postponed until
13551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// the dependencies are met.
13561b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runDependencies = 0;
13571b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runDependencyWatcher = null;
13581b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
13591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addRunDependency(id) {
13611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  runDependencies++;
13621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['monitorRunDependencies']) {
13631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['monitorRunDependencies'](runDependencies);
13641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
13661b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addRunDependency'] = addRunDependency;
13671b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction removeRunDependency(id) {
13681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  runDependencies--;
13691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['monitorRunDependencies']) {
13701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['monitorRunDependencies'](runDependencies);
13711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (runDependencies == 0) {
13731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (runDependencyWatcher !== null) {
13741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      clearInterval(runDependencyWatcher);
13751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      runDependencyWatcher = null;
13761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
13771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (dependenciesFulfilled) {
13781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var callback = dependenciesFulfilled;
13791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      dependenciesFulfilled = null;
13801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      callback(); // can add another dependenciesFulfilled
13811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
13821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
13831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
13841b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['removeRunDependency'] = removeRunDependency;
13851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13861b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["preloadedImages"] = {}; // maps url to image data
13871b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["preloadedAudios"] = {}; // maps url to audio data
13881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13901b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar memoryInitializer = null;
13911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Body ===
13931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
13981b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTATIC_BASE = 8;
13991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14001b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTATICTOP = STATIC_BASE + Runtime.alignMemory(547);
14011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch/* global initializers */ __ATINIT__.push();
14021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch/* memory initializer */ allocate([101,114,114,111,114,58,32,37,100,10,0,0,0,0,0,0,80,102,97,110,110,107,117,99,104,101,110,40,37,100,41,32,61,32,37,100,46,10,0,0,37,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
14051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14091b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
14101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14111b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(tempDoublePtr % 8 == 0);
14121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14131b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
14141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr] = HEAP8[ptr];
14161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
14181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
14201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
14221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
14241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14251b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempDouble(ptr) {
14261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr] = HEAP8[ptr];
14281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
14301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
14321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
14341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
14361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
14381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
14401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
14421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
14441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};
14511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};
14531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ___errno_state=0;function ___setErrNo(value) {
14561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // For convenient setting and returning of errno.
14571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[((___errno_state)>>2)]=value;
14581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return value;
14591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
14601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
14611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var PATH={splitPath:function (filename) {
14621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
14631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return splitPathRe.exec(filename).slice(1);
14641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },normalizeArray:function (parts, allowAboveRoot) {
14651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if the path tries to go above the root, `up` ends up > 0
14661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var up = 0;
14671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = parts.length - 1; i >= 0; i--) {
14681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var last = parts[i];
14691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (last === '.') {
14701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            parts.splice(i, 1);
14711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (last === '..') {
14721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            parts.splice(i, 1);
14731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            up++;
14741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (up) {
14751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            parts.splice(i, 1);
14761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            up--;
14771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
14781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
14791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if the path is allowed to go above the root, restore leading ..s
14801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (allowAboveRoot) {
14811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (; up--; up) {
14821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            parts.unshift('..');
14831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
14841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
14851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return parts;
14861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },normalize:function (path) {
14871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var isAbsolute = path.charAt(0) === '/',
14881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            trailingSlash = path.substr(-1) === '/';
14891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Normalize the path
14901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        path = PATH.normalizeArray(path.split('/').filter(function(p) {
14911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return !!p;
14921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }), !isAbsolute).join('/');
14931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!path && !isAbsolute) {
14941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path = '.';
14951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
14961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (path && trailingSlash) {
14971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path += '/';
14981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
14991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (isAbsolute ? '/' : '') + path;
15001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },dirname:function (path) {
15011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var result = PATH.splitPath(path),
15021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            root = result[0],
15031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            dir = result[1];
15041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!root && !dir) {
15051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // No dirname whatsoever
15061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return '.';
15071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (dir) {
15091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // It has a dirname, strip trailing slash
15101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          dir = dir.substr(0, dir.length - 1);
15111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return root + dir;
15131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },basename:function (path) {
15141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // EMSCRIPTEN return '/'' for '/', not an empty string
15151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (path === '/') return '/';
15161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lastSlash = path.lastIndexOf('/');
15171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (lastSlash === -1) return path;
15181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return path.substr(lastSlash+1);
15191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },extname:function (path) {
15201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.splitPath(path)[3];
15211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },join:function () {
15221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var paths = Array.prototype.slice.call(arguments, 0);
15231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.normalize(paths.join('/'));
15241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },join2:function (l, r) {
15251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.normalize(l + '/' + r);
15261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },resolve:function () {
15271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var resolvedPath = '',
15281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          resolvedAbsolute = false;
15291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
15301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = (i >= 0) ? arguments[i] : FS.cwd();
15311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Skip empty and invalid entries
15321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof path !== 'string') {
15331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new TypeError('Arguments to path.resolve must be strings');
15341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (!path) {
15351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            continue;
15361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
15371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          resolvedPath = path + '/' + resolvedPath;
15381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          resolvedAbsolute = path.charAt(0) === '/';
15391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // At this point the path should be resolved to a full absolute path, but
15411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // handle relative paths to be safe (might happen when process.cwd() fails)
15421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
15431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return !!p;
15441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }), !resolvedAbsolute).join('/');
15451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
15461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },relative:function (from, to) {
15471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        from = PATH.resolve(from).substr(1);
15481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        to = PATH.resolve(to).substr(1);
15491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function trim(arr) {
15501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var start = 0;
15511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (; start < arr.length; start++) {
15521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (arr[start] !== '') break;
15531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
15541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var end = arr.length - 1;
15551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (; end >= 0; end--) {
15561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (arr[end] !== '') break;
15571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
15581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (start > end) return [];
15591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return arr.slice(start, end - start + 1);
15601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var fromParts = trim(from.split('/'));
15621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var toParts = trim(to.split('/'));
15631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var length = Math.min(fromParts.length, toParts.length);
15641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var samePartsLength = length;
15651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = 0; i < length; i++) {
15661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (fromParts[i] !== toParts[i]) {
15671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            samePartsLength = i;
15681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break;
15691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
15701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var outputParts = [];
15721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = samePartsLength; i < fromParts.length; i++) {
15731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          outputParts.push('..');
15741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
15751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        outputParts = outputParts.concat(toParts.slice(samePartsLength));
15761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return outputParts.join('/');
15771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }};
15781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
15791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var TTY={ttys:[],init:function () {
15801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // https://github.com/kripken/emscripten/pull/1555
15811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if (ENVIRONMENT_IS_NODE) {
15821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY
15831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // device, it always assumes it's a TTY device. because of this, we're forcing
15841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible
15851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // with text files until FS.init can be refactored.
15861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   process['stdin']['setEncoding']('utf8');
15871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // }
15881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },shutdown:function () {
15891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // https://github.com/kripken/emscripten/pull/1555
15901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if (ENVIRONMENT_IS_NODE) {
15911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
15921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
15931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
15941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
15951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
15961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //   process['stdin']['pause']();
15971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // }
15981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },register:function (dev, ops) {
15991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        TTY.ttys[dev] = { input: [], output: [], ops: ops };
16001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.registerDevice(dev, TTY.stream_ops);
16011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },stream_ops:{open:function (stream) {
16021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var tty = TTY.ttys[stream.node.rdev];
16031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!tty) {
16041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
16051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.tty = tty;
16071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.seekable = false;
16081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },close:function (stream) {
16091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // flush any pending line data
16101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (stream.tty.output.length) {
16111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.tty.ops.put_char(stream.tty, 10);
16121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },read:function (stream, buffer, offset, length, pos /* ignored */) {
16141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!stream.tty || !stream.tty.ops.get_char) {
16151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
16161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var bytesRead = 0;
16181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i = 0; i < length; i++) {
16191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var result;
16201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
16211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              result = stream.tty.ops.get_char(stream.tty);
16221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
16231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EIO);
16241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
16251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (result === undefined && bytesRead === 0) {
16261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
16271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
16281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (result === null || result === undefined) break;
16291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            bytesRead++;
16301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            buffer[offset+i] = result;
16311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (bytesRead) {
16331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.node.timestamp = Date.now();
16341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return bytesRead;
16361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },write:function (stream, buffer, offset, length, pos) {
16371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!stream.tty || !stream.tty.ops.put_char) {
16381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
16391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i = 0; i < length; i++) {
16411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
16421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
16431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
16441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EIO);
16451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
16461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (length) {
16481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.node.timestamp = Date.now();
16491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return i;
16511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},default_tty_ops:{get_char:function (tty) {
16521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!tty.input.length) {
16531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var result = null;
16541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (ENVIRONMENT_IS_NODE) {
16551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              result = process['stdin']['read']();
16561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!result) {
16571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {
16581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  return null;  // EOF
16591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
16601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return undefined;  // no data available
16611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
16621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else if (typeof window != 'undefined' &&
16631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              typeof window.prompt == 'function') {
16641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Browser.
16651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              result = window.prompt('Input: ');  // returns null on cancel
16661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (result !== null) {
16671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                result += '\n';
16681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
16691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else if (typeof readline == 'function') {
16701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Command line.
16711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              result = readline();
16721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (result !== null) {
16731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                result += '\n';
16741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
16751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
16761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!result) {
16771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return null;
16781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
16791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            tty.input = intArrayFromString(result, true);
16801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return tty.input.shift();
16821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },put_char:function (tty, val) {
16831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (val === null || val === 10) {
16841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module['print'](tty.output.join(''));
16851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            tty.output = [];
16861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
16871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            tty.output.push(TTY.utf8.processCChar(val));
16881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},default_tty1_ops:{put_char:function (tty, val) {
16901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (val === null || val === 10) {
16911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module['printErr'](tty.output.join(''));
16921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            tty.output = [];
16931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
16941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            tty.output.push(TTY.utf8.processCChar(val));
16951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
16961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }}};
16971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
16981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {
16991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
17001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createNode:function (parent, name, mode, dev) {
17011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
17021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // no supported
17031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
17041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
17051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!MEMFS.ops_table) {
17061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          MEMFS.ops_table = {
17071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            dir: {
17081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node: {
17091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                getattr: MEMFS.node_ops.getattr,
17101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                setattr: MEMFS.node_ops.setattr,
17111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                lookup: MEMFS.node_ops.lookup,
17121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                mknod: MEMFS.node_ops.mknod,
17131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                rename: MEMFS.node_ops.rename,
17141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                unlink: MEMFS.node_ops.unlink,
17151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                rmdir: MEMFS.node_ops.rmdir,
17161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                readdir: MEMFS.node_ops.readdir,
17171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                symlink: MEMFS.node_ops.symlink
17181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              },
17191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream: {
17201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                llseek: MEMFS.stream_ops.llseek
17211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
17221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
17231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            file: {
17241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node: {
17251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                getattr: MEMFS.node_ops.getattr,
17261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                setattr: MEMFS.node_ops.setattr
17271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              },
17281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream: {
17291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                llseek: MEMFS.stream_ops.llseek,
17301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                read: MEMFS.stream_ops.read,
17311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                write: MEMFS.stream_ops.write,
17321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                allocate: MEMFS.stream_ops.allocate,
17331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                mmap: MEMFS.stream_ops.mmap
17341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
17351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
17361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            link: {
17371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node: {
17381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                getattr: MEMFS.node_ops.getattr,
17391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                setattr: MEMFS.node_ops.setattr,
17401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                readlink: MEMFS.node_ops.readlink
17411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              },
17421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream: {}
17431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
17441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            chrdev: {
17451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node: {
17461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                getattr: MEMFS.node_ops.getattr,
17471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                setattr: MEMFS.node_ops.setattr
17481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              },
17491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream: FS.chrdev_stream_ops
17501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
17511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
17521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
17531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.createNode(parent, name, mode, dev);
17541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isDir(node.mode)) {
17551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.node_ops = MEMFS.ops_table.dir.node;
17561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.stream_ops = MEMFS.ops_table.dir.stream;
17571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contents = {};
17581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (FS.isFile(node.mode)) {
17591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.node_ops = MEMFS.ops_table.file.node;
17601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.stream_ops = MEMFS.ops_table.file.stream;
17611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contents = [];
17621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
17631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (FS.isLink(node.mode)) {
17641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.node_ops = MEMFS.ops_table.link.node;
17651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.stream_ops = MEMFS.ops_table.link.stream;
17661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (FS.isChrdev(node.mode)) {
17671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.node_ops = MEMFS.ops_table.chrdev.node;
17681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.stream_ops = MEMFS.ops_table.chrdev.stream;
17691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
17701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.timestamp = Date.now();
17711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // add the new node to the parent
17721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (parent) {
17731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          parent.contents[name] = node;
17741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
17751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node;
17761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },ensureFlexible:function (node) {
17771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
17781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = node.contents;
17791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contents = Array.prototype.slice.call(contents);
17801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
17811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
17821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },node_ops:{getattr:function (node) {
17831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var attr = {};
17841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // device numbers reuse inode numbers.
17851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
17861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.ino = node.id;
17871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.mode = node.mode;
17881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.nlink = 1;
17891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.uid = 0;
17901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.gid = 0;
17911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.rdev = node.rdev;
17921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(node.mode)) {
17931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            attr.size = 4096;
17941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (FS.isFile(node.mode)) {
17951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            attr.size = node.contents.length;
17961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (FS.isLink(node.mode)) {
17971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            attr.size = node.link.length;
17981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
17991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            attr.size = 0;
18001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.atime = new Date(node.timestamp);
18021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.mtime = new Date(node.timestamp);
18031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.ctime = new Date(node.timestamp);
18041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
18051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          //       but this is not required by the standard.
18061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.blksize = 4096;
18071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          attr.blocks = Math.ceil(attr.size / attr.blksize);
18081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return attr;
18091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },setattr:function (node, attr) {
18101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (attr.mode !== undefined) {
18111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            node.mode = attr.mode;
18121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (attr.timestamp !== undefined) {
18141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            node.timestamp = attr.timestamp;
18151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (attr.size !== undefined) {
18171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            MEMFS.ensureFlexible(node);
18181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var contents = node.contents;
18191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (attr.size < contents.length) contents.length = attr.size;
18201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            else while (attr.size > contents.length) contents.push(0);
18211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },lookup:function (parent, name) {
18231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw FS.genericErrors[ERRNO_CODES.ENOENT];
18241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },mknod:function (parent, name, mode, dev) {
18251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return MEMFS.createNode(parent, name, mode, dev);
18261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },rename:function (old_node, new_dir, new_name) {
18271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // if we're overwriting a directory at new_name, make sure it's empty.
18281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(old_node.mode)) {
18291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var new_node;
18301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
18311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              new_node = FS.lookupNode(new_dir, new_name);
18321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
18331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
18341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (new_node) {
18351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              for (var i in new_node.contents) {
18361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
18371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
18381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
18391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // do the internal rewiring
18411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          delete old_node.parent.contents[old_node.name];
18421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          old_node.name = new_name;
18431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          new_dir.contents[new_name] = old_node;
18441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          old_node.parent = new_dir;
18451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },unlink:function (parent, name) {
18461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          delete parent.contents[name];
18471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },rmdir:function (parent, name) {
18481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var node = FS.lookupNode(parent, name);
18491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i in node.contents) {
18501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
18511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          delete parent.contents[name];
18531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },readdir:function (node) {
18541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var entries = ['.', '..']
18551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var key in node.contents) {
18561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!node.contents.hasOwnProperty(key)) {
18571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              continue;
18581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
18591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            entries.push(key);
18601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return entries;
18621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },symlink:function (parent, newname, oldpath) {
18631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);
18641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.link = oldpath;
18651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return node;
18661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },readlink:function (node) {
18671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.isLink(node.mode)) {
18681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
18691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return node.link;
18711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},stream_ops:{read:function (stream, buffer, offset, length, position) {
18721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = stream.node.contents;
18731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (position >= contents.length)
18741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return 0;
18751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var size = Math.min(contents.length - position, length);
18761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          assert(size >= 0);
18771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (size > 8 && contents.subarray) { // non-trivial, and typed array
18781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            buffer.set(contents.subarray(position, position + size), offset);
18791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else
18801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          {
18811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < size; i++) {
18821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              buffer[offset + i] = contents[position + i];
18831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
18841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
18851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return size;
18861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },write:function (stream, buffer, offset, length, position, canOwn) {
18871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var node = stream.node;
18881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.timestamp = Date.now();
18891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = node.contents;
18901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (length && contents.length === 0 && position === 0 && buffer.subarray) {
18911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // just replace it with the new data
18921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (canOwn && offset === 0) {
18931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
18941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
18951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
18961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
18971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node.contentMode = MEMFS.CONTENT_FIXED;
18981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
18991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return length;
19001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          MEMFS.ensureFlexible(node);
19021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = node.contents;
19031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          while (contents.length < position) contents.push(0);
19041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i = 0; i < length; i++) {
19051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            contents[position + i] = buffer[offset + i];
19061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return length;
19081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },llseek:function (stream, offset, whence) {
19091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var position = offset;
19101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (whence === 1) {  // SEEK_CUR.
19111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            position += stream.position;
19121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (whence === 2) {  // SEEK_END.
19131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (FS.isFile(stream.node.mode)) {
19141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              position += stream.node.contents.length;
19151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
19161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (position < 0) {
19181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
19191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.ungotten = [];
19211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.position = position;
19221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return position;
19231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },allocate:function (stream, offset, length) {
19241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          MEMFS.ensureFlexible(stream.node);
19251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = stream.node.contents;
19261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var limit = offset + length;
19271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          while (limit > contents.length) contents.push(0);
19281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },mmap:function (stream, buffer, offset, length, position, prot, flags) {
19291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.isFile(stream.node.mode)) {
19301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
19311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var ptr;
19331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var allocated;
19341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = stream.node.contents;
19351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Only make a new copy when MAP_PRIVATE is specified.
19361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ( !(flags & 2) &&
19371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
19381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // We can't emulate MAP_SHARED when the file is not backed by the buffer
19391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // we're mapping to (e.g. the HEAP buffer).
19401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            allocated = false;
19411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ptr = contents.byteOffset;
19421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
19431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // Try to avoid unnecessary slices.
19441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (position > 0 || position + length < contents.length) {
19451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (contents.subarray) {
19461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                contents = contents.subarray(position, position + length);
19471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
19481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                contents = Array.prototype.slice.call(contents, position, position + length);
19491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
19501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
19511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            allocated = true;
19521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ptr = _malloc(length);
19531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!ptr) {
19541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
19551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
19561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            buffer.set(contents, ptr);
19571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
19581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return { ptr: ptr, allocated: allocated };
19591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }}};
19601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var IDBFS={dbs:{},indexedDB:function () {
19621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
19631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
19641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // reuse all of the core MEMFS functionality
19651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return MEMFS.mount.apply(null, arguments);
19661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },syncfs:function (mount, populate, callback) {
19671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        IDBFS.getLocalSet(mount, function(err, local) {
19681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err) return callback(err);
19691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          IDBFS.getRemoteSet(mount, function(err, remote) {
19711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (err) return callback(err);
19721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var src = populate ? remote : local;
19741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var dst = populate ? local : remote;
19751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            IDBFS.reconcile(src, dst, callback);
19771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
19781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
19791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getDB:function (name, callback) {
19801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // check the cache first
19811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var db = IDBFS.dbs[name];
19821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (db) {
19831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(null, db);
19841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
19851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var req;
19871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
19881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
19891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
19901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(e);
19911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
19921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onupgradeneeded = function(e) {
19931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var db = e.target.result;
19941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var transaction = e.target.transaction;
19951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var fileStore;
19971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
19981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
19991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);
20001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
20011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);
20021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
20031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          fileStore.createIndex('timestamp', 'timestamp', { unique: false });
20051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
20061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onsuccess = function() {
20071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          db = req.result;
20081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // add to the cache
20101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          IDBFS.dbs[name] = db;
20111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          callback(null, db);
20121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
20131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onerror = function() {
20141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          callback(this.error);
20151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
20161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getLocalSet:function (mount, callback) {
20171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var entries = {};
20181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function isRealDir(p) {
20201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return p !== '.' && p !== '..';
20211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
20221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function toAbsolute(root) {
20231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return function(p) {
20241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return PATH.join2(root, p);
20251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
20261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
20271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
20291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (check.length) {
20311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = check.pop();
20321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var stat;
20331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
20351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stat = FS.stat(path);
20361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
20371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return callback(e);
20381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
20391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(stat.mode)) {
20411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));
20421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
20431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          entries[path] = { timestamp: stat.mtime };
20451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
20461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return callback(null, { type: 'local', entries: entries });
20481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getRemoteSet:function (mount, callback) {
20491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var entries = {};
20501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        IDBFS.getDB(mount.mountpoint, function(err, db) {
20521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err) return callback(err);
20531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
20551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          transaction.onerror = function() { callback(this.error); };
20561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
20581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var index = store.index('timestamp');
20591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          index.openKeyCursor().onsuccess = function(event) {
20611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var cursor = event.target.result;
20621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!cursor) {
20641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return callback(null, { type: 'remote', db: db, entries: entries });
20651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
20661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            entries[cursor.primaryKey] = { timestamp: cursor.key };
20681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            cursor.continue();
20701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
20711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
20721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },loadLocalEntry:function (path, callback) {
20731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stat, node;
20741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
20761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path);
20771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = lookup.node;
20781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stat = FS.stat(path);
20791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
20801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(e);
20811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
20821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
20831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isDir(stat.mode)) {
20841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(null, { timestamp: stat.mtime, mode: stat.mode });
20851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (FS.isFile(stat.mode)) {
20861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });
20871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
20881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(new Error('node type not supported'));
20891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
20901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },storeLocalEntry:function (path, entry, callback) {
20911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
20921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(entry.mode)) {
20931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.mkdir(path, entry.mode);
20941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (FS.isFile(entry.mode)) {
20951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });
20961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
20971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return callback(new Error('node type not supported'));
20981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
20991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.utime(path, entry.timestamp, entry.timestamp);
21011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
21021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(e);
21031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
21041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        callback(null);
21061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },removeLocalEntry:function (path, callback) {
21071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
21081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path);
21091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var stat = FS.stat(path);
21101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(stat.mode)) {
21121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.rmdir(path);
21131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (FS.isFile(stat.mode)) {
21141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.unlink(path);
21151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
21171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(e);
21181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
21191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        callback(null);
21211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },loadRemoteEntry:function (store, path, callback) {
21221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var req = store.get(path);
21231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onsuccess = function(event) { callback(null, event.target.result); };
21241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onerror = function() { callback(this.error); };
21251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },storeRemoteEntry:function (store, path, entry, callback) {
21261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var req = store.put(entry, path);
21271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onsuccess = function() { callback(null); };
21281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onerror = function() { callback(this.error); };
21291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },removeRemoteEntry:function (store, path, callback) {
21301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var req = store.delete(path);
21311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onsuccess = function() { callback(null); };
21321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        req.onerror = function() { callback(this.error); };
21331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },reconcile:function (src, dst, callback) {
21341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var total = 0;
21351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var create = [];
21371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Object.keys(src.entries).forEach(function (key) {
21381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var e = src.entries[key];
21391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var e2 = dst.entries[key];
21401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!e2 || e.timestamp > e2.timestamp) {
21411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            create.push(key);
21421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            total++;
21431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
21451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var remove = [];
21471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Object.keys(dst.entries).forEach(function (key) {
21481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var e = dst.entries[key];
21491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var e2 = src.entries[key];
21501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!e2) {
21511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            remove.push(key);
21521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            total++;
21531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
21551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!total) {
21571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return callback(null);
21581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
21591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var errored = false;
21611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var completed = 0;
21621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var db = src.type === 'remote' ? src.db : dst.db;
21631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
21641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
21651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function done(err) {
21671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err) {
21681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!done.errored) {
21691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              done.errored = true;
21701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return callback(err);
21711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
21721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return;
21731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (++completed >= total) {
21751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return callback(null);
21761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
21781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        transaction.onerror = function() { done(this.error); };
21801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // sort paths in ascending order so directory entries are created
21821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // before the files inside them
21831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        create.sort().forEach(function (path) {
21841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (dst.type === 'local') {
21851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            IDBFS.loadRemoteEntry(store, path, function (err, entry) {
21861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (err) return done(err);
21871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              IDBFS.storeLocalEntry(path, entry, done);
21881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
21891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
21901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            IDBFS.loadLocalEntry(path, function (err, entry) {
21911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (err) return done(err);
21921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              IDBFS.storeRemoteEntry(store, path, entry, done);
21931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
21941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
21951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
21961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
21971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // sort paths in descending order so files are deleted before their
21981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // parent directories
21991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        remove.sort().reverse().forEach(function(path) {
22001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (dst.type === 'local') {
22011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            IDBFS.removeLocalEntry(path, done);
22021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
22031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            IDBFS.removeRemoteEntry(store, path, done);
22041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
22051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
22061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }};
22071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
22081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var NODEFS={isWindows:false,staticInit:function () {
22091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        NODEFS.isWindows = !!process.platform.match(/^win/);
22101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mount:function (mount) {
22111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(ENVIRONMENT_IS_NODE);
22121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
22131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createNode:function (parent, name, mode, dev) {
22141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
22151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
22161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
22171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.createNode(parent, name, mode);
22181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.node_ops = NODEFS.node_ops;
22191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.stream_ops = NODEFS.stream_ops;
22201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node;
22211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMode:function (path) {
22221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stat;
22231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
22241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stat = fs.lstatSync(path);
22251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (NODEFS.isWindows) {
22261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
22271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // propagate write bits to execute bits.
22281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stat.mode = stat.mode | ((stat.mode & 146) >> 1);
22291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
22301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
22311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!e.code) throw e;
22321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES[e.code]);
22331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
22341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stat.mode;
22351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },realPath:function (node) {
22361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parts = [];
22371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (node.parent !== node) {
22381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          parts.push(node.name);
22391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = node.parent;
22401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
22411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parts.push(node.mount.opts.root);
22421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parts.reverse();
22431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.join.apply(null, parts);
22441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) {
22451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (flags in NODEFS.flagsToPermissionStringMap) {
22461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return NODEFS.flagsToPermissionStringMap[flags];
22471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
22481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return flags;
22491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
22501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },node_ops:{getattr:function (node) {
22511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(node);
22521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var stat;
22531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
22541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stat = fs.lstatSync(path);
22551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
22561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
22571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
22581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
22591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
22601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // See http://support.microsoft.com/kb/140365
22611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (NODEFS.isWindows && !stat.blksize) {
22621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stat.blksize = 4096;
22631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
22641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (NODEFS.isWindows && !stat.blocks) {
22651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
22661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
22671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return {
22681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            dev: stat.dev,
22691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ino: stat.ino,
22701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            mode: stat.mode,
22711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            nlink: stat.nlink,
22721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            uid: stat.uid,
22731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            gid: stat.gid,
22741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            rdev: stat.rdev,
22751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            size: stat.size,
22761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            atime: stat.atime,
22771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            mtime: stat.mtime,
22781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ctime: stat.ctime,
22791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            blksize: stat.blksize,
22801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            blocks: stat.blocks
22811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
22821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },setattr:function (node, attr) {
22831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(node);
22841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
22851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (attr.mode !== undefined) {
22861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.chmodSync(path, attr.mode);
22871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // update the common node structure mode as well
22881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              node.mode = attr.mode;
22891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
22901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (attr.timestamp !== undefined) {
22911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var date = new Date(attr.timestamp);
22921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.utimesSync(path, date, date);
22931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
22941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (attr.size !== undefined) {
22951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.truncateSync(path, attr.size);
22961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
22971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
22981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
22991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },lookup:function (parent, name) {
23021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = PATH.join2(NODEFS.realPath(parent), name);
23031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var mode = NODEFS.getMode(path);
23041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return NODEFS.createNode(parent, name, mode);
23051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },mknod:function (parent, name, mode, dev) {
23061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var node = NODEFS.createNode(parent, name, mode, dev);
23071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // create the backing node for this in the fs root as well
23081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(node);
23091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (FS.isDir(node.mode)) {
23111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.mkdirSync(path, node.mode);
23121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
23131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.writeFileSync(path, '', { mode: node.mode });
23141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
23151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return node;
23201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },rename:function (oldNode, newDir, newName) {
23211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var oldPath = NODEFS.realPath(oldNode);
23221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
23231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fs.renameSync(oldPath, newPath);
23251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },unlink:function (parent, name) {
23301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = PATH.join2(NODEFS.realPath(parent), name);
23311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fs.unlinkSync(path);
23331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },rmdir:function (parent, name) {
23381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = PATH.join2(NODEFS.realPath(parent), name);
23391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fs.rmdirSync(path);
23411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },readdir:function (node) {
23461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(node);
23471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return fs.readdirSync(path);
23491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },symlink:function (parent, newName, oldPath) {
23541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var newPath = PATH.join2(NODEFS.realPath(parent), newName);
23551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            fs.symlinkSync(oldPath, newPath);
23571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },readlink:function (node) {
23621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(node);
23631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return fs.readlinkSync(path);
23651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},stream_ops:{open:function (stream) {
23701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var path = NODEFS.realPath(stream.node);
23711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (FS.isFile(stream.node.mode)) {
23731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
23741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
23751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },close:function (stream) {
23801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (FS.isFile(stream.node.mode) && stream.nfd) {
23821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              fs.closeSync(stream.nfd);
23831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
23841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!e.code) throw e;
23861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },read:function (stream, buffer, offset, length, position) {
23891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // FIXME this is terrible.
23901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var nbuffer = new Buffer(length);
23911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var res;
23921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
23931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
23941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
23951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
23961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
23971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (res > 0) {
23981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < res; i++) {
23991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              buffer[offset + i] = nbuffer[i];
24001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
24011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return res;
24031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },write:function (stream, buffer, offset, length, position) {
24041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // FIXME this is terrible.
24051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
24061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var res;
24071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
24081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
24091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
24101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
24111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return res;
24131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },llseek:function (stream, offset, whence) {
24141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var position = offset;
24151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (whence === 1) {  // SEEK_CUR.
24161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            position += stream.position;
24171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else if (whence === 2) {  // SEEK_END.
24181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (FS.isFile(stream.node.mode)) {
24191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              try {
24201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var stat = fs.fstatSync(stream.nfd);
24211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                position += stat.size;
24221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } catch (e) {
24231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES[e.code]);
24241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
24251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
24261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (position < 0) {
24291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
24301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.position = position;
24331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return position;
24341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }}};
24351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _stdin=allocate(1, "i32*", ALLOC_STATIC);
24371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _stdout=allocate(1, "i32*", ALLOC_STATIC);
24391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _stderr=allocate(1, "i32*", ALLOC_STATIC);
24411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _fflush(stream) {
24431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int fflush(FILE *stream);
24441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
24451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // we don't currently perform any user-space buffering of data
24461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {
24471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
24481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ___setErrNo(e.errno);
24491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lookupPath:function (path, opts) {
24501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        path = PATH.resolve(FS.cwd(), path);
24511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts = opts || {};
24521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var defaults = {
24541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          follow_mount: true,
24551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          recurse_count: 0
24561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
24571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var key in defaults) {
24581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (opts[key] === undefined) {
24591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            opts[key] = defaults[key];
24601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
24621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (opts.recurse_count > 8) {  // max recursive lookup of 8
24641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
24651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
24661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // split the path
24681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
24691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return !!p;
24701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }), false);
24711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // start at the root
24731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var current = FS.root;
24741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var current_path = '/';
24751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = 0; i < parts.length; i++) {
24771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var islast = (i === parts.length-1);
24781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (islast && opts.parent) {
24791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // stop resolving
24801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break;
24811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          current = FS.lookupNode(current, parts[i]);
24841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          current_path = PATH.join2(current_path, parts[i]);
24851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // jump to the mount's root node if this is a mountpoint
24871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isMountpoint(current)) {
24881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!islast || (islast && opts.follow_mount)) {
24891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              current = current.mounted.root;
24901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
24911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
24921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
24931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // by default, lookupPath will not follow a symlink if it is the final path component.
24941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // setting opts.follow = true will override this behavior.
24951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!islast || opts.follow) {
24961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var count = 0;
24971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            while (FS.isLink(current.mode)) {
24981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var link = FS.readlink(current_path);
24991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              current_path = PATH.resolve(PATH.dirname(current_path), link);
25001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
25021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              current = lookup.node;
25031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
25051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
25061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
25071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
25081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
25091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return { path: current_path, node: current };
25121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getPath:function (node) {
25131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path;
25141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (true) {
25151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isRoot(node)) {
25161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var mount = node.mount.mountpoint;
25171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!path) return mount;
25181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
25191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
25201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path = path ? node.name + '/' + path : node.name;
25211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = node.parent;
25221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },hashName:function (parentid, name) {
25241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var hash = 0;
25251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = 0; i < name.length; i++) {
25281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
25291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ((parentid + hash) >>> 0) % FS.nameTable.length;
25311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },hashAddNode:function (node) {
25321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var hash = FS.hashName(node.parent.id, node.name);
25331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.name_next = FS.nameTable[hash];
25341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.nameTable[hash] = node;
25351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },hashRemoveNode:function (node) {
25361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var hash = FS.hashName(node.parent.id, node.name);
25371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.nameTable[hash] === node) {
25381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.nameTable[hash] = node.name_next;
25391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
25401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var current = FS.nameTable[hash];
25411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          while (current) {
25421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (current.name_next === node) {
25431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              current.name_next = node.name_next;
25441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
25451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
25461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            current = current.name_next;
25471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
25481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lookupNode:function (parent, name) {
25501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayLookup(parent);
25511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
25521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
25531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var hash = FS.hashName(parent.id, name);
25551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var node = FS.nameTable[hash]; node; node = node.name_next) {
25561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var nodeName = node.name;
25571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (node.parent.id === parent.id && nodeName === name) {
25581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return node;
25591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
25601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
25611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if we failed to find it in the cache, call into the VFS
25621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.lookup(parent, name);
25631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createNode:function (parent, name, mode, rdev) {
25641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.FSNode) {
25651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.FSNode = function(parent, name, mode, rdev) {
25661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!parent) {
25671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              parent = this;  // root node sets parent to itself
25681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
25691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.parent = parent;
25701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.mount = parent.mount;
25711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.mounted = null;
25721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.id = FS.nextInode++;
25731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.name = name;
25741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.mode = mode;
25751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.node_ops = {};
25761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.stream_ops = {};
25771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.rdev = rdev;
25781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
25791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.FSNode.prototype = {};
25811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // compatibility
25831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var readMode = 292 | 73;
25841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var writeMode = 146;
25851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
25861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // NOTE we must use Object.defineProperties instead of individual calls to
25871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Object.defineProperty in order to make closure compiler happy
25881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Object.defineProperties(FS.FSNode.prototype, {
25891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            read: {
25901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return (this.mode & readMode) === readMode; },
25911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
25921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
25931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            write: {
25941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return (this.mode & writeMode) === writeMode; },
25951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
25961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
25971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            isFolder: {
25981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return FS.isDir(this.mode); },
25991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
26001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            isDevice: {
26011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return FS.isChrdev(this.mode); },
26021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
26031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
26041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
26061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = new FS.FSNode(parent, name, mode, rdev);
26071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
26081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.hashAddNode(node);
26091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
26101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node;
26111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },destroyNode:function (node) {
26121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.hashRemoveNode(node);
26131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isRoot:function (node) {
26141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node === node.parent;
26151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isMountpoint:function (node) {
26161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return !!node.mounted;
26171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isFile:function (mode) {
26181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 32768;
26191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isDir:function (mode) {
26201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 16384;
26211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isLink:function (mode) {
26221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 40960;
26231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isChrdev:function (mode) {
26241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 8192;
26251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isBlkdev:function (mode) {
26261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 24576;
26271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isFIFO:function (mode) {
26281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 61440) === 4096;
26291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },isSocket:function (mode) {
26301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return (mode & 49152) === 49152;
26311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) {
26321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var flags = FS.flagModes[str];
26331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof flags === 'undefined') {
26341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new Error('Unknown file open mode: ' + str);
26351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return flags;
26371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },flagsToPermissionString:function (flag) {
26381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var accmode = flag & 2097155;
26391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var perms = ['r', 'w', 'rw'][accmode];
26401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((flag & 512)) {
26411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          perms += 'w';
26421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return perms;
26441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },nodePermissions:function (node, perms) {
26451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.ignorePermissions) {
26461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 0;
26471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // return 0 if any user, group or owner bits are set.
26491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
26501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.EACCES;
26511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
26521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.EACCES;
26531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
26541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.EACCES;
26551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 0;
26571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mayLookup:function (dir) {
26581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.nodePermissions(dir, 'x');
26591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mayCreate:function (dir, name) {
26601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
26611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var node = FS.lookupNode(dir, name);
26621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.EEXIST;
26631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
26641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.nodePermissions(dir, 'wx');
26661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mayDelete:function (dir, name, isdir) {
26671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
26681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
26691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = FS.lookupNode(dir, name);
26701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
26711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return e.errno;
26721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.nodePermissions(dir, 'wx');
26741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
26751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return err;
26761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (isdir) {
26781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.isDir(node.mode)) {
26791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return ERRNO_CODES.ENOTDIR;
26801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
26811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
26821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return ERRNO_CODES.EBUSY;
26831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
26841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
26851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isDir(node.mode)) {
26861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return ERRNO_CODES.EISDIR;
26871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
26881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 0;
26901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mayOpen:function (node, flags) {
26911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node) {
26921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.ENOENT;
26931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
26941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isLink(node.mode)) {
26951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ERRNO_CODES.ELOOP;
26961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (FS.isDir(node.mode)) {
26971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((flags & 2097155) !== 0 ||  // opening for write
26981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              (flags & 512)) {
26991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return ERRNO_CODES.EISDIR;
27001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
27011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
27031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
27041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        fd_start = fd_start || 0;
27051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        fd_end = fd_end || FS.MAX_OPEN_FDS;
27061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var fd = fd_start; fd <= fd_end; fd++) {
27071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.streams[fd]) {
27081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return fd;
27091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
27101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
27121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getStream:function (fd) {
27131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.streams[fd];
27141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createStream:function (stream, fd_start, fd_end) {
27151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.FSStream) {
27161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.FSStream = function(){};
27171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.FSStream.prototype = {};
27181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // compatibility
27191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Object.defineProperties(FS.FSStream.prototype, {
27201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            object: {
27211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return this.node; },
27221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              set: function(val) { this.node = val; }
27231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
27241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            isRead: {
27251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return (this.flags & 2097155) !== 1; }
27261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
27271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            isWrite: {
27281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return (this.flags & 2097155) !== 0; }
27291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            },
27301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            isAppend: {
27311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() { return (this.flags & 1024); }
27321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
27331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
27341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (0) {
27361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // reuse the object
27371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.__proto__ = FS.FSStream.prototype;
27381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
27391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var newStream = new FS.FSStream();
27401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var p in stream) {
27411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            newStream[p] = stream[p];
27421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
27431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream = newStream;
27441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var fd = FS.nextfd(fd_start, fd_end);
27461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        stream.fd = fd;
27471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.streams[fd] = stream;
27481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream;
27491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },closeStream:function (fd) {
27501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.streams[fd] = null;
27511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getStreamFromPtr:function (ptr) {
27521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.streams[ptr - 1];
27531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getPtrForStream:function (stream) {
27541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream ? stream.fd + 1 : 0;
27551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },chrdev_stream_ops:{open:function (stream) {
27561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var device = FS.getDevice(stream.node.rdev);
27571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // override node's stream ops with the device's
27581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.stream_ops = device.stream_ops;
27591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // forward the open call
27601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (stream.stream_ops.open) {
27611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.stream_ops.open(stream);
27621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
27631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },llseek:function () {
27641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
27651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},major:function (dev) {
27661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ((dev) >> 8);
27671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },minor:function (dev) {
27681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ((dev) & 0xff);
27691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },makedev:function (ma, mi) {
27701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ((ma) << 8 | (mi));
27711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },registerDevice:function (dev, ops) {
27721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.devices[dev] = { stream_ops: ops };
27731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getDevice:function (dev) {
27741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.devices[dev];
27751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMounts:function (mount) {
27761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mounts = [];
27771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var check = [mount];
27781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (check.length) {
27801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var m = check.pop();
27811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mounts.push(m);
27831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          check.push.apply(check, m.mounts);
27851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return mounts;
27881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },syncfs:function (populate, callback) {
27891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof(populate) === 'function') {
27901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          callback = populate;
27911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          populate = false;
27921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
27931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mounts = FS.getMounts(FS.root.mount);
27951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var completed = 0;
27961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
27971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function done(err) {
27981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err) {
27991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!done.errored) {
28001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              done.errored = true;
28011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return callback(err);
28021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
28031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return;
28041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (++completed >= mounts.length) {
28061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            callback(null);
28071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
28091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // sync all mounts
28111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mounts.forEach(function (mount) {
28121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!mount.type.syncfs) {
28131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return done(null);
28141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mount.type.syncfs(mount, populate, done);
28161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
28171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mount:function (type, opts, mountpoint) {
28181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var root = mountpoint === '/';
28191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var pseudo = !mountpoint;
28201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
28211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (root && FS.root) {
28231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
28241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (!root && !pseudo) {
28251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
28261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mountpoint = lookup.path;  // use the absolute path
28281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = lookup.node;
28291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (FS.isMountpoint(node)) {
28311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
28321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.isDir(node.mode)) {
28351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
28361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
28381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mount = {
28401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          type: type,
28411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          opts: opts,
28421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mountpoint: mountpoint,
28431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mounts: []
28441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
28451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // create a root node for the fs
28471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mountRoot = type.mount(mount);
28481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mountRoot.mount = mount;
28491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mount.root = mountRoot;
28501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (root) {
28521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.root = mountRoot;
28531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (node) {
28541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // set as a mountpoint
28551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.mounted = mount;
28561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // add the new mount to the current mount's children
28581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (node.mount) {
28591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            node.mount.mounts.push(mount);
28601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
28621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return mountRoot;
28641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },unmount:function (mountpoint) {
28651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
28661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.isMountpoint(lookup.node)) {
28681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
28691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
28701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // destroy the nodes for this mount, and all its child mounts
28721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = lookup.node;
28731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mount = node.mounted;
28741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mounts = FS.getMounts(mount);
28751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Object.keys(FS.nameTable).forEach(function (hash) {
28771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var current = FS.nameTable[hash];
28781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          while (current) {
28801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var next = current.name_next;
28811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (mounts.indexOf(current.mount) !== -1) {
28831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              FS.destroyNode(current);
28841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
28851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            current = next;
28871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
28881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
28891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // no longer a mountpoint
28911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.mounted = null;
28921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
28931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // remove this mount from the child mounts
28941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var idx = node.mount.mounts.indexOf(mount);
28951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(idx !== -1);
28961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.mount.mounts.splice(idx, 1);
28971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lookup:function (parent, name) {
28981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return parent.node_ops.lookup(parent, name);
28991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mknod:function (path, mode, dev) {
29001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { parent: true });
29011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parent = lookup.node;
29021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var name = PATH.basename(path);
29031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayCreate(parent, name);
29041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
29051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
29061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!parent.node_ops.mknod) {
29081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
29091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return parent.node_ops.mknod(parent, name, mode, dev);
29111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },create:function (path, mode) {
29121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode = mode !== undefined ? mode : 438 /* 0666 */;
29131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode &= 4095;
29141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode |= 32768;
29151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.mknod(path, mode, 0);
29161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mkdir:function (path, mode) {
29171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode = mode !== undefined ? mode : 511 /* 0777 */;
29181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode &= 511 | 512;
29191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode |= 16384;
29201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.mknod(path, mode, 0);
29211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mkdev:function (path, mode, dev) {
29221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof(dev) === 'undefined') {
29231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          dev = mode;
29241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mode = 438 /* 0666 */;
29251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode |= 8192;
29271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.mknod(path, mode, dev);
29281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },symlink:function (oldpath, newpath) {
29291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(newpath, { parent: true });
29301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parent = lookup.node;
29311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var newname = PATH.basename(newpath);
29321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayCreate(parent, newname);
29331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
29341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
29351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!parent.node_ops.symlink) {
29371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
29381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return parent.node_ops.symlink(parent, newname, oldpath);
29401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },rename:function (old_path, new_path) {
29411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var old_dirname = PATH.dirname(old_path);
29421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var new_dirname = PATH.dirname(new_path);
29431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var old_name = PATH.basename(old_path);
29441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var new_name = PATH.basename(new_path);
29451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // parents must exist
29461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup, old_dir, new_dir;
29471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
29481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          lookup = FS.lookupPath(old_path, { parent: true });
29491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          old_dir = lookup.node;
29501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          lookup = FS.lookupPath(new_path, { parent: true });
29511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          new_dir = lookup.node;
29521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
29531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
29541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // need to be part of the same mount
29561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (old_dir.mount !== new_dir.mount) {
29571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
29581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // source must exist
29601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var old_node = FS.lookupNode(old_dir, old_name);
29611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // old path should not be an ancestor of the new path
29621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var relative = PATH.relative(old_path, new_dirname);
29631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (relative.charAt(0) !== '.') {
29641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
29651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // new path should not be an ancestor of the old path
29671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        relative = PATH.relative(new_path, old_dirname);
29681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (relative.charAt(0) !== '.') {
29691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
29701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // see if the new path already exists
29721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var new_node;
29731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
29741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          new_node = FS.lookupNode(new_dir, new_name);
29751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
29761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // not fatal
29771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // early out if nothing needs to change
29791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (old_node === new_node) {
29801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return;
29811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // we'll need to delete the old entry
29831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var isdir = FS.isDir(old_node.mode);
29841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayDelete(old_dir, old_name, isdir);
29851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
29861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
29871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // need delete permissions if we'll be overwriting.
29891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // need create permissions if new doesn't already exist.
29901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        err = new_node ?
29911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.mayDelete(new_dir, new_name, isdir) :
29921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.mayCreate(new_dir, new_name);
29931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
29941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
29951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!old_dir.node_ops.rename) {
29971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
29981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
29991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
30001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
30011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // if we are going to change the parent, check write permissions
30031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (new_dir !== old_dir) {
30041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          err = FS.nodePermissions(old_dir, 'w');
30051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err) {
30061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(err);
30071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
30081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // remove the node from the lookup hash
30101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.hashRemoveNode(old_node);
30111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // do the underlying fs rename
30121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
30131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          old_dir.node_ops.rename(old_node, new_dir, new_name);
30141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
30151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw e;
30161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } finally {
30171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // add the node back to the hash (in case node_ops.rename
30181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // changed its name)
30191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.hashAddNode(old_node);
30201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },rmdir:function (path) {
30221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { parent: true });
30231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parent = lookup.node;
30241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var name = PATH.basename(path);
30251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.lookupNode(parent, name);
30261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayDelete(parent, name, true);
30271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
30281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
30291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!parent.node_ops.rmdir) {
30311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
30321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isMountpoint(node)) {
30341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
30351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parent.node_ops.rmdir(parent, name);
30371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.destroyNode(node);
30381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },readdir:function (path) {
30391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { follow: true });
30401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = lookup.node;
30411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node.node_ops.readdir) {
30421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
30431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node.node_ops.readdir(node);
30451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },unlink:function (path) {
30461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { parent: true });
30471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parent = lookup.node;
30481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var name = PATH.basename(path);
30491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.lookupNode(parent, name);
30501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayDelete(parent, name, false);
30511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
30521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // POSIX says unlink should set EPERM, not EISDIR
30531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
30541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
30551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!parent.node_ops.unlink) {
30571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
30581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isMountpoint(node)) {
30601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
30611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parent.node_ops.unlink(parent, name);
30631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.destroyNode(node);
30641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },readlink:function (path) {
30651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path);
30661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var link = lookup.node;
30671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!link.node_ops.readlink) {
30681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
30691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return link.node_ops.readlink(link);
30711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },stat:function (path, dontFollow) {
30721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { follow: !dontFollow });
30731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = lookup.node;
30741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node.node_ops.getattr) {
30751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
30761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node.node_ops.getattr(node);
30781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lstat:function (path) {
30791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.stat(path, true);
30801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },chmod:function (path, mode, dontFollow) {
30811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
30821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof path === 'string') {
30831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path, { follow: !dontFollow });
30841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = lookup.node;
30851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
30861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = path;
30871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node.node_ops.setattr) {
30891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
30901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
30911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.node_ops.setattr(node, {
30921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mode: (mode & 4095) | (node.mode & ~4095),
30931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          timestamp: Date.now()
30941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
30951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lchmod:function (path, mode) {
30961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.chmod(path, mode, true);
30971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },fchmod:function (fd, mode) {
30981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.getStream(fd);
30991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream) {
31001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
31011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.chmod(stream.node, mode);
31031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },chown:function (path, uid, gid, dontFollow) {
31041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
31051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof path === 'string') {
31061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path, { follow: !dontFollow });
31071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = lookup.node;
31081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
31091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = path;
31101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node.node_ops.setattr) {
31121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
31131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.node_ops.setattr(node, {
31151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          timestamp: Date.now()
31161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // we ignore the uid / gid for now
31171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
31181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },lchown:function (path, uid, gid) {
31191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.chown(path, uid, gid, true);
31201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },fchown:function (fd, uid, gid) {
31211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.getStream(fd);
31221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream) {
31231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
31241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.chown(stream.node, uid, gid);
31261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },truncate:function (path, len) {
31271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (len < 0) {
31281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
31291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
31311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof path === 'string') {
31321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path, { follow: true });
31331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = lookup.node;
31341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
31351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = path;
31361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node.node_ops.setattr) {
31381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
31391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isDir(node.mode)) {
31411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
31421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.isFile(node.mode)) {
31441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
31451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.nodePermissions(node, 'w');
31471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
31481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
31491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.node_ops.setattr(node, {
31511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          size: len,
31521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          timestamp: Date.now()
31531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
31541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },ftruncate:function (fd, len) {
31551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.getStream(fd);
31561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream) {
31571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
31581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((stream.flags & 2097155) === 0) {
31601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
31611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.truncate(stream.node, len);
31631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },utime:function (path, atime, mtime) {
31641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { follow: true });
31651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = lookup.node;
31661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.node_ops.setattr(node, {
31671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          timestamp: Math.max(atime, mtime)
31681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
31691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },open:function (path, flags, mode, fd_start, fd_end) {
31701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
31711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;
31721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((flags & 64)) {
31731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mode = (mode & 4095) | 32768;
31741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
31751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          mode = 0;
31761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node;
31781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof path === 'object') {
31791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node = path;
31801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
31811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path = PATH.normalize(path);
31821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
31831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var lookup = FS.lookupPath(path, {
31841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              follow: !(flags & 131072)
31851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
31861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            node = lookup.node;
31871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
31881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // ignore
31891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
31901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
31911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // perhaps we need to create the node
31921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((flags & 64)) {
31931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (node) {
31941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // if O_CREAT and O_EXCL are set, error out if the node already exists
31951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((flags & 128)) {
31961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
31971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
31981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
31991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // node doesn't exist, try to create it
32001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            node = FS.mknod(path, mode, 0);
32011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
32021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!node) {
32041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
32051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // can't truncate a device
32071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isChrdev(node.mode)) {
32081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flags &= ~512;
32091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // check permissions
32111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.mayOpen(node, flags);
32121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
32131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
32141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // do truncation if necessary
32161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((flags & 512)) {
32171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.truncate(node, 0);
32181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // we've already handled these, don't pass down to the underlying vfs
32201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        flags &= ~(128 | 512);
32211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
32221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // register the stream with the filesystem
32231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.createStream({
32241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node: node,
32251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path: FS.getPath(node),  // we want the absolute path to the node
32261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flags: flags,
32271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          seekable: true,
32281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          position: 0,
32291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream_ops: node.stream_ops,
32301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // used by the file family libc calls (fopen, fwrite, ferror, etc.)
32311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ungotten: [],
32321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          error: false
32331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }, fd_start, fd_end);
32341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // call the new stream's open function
32351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (stream.stream_ops.open) {
32361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream.stream_ops.open(stream);
32371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['logReadFiles'] && !(flags & 1)) {
32391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.readFiles) FS.readFiles = {};
32401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!(path in FS.readFiles)) {
32411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.readFiles[path] = 1;
32421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module['printErr']('read file: ' + path);
32431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
32441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream;
32461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },close:function (stream) {
32471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
32481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (stream.stream_ops.close) {
32491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.stream_ops.close(stream);
32501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
32511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
32521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw e;
32531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } finally {
32541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.closeStream(stream.fd);
32551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },llseek:function (stream, offset, whence) {
32571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.seekable || !stream.stream_ops.llseek) {
32581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
32591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream.stream_ops.llseek(stream, offset, whence);
32611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },read:function (stream, buffer, offset, length, position) {
32621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (length < 0 || position < 0) {
32631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
32641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((stream.flags & 2097155) === 1) {
32661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
32671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isDir(stream.node.mode)) {
32691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
32701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.stream_ops.read) {
32721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
32731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var seeking = true;
32751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof position === 'undefined') {
32761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          position = stream.position;
32771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          seeking = false;
32781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (!stream.seekable) {
32791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
32801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
32821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!seeking) stream.position += bytesRead;
32831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return bytesRead;
32841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },write:function (stream, buffer, offset, length, position, canOwn) {
32851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (length < 0 || position < 0) {
32861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
32871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((stream.flags & 2097155) === 0) {
32891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
32901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.isDir(stream.node.mode)) {
32921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
32931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.stream_ops.write) {
32951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
32961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
32971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var seeking = true;
32981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof position === 'undefined') {
32991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          position = stream.position;
33001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          seeking = false;
33011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (!stream.seekable) {
33021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
33031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (stream.flags & 1024) {
33051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // seek to the end before writing in append mode
33061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.llseek(stream, 0, 2);
33071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
33091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!seeking) stream.position += bytesWritten;
33101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return bytesWritten;
33111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },allocate:function (stream, offset, length) {
33121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (offset < 0 || length <= 0) {
33131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
33141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((stream.flags & 2097155) === 0) {
33161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
33171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
33191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
33201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.stream_ops.allocate) {
33221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
33231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        stream.stream_ops.allocate(stream, offset, length);
33251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mmap:function (stream, buffer, offset, length, position, prot, flags) {
33261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // TODO if PROT is PROT_WRITE, make sure we have write access
33271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((stream.flags & 2097155) === 1) {
33281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EACCES);
33291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.stream_ops.mmap) {
33311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
33321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
33341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },ioctl:function (stream, cmd, arg) {
33351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream.stream_ops.ioctl) {
33361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
33371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream.stream_ops.ioctl(stream, cmd, arg);
33391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },readFile:function (path, opts) {
33401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts = opts || {};
33411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts.flags = opts.flags || 'r';
33421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts.encoding = opts.encoding || 'binary';
33431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
33441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new Error('Invalid encoding type "' + opts.encoding + '"');
33451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var ret;
33471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.open(path, opts.flags);
33481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stat = FS.stat(path);
33491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var length = stat.size;
33501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var buf = new Uint8Array(length);
33511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.read(stream, buf, 0, length, 0);
33521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (opts.encoding === 'utf8') {
33531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret = '';
33541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var utf8 = new Runtime.UTF8Processor();
33551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i = 0; i < length; i++) {
33561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ret += utf8.processCChar(buf[i]);
33571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
33581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (opts.encoding === 'binary') {
33591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret = buf;
33601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.close(stream);
33621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ret;
33631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },writeFile:function (path, data, opts) {
33641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts = opts || {};
33651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts.flags = opts.flags || 'w';
33661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        opts.encoding = opts.encoding || 'utf8';
33671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
33681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new Error('Invalid encoding type "' + opts.encoding + '"');
33691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.open(path, opts.flags, opts.mode);
33711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (opts.encoding === 'utf8') {
33721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var utf8 = new Runtime.UTF8Processor();
33731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var buf = new Uint8Array(utf8.processJSString(data));
33741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);
33751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (opts.encoding === 'binary') {
33761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.write(stream, data, 0, data.length, 0, opts.canOwn);
33771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.close(stream);
33791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },cwd:function () {
33801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.currentPath;
33811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },chdir:function (path) {
33821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var lookup = FS.lookupPath(path, { follow: true });
33831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.isDir(lookup.node.mode)) {
33841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
33851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var err = FS.nodePermissions(lookup.node, 'x');
33871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (err) {
33881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(err);
33891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
33901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.currentPath = lookup.path;
33911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createDefaultDirectories:function () {
33921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdir('/tmp');
33931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createDefaultDevices:function () {
33941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // create /dev
33951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdir('/dev');
33961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // setup /dev/null
33971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.registerDevice(FS.makedev(1, 3), {
33981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          read: function() { return 0; },
33991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          write: function() { return 0; }
34001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
34011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdev('/dev/null', FS.makedev(1, 3));
34021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // setup /dev/tty and /dev/tty1
34031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // stderr needs to print output using Module['printErr']
34041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // so we register a second tty just for it.
34051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
34061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
34071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdev('/dev/tty', FS.makedev(5, 0));
34081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdev('/dev/tty1', FS.makedev(6, 0));
34091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // we're not going to emulate the actual shm device,
34101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // just create the tmp dirs that reside in it commonly
34111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdir('/dev/shm');
34121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mkdir('/dev/shm/tmp');
34131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createStandardStreams:function () {
34141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // TODO deprecate the old functionality of a single
34151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // input / output callback and that utilizes FS.createDevice
34161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // and instead require a unique set of stream ops
34171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // by default, we symlink the standard streams to the
34191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // default tty devices. however, if the standard streams
34201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // have been overwritten we create a unique device for
34211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // them instead.
34221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['stdin']) {
34231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.createDevice('/dev', 'stdin', Module['stdin']);
34241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
34251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.symlink('/dev/tty', '/dev/stdin');
34261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
34271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['stdout']) {
34281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.createDevice('/dev', 'stdout', null, Module['stdout']);
34291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
34301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.symlink('/dev/tty', '/dev/stdout');
34311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
34321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['stderr']) {
34331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.createDevice('/dev', 'stderr', null, Module['stderr']);
34341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
34351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.symlink('/dev/tty1', '/dev/stderr');
34361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
34371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // open default streams for the stdin, stdout and stderr devices
34391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stdin = FS.open('/dev/stdin', 'r');
34401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);
34411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');
34421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stdout = FS.open('/dev/stdout', 'w');
34441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);
34451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');
34461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stderr = FS.open('/dev/stderr', 'w');
34481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);
34491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');
34501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },ensureErrnoError:function () {
34511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (FS.ErrnoError) return;
34521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.ErrnoError = function ErrnoError(errno) {
34531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          this.errno = errno;
34541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var key in ERRNO_CODES) {
34551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (ERRNO_CODES[key] === errno) {
34561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              this.code = key;
34571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
34581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
34591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
34601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          this.message = ERRNO_MESSAGES[errno];
34611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
34621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.ErrnoError.prototype = new Error();
34631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.ErrnoError.prototype.constructor = FS.ErrnoError;
34641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
34651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        [ERRNO_CODES.ENOENT].forEach(function(code) {
34661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.genericErrors[code] = new FS.ErrnoError(code);
34671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.genericErrors[code].stack = '<generic error, no stack>';
34681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
34691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },staticInit:function () {
34701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.ensureErrnoError();
34711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.nameTable = new Array(4096);
34731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.mount(MEMFS, {}, '/');
34751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.createDefaultDirectories();
34771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.createDefaultDevices();
34781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },init:function (input, output, error) {
34791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        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)');
34801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.init.initialized = true;
34811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.ensureErrnoError();
34831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
34851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['stdin'] = input || Module['stdin'];
34861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['stdout'] = output || Module['stdout'];
34871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['stderr'] = error || Module['stderr'];
34881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
34891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.createStandardStreams();
34901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },quit:function () {
34911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.init.initialized = false;
34921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        for (var i = 0; i < FS.streams.length; i++) {
34931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var stream = FS.streams[i];
34941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!stream) {
34951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            continue;
34961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
34971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.close(stream);
34981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
34991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMode:function (canRead, canWrite) {
35001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mode = 0;
35011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (canRead) mode |= 292 | 73;
35021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (canWrite) mode |= 146;
35031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return mode;
35041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },joinPath:function (parts, forceRelative) {
35051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = PATH.join.apply(null, parts);
35061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (forceRelative && path[0] == '/') path = path.substr(1);
35071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return path;
35081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },absolutePath:function (relative, base) {
35091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.resolve(base, relative);
35101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },standardizePath:function (path) {
35111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return PATH.normalize(path);
35121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },findObject:function (path, dontResolveLastLink) {
35131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var ret = FS.analyzePath(path, dontResolveLastLink);
35141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (ret.exists) {
35151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return ret.object;
35161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
35171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ___setErrNo(ret.error);
35181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return null;
35191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
35201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },analyzePath:function (path, dontResolveLastLink) {
35211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // operate from within the context of the symlink's target
35221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
35231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
35241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path = lookup.path;
35251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
35261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
35271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var ret = {
35281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,
35291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          parentExists: false, parentPath: null, parentObject: null
35301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
35311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
35321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lookup = FS.lookupPath(path, { parent: true });
35331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.parentExists = true;
35341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.parentPath = lookup.path;
35351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.parentObject = lookup.node;
35361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.name = PATH.basename(path);
35371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
35381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.exists = true;
35391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.path = lookup.path;
35401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.object = lookup.node;
35411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.name = lookup.node.name;
35421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.isRoot = lookup.path === '/';
35431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
35441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.error = e.errno;
35451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
35461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ret;
35471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createFolder:function (parent, name, canRead, canWrite) {
35481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
35491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mode = FS.getMode(canRead, canWrite);
35501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.mkdir(path, mode);
35511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createPath:function (parent, path, canRead, canWrite) {
35521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        parent = typeof parent === 'string' ? parent : FS.getPath(parent);
35531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var parts = path.split('/').reverse();
35541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (parts.length) {
35551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var part = parts.pop();
35561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!part) continue;
35571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var current = PATH.join2(parent, part);
35581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
35591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            FS.mkdir(current);
35601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
35611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // ignore EEXIST
35621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
35631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          parent = current;
35641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
35651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return current;
35661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createFile:function (parent, name, properties, canRead, canWrite) {
35671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
35681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mode = FS.getMode(canRead, canWrite);
35691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.create(path, mode);
35701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
35711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
35721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mode = FS.getMode(canRead, canWrite);
35731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.create(path, mode);
35741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (data) {
35751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof data === 'string') {
35761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var arr = new Array(data.length);
35771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
35781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            data = arr;
35791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
35801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // make sure we can write to the file
35811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.chmod(node, mode | 146);
35821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var stream = FS.open(node, 'w');
35831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.write(stream, data, 0, data.length, 0, canOwn);
35841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.close(stream);
35851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          FS.chmod(node, mode);
35861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
35871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node;
35881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createDevice:function (parent, name, input, output) {
35891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
35901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var mode = FS.getMode(!!input, !!output);
35911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!FS.createDevice.major) FS.createDevice.major = 64;
35921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var dev = FS.makedev(FS.createDevice.major++, 0);
35931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Create a fake device that a set of stream ops to emulate
35941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // the old behavior.
35951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.registerDevice(dev, {
35961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          open: function(stream) {
35971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            stream.seekable = false;
35981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          },
35991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          close: function(stream) {
36001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // flush any pending line data
36011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (output && output.buffer && output.buffer.length) {
36021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              output(10);
36031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
36041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          },
36051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          read: function(stream, buffer, offset, length, pos /* ignored */) {
36061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var bytesRead = 0;
36071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < length; i++) {
36081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var result;
36091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              try {
36101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                result = input();
36111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } catch (e) {
36121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EIO);
36131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
36141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (result === undefined && bytesRead === 0) {
36151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
36161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
36171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (result === null || result === undefined) break;
36181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              bytesRead++;
36191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              buffer[offset+i] = result;
36201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
36211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (bytesRead) {
36221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream.node.timestamp = Date.now();
36231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
36241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return bytesRead;
36251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          },
36261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          write: function(stream, buffer, offset, length, pos) {
36271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < length; i++) {
36281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              try {
36291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                output(buffer[offset+i]);
36301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } catch (e) {
36311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EIO);
36321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
36331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
36341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (length) {
36351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              stream.node.timestamp = Date.now();
36361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
36371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return i;
36381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
36391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
36401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.mkdev(path, mode, dev);
36411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createLink:function (parent, name, target, canRead, canWrite) {
36421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
36431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.symlink(target, path);
36441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },forceLoadFile:function (obj) {
36451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
36461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var success = true;
36471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof XMLHttpRequest !== 'undefined') {
36481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          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.");
36491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (Module['read']) {
36501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Command-line.
36511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
36521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
36531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            //          read() will try to parse UTF8.
36541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            obj.contents = intArrayFromString(Module['read'](obj.url), true);
36551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
36561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            success = false;
36571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
36581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
36591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new Error('Cannot load without read() or XMLHttpRequest.');
36601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
36611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!success) ___setErrNo(ERRNO_CODES.EIO);
36621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return success;
36631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createLazyFile:function (parent, name, url, canRead, canWrite) {
36641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
36651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function LazyUint8Array() {
36661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          this.lengthKnown = false;
36671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          this.chunks = []; // Loaded chunks. Index is the chunk number
36681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
36691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
36701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (idx > this.length-1 || idx < 0) {
36711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return undefined;
36721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
36731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var chunkOffset = idx % this.chunkSize;
36741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var chunkNum = Math.floor(idx / this.chunkSize);
36751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return this.getter(chunkNum)[chunkOffset];
36761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
36771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
36781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          this.getter = getter;
36791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
36801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
36811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // Find length
36821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var xhr = new XMLHttpRequest();
36831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            xhr.open('HEAD', url, false);
36841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            xhr.send(null);
36851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
36861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var datalength = Number(xhr.getResponseHeader("Content-length"));
36871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var header;
36881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
36891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var chunkSize = 1024*1024; // Chunk size in bytes
36901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
36911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!hasByteServing) chunkSize = datalength;
36921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
36931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // Function to get a range from the remote URL.
36941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var doXHR = (function(from, to) {
36951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
36961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");
36971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
36981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
36991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var xhr = new XMLHttpRequest();
37001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              xhr.open('GET', url, false);
37011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
37021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
37031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Some hints to the browser that we want binary data.
37041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
37051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (xhr.overrideMimeType) {
37061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                xhr.overrideMimeType('text/plain; charset=x-user-defined');
37071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
37081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
37091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              xhr.send(null);
37101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
37111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (xhr.response !== undefined) {
37121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return new Uint8Array(xhr.response || []);
37131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
37141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return intArrayFromString(xhr.responseText || '', true);
37151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
37161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
37171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var lazyArray = this;
37181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            lazyArray.setDataGetter(function(chunkNum) {
37191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var start = chunkNum * chunkSize;
37201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var end = (chunkNum+1) * chunkSize - 1; // including this byte
37211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
37221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
37231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                lazyArray.chunks[chunkNum] = doXHR(start, end);
37241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
37251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
37261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return lazyArray.chunks[chunkNum];
37271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
37281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
37291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this._length = datalength;
37301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this._chunkSize = chunkSize;
37311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            this.lengthKnown = true;
37321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
37331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof XMLHttpRequest !== 'undefined') {
37341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
37351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var lazyArray = new LazyUint8Array();
37361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Object.defineProperty(lazyArray, "length", {
37371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() {
37381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if(!this.lengthKnown) {
37391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                      this.cacheLength();
37401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
37411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  return this._length;
37421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
37431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
37441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Object.defineProperty(lazyArray, "chunkSize", {
37451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              get: function() {
37461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if(!this.lengthKnown) {
37471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                      this.cacheLength();
37481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
37491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  return this._chunkSize;
37501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
37511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
37521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
37531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var properties = { isDevice: false, contents: lazyArray };
37541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
37551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var properties = { isDevice: false, url: url };
37561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
37571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
37581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.createFile(parent, name, properties, canRead, canWrite);
37591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // This is a total hack, but I want to get this lazy file code out of the
37601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // core of MEMFS. If we want to keep this lazy file concept I feel it should
37611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // be its own thin LAZYFS proxying calls to MEMFS.
37621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (properties.contents) {
37631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contents = properties.contents;
37641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (properties.url) {
37651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.contents = null;
37661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node.url = properties.url;
37671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
37681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // override each stream op with one that tries to force load the lazy file first
37691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream_ops = {};
37701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var keys = Object.keys(node.stream_ops);
37711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        keys.forEach(function(key) {
37721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var fn = node.stream_ops[key];
37731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream_ops[key] = function forceLoadLazyFile() {
37741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!FS.forceLoadFile(node)) {
37751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EIO);
37761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
37771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return fn.apply(null, arguments);
37781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
37791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
37801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // use a custom read function
37811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
37821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!FS.forceLoadFile(node)) {
37831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EIO);
37841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
37851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var contents = stream.node.contents;
37861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (position >= contents.length)
37871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return 0;
37881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var size = Math.min(contents.length - position, length);
37891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          assert(size >= 0);
37901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (contents.slice) { // normal array
37911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < size; i++) {
37921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              buffer[offset + i] = contents[position + i];
37931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
37941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
37951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
37961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              buffer[offset + i] = contents.get(position + i);
37971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
37981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
37991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return size;
38001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
38011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.stream_ops = stream_ops;
38021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return node;
38031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {
38041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.init();
38051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // TODO we should allow people to just pass in a complete filename instead
38061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // of parent and name being that we just join them anyways
38071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
38081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function processData(byteArray) {
38091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function finish(byteArray) {
38101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!dontCreateFile) {
38111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
38121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
38131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (onload) onload();
38141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            removeRunDependency('cp ' + fullname);
38151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
38161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var handled = false;
38171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Module['preloadPlugins'].forEach(function(plugin) {
38181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (handled) return;
38191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (plugin['canHandle'](fullname)) {
38201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              plugin['handle'](byteArray, fullname, finish, function() {
38211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (onerror) onerror();
38221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                removeRunDependency('cp ' + fullname);
38231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              });
38241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              handled = true;
38251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
38261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
38271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!handled) finish(byteArray);
38281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
38291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        addRunDependency('cp ' + fullname);
38301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof url == 'string') {
38311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.asyncLoad(url, function(byteArray) {
38321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            processData(byteArray);
38331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }, onerror);
38341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
38351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          processData(url);
38361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
38371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },indexedDB:function () {
38381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
38391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },DB_NAME:function () {
38401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 'EM_FS_' + window.location.pathname;
38411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
38421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        onload = onload || function(){};
38431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        onerror = onerror || function(){};
38441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var indexedDB = FS.indexedDB();
38451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
38461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
38471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
38481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return onerror(e);
38491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
38501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
38511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          console.log('creating db');
38521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var db = openRequest.result;
38531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          db.createObjectStore(FS.DB_STORE_NAME);
38541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
38551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onsuccess = function openRequest_onsuccess() {
38561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var db = openRequest.result;
38571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
38581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var files = transaction.objectStore(FS.DB_STORE_NAME);
38591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var ok = 0, fail = 0, total = paths.length;
38601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function finish() {
38611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (fail == 0) onload(); else onerror();
38621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
38631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          paths.forEach(function(path) {
38641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var putRequest = files.put(FS.analyzePath(path).object.contents, path);
38651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
38661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
38671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
38681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          transaction.onerror = onerror;
38691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
38701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onerror = onerror;
38711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },loadFilesFromDB:function (paths, onload, onerror) {
38721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        onload = onload || function(){};
38731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        onerror = onerror || function(){};
38741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var indexedDB = FS.indexedDB();
38751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
38761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
38771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
38781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return onerror(e);
38791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
38801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onupgradeneeded = onerror; // no database to load from
38811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onsuccess = function openRequest_onsuccess() {
38821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var db = openRequest.result;
38831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
38841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
38851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch(e) {
38861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            onerror(e);
38871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return;
38881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
38891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var files = transaction.objectStore(FS.DB_STORE_NAME);
38901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var ok = 0, fail = 0, total = paths.length;
38911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function finish() {
38921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (fail == 0) onload(); else onerror();
38931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
38941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          paths.forEach(function(path) {
38951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var getRequest = files.get(path);
38961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            getRequest.onsuccess = function getRequest_onsuccess() {
38971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (FS.analyzePath(path).exists) {
38981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                FS.unlink(path);
38991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
39001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
39011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ok++;
39021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (ok + fail == total) finish();
39031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            };
39041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
39051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
39061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          transaction.onerror = onerror;
39071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
39081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        openRequest.onerror = onerror;
39091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }};
39101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {
39151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
39161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createSocket:function (family, type, protocol) {
39171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var streaming = type == 1;
39181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (protocol) {
39191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp
39201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
39211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // create our internal socket structure
39231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var sock = {
39241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          family: family,
39251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          type: type,
39261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          protocol: protocol,
39271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          server: null,
39281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          peers: {},
39291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          pending: [],
39301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          recv_queue: [],
39311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock_ops: SOCKFS.websocket_sock_ops
39321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
39331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // create the filesystem node to store the socket structure
39351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var name = SOCKFS.nextname();
39361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var node = FS.createNode(SOCKFS.root, name, 49152, 0);
39371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        node.sock = sock;
39381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // and the wrapping stream that enables library functions such
39401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // as read and write to indirectly interact with the socket
39411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.createStream({
39421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          path: name,
39431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          node: node,
39441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flags: FS.modeStringToFlags('r+'),
39451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          seekable: false,
39461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          stream_ops: SOCKFS.stream_ops
39471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
39481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // map the new stream to the socket structure (sockets have a 1:1
39501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // relationship with a stream)
39511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        sock.stream = stream;
39521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return sock;
39541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getSocket:function (fd) {
39551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var stream = FS.getStream(fd);
39561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!stream || !FS.isSocket(stream.node.mode)) {
39571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return null;
39581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
39591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return stream.node.sock;
39601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },stream_ops:{poll:function (stream) {
39611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var sock = stream.node.sock;
39621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return sock.sock_ops.poll(sock);
39631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },ioctl:function (stream, request, varargs) {
39641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var sock = stream.node.sock;
39651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return sock.sock_ops.ioctl(sock, request, varargs);
39661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },read:function (stream, buffer, offset, length, position /* ignored */) {
39671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var sock = stream.node.sock;
39681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var msg = sock.sock_ops.recvmsg(sock, length);
39691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!msg) {
39701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // socket is closed
39711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return 0;
39721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
39731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          buffer.set(msg.buffer, offset);
39741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return msg.buffer.length;
39751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },write:function (stream, buffer, offset, length, position /* ignored */) {
39761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var sock = stream.node.sock;
39771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return sock.sock_ops.sendmsg(sock, buffer, offset, length);
39781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },close:function (stream) {
39791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var sock = stream.node.sock;
39801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.sock_ops.close(sock);
39811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},nextname:function () {
39821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!SOCKFS.nextname.current) {
39831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          SOCKFS.nextname.current = 0;
39841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
39851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 'socket[' + (SOCKFS.nextname.current++) + ']';
39861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },websocket_sock_ops:{createPeer:function (sock, addr, port) {
39871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var ws;
39881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof addr === 'object') {
39901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ws = addr;
39911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr = null;
39921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port = null;
39931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
39941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
39951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (ws) {
39961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // for sockets that've already connected (e.g. we're the server)
39971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // we can inspect the _socket property for the address
39981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (ws._socket) {
39991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              addr = ws._socket.remoteAddress;
40001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              port = ws._socket.remotePort;
40011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
40021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // if we're just now initializing a connection to the remote,
40031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // inspect the url property
40041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            else {
40051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
40061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!result) {
40071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new Error('WebSocket URL must be in the format ws(s)://address:port');
40081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
40091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              addr = result[1];
40101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              port = parseInt(result[2], 10);
40111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
40121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
40131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // create the actual websocket object and connect
40141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
40151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // runtimeConfig gets set to true if WebSocket runtime configuration is available.
40161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket']));
40171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#'
40191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // comments without checking context, so we'd end up with ws:#, the replace swaps the "#" for "//" again.
40201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var url = 'ws:#'.replace('#', '//');
40211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (runtimeConfig) {
40231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if ('string' === typeof Module['websocket']['url']) {
40241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  url = Module['websocket']['url']; // Fetch runtime WebSocket URL config.
40251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
40261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
40271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it.
40291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                url = url + addr + ':' + port;
40301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
40311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
40331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var subProtocols = 'binary'; // The default value is 'binary'
40341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (runtimeConfig) {
40361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if ('string' === typeof Module['websocket']['subprotocol']) {
40371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config.
40381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
40391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
40401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // The regex trims the string (removes spaces at the beginning and end, then splits the string by
40421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
40431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */);
40441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // The node ws library API for specifying optional subprotocol is slightly different than the browser's.
40461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols;
40471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // If node we use the ws library.
40491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];
40501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ws = new WebSocket(url, opts);
40511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ws.binaryType = 'arraybuffer';
40521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
40531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);
40541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
40551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
40561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var peer = {
40591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr: addr,
40601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port: port,
40611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            socket: ws,
40621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            dgram_send_queue: []
40631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
40641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          SOCKFS.websocket_sock_ops.addPeer(sock, peer);
40661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);
40671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // if this is a bound dgram socket, send the port number first to allow
40691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // us to override the ephemeral port reported to us by remotePort on the
40701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // remote end.
40711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 2 && typeof sock.sport !== 'undefined') {
40721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.dgram_send_queue.push(new Uint8Array([
40731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                255, 255, 255, 255,
40741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),
40751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)
40761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ]));
40771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
40781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return peer;
40801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },getPeer:function (sock, addr, port) {
40811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return sock.peers[addr + ':' + port];
40821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },addPeer:function (sock, peer) {
40831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.peers[peer.addr + ':' + peer.port] = peer;
40841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },removePeer:function (sock, peer) {
40851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          delete sock.peers[peer.addr + ':' + peer.port];
40861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },handlePeerEvents:function (sock, peer) {
40871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var first = true;
40881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
40891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var handleOpen = function () {
40901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
40911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var queued = peer.dgram_send_queue.shift();
40921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              while (queued) {
40931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                peer.socket.send(queued);
40941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                queued = peer.dgram_send_queue.shift();
40951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
40961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
40971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // not much we can do here in the way of proper error handling as we've already
40981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // lied and said this data was sent. shut it down.
40991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              peer.socket.close();
41001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
41011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
41021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function handleMessage(data) {
41041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer
41051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            data = new Uint8Array(data);  // make a typed array view on the array buffer
41061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // if this is the port message, override the peer's port with it
41091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var wasfirst = first;
41101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            first = false;
41111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (wasfirst &&
41121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                data.length === 10 &&
41131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&
41141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {
41151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // update the peer's port and it's key in the peer map
41161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var newport = ((data[8] << 8) | data[9]);
41171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              SOCKFS.websocket_sock_ops.removePeer(sock, peer);
41181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              peer.port = newport;
41191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              SOCKFS.websocket_sock_ops.addPeer(sock, peer);
41201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return;
41211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
41221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });
41241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
41251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (ENVIRONMENT_IS_NODE) {
41271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.socket.on('open', handleOpen);
41281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.socket.on('message', function(data, flags) {
41291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!flags.binary) {
41301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return;
41311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
41321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer
41331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
41341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.socket.on('error', function() {
41351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // don't throw
41361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            });
41371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
41381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.socket.onopen = handleOpen;
41391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            peer.socket.onmessage = function peer_socket_onmessage(event) {
41401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              handleMessage(event.data);
41411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            };
41421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },poll:function (sock) {
41441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 1 && sock.server) {
41451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // listen sockets should only say they're available for reading
41461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // if there are pending clients.
41471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return sock.pending.length ? (64 | 1) : 0;
41481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var mask = 0;
41511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets
41521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :
41531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            null;
41541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.recv_queue.length ||
41561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              !dest ||  // connection-less sockets are always ready to read
41571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              (dest && dest.socket.readyState === dest.socket.CLOSING) ||
41581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed
41591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            mask |= (64 | 1);
41601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!dest ||  // connection-less sockets are always ready to write
41631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              (dest && dest.socket.readyState === dest.socket.OPEN)) {
41641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            mask |= 4;
41651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||
41681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              (dest && dest.socket.readyState === dest.socket.CLOSED)) {
41691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            mask |= 16;
41701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
41721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return mask;
41731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },ioctl:function (sock, request, arg) {
41741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          switch (request) {
41751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 21531:
41761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var bytes = 0;
41771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (sock.recv_queue.length) {
41781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                bytes = sock.recv_queue[0].data.length;
41791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
41801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              HEAP32[((arg)>>2)]=bytes;
41811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return 0;
41821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            default:
41831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return ERRNO_CODES.EINVAL;
41841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },close:function (sock) {
41861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // if we've spawned a listen server, close it
41871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.server) {
41881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
41891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              sock.server.close();
41901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
41911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
41921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            sock.server = null;
41931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
41941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // close any peer connections
41951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var peers = Object.keys(sock.peers);
41961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          for (var i = 0; i < peers.length; i++) {
41971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var peer = sock.peers[peers[i]];
41981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
41991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              peer.socket.close();
42001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
42011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
42021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            SOCKFS.websocket_sock_ops.removePeer(sock, peer);
42031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 0;
42051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },bind:function (sock, addr, port) {
42061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {
42071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound
42081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.saddr = addr;
42101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.sport = port || _mkport();
42111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // in order to emulate dgram sockets, we need to launch a listen server when
42121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // binding on a connection-less socket
42131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // note: this is only required on the server side
42141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 2) {
42151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // close the existing server if it exists
42161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (sock.server) {
42171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              sock.server.close();
42181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              sock.server = null;
42191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
42201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // swallow error operation not supported error that occurs when binding in the
42211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // browser where this isn't supported
42221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
42231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              sock.sock_ops.listen(sock, 0);
42241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch (e) {
42251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!(e instanceof FS.ErrnoError)) throw e;
42261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;
42271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
42281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },connect:function (sock, addr, port) {
42301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.server) {
42311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);
42321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // TODO autobind
42351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // if (!sock.addr && sock.type == 2) {
42361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // }
42371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // early out if we're already connected / in the middle of connecting
42391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {
42401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
42411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (dest) {
42421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (dest.socket.readyState === dest.socket.CONNECTING) {
42431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);
42441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
42451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);
42461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
42471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
42481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // add the socket to our peer list and set our
42511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // destination address / port to match
42521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
42531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.daddr = peer.addr;
42541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.dport = peer.port;
42551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // always "fail" in non-blocking mode
42571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);
42581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },listen:function (sock, backlog) {
42591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ENVIRONMENT_IS_NODE) {
42601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
42611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.server) {
42631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening
42641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
42651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var WebSocketServer = require('ws').Server;
42661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var host = sock.saddr;
42671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.server = new WebSocketServer({
42681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            host: host,
42691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port: sock.sport
42701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // TODO support backlog
42711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
42721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.server.on('connection', function(ws) {
42741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (sock.type === 1) {
42751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);
42761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // create a peer on the new socket
42781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);
42791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              newsock.daddr = peer.addr;
42801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              newsock.dport = peer.port;
42811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
42821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // push to queue for accept to pick up
42831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              sock.pending.push(newsock);
42841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
42851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // create a peer on the listen socket so calling sendto
42861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // with the listen socket and an address will resolve
42871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // to the correct client
42881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              SOCKFS.websocket_sock_ops.createPeer(sock, ws);
42891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
42901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
42911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.server.on('closed', function() {
42921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            sock.server = null;
42931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
42941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          sock.server.on('error', function() {
42951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // don't throw
42961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          });
42971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },accept:function (listensock) {
42981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!listensock.server) {
42991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
43001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var newsock = listensock.pending.shift();
43021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          newsock.stream.flags = listensock.stream.flags;
43031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return newsock;
43041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },getname:function (sock, peer) {
43051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var addr, port;
43061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (peer) {
43071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (sock.daddr === undefined || sock.dport === undefined) {
43081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
43091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
43101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr = sock.daddr;
43111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port = sock.dport;
43121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
43131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // TODO saddr and sport will be set for bind()'d UDP sockets, but what
43141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // should we be returning for TCP sockets that've been connect()'d?
43151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr = sock.saddr || 0;
43161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port = sock.sport || 0;
43171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return { addr: addr, port: port };
43191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },sendmsg:function (sock, buffer, offset, length, addr, port) {
43201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 2) {
43211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // connection-less sockets will honor the message address,
43221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // and otherwise fall back to the bound destination address
43231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (addr === undefined || port === undefined) {
43241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              addr = sock.daddr;
43251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              port = sock.dport;
43261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
43271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // if there was no address to fall back to, error out
43281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (addr === undefined || port === undefined) {
43291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);
43301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
43311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
43321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // connection-based sockets will only use the bound
43331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr = sock.daddr;
43341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port = sock.dport;
43351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // find the peer for the destination address
43381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);
43391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // early out if not connected with a connection-based socket
43411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 1) {
43421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
43431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
43441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else if (dest.socket.readyState === dest.socket.CONNECTING) {
43451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
43461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
43471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // create a copy of the incoming data to send, as the WebSocket API
43501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // doesn't work entirely with an ArrayBufferView, it'll just send
43511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // the entire underlying buffer
43521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var data;
43531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {
43541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            data = buffer.slice(offset, offset + length);
43551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {  // ArrayBufferView
43561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);
43571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // if we're emulating a connection-less dgram socket and don't have
43601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // a cached connection, queue the buffer to send upon connect and
43611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // lie, saying the data was sent now.
43621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 2) {
43631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
43641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // if we're not connected, open a new connection
43651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
43661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
43671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
43681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              dest.dgram_send_queue.push(data);
43691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return length;
43701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
43711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          try {
43741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // send the actual data
43751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            dest.socket.send(data);
43761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return length;
43771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } catch (e) {
43781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
43791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },recvmsg:function (sock, length) {
43811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
43821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 1 && sock.server) {
43831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // tcp servers should not be recv()'ing on the listen socket
43841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
43851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
43861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var queued = sock.recv_queue.shift();
43881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!queued) {
43891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (sock.type === 1) {
43901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
43911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
43921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!dest) {
43931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // if we have a destination address but are not connected, error out
43941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
43951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
43961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
43971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // return null if the socket has closed
43981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return null;
43991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
44001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              else {
44011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // else, our socket is in a valid state but truly has nothing available
44021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
44031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
44041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
44051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
44061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
44071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
44081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
44101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // requeued TCP data it'll be an ArrayBufferView
44111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var queuedLength = queued.data.byteLength || queued.data.length;
44121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var queuedOffset = queued.data.byteOffset || 0;
44131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var queuedBuffer = queued.data.buffer || queued.data;
44141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var bytesRead = Math.min(length, queuedLength);
44151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var res = {
44161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
44171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            addr: queued.addr,
44181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            port: queued.port
44191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
44201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // push back any unread data for TCP connections
44231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (sock.type === 1 && bytesRead < queuedLength) {
44241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var bytesRemaining = queuedLength - bytesRead;
44251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);
44261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            sock.recv_queue.unshift(queued);
44271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
44281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return res;
44301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }}};function _send(fd, buf, len, flags) {
44311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var sock = SOCKFS.getSocket(fd);
44321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!sock) {
44331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ___setErrNo(ERRNO_CODES.EBADF);
44341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
44351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // TODO honor flags
44371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return _write(fd, buf, len);
44381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
44391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _pwrite(fildes, buf, nbyte, offset) {
44411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
44421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
44431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var stream = FS.getStream(fildes);
44441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!stream) {
44451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ___setErrNo(ERRNO_CODES.EBADF);
44461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
44471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      try {
44491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var slab = HEAP8;
44501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.write(stream, slab, buf, nbyte, offset);
44511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } catch (e) {
44521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.handleFSError(e);
44531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
44541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function _write(fildes, buf, nbyte) {
44561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // ssize_t write(int fildes, const void *buf, size_t nbyte);
44571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
44581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var stream = FS.getStream(fildes);
44591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!stream) {
44601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        ___setErrNo(ERRNO_CODES.EBADF);
44611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
44621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      try {
44661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var slab = HEAP8;
44671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return FS.write(stream, slab, buf, nbyte);
44681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } catch (e) {
44691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        FS.handleFSError(e);
44701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
44711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
44731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _fileno(stream) {
44751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int fileno(FILE *stream);
44761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
44771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      stream = FS.getStreamFromPtr(stream);
44781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!stream) return -1;
44791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return stream.fd;
44801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function _fwrite(ptr, size, nitems, stream) {
44811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
44821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html
44831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var bytesToWrite = nitems * size;
44841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (bytesToWrite == 0) return 0;
44851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var fd = _fileno(stream);
44861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var bytesWritten = _write(fd, ptr, bytesToWrite);
44871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (bytesWritten == -1) {
44881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var streamObj = FS.getStreamFromPtr(stream);
44891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (streamObj) streamObj.error = true;
44901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return 0;
44911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
44921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return Math.floor(bytesWritten / size);
44931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
44941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
44951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
44981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["_strlen"] = _strlen;
44991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
45001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function __reallyNegative(x) {
45011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return x < 0 || (x === 0 && (1/x) === -Infinity);
45021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function __formatString(format, varargs) {
45031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var textIndex = format;
45041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var argIndex = 0;
45051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      function getNextArg(type) {
45061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // NOTE: Explicitly ignoring type safety. Otherwise this fails:
45071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //       int x = 4; printf("%c\n", (char)x);
45081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var ret;
45091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (type === 'double') {
45101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret = HEAPF64[(((varargs)+(argIndex))>>3)];
45111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else if (type == 'i64') {
45121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret = [HEAP32[(((varargs)+(argIndex))>>2)],
45131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                 HEAP32[(((varargs)+(argIndex+4))>>2)]];
45141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
45151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
45161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          type = 'i32'; // varargs are always i32, i64, or double
45171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret = HEAP32[(((varargs)+(argIndex))>>2)];
45181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
45191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        argIndex += Runtime.getNativeFieldSize(type);
45201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ret;
45211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
45221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
45231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = [];
45241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var curr, next, currArg;
45251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      while(1) {
45261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var startTextIndex = textIndex;
45271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        curr = HEAP8[(textIndex)];
45281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (curr === 0) break;
45291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        next = HEAP8[((textIndex+1)|0)];
45301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (curr == 37) {
45311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Handle flags.
45321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flagAlwaysSigned = false;
45331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flagLeftAlign = false;
45341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flagAlternative = false;
45351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flagZeroPad = false;
45361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flagPadSign = false;
45371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flagsLoop: while (1) {
45381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            switch (next) {
45391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              case 43:
45401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagAlwaysSigned = true;
45411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                break;
45421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              case 45:
45431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagLeftAlign = true;
45441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                break;
45451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              case 35:
45461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagAlternative = true;
45471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                break;
45481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              case 48:
45491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (flagZeroPad) {
45501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  break flagsLoop;
45511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
45521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  flagZeroPad = true;
45531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  break;
45541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
45551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              case 32:
45561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagPadSign = true;
45571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                break;
45581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              default:
45591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                break flagsLoop;
45601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
45611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            textIndex++;
45621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            next = HEAP8[((textIndex+1)|0)];
45631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
45641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
45651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Handle width.
45661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var width = 0;
45671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (next == 42) {
45681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            width = getNextArg('i32');
45691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            textIndex++;
45701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            next = HEAP8[((textIndex+1)|0)];
45711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
45721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            while (next >= 48 && next <= 57) {
45731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              width = width * 10 + (next - 48);
45741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              textIndex++;
45751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              next = HEAP8[((textIndex+1)|0)];
45761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
45771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
45781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
45791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Handle precision.
45801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var precisionSet = false, precision = -1;
45811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (next == 46) {
45821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            precision = 0;
45831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            precisionSet = true;
45841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            textIndex++;
45851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            next = HEAP8[((textIndex+1)|0)];
45861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (next == 42) {
45871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              precision = getNextArg('i32');
45881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              textIndex++;
45891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
45901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              while(1) {
45911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var precisionChr = HEAP8[((textIndex+1)|0)];
45921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (precisionChr < 48 ||
45931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    precisionChr > 57) break;
45941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                precision = precision * 10 + (precisionChr - 48);
45951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                textIndex++;
45961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
45971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
45981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            next = HEAP8[((textIndex+1)|0)];
45991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
46001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (precision < 0) {
46011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            precision = 6; // Standard default.
46021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            precisionSet = false;
46031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
46041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
46051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Handle integer sizes. WARNING: These assume a 32-bit architecture!
46061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var argSize;
46071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          switch (String.fromCharCode(next)) {
46081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'h':
46091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var nextNext = HEAP8[((textIndex+2)|0)];
46101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (nextNext == 104) {
46111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                textIndex++;
46121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argSize = 1; // char (actually i32 in varargs)
46131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
46141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argSize = 2; // short (actually i32 in varargs)
46151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
46161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
46171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'l':
46181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var nextNext = HEAP8[((textIndex+2)|0)];
46191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (nextNext == 108) {
46201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                textIndex++;
46211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argSize = 8; // long long
46221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
46231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argSize = 4; // long
46241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
46251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
46261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'L': // long long
46271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'q': // int64_t
46281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'j': // intmax_t
46291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argSize = 8;
46301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
46311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'z': // size_t
46321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 't': // ptrdiff_t
46331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'I': // signed ptrdiff_t or unsigned size_t
46341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argSize = 4;
46351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
46361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            default:
46371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argSize = null;
46381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
46391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (argSize) textIndex++;
46401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          next = HEAP8[((textIndex+1)|0)];
46411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
46421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Handle type specifier.
46431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          switch (String.fromCharCode(next)) {
46441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {
46451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Integer.
46461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var signed = next == 100 || next == 105;
46471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argSize = argSize || 4;
46481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var currArg = getNextArg('i' + (argSize * 8));
46491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var argText;
46501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Flatten i64-1 [low, high] into a (slightly rounded) double
46511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (argSize == 8) {
46521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);
46531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
46541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Truncate to requested size.
46551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (argSize <= 4) {
46561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var limit = Math.pow(256, argSize) - 1;
46571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
46581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
46591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Format the number.
46601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var currAbsArg = Math.abs(currArg);
46611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var prefix = '';
46621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (next == 100 || next == 105) {
46631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = reSign(currArg, 8 * argSize, 1).toString(10);
46641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else if (next == 117) {
46651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = unSign(currArg, 8 * argSize, 1).toString(10);
46661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                currArg = Math.abs(currArg);
46671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else if (next == 111) {
46681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
46691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else if (next == 120 || next == 88) {
46701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                prefix = (flagAlternative && currArg != 0) ? '0x' : '';
46711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (currArg < 0) {
46721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  // Represent negative numbers in hex as 2's complement.
46731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  currArg = -currArg;
46741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = (currAbsArg - 1).toString(16);
46751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  var buffer = [];
46761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  for (var i = 0; i < argText.length; i++) {
46771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));
46781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
46791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = buffer.join('');
46801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  while (argText.length < argSize * 2) argText = 'f' + argText;
46811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
46821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = currAbsArg.toString(16);
46831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
46841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (next == 88) {
46851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  prefix = prefix.toUpperCase();
46861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = argText.toUpperCase();
46871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
46881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else if (next == 112) {
46891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (currAbsArg === 0) {
46901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = '(nil)';
46911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
46921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  prefix = '0x';
46931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = currAbsArg.toString(16);
46941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
46951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
46961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (precisionSet) {
46971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                while (argText.length < precision) {
46981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = '0' + argText;
46991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
47011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Add sign if needed
47031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (currArg >= 0) {
47041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (flagAlwaysSigned) {
47051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  prefix = '+' + prefix;
47061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else if (flagPadSign) {
47071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  prefix = ' ' + prefix;
47081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
47101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Move sign to prefix so we zero-pad after the sign
47121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (argText.charAt(0) == '-') {
47131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                prefix = '-' + prefix;
47141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = argText.substr(1);
47151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
47161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Add padding.
47181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              while (prefix.length + argText.length < width) {
47191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (flagLeftAlign) {
47201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText += ' ';
47211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
47221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (flagZeroPad) {
47231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = '0' + argText;
47241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  } else {
47251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    prefix = ' ' + prefix;
47261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
47271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
47291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Insert the result into the buffer.
47311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argText = prefix + argText;
47321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argText.split('').forEach(function(chr) {
47331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ret.push(chr.charCodeAt(0));
47341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              });
47351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
47361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
47371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {
47381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Float.
47391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var currArg = getNextArg('double');
47401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var argText;
47411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (isNaN(currArg)) {
47421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = 'nan';
47431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagZeroPad = false;
47441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else if (!isFinite(currArg)) {
47451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = (currArg < 0 ? '-' : '') + 'inf';
47461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                flagZeroPad = false;
47471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
47481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var isGeneral = false;
47491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var effectivePrecision = Math.min(precision, 20);
47501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // Convert g/G to f/F or e/E, as per:
47521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html
47531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (next == 103 || next == 71) {
47541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  isGeneral = true;
47551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  precision = precision || 1;
47561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);
47571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (precision > exponent && exponent >= -4) {
47581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);
47591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    precision -= exponent + 1;
47601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  } else {
47611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);
47621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    precision--;
47631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
47641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  effectivePrecision = Math.min(precision, 20);
47651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (next == 101 || next == 69) {
47681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = currArg.toExponential(effectivePrecision);
47691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  // Make sure the exponent has at least 2 digits.
47701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (/[eE][-+]\d$/.test(argText)) {
47711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);
47721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
47731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else if (next == 102 || next == 70) {
47741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText = currArg.toFixed(effectivePrecision);
47751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (currArg === 0 && __reallyNegative(currArg)) {
47761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = '-' + argText;
47771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
47781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var parts = argText.split('e');
47811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (isGeneral && !flagAlternative) {
47821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  // Discard trailing zeros and periods.
47831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&
47841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {
47851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    parts[0] = parts[0].slice(0, -1);
47861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
47871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
47881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  // Make sure we have a period in alternative mode.
47891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
47901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  // Zero pad until required precision.
47911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  while (precision > effectivePrecision++) parts[0] += '0';
47921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
47931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');
47941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // Capitalize 'E' if needed.
47961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (next == 69) argText = argText.toUpperCase();
47971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
47981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // Add sign.
47991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (currArg >= 0) {
48001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (flagAlwaysSigned) {
48011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = '+' + argText;
48021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  } else if (flagPadSign) {
48031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = ' ' + argText;
48041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
48051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
48061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
48081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Add padding.
48091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              while (argText.length < width) {
48101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (flagLeftAlign) {
48111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  argText += ' ';
48121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else {
48131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
48141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = argText[0] + '0' + argText.slice(1);
48151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  } else {
48161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    argText = (flagZeroPad ? '0' : ' ') + argText;
48171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
48181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
48191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
48211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Adjust case.
48221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (next < 97) argText = argText.toUpperCase();
48231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
48241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Insert the result into the buffer.
48251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              argText.split('').forEach(function(chr) {
48261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ret.push(chr.charCodeAt(0));
48271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              });
48281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
48291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 's': {
48311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // String.
48321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var arg = getNextArg('i8*');
48331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var argLength = arg ? _strlen(arg) : '(null)'.length;
48341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (precisionSet) argLength = Math.min(argLength, precision);
48351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!flagLeftAlign) {
48361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                while (argLength < width--) {
48371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret.push(32);
48381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
48391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (arg) {
48411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                for (var i = 0; i < argLength; i++) {
48421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret.push(HEAPU8[((arg++)|0)]);
48431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
48441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
48451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));
48461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (flagLeftAlign) {
48481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                while (argLength < width--) {
48491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret.push(32);
48501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
48511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
48531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'c': {
48551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Character.
48561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (flagLeftAlign) ret.push(getNextArg('i8'));
48571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              while (--width > 0) {
48581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ret.push(32);
48591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (!flagLeftAlign) ret.push(getNextArg('i8'));
48611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
48621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case 'n': {
48641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Write the length written so far to the next parameter.
48651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var ptr = getNextArg('i32*');
48661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              HEAP32[((ptr)>>2)]=ret.length;
48671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
48681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            case '%': {
48701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Literal percent sign.
48711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ret.push(curr);
48721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
48731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            default: {
48751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              // Unknown specifiers remain untouched.
48761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              for (var i = startTextIndex; i < textIndex + 2; i++) {
48771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                ret.push(HEAP8[(i)]);
48781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
48791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
48801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
48811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          textIndex += 2;
48821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // TODO: Support a/A (hex float) and m (last error) specifiers.
48831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // TODO: Support %1${specifier} for arg selection.
48841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
48851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          ret.push(curr);
48861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          textIndex += 1;
48871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
48881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
48891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
48901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function _fprintf(stream, format, varargs) {
48911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int fprintf(FILE *restrict stream, const char *restrict format, ...);
48921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
48931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var result = __formatString(format, varargs);
48941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var stack = Runtime.stackSave();
48951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);
48961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Runtime.stackRestore(stack);
48971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
48981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function _printf(format, varargs) {
48991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int printf(const char *restrict format, ...);
49001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
49011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var stdout = HEAP32[((_stdout)>>2)];
49021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return _fprintf(stdout, format, varargs);
49031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
49041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
49051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
49061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _fputc(c, stream) {
49071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int fputc(int c, FILE *stream);
49081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
49091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var chr = unSign(c & 0xFF);
49101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP8[((_fputc.ret)|0)]=chr;
49111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var fd = _fileno(stream);
49121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = _write(fd, _fputc.ret, 1);
49131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (ret == -1) {
49141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var streamObj = FS.getStreamFromPtr(stream);
49151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (streamObj) streamObj.error = true;
49161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return -1;
49171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
49181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return chr;
49191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
49201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }function _putchar(c) {
49211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // int putchar(int c);
49221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html
49231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return _fputc(c, HEAP32[((_stdout)>>2)]);
49241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
49251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
49261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _sbrk(bytes) {
49271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // Implement a Linux-like 'memory area' for our 'process'.
49281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // Changes the size of the memory area by |bytes|; returns the
49291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // address of the previous top ('break') of the memory area
49301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
49311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var self = _sbrk;
49321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!self.called) {
49331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
49341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        self.called = true;
49351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        assert(Runtime.dynamicAlloc);
49361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        self.alloc = Runtime.dynamicAlloc;
49371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
49381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
49391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = DYNAMICTOP;
49401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (bytes != 0) self.alloc(bytes);
49411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;  // Previous break location.
49421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
49431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
49441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _sysconf(name) {
49451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // long sysconf(int name);
49461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
49471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      switch(name) {
49481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 30: return PAGE_SIZE;
49491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 132:
49501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 133:
49511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 12:
49521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 137:
49531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 138:
49541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 15:
49551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 235:
49561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 16:
49571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 17:
49581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 18:
49591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 19:
49601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 20:
49611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 149:
49621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 13:
49631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 10:
49641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 236:
49651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 153:
49661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 9:
49671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 21:
49681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 22:
49691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 159:
49701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 154:
49711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 14:
49721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 77:
49731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 78:
49741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 139:
49751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 80:
49761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 81:
49771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 79:
49781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 82:
49791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 68:
49801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 67:
49811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 164:
49821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 11:
49831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 29:
49841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 47:
49851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 48:
49861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 95:
49871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 52:
49881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 51:
49891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 46:
49901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 200809;
49911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 27:
49921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 246:
49931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 127:
49941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 128:
49951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 23:
49961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 24:
49971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 160:
49981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 161:
49991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 181:
50001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 182:
50011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 242:
50021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 183:
50031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 184:
50041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 243:
50051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 244:
50061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 245:
50071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 165:
50081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 178:
50091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 179:
50101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 49:
50111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 50:
50121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 168:
50131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 169:
50141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 175:
50151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 170:
50161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 171:
50171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 172:
50181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 97:
50191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 76:
50201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 32:
50211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 173:
50221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 35:
50231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return -1;
50241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 176:
50251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 177:
50261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 7:
50271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 155:
50281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 8:
50291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 157:
50301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 125:
50311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 126:
50321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 92:
50331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 93:
50341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 129:
50351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 130:
50361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 131:
50371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 94:
50381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 91:
50391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 1;
50401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 74:
50411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 60:
50421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 69:
50431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 70:
50441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 4:
50451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 1024;
50461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 31:
50471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 42:
50481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 72:
50491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 32;
50501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 87:
50511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 26:
50521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 33:
50531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 2147483647;
50541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 34:
50551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 1:
50561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 47839;
50571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 38:
50581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 36:
50591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 99;
50601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 43:
50611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 37:
50621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return 2048;
50631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 0: return 2097152;
50641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 3: return 65536;
50651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 28: return 32768;
50661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 44: return 32767;
50671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 75: return 16384;
50681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 39: return 1000;
50691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 89: return 700;
50701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 71: return 256;
50711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 40: return 255;
50721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 2: return 100;
50731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 180: return 64;
50741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 25: return 20;
50751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 5: return 16;
50761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 6: return 6;
50771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 73: return 4;
50781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        case 84: return 1;
50791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
50801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      ___setErrNo(ERRNO_CODES.EINVAL);
50811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return -1;
50821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
50831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
50841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
50851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["_memset"] = _memset;
50861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
50871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function ___errno_location() {
50881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ___errno_state;
50891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
50901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
50911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _abort() {
50921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module['abort']();
50931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
50941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
50951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false,queue:[],pause:function () {
50961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mainLoop.shouldPause = true;
50971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },resume:function () {
50981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Browser.mainLoop.paused) {
50991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mainLoop.paused = false;
51001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mainLoop.scheduler();
51011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
51021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mainLoop.shouldPause = false;
51031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        },updateStatus:function () {
51041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Module['setStatus']) {
51051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var message = Module['statusMessage'] || 'Please wait...';
51061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var remaining = Browser.mainLoop.remainingBlockers;
51071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var expected = Browser.mainLoop.expectedBlockers;
51081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (remaining) {
51091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (remaining < expected) {
51101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
51111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              } else {
51121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                Module['setStatus'](message);
51131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
51141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
51151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              Module['setStatus']('');
51161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
51171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
51181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
51191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers
51201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
51211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
51221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.initted = true;
51231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
51241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
51251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          new Blob();
51261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.hasBlobConstructor = true;
51271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch(e) {
51281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.hasBlobConstructor = false;
51291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          console.log("warning: no blob constructor, cannot create blobs with mimetypes");
51301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
51311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
51321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
51331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
51341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
51351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Module.noImageDecoding = true;
51361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
51371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
51381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Support for plugins that can process preloaded files. You can add more of these to
51391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // your app by creating and appending to Module.preloadPlugins.
51401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        //
51411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Each plugin is asked if it can handle a file based on the file's name. If it can,
51421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // it is given the file's raw data. When it is done, it calls a callback with the file's
51431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // (possibly modified) data. For example, a plugin might decompress a file, or it
51441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // might create some side data structure for use later (like an Image element, etc.).
51451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
51461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var imagePlugin = {};
51471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
51481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
51491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
51501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
51511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var b = null;
51521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Browser.hasBlobConstructor) {
51531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
51541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              b = new Blob([byteArray], { type: Browser.getMimetype(name) });
51551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (b.size !== byteArray.length) { // Safari bug #118630
51561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                // Safari's Blob can only take an ArrayBuffer
51571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
51581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
51591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch(e) {
51601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
51611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
51621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
51631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!b) {
51641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var bb = new Browser.BlobBuilder();
51651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
51661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            b = bb.getBlob();
51671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
51681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var url = Browser.URLObject.createObjectURL(b);
51691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var img = new Image();
51701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          img.onload = function img_onload() {
51711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            assert(img.complete, 'Image ' + name + ' could not be decoded');
51721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var canvas = document.createElement('canvas');
51731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.width = img.width;
51741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.height = img.height;
51751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var ctx = canvas.getContext('2d');
51761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ctx.drawImage(img, 0, 0);
51771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module["preloadedImages"][name] = canvas;
51781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.URLObject.revokeObjectURL(url);
51791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (onload) onload(byteArray);
51801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
51811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          img.onerror = function img_onerror(event) {
51821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            console.log('Image ' + url + ' could not be decoded');
51831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (onerror) onerror();
51841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          };
51851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          img.src = url;
51861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
51871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['preloadPlugins'].push(imagePlugin);
51881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
51891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var audioPlugin = {};
51901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
51911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
51921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
51931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
51941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var done = false;
51951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function finish(audio) {
51961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (done) return;
51971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            done = true;
51981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module["preloadedAudios"][name] = audio;
51991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (onload) onload(byteArray);
52001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
52011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          function fail() {
52021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (done) return;
52031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            done = true;
52041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Module["preloadedAudios"][name] = new Audio(); // empty shim
52051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (onerror) onerror();
52061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
52071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Browser.hasBlobConstructor) {
52081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
52091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
52101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } catch(e) {
52111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return fail();
52121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
52131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
52141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var audio = new Audio();
52151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
52161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            audio.onerror = function audio_onerror(event) {
52171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              if (done) return;
52181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
52191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              function encode64(data) {
52201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
52211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var PAD = '=';
52221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var ret = '';
52231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var leftchar = 0;
52241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                var leftbits = 0;
52251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                for (var i = 0; i < data.length; i++) {
52261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  leftchar = (leftchar << 8) | data[i];
52271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  leftbits += 8;
52281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  while (leftbits >= 6) {
52291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    var curr = (leftchar >> (leftbits-6)) & 0x3f;
52301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    leftbits -= 6;
52311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                    ret += BASE[curr];
52321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  }
52331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
52341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                if (leftbits == 2) {
52351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret += BASE[(leftchar&3) << 4];
52361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret += PAD + PAD;
52371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                } else if (leftbits == 4) {
52381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret += BASE[(leftchar&0xf) << 2];
52391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                  ret += PAD;
52401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                }
52411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return ret;
52421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
52431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
52441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              finish(audio); // we don't wait for confirmation this worked - but it's worth trying
52451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            };
52461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            audio.src = url;
52471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
52481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.safeSetTimeout(function() {
52491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              finish(audio); // try to use it even though it is not necessarily ready to play
52501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }, 10000);
52511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
52521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            return fail();
52531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
52541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
52551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['preloadPlugins'].push(audioPlugin);
52561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Canvas event setup
52581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var canvas = Module['canvas'];
52601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module
52621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // Module['forcedAspectRatio'] = 4 / 3;
52631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvas.requestPointerLock = canvas['requestPointerLock'] ||
52651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                    canvas['mozRequestPointerLock'] ||
52661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                    canvas['webkitRequestPointerLock'] ||
52671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                    canvas['msRequestPointerLock'] ||
52681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                    function(){};
52691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvas.exitPointerLock = document['exitPointerLock'] ||
52701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                 document['mozExitPointerLock'] ||
52711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                 document['webkitExitPointerLock'] ||
52721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                 document['msExitPointerLock'] ||
52731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                 function(){}; // no-op if function does not exist
52741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
52751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function pointerLockChange() {
52771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.pointerLock = document['pointerLockElement'] === canvas ||
52781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                document['mozPointerLockElement'] === canvas ||
52791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                document['webkitPointerLockElement'] === canvas ||
52801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                document['msPointerLockElement'] === canvas;
52811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
52821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        document.addEventListener('pointerlockchange', pointerLockChange, false);
52841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        document.addEventListener('mozpointerlockchange', pointerLockChange, false);
52851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
52861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        document.addEventListener('mspointerlockchange', pointerLockChange, false);
52871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
52881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['elementPointerLock']) {
52891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          canvas.addEventListener("click", function(ev) {
52901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (!Browser.pointerLock && canvas.requestPointerLock) {
52911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.requestPointerLock();
52921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ev.preventDefault();
52931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
52941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }, false);
52951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
52961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
52971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var ctx;
52981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var errorInfo = '?';
52991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function onContextCreationError(event) {
53001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          errorInfo = event.statusMessage || errorInfo;
53011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        try {
53031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (useWebGL) {
53041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var contextAttributes = {
53051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              antialias: false,
53061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              alpha: false
53071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            };
53081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (webGLContextAttributes) {
53101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              for (var attribute in webGLContextAttributes) {
53111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                contextAttributes[attribute] = webGLContextAttributes[attribute];
53121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              }
53131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
53141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
53171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            try {
53181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ['experimental-webgl', 'webgl'].some(function(webglId) {
53191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                return ctx = canvas.getContext(webglId, contextAttributes);
53201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              });
53211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } finally {
53221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
53231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
53241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
53251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            ctx = canvas.getContext('2d');
53261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
53271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ctx) throw ':(';
53281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } catch (e) {
53291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Module.print('Could not create canvas: ' + [errorInfo, e]);
53301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          return null;
53311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (useWebGL) {
53331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Set the background of the WebGL canvas to black
53341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          canvas.style.backgroundColor = "black";
53351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Warn on context loss
53371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          canvas.addEventListener('webglcontextlost', function(event) {
53381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            alert('WebGL context lost. You will need to reload the page.');
53391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }, false);
53401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (setInModule) {
53421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          GLctx = Module.ctx = ctx;
53431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Module.useWebGL = useWebGL;
53441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
53451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.init();
53461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return ctx;
53481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
53491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.lockPointer = lockPointer;
53501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.resizeCanvas = resizeCanvas;
53511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
53521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
53531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var canvas = Module['canvas'];
53551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        function fullScreenChange() {
53561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.isFullScreen = false;
53571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var canvasContainer = canvas.parentNode;
53581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
53591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
53601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               document['fullScreenElement'] || document['fullscreenElement'] ||
53611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               document['msFullScreenElement'] || document['msFullscreenElement'] ||
53621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               document['webkitCurrentFullScreenElement']) === canvasContainer) {
53631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.cancelFullScreen = document['cancelFullScreen'] ||
53641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                      document['mozCancelFullScreen'] ||
53651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                      document['webkitCancelFullScreen'] ||
53661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                      document['msExitFullscreen'] ||
53671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                      document['exitFullscreen'] ||
53681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                      function() {};
53691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
53701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (Browser.lockPointer) canvas.requestPointerLock();
53711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.isFullScreen = true;
53721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
53731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
53741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen
53761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
53771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvasContainer.parentNode.removeChild(canvasContainer);
53781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();
53801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
53811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
53821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.updateCanvasDimensions(canvas);
53831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!Browser.fullScreenHandlersInstalled) {
53861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.fullScreenHandlersInstalled = true;
53871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          document.addEventListener('fullscreenchange', fullScreenChange, false);
53881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          document.addEventListener('mozfullscreenchange', fullScreenChange, false);
53891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
53901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          document.addEventListener('MSFullscreenChange', fullScreenChange, false);
53911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
53921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root
53941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var canvasContainer = document.createElement("div");
53951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvas.parentNode.insertBefore(canvasContainer, canvas);
53961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvasContainer.appendChild(canvas);
53971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
53981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)
53991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||
54001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                            canvasContainer['mozRequestFullScreen'] ||
54011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                            canvasContainer['msRequestFullscreen'] ||
54021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
54031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        canvasContainer.requestFullScreen();
54041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },requestAnimationFrame:function requestAnimationFrame(func) {
54051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
54061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          setTimeout(func, 1000/60);
54071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
54081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!window.requestAnimationFrame) {
54091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            window.requestAnimationFrame = window['requestAnimationFrame'] ||
54101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           window['mozRequestAnimationFrame'] ||
54111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           window['webkitRequestAnimationFrame'] ||
54121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           window['msRequestAnimationFrame'] ||
54131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           window['oRequestAnimationFrame'] ||
54141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                           window['setTimeout'];
54151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
54161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          window.requestAnimationFrame(func);
54171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
54181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },safeCallback:function (func) {
54191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return function() {
54201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ABORT) return func.apply(null, arguments);
54211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
54221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },safeRequestAnimationFrame:function (func) {
54231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return Browser.requestAnimationFrame(function() {
54241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ABORT) func();
54251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
54261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },safeSetTimeout:function (func, timeout) {
54271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return setTimeout(function() {
54281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ABORT) func();
54291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }, timeout);
54301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },safeSetInterval:function (func, timeout) {
54311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return setInterval(function() {
54321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!ABORT) func();
54331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }, timeout);
54341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMimetype:function (name) {
54351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return {
54361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'jpg': 'image/jpeg',
54371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'jpeg': 'image/jpeg',
54381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'png': 'image/png',
54391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'bmp': 'image/bmp',
54401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'ogg': 'audio/ogg',
54411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'wav': 'audio/wav',
54421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          'mp3': 'audio/mpeg'
54431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }[name.substr(name.lastIndexOf('.')+1)];
54441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getUserMedia:function (func) {
54451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if(!window.getUserMedia) {
54461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          window.getUserMedia = navigator['getUserMedia'] ||
54471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch                                navigator['mozGetUserMedia'];
54481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
54491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        window.getUserMedia(func);
54501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMovementX:function (event) {
54511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return event['movementX'] ||
54521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               event['mozMovementX'] ||
54531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               event['webkitMovementX'] ||
54541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               0;
54551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMovementY:function (event) {
54561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return event['movementY'] ||
54571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               event['mozMovementY'] ||
54581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               event['webkitMovementY'] ||
54591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch               0;
54601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },getMouseWheelDelta:function (event) {
54611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));
54621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
54631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Browser.pointerLock) {
54641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // When the pointer is locked, calculate the coordinates
54651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // based on the movement of the mouse.
54661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Workaround for Firefox bug 764498
54671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (event.type != 'mousemove' &&
54681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              ('mozMovementX' in event)) {
54691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseMovementX = Browser.mouseMovementY = 0;
54701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
54711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseMovementX = Browser.getMovementX(event);
54721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseMovementY = Browser.getMovementY(event);
54731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
54741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
54751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // check if SDL is available
54761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof SDL != "undefined") {
54771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
54781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
54791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
54801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // just add the mouse delta to the current absolut mouse position
54811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            // FIXME: ideally this should be clamped against the canvas size and zero
54821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseX += Browser.mouseMovementX;
54831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            Browser.mouseY += Browser.mouseMovementY;
54841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
54851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
54861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Otherwise, calculate the movement based on the changes
54871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // in the coordinates.
54881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var rect = Module["canvas"].getBoundingClientRect();
54891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var x, y;
54901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
54911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // Neither .scrollX or .pageXOffset are defined in a spec, but
54921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // we prefer .scrollX because it is currently in a spec draft.
54931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
54941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
54951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
54961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (event.type == 'touchstart' ||
54971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              event.type == 'touchend' ||
54981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              event.type == 'touchmove') {
54991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            var t = event.touches.item(0);
55001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (t) {
55011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              x = t.pageX - (scrollX + rect.left);
55021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              y = t.pageY - (scrollY + rect.top);
55031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
55041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              return;
55051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
55061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
55071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            x = event.pageX - (scrollX + rect.left);
55081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            y = event.pageY - (scrollY + rect.top);
55091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
55101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
55111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // the canvas might be CSS-scaled compared to its backbuffer;
55121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // SDL-using content will want mouse coordinates in terms
55131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          // of backbuffer units.
55141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var cw = Module["canvas"].width;
55151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var ch = Module["canvas"].height;
55161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          x = x * (cw / rect.width);
55171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          y = y * (ch / rect.height);
55181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
55191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mouseMovementX = x - Browser.mouseX;
55201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mouseMovementY = y - Browser.mouseY;
55211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mouseX = x;
55221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          Browser.mouseY = y;
55231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
55241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },xhrLoad:function (url, onload, onerror) {
55251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var xhr = new XMLHttpRequest();
55261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        xhr.open('GET', url, true);
55271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        xhr.responseType = 'arraybuffer';
55281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        xhr.onload = function xhr_onload() {
55291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
55301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            onload(xhr.response);
55311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
55321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            onerror();
55331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
55341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        };
55351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        xhr.onerror = onerror;
55361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        xhr.send(null);
55371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },asyncLoad:function (url, onload, onerror, noRunDep) {
55381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.xhrLoad(url, function(arrayBuffer) {
55391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
55401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          onload(new Uint8Array(arrayBuffer));
55411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (!noRunDep) removeRunDependency('al ' + url);
55421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }, function(event) {
55431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (onerror) {
55441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            onerror();
55451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
55461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            throw 'Loading data file "' + url + '" failed.';
55471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
55481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
55491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!noRunDep) addRunDependency('al ' + url);
55501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },resizeListeners:[],updateResizeListeners:function () {
55511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var canvas = Module['canvas'];
55521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.resizeListeners.forEach(function(listener) {
55531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          listener(canvas.width, canvas.height);
55541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        });
55551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },setCanvasSize:function (width, height, noUpdates) {
55561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var canvas = Module['canvas'];
55571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.updateCanvasDimensions(canvas, width, height);
55581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (!noUpdates) Browser.updateResizeListeners();
55591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
55601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // check if SDL is available
55611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof SDL != "undefined") {
55621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
55631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
55641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
55651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
55661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.updateResizeListeners();
55671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },setWindowedCanvasSize:function () {
55681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        // check if SDL is available
55691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (typeof SDL != "undefined") {
55701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
55711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
55721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
55731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
55741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Browser.updateResizeListeners();
55751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      },updateCanvasDimensions:function (canvas, wNative, hNative) {
55761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (wNative && hNative) {
55771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          canvas.widthNative = wNative;
55781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          canvas.heightNative = hNative;
55791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
55801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          wNative = canvas.widthNative;
55811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          hNative = canvas.heightNative;
55821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
55831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var w = wNative;
55841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        var h = hNative;
55851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {
55861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (w/h < Module['forcedAspectRatio']) {
55871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            w = Math.round(h * Module['forcedAspectRatio']);
55881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
55891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            h = Math.round(w / Module['forcedAspectRatio']);
55901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
55911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
55921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
55931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
55941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             document['fullScreenElement'] || document['fullscreenElement'] ||
55951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             document['msFullScreenElement'] || document['msFullscreenElement'] ||
55961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {
55971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           var factor = Math.min(screen.width / w, screen.height / h);
55981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           w = Math.round(w * factor);
55991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           h = Math.round(h * factor);
56001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
56011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (Browser.resizeCanvas) {
56021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (canvas.width  != w) canvas.width  = w;
56031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (canvas.height != h) canvas.height = h;
56041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof canvas.style != 'undefined') {
56051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.style.removeProperty( "width");
56061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            canvas.style.removeProperty("height");
56071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
56081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
56091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (canvas.width  != wNative) canvas.width  = wNative;
56101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (canvas.height != hNative) canvas.height = hNative;
56111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (typeof canvas.style != 'undefined') {
56121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (w != wNative || h != hNative) {
56131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.style.setProperty( "width", w + "px", "important");
56141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.style.setProperty("height", h + "px", "important");
56151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
56161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.style.removeProperty( "width");
56171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              canvas.style.removeProperty("height");
56181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
56191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
56201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
56211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }};
56221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _time(ptr) {
56241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      var ret = Math.floor(Date.now()/1000);
56251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (ptr) {
56261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[((ptr)>>2)]=ret;
56271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
56281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return ret;
56291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
56301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function _emscripten_memcpy_big(dest, src, num) {
56341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
56351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return dest;
56361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
56371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["_memcpy"] = _memcpy;
56381b268ca467c924004286c97bac133db489cf43d0Ben MurdochFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;
56391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
56401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
56411b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
56421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });
56431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch_fputc.ret = allocate([0], "i8", ALLOC_STATIC);
56441b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
56451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
56461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
56471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
56481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
56491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
56501b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
56511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56521b268ca467c924004286c97bac133db489cf43d0Ben MurdochstaticSealed = true; // seal the static portion of memory
56531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56541b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTACK_MAX = STACK_BASE + 5242880;
56551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56561b268ca467c924004286c97bac133db489cf43d0Ben MurdochDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
56571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56581b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");
56591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56611b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_min = Math.min;
56621b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction asmPrintInt(x, y) {
56631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
56641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
56651b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction asmPrintFloat(x, y) {
56661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
56671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
56681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_START_ASM
56691b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar asm = Wasm.instantiateModuleFromAsm((function Module(global, env, buffer) {
56701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  'use asm';
56711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAP8 = new global.Int8Array(buffer);
56721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAP16 = new global.Int16Array(buffer);
56731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAP32 = new global.Int32Array(buffer);
56741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAPU8 = new global.Uint8Array(buffer);
56751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAPU16 = new global.Uint16Array(buffer);
56761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAPU32 = new global.Uint32Array(buffer);
56771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAPF32 = new global.Float32Array(buffer);
56781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var HEAPF64 = new global.Float64Array(buffer);
56791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var STACKTOP=env.STACKTOP|0;
56811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var STACK_MAX=env.STACK_MAX|0;
56821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempDoublePtr=env.tempDoublePtr|0;
56831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ABORT=env.ABORT|0;
56841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var __THREW__ = 0;
56861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var threwValue = 0;
56871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var setjmpId = 0;
56881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var undef = 0;
56891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var nan = +env.NaN, inf = +env.Infinity;
56901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;
56911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
56921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet0 = 0;
56931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet1 = 0;
56941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet2 = 0;
56951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet3 = 0;
56961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet4 = 0;
56971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet5 = 0;
56981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet6 = 0;
56991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet7 = 0;
57001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet8 = 0;
57011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempRet9 = 0;
57021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_floor=global.Math.floor;
57031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_abs=global.Math.abs;
57041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_sqrt=global.Math.sqrt;
57051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_pow=global.Math.pow;
57061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_cos=global.Math.cos;
57071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_sin=global.Math.sin;
57081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_tan=global.Math.tan;
57091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_acos=global.Math.acos;
57101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_asin=global.Math.asin;
57111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_atan=global.Math.atan;
57121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_atan2=global.Math.atan2;
57131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_exp=global.Math.exp;
57141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_log=global.Math.log;
57151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_ceil=global.Math.ceil;
57161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_imul=global.Math.imul;
57171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var abort=env.abort;
57181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var assert=env.assert;
57191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var asmPrintInt=env.asmPrintInt;
57201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var asmPrintFloat=env.asmPrintFloat;
57211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var Math_min=env.min;
57221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _fflush=env._fflush;
57231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _emscripten_memcpy_big=env._emscripten_memcpy_big;
57241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _putchar=env._putchar;
57251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _fputc=env._fputc;
57261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _send=env._send;
57271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _pwrite=env._pwrite;
57281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _abort=env._abort;
57291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var __reallyNegative=env.__reallyNegative;
57301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _fwrite=env._fwrite;
57311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _sbrk=env._sbrk;
57321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _mkport=env._mkport;
57331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _fprintf=env._fprintf;
57341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ___setErrNo=env.___setErrNo;
57351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var __formatString=env.__formatString;
57361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _fileno=env._fileno;
57371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _printf=env._printf;
57381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _time=env._time;
57391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _sysconf=env._sysconf;
57401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var _write=env._write;
57411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var ___errno_location=env.___errno_location;
57421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var tempFloat = 0.0;
57431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
57441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_START_FUNCS
57451b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _malloc(i12) {
57461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i12 | 0;
57471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0;
57481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = STACKTOP;
57491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do {
57501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i12 >>> 0 < 245) {
57511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i12 >>> 0 < 11) {
57521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i12 = 16;
57531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
57541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i12 = i12 + 11 & -8;
57551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
57561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i20 = i12 >>> 3;
57571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i18 = HEAP32[14] | 0;
57581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i21 = i18 >>> i20;
57591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i21 & 3 | 0) != 0) {
57601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i6 = (i21 & 1 ^ 1) + i20 | 0;
57611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i5 = i6 << 1;
57621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i3 = 96 + (i5 << 2) | 0;
57631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i5 = 96 + (i5 + 2 << 2) | 0;
57641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i7 = HEAP32[i5 >> 2] | 0;
57651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i7 + 8 | 0;
57661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = HEAP32[i2 >> 2] | 0;
57671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    do {
57681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i3 | 0) != (i4 | 0)) {
57691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i4 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
57701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
57711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
57721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i8 = i4 + 12 | 0;
57731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) {
57741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i8 >> 2] = i3;
57751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i5 >> 2] = i4;
57761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
57771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
57781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
57791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
57801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
57811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[14] = i18 & ~(1 << i6);
57821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
57831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } while (0);
57841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = i6 << 3;
57851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i7 + 4 >> 2] = i32 | 3;
57861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = i7 + (i32 | 4) | 0;
57871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
57881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = i2;
57891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = i1;
57901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return i32 | 0;
57911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
57921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i12 >>> 0 > (HEAP32[64 >> 2] | 0) >>> 0) {
57931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i21 | 0) != 0) {
57941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = 2 << i20;
57951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i21 << i20 & (i7 | 0 - i7);
57961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = (i7 & 0 - i7) + -1 | 0;
57971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i7 >>> 12 & 16;
57981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i7 >>> i2;
57991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i7 >>> 5 & 8;
58001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i7 >>> i6;
58011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i5 = i7 >>> 2 & 4;
58021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i7 >>> i5;
58031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = i7 >>> 1 & 2;
58041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i7 >>> i4;
58051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i7 >>> 1 & 1;
58061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0;
58071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i3 << 1;
58081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = 96 + (i7 << 2) | 0;
58091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = 96 + (i7 + 2 << 2) | 0;
58101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i5 = HEAP32[i7 >> 2] | 0;
58111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i5 + 8 | 0;
58121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = HEAP32[i2 >> 2] | 0;
58131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
58141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i4 | 0) != (i6 | 0)) {
58151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
58161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
58171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
58181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = i6 + 12 | 0;
58191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) {
58201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i8 >> 2] = i4;
58211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i7 >> 2] = i6;
58221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
58231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
58241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
58251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
58261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
58271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[14] = i18 & ~(1 << i3);
58281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
58291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
58301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i3 << 3;
58311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = i6 - i12 | 0;
58321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i5 + 4 >> 2] = i12 | 3;
58331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i5 + i12 | 0;
58341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1;
58351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i5 + i6 >> 2] = i4;
58361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = HEAP32[64 >> 2] | 0;
58371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i6 | 0) != 0) {
58381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i5 = HEAP32[76 >> 2] | 0;
58391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i8 = i6 >>> 3;
58401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i9 = i8 << 1;
58411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = 96 + (i9 << 2) | 0;
58421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i7 = HEAP32[14] | 0;
58431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i8 = 1 << i8;
58441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i7 & i8 | 0) != 0) {
58451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = 96 + (i9 + 2 << 2) | 0;
58461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = HEAP32[i7 >> 2] | 0;
58471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i8 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
58481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
58491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
58501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i28 = i7;
58511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i27 = i8;
58521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
58531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
58541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[14] = i7 | i8;
58551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i28 = 96 + (i9 + 2 << 2) | 0;
58561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = i6;
58571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
58581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i28 >> 2] = i5;
58591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i27 + 12 >> 2] = i5;
58601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i5 + 8 >> 2] = i27;
58611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i5 + 12 >> 2] = i6;
58621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
58631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[64 >> 2] = i4;
58641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[76 >> 2] = i3;
58651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i2;
58661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     STACKTOP = i1;
58671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     return i32 | 0;
58681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
58691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i18 = HEAP32[60 >> 2] | 0;
58701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i18 | 0) != 0) {
58711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = (i18 & 0 - i18) + -1 | 0;
58721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i31 = i2 >>> 12 & 16;
58731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 >>> i31;
58741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i30 = i2 >>> 5 & 8;
58751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 >>> i30;
58761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i2 >>> 2 & 4;
58771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 >>> i32;
58781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i2 >>> 1 & 2;
58791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 >>> i6;
58801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i2 >>> 1 & 1;
58811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = HEAP32[360 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0;
58821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0;
58831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i3;
58841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
58851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i5 = HEAP32[i6 + 16 >> 2] | 0;
58861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i5 | 0) == 0) {
58871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = HEAP32[i6 + 20 >> 2] | 0;
58881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i5 | 0) == 0) {
58891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
58901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
58911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
58921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0;
58931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i4 = i6 >>> 0 < i2 >>> 0;
58941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = i4 ? i6 : i2;
58951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = i5;
58961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = i4 ? i5 : i3;
58971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
58981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = HEAP32[72 >> 2] | 0;
58991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i3 >>> 0 < i6 >>> 0) {
59001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
59011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
59021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = i3 + i12 | 0;
59031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (!(i3 >>> 0 < i4 >>> 0)) {
59041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
59051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
59061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i5 = HEAP32[i3 + 24 >> 2] | 0;
59071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = HEAP32[i3 + 12 >> 2] | 0;
59081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
59091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i7 | 0) == (i3 | 0)) {
59101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = i3 + 20 | 0;
59111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = HEAP32[i8 >> 2] | 0;
59121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i7 | 0) == 0) {
59131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i8 = i3 + 16 | 0;
59141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i7 = HEAP32[i8 >> 2] | 0;
59151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i7 | 0) == 0) {
59161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i26 = 0;
59171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
59181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       while (1) {
59211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i10 = i7 + 20 | 0;
59221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i9 = HEAP32[i10 >> 2] | 0;
59231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i9 | 0) != 0) {
59241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i7 = i9;
59251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i8 = i10;
59261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         continue;
59271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i10 = i7 + 16 | 0;
59291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i9 = HEAP32[i10 >> 2] | 0;
59301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i9 | 0) == 0) {
59311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
59321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
59331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i7 = i9;
59341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i8 = i10;
59351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i8 >>> 0 < i6 >>> 0) {
59381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
59391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
59401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i8 >> 2] = 0;
59411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i26 = i7;
59421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
59431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
59451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = HEAP32[i3 + 8 >> 2] | 0;
59461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i8 >>> 0 < i6 >>> 0) {
59471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
59481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i6 = i8 + 12 | 0;
59501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) {
59511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
59521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i9 = i7 + 8 | 0;
59541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) {
59551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i6 >> 2] = i7;
59561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i9 >> 2] = i8;
59571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i26 = i7;
59581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
59591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
59601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
59611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
59631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
59641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
59651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i5 | 0) != 0) {
59661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = HEAP32[i3 + 28 >> 2] | 0;
59671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i6 = 360 + (i7 << 2) | 0;
59681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) {
59691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i6 >> 2] = i26;
59701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i26 | 0) == 0) {
59711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i7);
59721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
59731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
59751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
59761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
59771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i6 = i5 + 16 | 0;
59791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) {
59801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i6 >> 2] = i26;
59811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
59821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i5 + 20 >> 2] = i26;
59831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i26 | 0) == 0) {
59851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
59861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
59871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i26 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
59891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
59901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
59911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i26 + 24 >> 2] = i5;
59921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = HEAP32[i3 + 16 >> 2] | 0;
59931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       do {
59941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i5 | 0) != 0) {
59951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
59961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          _abort();
59971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
59981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i26 + 16 >> 2] = i5;
59991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i5 + 24 >> 2] = i26;
60001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
60011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
60021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
60031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } while (0);
60041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = HEAP32[i3 + 20 >> 2] | 0;
60051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i5 | 0) != 0) {
60061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
60071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
60081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
60091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i26 + 20 >> 2] = i5;
60101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i5 + 24 >> 2] = i26;
60111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
60121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
60131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
60141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
60151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
60161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i2 >>> 0 < 16) {
60171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i2 + i12 | 0;
60181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 + 4 >> 2] = i32 | 3;
60191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i3 + (i32 + 4) | 0;
60201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
60211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
60221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 + 4 >> 2] = i12 | 3;
60231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1;
60241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 + (i2 + i12) >> 2] = i2;
60251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = HEAP32[64 >> 2] | 0;
60261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i6 | 0) != 0) {
60271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = HEAP32[76 >> 2] | 0;
60281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = i6 >>> 3;
60291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i9 = i8 << 1;
60301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i6 = 96 + (i9 << 2) | 0;
60311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = HEAP32[14] | 0;
60321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = 1 << i8;
60331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i7 & i8 | 0) != 0) {
60341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i7 = 96 + (i9 + 2 << 2) | 0;
60351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i8 = HEAP32[i7 >> 2] | 0;
60361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i8 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
60371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
60381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
60391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i25 = i7;
60401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i24 = i8;
60411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
60421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
60431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[14] = i7 | i8;
60441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i25 = 96 + (i9 + 2 << 2) | 0;
60451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i24 = i6;
60461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
60471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i25 >> 2] = i5;
60481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i24 + 12 >> 2] = i5;
60491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i5 + 8 >> 2] = i24;
60501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i5 + 12 >> 2] = i6;
60511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
60521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[64 >> 2] = i2;
60531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[76 >> 2] = i4;
60541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
60551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i3 + 8 | 0;
60561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     STACKTOP = i1;
60571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     return i32 | 0;
60581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
60591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
60601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
60611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (!(i12 >>> 0 > 4294967231)) {
60621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i24 = i12 + 11 | 0;
60631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i12 = i24 & -8;
60641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i26 = HEAP32[60 >> 2] | 0;
60651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i26 | 0) != 0) {
60661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i25 = 0 - i12 | 0;
60671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i24 = i24 >>> 8;
60681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i24 | 0) != 0) {
60691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i12 >>> 0 > 16777215) {
60701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = 31;
60711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
60721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i31 = (i24 + 1048320 | 0) >>> 16 & 8;
60731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i32 = i24 << i31;
60741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i30 = (i32 + 520192 | 0) >>> 16 & 4;
60751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i32 = i32 << i30;
60761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = (i32 + 245760 | 0) >>> 16 & 2;
60771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0;
60781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1;
60791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
60801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
60811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i27 = 0;
60821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
60831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i30 = HEAP32[360 + (i27 << 2) >> 2] | 0;
60841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     L126 : do {
60851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i30 | 0) == 0) {
60861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i29 = 0;
60871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i24 = 0;
60881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
60891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i27 | 0) == 31) {
60901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i24 = 0;
60911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
60921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i24 = 25 - (i27 >>> 1) | 0;
60931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
60941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i29 = 0;
60951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i28 = i12 << i24;
60961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i24 = 0;
60971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       while (1) {
60981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i32 = HEAP32[i30 + 4 >> 2] & -8;
60991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i31 = i32 - i12 | 0;
61001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i31 >>> 0 < i25 >>> 0) {
61011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i32 | 0) == (i12 | 0)) {
61021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i25 = i31;
61031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i29 = i30;
61041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i24 = i30;
61051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break L126;
61061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
61071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i25 = i31;
61081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i24 = i30;
61091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
61101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
61111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i31 = HEAP32[i30 + 20 >> 2] | 0;
61121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0;
61131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31;
61141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i30 | 0) == 0) {
61151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
61161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
61171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i28 = i28 << 1;
61181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
61191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
61201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
61211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
61221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i29 | 0) == 0 & (i24 | 0) == 0) {
61231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = 2 << i27;
61241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i26 = i26 & (i32 | 0 - i32);
61251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i26 | 0) == 0) {
61261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
61271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
61281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = (i26 & 0 - i26) + -1 | 0;
61291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i28 = i32 >>> 12 & 16;
61301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i32 >>> i28;
61311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i27 = i32 >>> 5 & 8;
61321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i32 >>> i27;
61331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i30 = i32 >>> 2 & 4;
61341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i32 >>> i30;
61351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i31 = i32 >>> 1 & 2;
61361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i32 >>> i31;
61371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i29 = i32 >>> 1 & 1;
61381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i29 = HEAP32[360 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0;
61391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
61401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i29 | 0) != 0) {
61411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      while (1) {
61421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0;
61431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i26 = i27 >>> 0 < i25 >>> 0;
61441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = i26 ? i27 : i25;
61451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i24 = i26 ? i29 : i24;
61461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i26 = HEAP32[i29 + 16 >> 2] | 0;
61471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i26 | 0) != 0) {
61481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i29 = i26;
61491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        continue;
61501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
61511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i29 = HEAP32[i29 + 20 >> 2] | 0;
61521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i29 | 0) == 0) {
61531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
61541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
61551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
61561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
61571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[64 >> 2] | 0) - i12 | 0) >>> 0 : 0) {
61581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i4 = HEAP32[72 >> 2] | 0;
61591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i24 >>> 0 < i4 >>> 0) {
61601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
61611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
61621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = i24 + i12 | 0;
61631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!(i24 >>> 0 < i2 >>> 0)) {
61641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
61651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
61661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = HEAP32[i24 + 24 >> 2] | 0;
61671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = HEAP32[i24 + 12 >> 2] | 0;
61681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      do {
61691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i6 | 0) == (i24 | 0)) {
61701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i6 = i24 + 20 | 0;
61711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = HEAP32[i6 >> 2] | 0;
61721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i5 | 0) == 0) {
61731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i6 = i24 + 16 | 0;
61741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i5 = HEAP32[i6 >> 2] | 0;
61751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i5 | 0) == 0) {
61761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i22 = 0;
61771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
61781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
61791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
61801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        while (1) {
61811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i8 = i5 + 20 | 0;
61821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i7 = HEAP32[i8 >> 2] | 0;
61831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i7 | 0) != 0) {
61841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i5 = i7;
61851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i6 = i8;
61861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          continue;
61871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
61881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i7 = i5 + 16 | 0;
61891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i8 = HEAP32[i7 >> 2] | 0;
61901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i8 | 0) == 0) {
61911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
61921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
61931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i5 = i8;
61941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i6 = i7;
61951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
61961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
61971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i6 >>> 0 < i4 >>> 0) {
61981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
61991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
62001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i6 >> 2] = 0;
62011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i22 = i5;
62021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
62031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
62051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = HEAP32[i24 + 8 >> 2] | 0;
62061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i5 >>> 0 < i4 >>> 0) {
62071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
62081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i7 = i5 + 12 | 0;
62101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) {
62111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
62121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = i6 + 8 | 0;
62141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
62151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i7 >> 2] = i6;
62161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i4 >> 2] = i5;
62171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i22 = i6;
62181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
62191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
62201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
62211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
62231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } while (0);
62241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      do {
62251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i3 | 0) != 0) {
62261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = HEAP32[i24 + 28 >> 2] | 0;
62271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = 360 + (i4 << 2) | 0;
62281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) {
62291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i5 >> 2] = i22;
62301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i22 | 0) == 0) {
62311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i4);
62321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
62331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
62351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
62361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          _abort();
62371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i4 = i3 + 16 | 0;
62391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
62401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i4 >> 2] = i22;
62411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
62421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i3 + 20 >> 2] = i22;
62431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i22 | 0) == 0) {
62451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
62461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i22 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
62491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
62501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i22 + 24 >> 2] = i3;
62521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = HEAP32[i24 + 16 >> 2] | 0;
62531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        do {
62541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i3 | 0) != 0) {
62551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
62561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           _abort();
62571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
62581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i22 + 16 >> 2] = i3;
62591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i3 + 24 >> 2] = i22;
62601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           break;
62611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
62621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } while (0);
62641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = HEAP32[i24 + 20 >> 2] | 0;
62651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i3 | 0) != 0) {
62661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
62671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          _abort();
62681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
62691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i22 + 20 >> 2] = i3;
62701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i3 + 24 >> 2] = i22;
62711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break;
62721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
62731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
62741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
62751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } while (0);
62761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      L204 : do {
62771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (!(i25 >>> 0 < 16)) {
62781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + 4 >> 2] = i12 | 3;
62791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1;
62801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + (i25 + i12) >> 2] = i25;
62811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = i25 >>> 3;
62821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i25 >>> 0 < 256) {
62831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i6 = i4 << 1;
62841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 96 + (i6 << 2) | 0;
62851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i5 = HEAP32[14] | 0;
62861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i4 = 1 << i4;
62871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((i5 & i4 | 0) != 0) {
62881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i5 = 96 + (i6 + 2 << 2) | 0;
62891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i4 = HEAP32[i5 >> 2] | 0;
62901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (i4 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
62911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           _abort();
62921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
62931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i21 = i5;
62941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i20 = i4;
62951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
62961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
62971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[14] = i5 | i4;
62981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i21 = 96 + (i6 + 2 << 2) | 0;
62991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i20 = i3;
63001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
63011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i21 >> 2] = i2;
63021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i20 + 12 >> 2] = i2;
63031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 8) >> 2] = i20;
63041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 12) >> 2] = i3;
63051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
63061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = i25 >>> 8;
63081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i3 | 0) != 0) {
63091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i25 >>> 0 > 16777215) {
63101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = 31;
63111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
63121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i31 = (i3 + 1048320 | 0) >>> 16 & 8;
63131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i32 = i3 << i31;
63141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i30 = (i32 + 520192 | 0) >>> 16 & 4;
63151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i32 = i32 << i30;
63161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = (i32 + 245760 | 0) >>> 16 & 2;
63171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
63181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1;
63191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
63201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
63211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 0;
63221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i6 = 360 + (i3 << 2) | 0;
63241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + (i12 + 28) >> 2] = i3;
63251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + (i12 + 20) >> 2] = 0;
63261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + (i12 + 16) >> 2] = 0;
63271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = HEAP32[60 >> 2] | 0;
63281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = 1 << i3;
63291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i4 & i5 | 0) == 0) {
63301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[60 >> 2] = i4 | i5;
63311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i6 >> 2] = i2;
63321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 24) >> 2] = i6;
63331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 12) >> 2] = i2;
63341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 8) >> 2] = i2;
63351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
63361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = HEAP32[i6 >> 2] | 0;
63381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i3 | 0) == 31) {
63391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 0;
63401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
63411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 25 - (i3 >>> 1) | 0;
63421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        L225 : do {
63441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) {
63451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = i25 << i3;
63461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          while (1) {
63471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i6 = i4 + (i3 >>> 31 << 2) + 16 | 0;
63481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i5 = HEAP32[i6 >> 2] | 0;
63491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((i5 | 0) == 0) {
63501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break;
63511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
63521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) {
63531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i18 = i5;
63541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            break L225;
63551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           } else {
63561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i3 = i3 << 1;
63571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i4 = i5;
63581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
63591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
63601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
63611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           _abort();
63621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
63631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i6 >> 2] = i2;
63641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i24 + (i12 + 24) >> 2] = i4;
63651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i24 + (i12 + 12) >> 2] = i2;
63661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i24 + (i12 + 8) >> 2] = i2;
63671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           break L204;
63681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
63691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
63701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i18 = i4;
63711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
63721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } while (0);
63731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i4 = i18 + 8 | 0;
63741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = HEAP32[i4 >> 2] | 0;
63751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = HEAP32[72 >> 2] | 0;
63761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i18 >>> 0 < i5 >>> 0) {
63771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
63781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i3 >>> 0 < i5 >>> 0) {
63801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         _abort();
63811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
63821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i3 + 12 >> 2] = i2;
63831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i4 >> 2] = i2;
63841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 8) >> 2] = i3;
63851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 12) >> 2] = i18;
63861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[i24 + (i12 + 24) >> 2] = 0;
63871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
63881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
63891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
63901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i32 = i25 + i12 | 0;
63911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i24 + 4 >> 2] = i32 | 3;
63921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i32 = i24 + (i32 + 4) | 0;
63931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
63941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
63951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } while (0);
63961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i32 = i24 + 8 | 0;
63971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      STACKTOP = i1;
63981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return i32 | 0;
63991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
64001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
64011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
64021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i12 = -1;
64031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
64041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
64051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
64061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[64 >> 2] | 0;
64071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i12 >>> 0 > i18 >>> 0)) {
64081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i3 = i18 - i12 | 0;
64091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = HEAP32[76 >> 2] | 0;
64101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i3 >>> 0 > 15) {
64111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[76 >> 2] = i2 + i12;
64121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[64 >> 2] = i3;
64131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1;
64141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + i18 >> 2] = i3;
64151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 4 >> 2] = i12 | 3;
64161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
64171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[64 >> 2] = 0;
64181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[76 >> 2] = 0;
64191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 4 >> 2] = i18 | 3;
64201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i32 = i2 + (i18 + 4) | 0;
64211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
64221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
64231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i32 = i2 + 8 | 0;
64241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
64251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return i32 | 0;
64261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
64271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[68 >> 2] | 0;
64281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 < i18 >>> 0) {
64291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i31 = i18 - i12 | 0;
64301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[68 >> 2] = i31;
64311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i32 = HEAP32[80 >> 2] | 0;
64321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[80 >> 2] = i32 + i12;
64331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
64341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i32 + 4 >> 2] = i12 | 3;
64351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i32 = i32 + 8 | 0;
64361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
64371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return i32 | 0;
64381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
64391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do {
64401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((HEAP32[132] | 0) == 0) {
64411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i18 = _sysconf(30) | 0;
64421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i18 + -1 & i18 | 0) == 0) {
64431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[536 >> 2] = i18;
64441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[532 >> 2] = i18;
64451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[540 >> 2] = -1;
64461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[544 >> 2] = -1;
64471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[548 >> 2] = 0;
64481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[500 >> 2] = 0;
64491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[132] = (_time(0) | 0) & -16 ^ 1431655768;
64501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
64511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
64521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _abort();
64531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
64541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
64551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
64561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i12 + 48 | 0;
64571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = HEAP32[536 >> 2] | 0;
64581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i12 + 47 | 0;
64591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = i25 + i21 | 0;
64601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0 - i25 | 0;
64611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i22 & i25;
64621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i18 >>> 0 > i12 >>> 0)) {
64631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i32 = 0;
64641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
64651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return i32 | 0;
64661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
64671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = HEAP32[496 >> 2] | 0;
64681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) != 0 ? (i31 = HEAP32[488 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) {
64691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i32 = 0;
64701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
64711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return i32 | 0;
64721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
64731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L269 : do {
64741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((HEAP32[500 >> 2] & 4 | 0) == 0) {
64751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i26 = HEAP32[80 >> 2] | 0;
64761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   L271 : do {
64771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i26 | 0) != 0) {
64781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i24 = 504 | 0;
64791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
64801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i27 = HEAP32[i24 >> 2] | 0;
64811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2] | 0) | 0) >>> 0 > i26 >>> 0) : 0) {
64821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
64831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
64841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i24 = HEAP32[i24 + 8 >> 2] | 0;
64851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i24 | 0) == 0) {
64861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = 182;
64871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break L271;
64881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
64891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
64901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i24 | 0) != 0) {
64911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i25 = i22 - (HEAP32[68 >> 2] | 0) & i25;
64921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i25 >>> 0 < 2147483647) {
64931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = _sbrk(i25 | 0) | 0;
64941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0);
64951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i22 = i13;
64961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i24 = i25;
64971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i23 = i26 ? i13 : -1;
64981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = i26 ? i25 : 0;
64991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = 191;
65001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
65011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = 0;
65021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
65031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
65041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 182;
65051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
65061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
65071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i13 = 182;
65081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
65091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } while (0);
65101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   do {
65111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) == 182) {
65121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i23 = _sbrk(0) | 0;
65131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i23 | 0) != (-1 | 0)) {
65141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i24 = i23;
65151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i22 = HEAP32[532 >> 2] | 0;
65161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i25 = i22 + -1 | 0;
65171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i25 & i24 | 0) == 0) {
65181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = i18;
65191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
65201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0;
65211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
65221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i24 = HEAP32[488 >> 2] | 0;
65231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i26 = i24 + i25 | 0;
65241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) {
65251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i22 = HEAP32[496 >> 2] | 0;
65261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) {
65271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i25 = 0;
65281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
65291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
65301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i22 = _sbrk(i25 | 0) | 0;
65311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = (i22 | 0) == (i23 | 0);
65321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i24 = i25;
65331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i23 = i13 ? i23 : -1;
65341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = i13 ? i25 : 0;
65351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = 191;
65361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
65371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i25 = 0;
65381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
65391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
65401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i25 = 0;
65411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
65421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
65431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } while (0);
65441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   L291 : do {
65451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) == 191) {
65461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i13 = 0 - i24 | 0;
65471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i23 | 0) != (-1 | 0)) {
65481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i17 = i23;
65491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = i25;
65501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 202;
65511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break L269;
65521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
65531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
65541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[536 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 2147483647) : 0) {
65551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) {
65561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _sbrk(i13 | 0) | 0;
65571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break L291;
65581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
65591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i24 = i19 + i24 | 0;
65601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
65611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
65621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
65631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
65641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i22 | 0) != (-1 | 0)) {
65651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i17 = i22;
65661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = i24;
65671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 202;
65681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break L269;
65691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
65701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
65711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } while (0);
65721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[500 >> 2] = HEAP32[500 >> 2] | 4;
65731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i13 = 199;
65741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
65751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i25 = 0;
65761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i13 = 199;
65771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
65781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
65791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((((i13 | 0) == 199 ? i18 >>> 0 < 2147483647 : 0) ? (i17 = _sbrk(i18 | 0) | 0, i16 = _sbrk(0) | 0, (i16 | 0) != (-1 | 0) & (i17 | 0) != (-1 | 0) & i17 >>> 0 < i16 >>> 0) : 0) ? (i15 = i16 - i17 | 0, i14 = i15 >>> 0 > (i12 + 40 | 0) >>> 0, i14) : 0) {
65801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i14 = i14 ? i15 : i25;
65811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i13 = 202;
65821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
65831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == 202) {
65841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i15 = (HEAP32[488 >> 2] | 0) + i14 | 0;
65851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[488 >> 2] = i15;
65861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i15 >>> 0 > (HEAP32[492 >> 2] | 0) >>> 0) {
65871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[492 >> 2] = i15;
65881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
65891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i15 = HEAP32[80 >> 2] | 0;
65901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  L311 : do {
65911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i15 | 0) != 0) {
65921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i21 = 504 | 0;
65931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
65941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i16 = HEAP32[i21 >> 2] | 0;
65951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i19 = i21 + 4 | 0;
65961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i20 = HEAP32[i19 >> 2] | 0;
65971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i17 | 0) == (i16 + i20 | 0)) {
65981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 214;
65991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
66001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i18 = HEAP32[i21 + 8 >> 2] | 0;
66021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i18 | 0) == 0) {
66031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
66041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
66051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i21 = i18;
66061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
66081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) {
66091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i19 >> 2] = i20 + i14;
66101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = (HEAP32[68 >> 2] | 0) + i14 | 0;
66111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i15 + 8 | 0;
66121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i3 & 7 | 0) == 0) {
66131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 0;
66141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
66151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 0 - i3 & 7;
66161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i2 - i3 | 0;
66181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[80 >> 2] = i15 + i3;
66191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[68 >> 2] = i32;
66201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1;
66211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + (i2 + 4) >> 2] = 40;
66221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[84 >> 2] = HEAP32[544 >> 2];
66231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
66241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
66251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (i17 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
66261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[72 >> 2] = i17;
66271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
66281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i19 = i17 + i14 | 0;
66291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i16 = 504 | 0;
66301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
66311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) {
66321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 224;
66331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
66341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i18 = HEAP32[i16 + 8 >> 2] | 0;
66361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i18 | 0) == 0) {
66371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
66381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
66391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i16 = i18;
66401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
66421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) {
66431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i16 >> 2] = i17;
66441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i16 + 4 | 0;
66451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14;
66461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = i17 + 8 | 0;
66471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i6 & 7 | 0) == 0) {
66481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = 0;
66491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
66501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = 0 - i6 & 7;
66511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i17 + (i14 + 8) | 0;
66531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i7 & 7 | 0) == 0) {
66541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 0;
66551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
66561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = 0 - i7 & 7;
66571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
66581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i15 = i17 + (i13 + i14) | 0;
66591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i8 = i6 + i12 | 0;
66601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i17 + i8 | 0;
66611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i10 = i15 - (i17 + i6) - i12 | 0;
66621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3;
66631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     L348 : do {
66641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i15 | 0) != (HEAP32[80 >> 2] | 0)) {
66651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i15 | 0) == (HEAP32[76 >> 2] | 0)) {
66661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i32 = (HEAP32[64 >> 2] | 0) + i10 | 0;
66671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[64 >> 2] = i32;
66681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[76 >> 2] = i7;
66691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
66701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i32 + i8) >> 2] = i32;
66711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
66721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
66731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i12 = i14 + 4 | 0;
66741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0;
66751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i18 & 3 | 0) == 1) {
66761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i11 = i18 & -8;
66771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i16 = i18 >>> 3;
66781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        do {
66791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (!(i18 >>> 0 < 256)) {
66801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0;
66811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
66821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          do {
66831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((i19 | 0) == (i15 | 0)) {
66841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i19 = i13 | 16;
66851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i18 = i17 + (i12 + i19) | 0;
66861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i16 = HEAP32[i18 >> 2] | 0;
66871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((i16 | 0) == 0) {
66881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i18 = i17 + (i19 + i14) | 0;
66891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i16 = HEAP32[i18 >> 2] | 0;
66901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             if ((i16 | 0) == 0) {
66911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              i5 = 0;
66921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
66931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             }
66941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
66951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            while (1) {
66961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i20 = i16 + 20 | 0;
66971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i19 = HEAP32[i20 >> 2] | 0;
66981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             if ((i19 | 0) != 0) {
66991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              i16 = i19;
67001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              i18 = i20;
67011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              continue;
67021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             }
67031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i19 = i16 + 16 | 0;
67041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i20 = HEAP32[i19 >> 2] | 0;
67051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             if ((i20 | 0) == 0) {
67061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
67071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             } else {
67081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              i16 = i20;
67091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              i18 = i19;
67101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             }
67111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (i18 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
67151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i18 >> 2] = 0;
67161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i5 = i16;
67171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             break;
67181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           } else {
67201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
67211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (i18 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i16 = i18 + 12 | 0;
67251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) {
67261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i20 = i19 + 8 | 0;
67291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) {
67301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i16 >> 2] = i19;
67311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i20 >> 2] = i18;
67321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             i5 = i19;
67331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             break;
67341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
67351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
67381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } while (0);
67391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((i9 | 0) != 0) {
67401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0;
67411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i18 = 360 + (i16 << 2) | 0;
67421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) {
67431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            HEAP32[i18 >> 2] = i5;
67441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((i5 | 0) == 0) {
67451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i16);
67461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             break;
67471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           } else {
67491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i16 = i9 + 16 | 0;
67531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
67541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i16 >> 2] = i5;
67551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
67561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i9 + 20 >> 2] = i5;
67571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((i5 | 0) == 0) {
67591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             break;
67601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
67621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            _abort();
67641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
67651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[i5 + 24 >> 2] = i9;
67661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i15 = i13 | 16;
67671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0;
67681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           do {
67691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if ((i9 | 0) != 0) {
67701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              _abort();
67721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             } else {
67731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              HEAP32[i5 + 16 >> 2] = i9;
67741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              HEAP32[i9 + 24 >> 2] = i5;
67751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch              break;
67761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             }
67771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           } while (0);
67791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0;
67801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((i9 | 0) != 0) {
67811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             _abort();
67831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            } else {
67841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i5 + 20 >> 2] = i9;
67851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             HEAP32[i9 + 24 >> 2] = i5;
67861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch             break;
67871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            }
67881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
67891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
67901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
67911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
67921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
67931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i18 = 96 + (i16 << 1 << 2) | 0;
67941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((i5 | 0) != (i18 | 0)) {
67951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
67961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            _abort();
67971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
67981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) {
67991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            _abort();
68001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
68011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
68021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((i12 | 0) == (i5 | 0)) {
68031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           HEAP32[14] = HEAP32[14] & ~(1 << i16);
68041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           break;
68051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
68061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((i12 | 0) != (i18 | 0)) {
68071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if (i12 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
68081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            _abort();
68091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
68101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i16 = i12 + 8 | 0;
68111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
68121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            i9 = i16;
68131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           } else {
68141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch            _abort();
68151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           }
68161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
68171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i9 = i12 + 8 | 0;
68181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
68191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i5 + 12 >> 2] = i12;
68201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i9 >> 2] = i5;
68211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
68221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } while (0);
68231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i15 = i17 + ((i11 | i13) + i14) | 0;
68241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i10 = i11 + i10 | 0;
68251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
68261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = i15 + 4 | 0;
68271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2;
68281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1;
68291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i10 + i8) >> 2] = i10;
68301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = i10 >>> 3;
68311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i10 >>> 0 < 256) {
68321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i10 = i5 << 1;
68331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i2 = 96 + (i10 << 2) | 0;
68341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i9 = HEAP32[14] | 0;
68351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = 1 << i5;
68361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i9 & i5 | 0) != 0) {
68371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i9 = 96 + (i10 + 2 << 2) | 0;
68381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i5 = HEAP32[i9 >> 2] | 0;
68391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
68401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          _abort();
68411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
68421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i3 = i9;
68431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i4 = i5;
68441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
68451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
68461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         HEAP32[14] = i9 | i5;
68471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 96 + (i10 + 2 << 2) | 0;
68481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i4 = i2;
68491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
68501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i3 >> 2] = i7;
68511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i4 + 12 >> 2] = i7;
68521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 8) >> 2] = i4;
68531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 12) >> 2] = i2;
68541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
68551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
68561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = i10 >>> 8;
68571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i3 | 0) != 0) {
68581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if (i10 >>> 0 > 16777215) {
68591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 31;
68601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
68611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i31 = (i3 + 1048320 | 0) >>> 16 & 8;
68621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i32 = i3 << i31;
68631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i30 = (i32 + 520192 | 0) >>> 16 & 4;
68641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i32 = i32 << i30;
68651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = (i32 + 245760 | 0) >>> 16 & 2;
68661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
68671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1;
68681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
68691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
68701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = 0;
68711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
68721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = 360 + (i3 << 2) | 0;
68731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i8 + 28) >> 2] = i3;
68741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i8 + 20) >> 2] = 0;
68751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i8 + 16) >> 2] = 0;
68761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i9 = HEAP32[60 >> 2] | 0;
68771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = 1 << i3;
68781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i9 & i5 | 0) == 0) {
68791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[60 >> 2] = i9 | i5;
68801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i4 >> 2] = i7;
68811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 24) >> 2] = i4;
68821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 12) >> 2] = i7;
68831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 8) >> 2] = i7;
68841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
68851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
68861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = HEAP32[i4 >> 2] | 0;
68871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i3 | 0) == 31) {
68881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = 0;
68891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
68901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i3 = 25 - (i3 >>> 1) | 0;
68911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
68921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       L444 : do {
68931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) {
68941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = i10 << i3;
68951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         while (1) {
68961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i5 = i4 + (i3 >>> 31 << 2) + 16 | 0;
68971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          i9 = HEAP32[i5 >> 2] | 0;
68981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((i9 | 0) == 0) {
68991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           break;
69001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
69011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) {
69021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i2 = i9;
69031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           break L444;
69041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          } else {
69051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i3 = i3 << 1;
69061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch           i4 = i9;
69071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          }
69081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
69091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
69101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          _abort();
69111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         } else {
69121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i5 >> 2] = i7;
69131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i17 + (i8 + 24) >> 2] = i4;
69141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i17 + (i8 + 12) >> 2] = i7;
69151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          HEAP32[i17 + (i8 + 8) >> 2] = i7;
69161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch          break L348;
69171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         }
69181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
69191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i2 = i4;
69201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
69211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } while (0);
69221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = i2 + 8 | 0;
69231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = HEAP32[i4 >> 2] | 0;
69241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i5 = HEAP32[72 >> 2] | 0;
69251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i2 >>> 0 < i5 >>> 0) {
69261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
69271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
69281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i3 >>> 0 < i5 >>> 0) {
69291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
69301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
69311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i3 + 12 >> 2] = i7;
69321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i4 >> 2] = i7;
69331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 8) >> 2] = i3;
69341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 12) >> 2] = i2;
69351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i17 + (i8 + 24) >> 2] = 0;
69361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
69371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
69381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
69391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i32 = (HEAP32[68 >> 2] | 0) + i10 | 0;
69401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[68 >> 2] = i32;
69411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[80 >> 2] = i7;
69421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
69431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
69441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
69451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i17 + (i6 | 8) | 0;
69461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     STACKTOP = i1;
69471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     return i32 | 0;
69481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
69491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i3 = 504 | 0;
69501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
69511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = HEAP32[i3 >> 2] | 0;
69521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i11 | 0, i10 >>> 0 > i15 >>> 0) : 0) {
69531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
69541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
69551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = HEAP32[i3 + 8 >> 2] | 0;
69561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
69571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i3 = i2 + (i11 + -39) | 0;
69581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i3 & 7 | 0) == 0) {
69591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 0;
69601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
69611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 0 - i3 & 7;
69621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
69631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i2 + (i11 + -47 + i3) | 0;
69641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2;
69651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i3 = i2 + 8 | 0;
69661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = i17 + 8 | 0;
69671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i4 & 7 | 0) == 0) {
69681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = 0;
69691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
69701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = 0 - i4 & 7;
69711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
69721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = i14 + -40 - i4 | 0;
69731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[80 >> 2] = i17 + i4;
69741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[68 >> 2] = i32;
69751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1;
69761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i17 + (i14 + -36) >> 2] = 40;
69771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[84 >> 2] = HEAP32[544 >> 2];
69781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 + 4 >> 2] = 27;
69791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i3 + 0 >> 2] = HEAP32[504 >> 2];
69801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i3 + 4 >> 2] = HEAP32[508 >> 2];
69811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i3 + 8 >> 2] = HEAP32[512 >> 2];
69821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i3 + 12 >> 2] = HEAP32[516 >> 2];
69831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[504 >> 2] = i17;
69841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[508 >> 2] = i14;
69851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[516 >> 2] = 0;
69861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[512 >> 2] = i3;
69871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = i2 + 28 | 0;
69881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i4 >> 2] = 7;
69891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) {
69901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
69911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = i4 + 4 | 0;
69921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 >> 2] = 7;
69931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) {
69941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = i3;
69951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
69961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
69971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
69981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
69991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
70001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i2 | 0) != (i15 | 0)) {
70011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 - i15 | 0;
70021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i15 + (i2 + 4) | 0;
70031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2;
70041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + 4 >> 2] = i2 | 1;
70051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + i2 >> 2] = i2;
70061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i2 >>> 3;
70071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i2 >>> 0 < 256) {
70081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i4 = i3 << 1;
70091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = 96 + (i4 << 2) | 0;
70101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i5 = HEAP32[14] | 0;
70111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 1 << i3;
70121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i5 & i3 | 0) != 0) {
70131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = 96 + (i4 + 2 << 2) | 0;
70141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = HEAP32[i4 >> 2] | 0;
70151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
70161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
70171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
70181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i7 = i4;
70191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i8 = i3;
70201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
70211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
70221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[14] = i5 | i3;
70231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = 96 + (i4 + 2 << 2) | 0;
70241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i8 = i2;
70251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
70261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i7 >> 2] = i15;
70271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i8 + 12 >> 2] = i15;
70281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 8 >> 2] = i8;
70291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 12 >> 2] = i2;
70301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
70311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
70321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i2 >>> 8;
70331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i3 | 0) != 0) {
70341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i2 >>> 0 > 16777215) {
70351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = 31;
70361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
70371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i31 = (i3 + 1048320 | 0) >>> 16 & 8;
70381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i32 = i3 << i31;
70391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i30 = (i32 + 520192 | 0) >>> 16 & 4;
70401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i32 = i32 << i30;
70411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = (i32 + 245760 | 0) >>> 16 & 2;
70421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
70431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1;
70441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
70451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
70461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 0;
70471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
70481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = 360 + (i3 << 2) | 0;
70491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + 28 >> 2] = i3;
70501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + 20 >> 2] = 0;
70511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i15 + 16 >> 2] = 0;
70521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = HEAP32[60 >> 2] | 0;
70531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i5 = 1 << i3;
70541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i4 & i5 | 0) == 0) {
70551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[60 >> 2] = i4 | i5;
70561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i7 >> 2] = i15;
70571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 24 >> 2] = i7;
70581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 12 >> 2] = i15;
70591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 8 >> 2] = i15;
70601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
70611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
70621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = HEAP32[i7 >> 2] | 0;
70631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i3 | 0) == 31) {
70641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 0;
70651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
70661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i3 = 25 - (i3 >>> 1) | 0;
70671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
70681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     L499 : do {
70691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) {
70701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = i2 << i3;
70711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       while (1) {
70721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i7 = i4 + (i3 >>> 31 << 2) + 16 | 0;
70731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i5 = HEAP32[i7 >> 2] | 0;
70741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((i5 | 0) == 0) {
70751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break;
70761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
70771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) {
70781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i6 = i5;
70791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         break L499;
70801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        } else {
70811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i3 = i3 << 1;
70821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch         i4 = i5;
70831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        }
70841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
70851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
70861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
70871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
70881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i7 >> 2] = i15;
70891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i15 + 24 >> 2] = i4;
70901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i15 + 12 >> 2] = i15;
70911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i15 + 8 >> 2] = i15;
70921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break L311;
70931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
70941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
70951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i6 = i4;
70961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
70971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
70981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = i6 + 8 | 0;
70991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = HEAP32[i4 >> 2] | 0;
71001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = HEAP32[72 >> 2] | 0;
71011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i6 >>> 0 < i2 >>> 0) {
71021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
71031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
71041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i3 >>> 0 < i2 >>> 0) {
71051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
71061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
71071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i3 + 12 >> 2] = i15;
71081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i4 >> 2] = i15;
71091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 8 >> 2] = i3;
71101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 12 >> 2] = i6;
71111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 24 >> 2] = 0;
71121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
71131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
71141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
71151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
71161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = HEAP32[72 >> 2] | 0;
71171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) {
71181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[72 >> 2] = i17;
71191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
71201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[504 >> 2] = i17;
71211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[508 >> 2] = i14;
71221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[516 >> 2] = 0;
71231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[92 >> 2] = HEAP32[132];
71241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[88 >> 2] = -1;
71251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = 0;
71261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    do {
71271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i32 = i2 << 1;
71281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i31 = 96 + (i32 << 2) | 0;
71291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[96 + (i32 + 3 << 2) >> 2] = i31;
71301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[96 + (i32 + 2 << 2) >> 2] = i31;
71311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i2 + 1 | 0;
71321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } while ((i2 | 0) != 32);
71331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i17 + 8 | 0;
71341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i2 & 7 | 0) == 0) {
71351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = 0;
71361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
71371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = 0 - i2 & 7;
71381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
71391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i32 = i14 + -40 - i2 | 0;
71401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[80 >> 2] = i17 + i2;
71411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[68 >> 2] = i32;
71421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1;
71431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i17 + (i14 + -36) >> 2] = 40;
71441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[84 >> 2] = HEAP32[544 >> 2];
71451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
71461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } while (0);
71471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = HEAP32[68 >> 2] | 0;
71481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i2 >>> 0 > i12 >>> 0) {
71491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i31 = i2 - i12 | 0;
71501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[68 >> 2] = i31;
71511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i32 = HEAP32[80 >> 2] | 0;
71521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[80 >> 2] = i32 + i12;
71531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
71541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i32 + 4 >> 2] = i12 | 3;
71551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i32 = i32 + 8 | 0;
71561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   STACKTOP = i1;
71571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   return i32 | 0;
71581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
71591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
71601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[(___errno_location() | 0) >> 2] = 12;
71611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = 0;
71621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1;
71631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0;
71641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
71651b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _free(i7) {
71661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 | 0;
71671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0;
71681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = STACKTOP;
71691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == 0) {
71701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
71711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return;
71721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
71731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i7 + -8 | 0;
71741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[72 >> 2] | 0;
71751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i15 >>> 0 < i16 >>> 0) {
71761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _abort();
71771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
71781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i7 + -4 >> 2] | 0;
71791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i13 & 3;
71801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 1) {
71811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _abort();
71821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
71831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i13 & -8;
71841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 + (i8 + -8) | 0;
71851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do {
71861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i13 & 1 | 0) == 0) {
71871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i19 = HEAP32[i15 >> 2] | 0;
71881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i12 | 0) == 0) {
71891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = i1;
71901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return;
71911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
71921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i15 = -8 - i19 | 0;
71931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i13 = i7 + i15 | 0;
71941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i12 = i19 + i8 | 0;
71951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i13 >>> 0 < i16 >>> 0) {
71961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _abort();
71971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
71981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i13 | 0) == (HEAP32[76 >> 2] | 0)) {
71991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i7 + (i8 + -4) | 0;
72001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
72011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i13;
72021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = i12;
72031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
72041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
72051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[64 >> 2] = i12;
72061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2;
72071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1;
72081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i6 >> 2] = i12;
72091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = i1;
72101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return;
72111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
72121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i18 = i19 >>> 3;
72131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i19 >>> 0 < 256) {
72141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
72151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
72161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i14 = 96 + (i18 << 1 << 2) | 0;
72171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i2 | 0) != (i14 | 0)) {
72181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i2 >>> 0 < i16 >>> 0) {
72191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) {
72221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
72251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i11 | 0) == (i2 | 0)) {
72261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[14] = HEAP32[14] & ~(1 << i18);
72271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i13;
72281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = i12;
72291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
72301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
72311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i11 | 0) != (i14 | 0)) {
72321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i11 >>> 0 < i16 >>> 0) {
72331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i14 = i11 + 8 | 0;
72361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) {
72371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i17 = i14;
72381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
72391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
72421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i17 = i11 + 8 | 0;
72431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
72441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 + 12 >> 2] = i11;
72451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i17 >> 2] = i2;
72461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i13;
72471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i11 = i12;
72481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
72491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
72501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0;
72511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
72521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   do {
72531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i18 | 0) == (i13 | 0)) {
72541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i19 = i7 + (i15 + 20) | 0;
72551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i18 = HEAP32[i19 >> 2] | 0;
72561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i18 | 0) == 0) {
72571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i19 = i7 + (i15 + 16) | 0;
72581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i18 = HEAP32[i19 >> 2] | 0;
72591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i18 | 0) == 0) {
72601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i14 = 0;
72611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
72621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
72631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
72651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i21 = i18 + 20 | 0;
72661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i20 = HEAP32[i21 >> 2] | 0;
72671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i20 | 0) != 0) {
72681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i18 = i20;
72691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i19 = i21;
72701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       continue;
72711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
72721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i20 = i18 + 16 | 0;
72731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i21 = HEAP32[i20 >> 2] | 0;
72741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i21 | 0) == 0) {
72751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
72761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
72771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i18 = i21;
72781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i19 = i20;
72791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
72801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i19 >>> 0 < i16 >>> 0) {
72821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
72841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i19 >> 2] = 0;
72851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = i18;
72861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
72871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
72891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
72901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i19 >>> 0 < i16 >>> 0) {
72911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i16 = i19 + 12 | 0;
72941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) {
72951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
72961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
72971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i20 = i18 + 8 | 0;
72981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) {
72991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i16 >> 2] = i18;
73001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i20 >> 2] = i19;
73011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = i18;
73021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
73031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
73041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
73051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
73071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } while (0);
73081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i17 | 0) != 0) {
73091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0;
73101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i16 = 360 + (i18 << 2) | 0;
73111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) {
73121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i16 >> 2] = i14;
73131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i14 | 0) == 0) {
73141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i18);
73151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = i13;
73161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i11 = i12;
73171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
73181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
73201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i17 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
73211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
73221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i16 = i17 + 16 | 0;
73241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) {
73251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i16 >> 2] = i14;
73261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
73271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i17 + 20 >> 2] = i14;
73281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i14 | 0) == 0) {
73301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = i13;
73311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i11 = i12;
73321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
73331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
73351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (i14 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
73361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     _abort();
73371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
73381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i14 + 24 >> 2] = i17;
73391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0;
73401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    do {
73411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i16 | 0) != 0) {
73421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i16 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
73431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
73441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
73451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i14 + 16 >> 2] = i16;
73461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i16 + 24 >> 2] = i14;
73471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
73481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
73491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } while (0);
73511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0;
73521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i15 | 0) != 0) {
73531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i15 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
73541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
73551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
73561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i14 + 20 >> 2] = i15;
73571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i15 + 24 >> 2] = i14;
73581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i2 = i13;
73591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i11 = i12;
73601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
73611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
73621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
73631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i2 = i13;
73641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = i12;
73651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
73661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
73671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i2 = i13;
73681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i11 = i12;
73691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
73701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
73711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i2 = i15;
73721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i11 = i8;
73731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
73741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
73751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i2 >>> 0 < i6 >>> 0)) {
73761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _abort();
73771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
73781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i7 + (i8 + -4) | 0;
73791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i12 >> 2] | 0;
73801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 & 1 | 0) == 0) {
73811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _abort();
73821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
73831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 & 2 | 0) == 0) {
73841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i6 | 0) == (HEAP32[80 >> 2] | 0)) {
73851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i21 = (HEAP32[68 >> 2] | 0) + i11 | 0;
73861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[68 >> 2] = i21;
73871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[80 >> 2] = i2;
73881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 4 >> 2] = i21 | 1;
73891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i2 | 0) != (HEAP32[76 >> 2] | 0)) {
73901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = i1;
73911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return;
73921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
73931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[76 >> 2] = 0;
73941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[64 >> 2] = 0;
73951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   STACKTOP = i1;
73961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   return;
73971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
73981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i6 | 0) == (HEAP32[76 >> 2] | 0)) {
73991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i21 = (HEAP32[64 >> 2] | 0) + i11 | 0;
74001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[64 >> 2] = i21;
74011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[76 >> 2] = i2;
74021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 4 >> 2] = i21 | 1;
74031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + i21 >> 2] = i21;
74041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   STACKTOP = i1;
74051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   return;
74061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
74071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i11 = (i13 & -8) + i11 | 0;
74081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i12 = i13 >>> 3;
74091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  do {
74101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (!(i13 >>> 0 < 256)) {
74111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0;
74121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
74131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    do {
74141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i15 | 0) == (i6 | 0)) {
74151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = i7 + (i8 + 12) | 0;
74161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i12 = HEAP32[i13 >> 2] | 0;
74171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i12 | 0) == 0) {
74181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i13 = i7 + (i8 + 8) | 0;
74191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i12 = HEAP32[i13 >> 2] | 0;
74201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i12 | 0) == 0) {
74211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i9 = 0;
74221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
74231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
74241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      while (1) {
74261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i14 = i12 + 20 | 0;
74271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i15 = HEAP32[i14 >> 2] | 0;
74281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i15 | 0) != 0) {
74291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i12 = i15;
74301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i13 = i14;
74311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        continue;
74321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
74331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i14 = i12 + 16 | 0;
74341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i15 = HEAP32[i14 >> 2] | 0;
74351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i15 | 0) == 0) {
74361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
74371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
74381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i12 = i15;
74391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i13 = i14;
74401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
74411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i13 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
74431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
74441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
74451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i13 >> 2] = 0;
74461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i9 = i12;
74471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
74481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
74501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = HEAP32[i7 + i8 >> 2] | 0;
74511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i13 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
74521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
74531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = i13 + 12 | 0;
74551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) {
74561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
74571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i12 = i15 + 8 | 0;
74591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
74601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i14 >> 2] = i15;
74611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i12 >> 2] = i13;
74621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i9 = i15;
74631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
74641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
74651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
74661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
74681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } while (0);
74691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i10 | 0) != 0) {
74701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0;
74711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i13 = 360 + (i12 << 2) | 0;
74721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) {
74731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i13 >> 2] = i9;
74741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i9 | 0) == 0) {
74751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i12);
74761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
74771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
74791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i10 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
74801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
74811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i12 = i10 + 16 | 0;
74831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
74841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i12 >> 2] = i9;
74851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
74861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i10 + 20 >> 2] = i9;
74871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i9 | 0) == 0) {
74891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
74901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
74911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
74921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
74931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
74941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
74951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i9 + 24 >> 2] = i10;
74961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0;
74971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
74981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i6 | 0) != 0) {
74991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
75001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        _abort();
75011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
75021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i9 + 16 >> 2] = i6;
75031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i6 + 24 >> 2] = i9;
75041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
75051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
75061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
75071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while (0);
75081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0;
75091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i6 | 0) != 0) {
75101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
75111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       _abort();
75121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
75131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i9 + 20 >> 2] = i6;
75141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i6 + 24 >> 2] = i9;
75151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
75161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
75171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
75181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
75191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
75201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i9 = HEAP32[i7 + i8 >> 2] | 0;
75211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
75221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i8 = 96 + (i12 << 1 << 2) | 0;
75231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i9 | 0) != (i8 | 0)) {
75241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
75251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
75261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
75271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) {
75281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
75291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
75301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
75311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i7 | 0) == (i9 | 0)) {
75321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[14] = HEAP32[14] & ~(1 << i12);
75331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
75341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
75351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i7 | 0) != (i8 | 0)) {
75361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
75371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
75381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
75391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i8 = i7 + 8 | 0;
75401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) {
75411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i10 = i8;
75421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
75431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
75441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
75451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
75461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i10 = i7 + 8 | 0;
75471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
75481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i9 + 12 >> 2] = i7;
75491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i10 >> 2] = i9;
75501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
75511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } while (0);
75521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + 4 >> 2] = i11 | 1;
75531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + i11 >> 2] = i11;
75541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i2 | 0) == (HEAP32[76 >> 2] | 0)) {
75551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[64 >> 2] = i11;
75561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   STACKTOP = i1;
75571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   return;
75581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
75591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else {
75601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i12 >> 2] = i13 & -2;
75611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + 4 >> 2] = i11 | 1;
75621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + i11 >> 2] = i11;
75631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
75641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i11 >>> 3;
75651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i11 >>> 0 < 256) {
75661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i7 = i6 << 1;
75671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i3 = 96 + (i7 << 2) | 0;
75681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i8 = HEAP32[14] | 0;
75691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i6 = 1 << i6;
75701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i8 & i6 | 0) != 0) {
75711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i6 = 96 + (i7 + 2 << 2) | 0;
75721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i7 = HEAP32[i6 >> 2] | 0;
75731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
75741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _abort();
75751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
75761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = i6;
75771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i5 = i7;
75781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
75791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
75801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[14] = i8 | i6;
75811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = 96 + (i7 + 2 << 2) | 0;
75821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i5 = i3;
75831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
75841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i4 >> 2] = i2;
75851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i5 + 12 >> 2] = i2;
75861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + 8 >> 2] = i5;
75871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i2 + 12 >> 2] = i3;
75881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
75891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return;
75901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
75911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i11 >>> 8;
75921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) != 0) {
75931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i11 >>> 0 > 16777215) {
75941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = 31;
75951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
75961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i20 = (i4 + 1048320 | 0) >>> 16 & 8;
75971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i21 = i4 << i20;
75981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i19 = (i21 + 520192 | 0) >>> 16 & 4;
75991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i21 = i21 << i19;
76001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = (i21 + 245760 | 0) >>> 16 & 2;
76011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0;
76021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1;
76031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
76041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else {
76051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i4 = 0;
76061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
76071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 360 + (i4 << 2) | 0;
76081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 28 >> 2] = i4;
76091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 20 >> 2] = 0;
76101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 16 >> 2] = 0;
76111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[60 >> 2] | 0;
76121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 1 << i4;
76131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L199 : do {
76141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i7 & i6 | 0) != 0) {
76151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i5 = HEAP32[i5 >> 2] | 0;
76161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i4 | 0) == 31) {
76171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = 0;
76181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
76191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = 25 - (i4 >>> 1) | 0;
76201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
76211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   L205 : do {
76221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) {
76231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = i11 << i4;
76241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i5;
76251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
76261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i6 = i7 + (i4 >>> 31 << 2) + 16 | 0;
76271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i5 = HEAP32[i6 >> 2] | 0;
76281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i5 | 0) == 0) {
76291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
76301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
76311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) {
76321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i3 = i5;
76331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break L205;
76341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
76351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i4 = i4 << 1;
76361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i7 = i5;
76371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
76381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
76391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) {
76401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      _abort();
76411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
76421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i6 >> 2] = i2;
76431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i2 + 24 >> 2] = i7;
76441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i2 + 12 >> 2] = i2;
76451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i2 + 8 >> 2] = i2;
76461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break L199;
76471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
76481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
76491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = i5;
76501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
76511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } while (0);
76521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i5 = i3 + 8 | 0;
76531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = HEAP32[i5 >> 2] | 0;
76541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i6 = HEAP32[72 >> 2] | 0;
76551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i3 >>> 0 < i6 >>> 0) {
76561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _abort();
76571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
76581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if (i4 >>> 0 < i6 >>> 0) {
76591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _abort();
76601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
76611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i4 + 12 >> 2] = i2;
76621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i5 >> 2] = i2;
76631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 + 8 >> 2] = i4;
76641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 + 12 >> 2] = i3;
76651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i2 + 24 >> 2] = 0;
76661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
76671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
76681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
76691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[60 >> 2] = i7 | i6;
76701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i5 >> 2] = i2;
76711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 24 >> 2] = i5;
76721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 12 >> 2] = i2;
76731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i2 + 8 >> 2] = i2;
76741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
76751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
76761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = (HEAP32[88 >> 2] | 0) + -1 | 0;
76771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[88 >> 2] = i21;
76781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i21 | 0) == 0) {
76791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = 512 | 0;
76801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else {
76811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i1;
76821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return;
76831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
76841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) {
76851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = HEAP32[i2 >> 2] | 0;
76861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i2 | 0) == 0) {
76871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   break;
76881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
76891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i2 = i2 + 8 | 0;
76901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
76911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
76921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[88 >> 2] = -1;
76931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1;
76941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return;
76951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
76961b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction __Z15fannkuch_workerPv(i9) {
76971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i9 | 0;
76981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0;
76991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = STACKTOP;
77001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i9 + 4 >> 2] | 0;
77011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 << 2;
77021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = _malloc(i6) | 0;
77031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = _malloc(i6) | 0;
77041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = _malloc(i6) | 0;
77051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = (i7 | 0) > 0;
77061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10) {
77071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i8 = 0;
77081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  do {
77091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i5 + (i8 << 2) >> 2] = i8;
77101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i8 = i8 + 1 | 0;
77111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } while ((i8 | 0) != (i7 | 0));
77121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i8 = i7 + -1 | 0;
77131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i17 = HEAP32[i9 >> 2] | 0;
77141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i5 + (i17 << 2) >> 2] = i8;
77151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i9 = i5 + (i8 << 2) | 0;
77161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i9 >> 2] = i17;
77171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i10) {
77181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i10 = i7 << 2;
77191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i11 = 0;
77201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i12 = i7;
77211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   L7 : while (1) {
77221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i12 | 0) > 1) {
77231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
77241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = i12 + -1 | 0;
77251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i6 + (i13 << 2) >> 2] = i12;
77261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i13 | 0) > 1) {
77271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i12 = i13;
77281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
77291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i12 = 1;
77301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
77311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
77321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
77331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
77341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i13 = HEAP32[i5 >> 2] | 0;
77351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) != 0 ? (HEAP32[i9 >> 2] | 0) != (i8 | 0) : 0) {
77361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     _memcpy(i2 | 0, i5 | 0, i10 | 0) | 0;
77371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i15 = 0;
77381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i14 = HEAP32[i2 >> 2] | 0;
77391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     while (1) {
77401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i17 = i14 + -1 | 0;
77411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i17 | 0) > 1) {
77421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i16 = 1;
77431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       do {
77441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i20 = i2 + (i16 << 2) | 0;
77451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i19 = HEAP32[i20 >> 2] | 0;
77461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i18 = i2 + (i17 << 2) | 0;
77471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i20 >> 2] = HEAP32[i18 >> 2];
77481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        HEAP32[i18 >> 2] = i19;
77491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i16 = i16 + 1 | 0;
77501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i17 = i17 + -1 | 0;
77511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } while ((i16 | 0) < (i17 | 0));
77521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
77531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i15 = i15 + 1 | 0;
77541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i20 = i2 + (i14 << 2) | 0;
77551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i16 = HEAP32[i20 >> 2] | 0;
77561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i20 >> 2] = i14;
77571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if ((i16 | 0) == 0) {
77581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       break;
77591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      } else {
77601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i14 = i16;
77611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
77621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
77631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = (i11 | 0) < (i15 | 0) ? i15 : i11;
77641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
77651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i12 | 0) >= (i8 | 0)) {
77661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i8 = 34;
77671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
77681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
77691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
77701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i12 | 0) > 0) {
77711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = 0;
77721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      while (1) {
77731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       i15 = i14 + 1 | 0;
77741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       HEAP32[i5 + (i14 << 2) >> 2] = HEAP32[i5 + (i15 << 2) >> 2];
77751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       if ((i15 | 0) == (i12 | 0)) {
77761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i14 = i12;
77771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        break;
77781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       } else {
77791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        i14 = i15;
77801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch       }
77811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }
77821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
77831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i14 = 0;
77841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
77851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i5 + (i14 << 2) >> 2] = i13;
77861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i14 = i6 + (i12 << 2) | 0;
77871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i20 = (HEAP32[i14 >> 2] | 0) + -1 | 0;
77881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i14 >> 2] = i20;
77891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i14 = i12 + 1 | 0;
77901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i20 | 0) > 0) {
77911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      continue L7;
77921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
77931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i14 | 0) >= (i8 | 0)) {
77941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i8 = 34;
77951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break L7;
77961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
77971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i13 = HEAP32[i5 >> 2] | 0;
77981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i12 = i14;
77991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
78001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i8 | 0) == 34) {
78021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _free(i5);
78031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _free(i2);
78041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    _free(i6);
78051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    STACKTOP = i3;
78061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return i11 | 0;
78071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
78091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i1 = i9;
78101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = i8;
78111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
78121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else {
78131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i4 = i7 + -1 | 0;
78141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i20 = HEAP32[i9 >> 2] | 0;
78151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i5 + (i20 << 2) >> 2] = i4;
78161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i1 = i5 + (i4 << 2) | 0;
78171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i1 >> 2] = i20;
78181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
78191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0;
78201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L36 : while (1) {
78211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i7 | 0) > 1) {
78221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   while (1) {
78231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i8 = i7 + -1 | 0;
78241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i6 + (i8 << 2) >> 2] = i7;
78251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i8 | 0) > 1) {
78261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = i8;
78271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
78281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i7 = 1;
78291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
78301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
78311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
78331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i8 = HEAP32[i5 >> 2] | 0;
78341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i8 | 0) != 0 ? (HEAP32[i1 >> 2] | 0) != (i4 | 0) : 0) {
78351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i10 = 0;
78361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = HEAP32[i2 >> 2] | 0;
78371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   while (1) {
78381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i13 = i9 + -1 | 0;
78391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i13 | 0) > 1) {
78401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i12 = 1;
78411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     do {
78421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i18 = i2 + (i12 << 2) | 0;
78431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i19 = HEAP32[i18 >> 2] | 0;
78441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i20 = i2 + (i13 << 2) | 0;
78451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i18 >> 2] = HEAP32[i20 >> 2];
78461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAP32[i20 >> 2] = i19;
78471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i12 = i12 + 1 | 0;
78481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i13 = i13 + -1 | 0;
78491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } while ((i12 | 0) < (i13 | 0));
78501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
78511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i10 = i10 + 1 | 0;
78521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i20 = i2 + (i9 << 2) | 0;
78531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i12 = HEAP32[i20 >> 2] | 0;
78541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i20 >> 2] = i9;
78551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i12 | 0) == 0) {
78561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
78571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
78581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i9 = i12;
78591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
78601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i11 = (i11 | 0) < (i10 | 0) ? i10 : i11;
78621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
78631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i7 | 0) >= (i4 | 0)) {
78641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i8 = 34;
78651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   break;
78661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
78671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
78681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i7 | 0) > 0) {
78691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i9 = 0;
78701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
78711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i10 = i9 + 1 | 0;
78721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i5 + (i9 << 2) >> 2] = HEAP32[i5 + (i10 << 2) >> 2];
78731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i10 | 0) == (i7 | 0)) {
78741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i9 = i7;
78751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
78761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
78771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i9 = i10;
78781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
78791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
78801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
78811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i9 = 0;
78821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i5 + (i9 << 2) >> 2] = i8;
78841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = i6 + (i7 << 2) | 0;
78851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i20 = (HEAP32[i9 >> 2] | 0) + -1 | 0;
78861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i9 >> 2] = i20;
78871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = i7 + 1 | 0;
78881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i20 | 0) > 0) {
78891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    continue L36;
78901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i9 | 0) >= (i4 | 0)) {
78921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i8 = 34;
78931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break L36;
78941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
78951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i8 = HEAP32[i5 >> 2] | 0;
78961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i7 = i9;
78971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
78981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
78991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) == 34) {
79001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _free(i5);
79011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _free(i2);
79021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _free(i6);
79031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = i3;
79041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return i11 | 0;
79051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
79061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0;
79071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
79081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _main(i3, i5) {
79091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0;
79101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i5 | 0;
79111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
79121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = STACKTOP;
79131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + 16 | 0;
79141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i2;
79151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L1 : do {
79161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i3 | 0) > 1) {
79171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i3 = HEAP8[HEAP32[i5 + 4 >> 2] | 0] | 0;
79181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   switch (i3 | 0) {
79191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 50:
79201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 10;
79221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break L1;
79231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 51:
79251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i4 = 4;
79271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break L1;
79281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 52:
79301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 11;
79321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break L1;
79331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 53:
79351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 12;
79371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break L1;
79381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 49:
79401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i3 = 9;
79421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break L1;
79431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   case 48:
79451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = 0;
79471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     STACKTOP = i2;
79481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     return i11 | 0;
79491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   default:
79511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    {
79521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i1 >> 2] = i3 + -48;
79531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     _printf(8, i1 | 0) | 0;
79541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i11 = -1;
79551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     STACKTOP = i2;
79561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     return i11 | 0;
79571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
79581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
79591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
79601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i4 = 4;
79611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
79621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0);
79631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) == 4) {
79641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i3 = 11;
79651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
79661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3 + -1 | 0;
79671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 0;
79681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 0;
79691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) {
79701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i4 = _malloc(12) | 0;
79711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i4 >> 2] = i7;
79721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i4 + 4 >> 2] = i3;
79731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i4 + 8 >> 2] = i6;
79741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i7 = i7 + 1 | 0;
79751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i7 | 0) == (i5 | 0)) {
79761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   break;
79771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
79781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i6 = i4;
79791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
79801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
79811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3 << 2;
79821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = _malloc(i5) | 0;
79831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = _malloc(i5) | 0;
79841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 0;
79851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do {
79861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP32[i6 + (i7 << 2) >> 2] = i7;
79871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i7 = i7 + 1 | 0;
79881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i7 | 0) != (i3 | 0));
79891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i3;
79901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 30;
79911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L19 : do {
79921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i9 = 0;
79931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  do {
79941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i1 >> 2] = (HEAP32[i6 + (i9 << 2) >> 2] | 0) + 1;
79951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   _printf(48, i1 | 0) | 0;
79961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = i9 + 1 | 0;
79971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } while ((i9 | 0) != (i3 | 0));
79981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  _putchar(10) | 0;
79991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i7 = i7 + -1 | 0;
80001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if ((i8 | 0) <= 1) {
80011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i8 | 0) == (i3 | 0)) {
80021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
80031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
80051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   while (1) {
80061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i9 = i8 + -1 | 0;
80071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP32[i5 + (i9 << 2) >> 2] = i8;
80081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if ((i9 | 0) > 1) {
80091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i8 = i9;
80101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
80111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i8 = 1;
80121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     break;
80131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
80141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
80161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
80171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = HEAP32[i6 >> 2] | 0;
80181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i8 | 0) > 0) {
80191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i11 = 0;
80201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    while (1) {
80211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     i10 = i11 + 1 | 0;
80221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     HEAP32[i6 + (i11 << 2) >> 2] = HEAP32[i6 + (i10 << 2) >> 2];
80231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     if ((i10 | 0) == (i8 | 0)) {
80241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i10 = i8;
80251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      break;
80261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     } else {
80271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      i11 = i10;
80281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch     }
80291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
80301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
80311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i10 = 0;
80321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i6 + (i10 << 2) >> 2] = i9;
80341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = i5 + (i8 << 2) | 0;
80351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i11 = (HEAP32[i9 >> 2] | 0) + -1 | 0;
80361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i9 >> 2] = i11;
80371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i9 = i8 + 1 | 0;
80381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i11 | 0) > 0) {
80391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
80401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i9 | 0) == (i3 | 0)) {
80421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break L19;
80431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
80441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i8 = i9;
80451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
80471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i7 | 0) != 0);
80481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i6);
80491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i5);
80501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) == 0) {
80511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i5 = 0;
80521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else {
80531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i5 = 0;
80541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (1) {
80551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i6 = __Z15fannkuch_workerPv(i4) | 0;
80561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i5 = (i5 | 0) < (i6 | 0) ? i6 : i5;
80571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i6 = HEAP32[i4 + 8 >> 2] | 0;
80581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   _free(i4);
80591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i6 | 0) == 0) {
80601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    break;
80611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   } else {
80621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i4 = i6;
80631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
80641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
80651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
80661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = i3;
80671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 + 4 >> 2] = i5;
80681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _printf(24, i1 | 0) | 0;
80691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0;
80701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i2;
80711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0;
80721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
80731b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _memcpy(i3, i2, i1) {
80741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0;
80751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 | 0;
80761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
80771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i4 = 0;
80781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0;
80791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3 | 0;
80801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 & 3) == (i2 & 3)) {
80811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (i3 & 3) {
80821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   if ((i1 | 0) == 0) return i4 | 0;
80831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP8[i3] = HEAP8[i2] | 0;
80841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i3 = i3 + 1 | 0;
80851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i2 = i2 + 1 | 0;
80861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i1 = i1 - 1 | 0;
80871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
80881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while ((i1 | 0) >= 4) {
80891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i3 >> 2] = HEAP32[i2 >> 2];
80901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i3 = i3 + 4 | 0;
80911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i2 = i2 + 4 | 0;
80921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i1 = i1 - 4 | 0;
80931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
80941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
80951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) > 0) {
80961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[i3] = HEAP8[i2] | 0;
80971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i3 = i3 + 1 | 0;
80981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = i2 + 1 | 0;
80991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i1 = i1 - 1 | 0;
81001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
81011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i4 | 0;
81021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81031b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _memset(i1, i4, i3) {
81041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i4 | 0;
81061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0;
81071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0, i5 = 0, i6 = 0, i7 = 0;
81081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i1 + i3 | 0;
81091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) >= 20) {
81101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i4 = i4 & 255;
81111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i7 = i1 & 3;
81121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24;
81131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i5 = i2 & ~3;
81141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (i7) {
81151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i7 = i1 + 4 - i7 | 0;
81161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   while ((i1 | 0) < (i7 | 0)) {
81171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAP8[i1] = i4;
81181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    i1 = i1 + 1 | 0;
81191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   }
81201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
81211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while ((i1 | 0) < (i5 | 0)) {
81221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   HEAP32[i1 >> 2] = i6;
81231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch   i1 = i1 + 4 | 0;
81241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
81251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
81261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) < (i2 | 0)) {
81271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  HEAP8[i1] = i4;
81281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i1 = i1 + 1 | 0;
81291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
81301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i1 - i3 | 0;
81311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81321b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempDouble(i1) {
81331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[i1];
81351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
81361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
81371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
81381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0];
81391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0];
81401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0];
81411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0];
81421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81431b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempFloat(i1) {
81441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[i1];
81461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
81471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
81481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
81491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81501b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction runPostSets() {}
81511b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _strlen(i1) {
81521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0;
81541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i1;
81551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (HEAP8[i2] | 0) {
81561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  i2 = i2 + 1 | 0;
81571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
81581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i2 - i1 | 0;
81591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackAlloc(i1) {
81611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0;
81631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = STACKTOP;
81641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + i1 | 0;
81651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + 7 & -8;
81661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i2 | 0;
81671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81681b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setThrew(i1, i2) {
81691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 | 0;
81711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((__THREW__ | 0) == 0) {
81721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  __THREW__ = i1;
81731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  threwValue = i2;
81741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }
81751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81761b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackRestore(i1) {
81771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1;
81791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81801b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet9(i1) {
81811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet9 = i1;
81831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81841b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet8(i1) {
81851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet8 = i1;
81871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81881b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet7(i1) {
81891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet7 = i1;
81911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81921b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet6(i1) {
81931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet6 = i1;
81951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
81961b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet5(i1) {
81971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
81981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet5 = i1;
81991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82001b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet4(i1) {
82011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
82021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet4 = i1;
82031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82041b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet3(i1) {
82051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
82061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet3 = i1;
82071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet2(i1) {
82091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
82101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet2 = i1;
82111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82121b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet1(i1) {
82131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
82141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet1 = i1;
82151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82161b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet0(i1) {
82171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0;
82181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet0 = i1;
82191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82201b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackSave() {
82211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return STACKTOP | 0;
82221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_END_FUNCS
82251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  return { _strlen: _strlen, _free: _free, _main: _main, _memset: _memset, _malloc: _malloc, _memcpy: _memcpy, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, setThrew: setThrew, setTempRet0: setTempRet0, setTempRet1: setTempRet1, setTempRet2: setTempRet2, setTempRet3: setTempRet3, setTempRet4: setTempRet4, setTempRet5: setTempRet5, setTempRet6: setTempRet6, setTempRet7: setTempRet7, setTempRet8: setTempRet8, setTempRet9: setTempRet9 };
82281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}).toString(),
82291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_END_ASM
82301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch{ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "min": Math_min, "_fflush": _fflush, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_putchar": _putchar, "_fputc": _fputc, "_send": _send, "_pwrite": _pwrite, "_abort": _abort, "__reallyNegative": __reallyNegative, "_fwrite": _fwrite, "_sbrk": _sbrk, "_mkport": _mkport, "_fprintf": _fprintf, "___setErrNo": ___setErrNo, "__formatString": __formatString, "_fileno": _fileno, "_printf": _printf, "_time": _time, "_sysconf": _sysconf, "_write": _write, "___errno_location": ___errno_location, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity }, buffer);
82311b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _strlen = Module["_strlen"] = asm["_strlen"];
82321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _free = Module["_free"] = asm["_free"];
82331b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _main = Module["_main"] = asm["_main"];
82341b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _memset = Module["_memset"] = asm["_memset"];
82351b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _malloc = Module["_malloc"] = asm["_malloc"];
82361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _memcpy = Module["_memcpy"] = asm["_memcpy"];
82371b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runPostSets = Module["runPostSets"] = asm["runPostSets"];
82381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82391b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
82401b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackSave = function() { return asm['stackSave']() };
82411b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackRestore = function(top) { asm['stackRestore'](top) };
82421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included
82451b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar i64Math = null;
82461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Auto-generated postamble setup entry stuff ===
82481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82491b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (memoryInitializer) {
82501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
82511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var data = Module['readBinary'](memoryInitializer);
82521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    HEAPU8.set(data, STATIC_BASE);
82531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
82541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    addRunDependency('memory initializer');
82551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Browser.asyncLoad(memoryInitializer, function(data) {
82561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      HEAPU8.set(data, STATIC_BASE);
82571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      removeRunDependency('memory initializer');
82581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }, function(data) {
82591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      throw 'could not load memory initializer ' + memoryInitializer;
82601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    });
82611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
82621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82641b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ExitStatus(status) {
82651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  this.name = "ExitStatus";
82661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  this.message = "Program terminated with exit(" + status + ")";
82671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  this.status = status;
82681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch};
82691b268ca467c924004286c97bac133db489cf43d0Ben MurdochExitStatus.prototype = new Error();
82701b268ca467c924004286c97bac133db489cf43d0Ben MurdochExitStatus.prototype.constructor = ExitStatus;
82711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82721b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar initialStackTop;
82731b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar preloadStartTime = null;
82741b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar calledMain = false;
82751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82761b268ca467c924004286c97bac133db489cf43d0Ben MurdochdependenciesFulfilled = function runCaller() {
82771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
82781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"]));
82791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
82801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
82811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82821b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['callMain'] = Module.callMain = function callMain(args) {
82831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
82841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');
82851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  args = args || [];
82871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  ensureInitRuntime();
82891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
82901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var argc = args.length+1;
82911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function pad() {
82921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    for (var i = 0; i < 4-1; i++) {
82931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      argv.push(0);
82941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
82951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
82961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ];
82971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  pad();
82981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  for (var i = 0; i < argc-1; i = i + 1) {
82991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));
83001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    pad();
83011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  argv.push(0);
83031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  argv = allocate(argv, 'i32', ALLOC_NORMAL);
83041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  initialStackTop = STACKTOP;
83061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  try {
83081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    var ret = Module['_main'](argc, argv, 0);
83101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    // if we're not running an evented main loop, it's time to exit
83131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (!Module['noExitRuntime']) {
83141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      exit(ret);
83151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
83161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  catch(e) {
83181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (e instanceof ExitStatus) {
83191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // exit() throws this once it's done to make sure execution
83201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // has been stopped completely
83211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return;
83221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else if (e == 'SimulateInfiniteLoop') {
83231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      // running an evented main loop, don't immediately exit
83241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module['noExitRuntime'] = true;
83251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      return;
83261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    } else {
83271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
83281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      throw e;
83291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
83301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } finally {
83311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    calledMain = true;
83321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
83341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83381b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction run(args) {
83391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  args = args || Module['arguments'];
83401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (preloadStartTime === null) preloadStartTime = Date.now();
83421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (runDependencies > 0) {
83441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module.printErr('run() called, but dependencies remain, so not running');
83451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return;
83461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  preRun();
83491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
83511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame
83521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  function doRun() {
83541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
83551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['calledRun'] = true;
83561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    ensureInitRuntime();
83581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    preMain();
83601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {
83621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms');
83631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
83641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    if (Module['_main'] && shouldRunNow) {
83661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      Module['callMain'](args);
83671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }
83681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    postRun();
83701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (Module['setStatus']) {
83731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['setStatus']('Running...');
83741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    setTimeout(function() {
83751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      setTimeout(function() {
83761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch        Module['setStatus']('');
83771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      }, 1);
83781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch      if (!ABORT) doRun();
83791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    }, 1);
83801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  } else {
83811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    doRun();
83821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
83831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
83841b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['run'] = Module.run = run;
83851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83861b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction exit(status) {
83871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  ABORT = true;
83881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  EXITSTATUS = status;
83891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  STACKTOP = initialStackTop;
83901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // exit the runtime
83921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  exitRuntime();
83931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
83941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // TODO We should handle this differently based on environment.
83951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // In the browser, the best we can do is throw an exception
83961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // to halt execution, but in node we could process.exit and
83971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // I'd imagine SM shell would have something equivalent.
83981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // This would let us set a proper exit status (which
83991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // would be great for checking test exit statuses).
84001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // https://github.com/kripken/emscripten/issues/1371
84011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  // throw an exception to halt the current execution
84031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  throw new ExitStatus(status);
84041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
84051b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['exit'] = Module.exit = exit;
84061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction abort(text) {
84081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (text) {
84091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module.print(text);
84101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module.printErr(text);
84111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
84121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  ABORT = true;
84141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  EXITSTATUS = 1;
84151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';
84171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  throw 'abort() at ' + stackTrace() + extra;
84191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
84201b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['abort'] = Module.abort = abort;
84211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// {{PRE_RUN_ADDITIONS}}
84231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84241b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (Module['preInit']) {
84251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
84261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  while (Module['preInit'].length > 0) {
84271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    Module['preInit'].pop()();
84281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
84291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
84301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// shouldRunNow refers to calling main(), not run().
84321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar shouldRunNow = true;
84331b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (Module['noInitialRun']) {
84341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  shouldRunNow = false;
84351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}
84361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
84381b268ca467c924004286c97bac133db489cf43d0Ben Murdochrun([].concat(Module["arguments"]));
8439