// Modified embenchen to direct to asm-wasm.
// Flags: --expose-wasm

var EXPECTED_OUTPUT =
  /frame averages: .+ \+- .+, range: .+ to .+ \n/;
var Module = {
  arguments: [1],
  print: function(x) {Module.printBuffer += x + '\n';},
  preRun: [function() {Module.printBuffer = ''}],
  postRun: [function() {
    assertTrue(EXPECTED_OUTPUT.test(Module.printBuffer));
  }],
};
// The Module object: Our interface to the outside world. We import
// and export values on it, and do the work to get that through
// closure compiler if necessary. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to do an eval in order to handle the closure compiler
// case, where this code here is minified but Module was defined
// elsewhere (e.g. case 4 above). We also need to check if Module
// already exists (e.g. case 3 above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define   var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module;
if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};

// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
for (var key in Module) {
  if (Module.hasOwnProperty(key)) {
    moduleOverrides[key] = Module[key];
  }
}

// The environment setup code below is customized to use Module.
// *** Environment setup code ***
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;

if (ENVIRONMENT_IS_NODE) {
  // Expose functionality in the same simple way that the shells work
  // Note that we pollute the global namespace here, otherwise we break in node
  if (!Module['print']) Module['print'] = function print(x) {
    process['stdout'].write(x + '\n');
  };
  if (!Module['printErr']) Module['printErr'] = function printErr(x) {
    process['stderr'].write(x + '\n');
  };

  var nodeFS = require('fs');
  var nodePath = require('path');

  Module['read'] = function read(filename, binary) {
    filename = nodePath['normalize'](filename);
    var ret = nodeFS['readFileSync'](filename);
    // The path is absolute if the normalized version is the same as the resolved.
    if (!ret && filename != nodePath['resolve'](filename)) {
      filename = path.join(__dirname, '..', 'src', filename);
      ret = nodeFS['readFileSync'](filename);
    }
    if (ret && !binary) ret = ret.toString();
    return ret;
  };

  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };

  Module['load'] = function load(f) {
    globalEval(read(f));
  };

  Module['arguments'] = process['argv'].slice(2);

  module['exports'] = Module;
}
else if (ENVIRONMENT_IS_SHELL) {
  if (!Module['print']) Module['print'] = print;
  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm

  if (typeof read != 'undefined') {
    Module['read'] = read;
  } else {
    Module['read'] = function read() { throw 'no read() available (jsc?)' };
  }

  Module['readBinary'] = function readBinary(f) {
    return read(f, 'binary');
  };

  if (typeof scriptArgs != 'undefined') {
    Module['arguments'] = scriptArgs;
  } else if (typeof arguments != 'undefined') {
    Module['arguments'] = arguments;
  }

  this['Module'] = Module;

  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)
}
else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  Module['read'] = function read(url) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, false);
    xhr.send(null);
    return xhr.responseText;
  };

  if (typeof arguments != 'undefined') {
    Module['arguments'] = arguments;
  }

  if (typeof console !== 'undefined') {
    if (!Module['print']) Module['print'] = function print(x) {
      console.log(x);
    };
    if (!Module['printErr']) Module['printErr'] = function printErr(x) {
      console.log(x);
    };
  } else {
    // Probably a worker, and without console.log. We can do very little here...
    var TRY_USE_DUMP = false;
    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
      dump(x);
    }) : (function(x) {
      // self.postMessage(x); // enable this if you want stdout to be sent as messages
    }));
  }

  if (ENVIRONMENT_IS_WEB) {
    window['Module'] = Module;
  } else {
    Module['load'] = importScripts;
  }
}
else {
  // Unreachable because SHELL is dependant on the others
  throw 'Unknown runtime environment. Where are we?';
}

function globalEval(x) {
  eval.call(null, x);
}
if (!Module['load'] == 'undefined' && Module['read']) {
  Module['load'] = function load(f) {
    globalEval(Module['read'](f));
  };
}
if (!Module['print']) {
  Module['print'] = function(){};
}
if (!Module['printErr']) {
  Module['printErr'] = Module['print'];
}
if (!Module['arguments']) {
  Module['arguments'] = [];
}
// *** Environment setup code ***

// Closure helpers
Module.print = Module['print'];
Module.printErr = Module['printErr'];

// Callbacks
Module['preRun'] = [];
Module['postRun'] = [];

// Merge back in the overrides
for (var key in moduleOverrides) {
  if (moduleOverrides.hasOwnProperty(key)) {
    Module[key] = moduleOverrides[key];
  }
}



// === Auto-generated preamble library stuff ===

//========================================
// Runtime code shared with compiler
//========================================

var Runtime = {
  stackSave: function () {
    return STACKTOP;
  },
  stackRestore: function (stackTop) {
    STACKTOP = stackTop;
  },
  forceAlign: function (target, quantum) {
    quantum = quantum || 4;
    if (quantum == 1) return target;
    if (isNumber(target) && isNumber(quantum)) {
      return Math.ceil(target/quantum)*quantum;
    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
    }
    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
  },
  isNumberType: function (type) {
    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
  },
  isPointerType: function isPointerType(type) {
  return type[type.length-1] == '*';
},
  isStructType: function isStructType(type) {
  if (isPointerType(type)) return false;
  if (isArrayType(type)) return true;
  if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
  // See comment in isStructPointerType()
  return type[0] == '%';
},
  INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
  FLOAT_TYPES: {"float":0,"double":0},
  or64: function (x, y) {
    var l = (x | 0) | (y | 0);
    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  and64: function (x, y) {
    var l = (x | 0) & (y | 0);
    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  xor64: function (x, y) {
    var l = (x | 0) ^ (y | 0);
    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  getNativeTypeSize: function (type) {
    switch (type) {
      case 'i1': case 'i8': return 1;
      case 'i16': return 2;
      case 'i32': return 4;
      case 'i64': return 8;
      case 'float': return 4;
      case 'double': return 8;
      default: {
        if (type[type.length-1] === '*') {
          return Runtime.QUANTUM_SIZE; // A pointer
        } else if (type[0] === 'i') {
          var bits = parseInt(type.substr(1));
          assert(bits % 8 === 0);
          return bits/8;
        } else {
          return 0;
        }
      }
    }
  },
  getNativeFieldSize: function (type) {
    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
  },
  dedup: function dedup(items, ident) {
  var seen = {};
  if (ident) {
    return items.filter(function(item) {
      if (seen[item[ident]]) return false;
      seen[item[ident]] = true;
      return true;
    });
  } else {
    return items.filter(function(item) {
      if (seen[item]) return false;
      seen[item] = true;
      return true;
    });
  }
},
  set: function set() {
  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
  var ret = {};
  for (var i = 0; i < args.length; i++) {
    ret[args[i]] = 0;
  }
  return ret;
},
  STACK_ALIGN: 8,
  getAlignSize: function (type, size, vararg) {
    // we align i64s and doubles on 64-bit boundaries, unlike x86
    if (!vararg && (type == 'i64' || type == 'double')) return 8;
    if (!type) return Math.min(size, 8); // align structures internally to 64 bits
    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
  },
  calculateStructAlignment: function calculateStructAlignment(type) {
    type.flatSize = 0;
    type.alignSize = 0;
    var diffs = [];
    var prev = -1;
    var index = 0;
    type.flatIndexes = type.fields.map(function(field) {
      index++;
      var size, alignSize;
      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
        alignSize = Runtime.getAlignSize(field, size);
      } else if (Runtime.isStructType(field)) {
        if (field[1] === '0') {
          // this is [0 x something]. When inside another structure like here, it must be at the end,
          // and it adds no size
          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
          size = 0;
          if (Types.types[field]) {
            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
          } else {
            alignSize = type.alignSize || QUANTUM_SIZE;
          }
        } else {
          size = Types.types[field].flatSize;
          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
        }
      } else if (field[0] == 'b') {
        // bN, large number field, like a [N x i8]
        size = field.substr(1)|0;
        alignSize = 1;
      } else if (field[0] === '<') {
        // vector type
        size = alignSize = Types.types[field].flatSize; // fully aligned
      } else if (field[0] === 'i') {
        // illegal integer field, that could not be legalized because it is an internal structure field
        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
        size = alignSize = parseInt(field.substr(1))/8;
        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
      } else {
        assert(false, 'invalid type for calculateStructAlignment');
      }
      if (type.packed) alignSize = 1;
      type.alignSize = Math.max(type.alignSize, alignSize);
      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
      type.flatSize = curr + size;
      if (prev >= 0) {
        diffs.push(curr-prev);
      }
      prev = curr;
      return curr;
    });
    if (type.name_ && type.name_[0] === '[') {
      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
      // allocating a potentially huge array for [999999 x i8] etc.
      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
    }
    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
    if (diffs.length == 0) {
      type.flatFactor = type.flatSize;
    } else if (Runtime.dedup(diffs).length == 1) {
      type.flatFactor = diffs[0];
    }
    type.needsFlattening = (type.flatFactor != 1);
    return type.flatIndexes;
  },
  generateStructInfo: function (struct, typeName, offset) {
    var type, alignment;
    if (typeName) {
      offset = offset || 0;
      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
      if (!type) return null;
      if (type.fields.length != struct.length) {
        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
        return null;
      }
      alignment = type.flatIndexes;
    } else {
      var type = { fields: struct.map(function(item) { return item[0] }) };
      alignment = Runtime.calculateStructAlignment(type);
    }
    var ret = {
      __size__: type.flatSize
    };
    if (typeName) {
      struct.forEach(function(item, i) {
        if (typeof item === 'string') {
          ret[item] = alignment[i] + offset;
        } else {
          // embedded struct
          var key;
          for (var k in item) key = k;
          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
        }
      });
    } else {
      struct.forEach(function(item, i) {
        ret[item[1]] = alignment[i];
      });
    }
    return ret;
  },
  dynCall: function (sig, ptr, args) {
    if (args && args.length) {
      if (!args.splice) args = Array.prototype.slice.call(args);
      args.splice(0, 0, ptr);
      return Module['dynCall_' + sig].apply(null, args);
    } else {
      return Module['dynCall_' + sig].call(null, ptr);
    }
  },
  functionPointers: [],
  addFunction: function (func) {
    for (var i = 0; i < Runtime.functionPointers.length; i++) {
      if (!Runtime.functionPointers[i]) {
        Runtime.functionPointers[i] = func;
        return 2*(1 + i);
      }
    }
    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
  },
  removeFunction: function (index) {
    Runtime.functionPointers[(index-2)/2] = null;
  },
  getAsmConst: function (code, numArgs) {
    // code is a constant string on the heap, so we can cache these
    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
    var func = Runtime.asmConstCache[code];
    if (func) return func;
    var args = [];
    for (var i = 0; i < numArgs; i++) {
      args.push(String.fromCharCode(36) + i); // $0, $1 etc
    }
    var source = Pointer_stringify(code);
    if (source[0] === '"') {
      // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
      if (source.indexOf('"', 1) === source.length-1) {
        source = source.substr(1, source.length-2);
      } else {
        // something invalid happened, e.g. EM_ASM("..code($0)..", input)
        abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
      }
    }
    try {
      var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })'); // new Function does not allow upvars in node
    } catch(e) {
      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.)');
      throw e;
    }
    return Runtime.asmConstCache[code] = evalled;
  },
  warnOnce: function (text) {
    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
    if (!Runtime.warnOnce.shown[text]) {
      Runtime.warnOnce.shown[text] = 1;
      Module.printErr(text);
    }
  },
  funcWrappers: {},
  getFuncWrapper: function (func, sig) {
    assert(sig);
    if (!Runtime.funcWrappers[func]) {
      Runtime.funcWrappers[func] = function dynCall_wrapper() {
        return Runtime.dynCall(sig, func, arguments);
      };
    }
    return Runtime.funcWrappers[func];
  },
  UTF8Processor: function () {
    var buffer = [];
    var needed = 0;
    this.processCChar = function (code) {
      code = code & 0xFF;

      if (buffer.length == 0) {
        if ((code & 0x80) == 0x00) {        // 0xxxxxxx
          return String.fromCharCode(code);
        }
        buffer.push(code);
        if ((code & 0xE0) == 0xC0) {        // 110xxxxx
          needed = 1;
        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
          needed = 2;
        } else {                            // 11110xxx
          needed = 3;
        }
        return '';
      }

      if (needed) {
        buffer.push(code);
        needed--;
        if (needed > 0) return '';
      }

      var c1 = buffer[0];
      var c2 = buffer[1];
      var c3 = buffer[2];
      var c4 = buffer[3];
      var ret;
      if (buffer.length == 2) {
        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));
      } else if (buffer.length == 3) {
        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));
      } else {
        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);
        ret = String.fromCharCode(
          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
          (codePoint - 0x10000) % 0x400 + 0xDC00);
      }
      buffer.length = 0;
      return ret;
    }
    this.processJSString = function processJSString(string) {
      /* TODO: use TextEncoder when present,
        var encoder = new TextEncoder();
        encoder['encoding'] = "utf-8";
        var utf8Array = encoder['encode'](aMsg.data);
      */
      string = unescape(encodeURIComponent(string));
      var ret = [];
      for (var i = 0; i < string.length; i++) {
        ret.push(string.charCodeAt(i));
      }
      return ret;
    }
  },
  getCompilerSetting: function (name) {
    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';
  },
  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },
  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },
  GLOBAL_BASE: 8,
  QUANTUM_SIZE: 4,
  __dummy__: 0
}


Module['Runtime'] = Runtime;









//========================================
// Runtime essentials
//========================================

var __THREW__ = 0; // Used in checking for thrown exceptions.

var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
var EXITSTATUS = 0;

var undef = 0;
// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
var tempI64, tempI64b;
var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;

function assert(condition, text) {
  if (!condition) {
    abort('Assertion failed: ' + text);
  }
}

var globalScope = this;

// C calling interface. A convenient way to call C functions (in C files, or
// defined with extern "C").
//
// Note: LLVM optimizations can inline and remove functions, after which you will not be
//       able to call them. Closure can also do so. To avoid that, add your function to
//       the exports using something like
//
//         -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
//
// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern "C")
// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
// @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,
//                   except that 'array' is not possible (there is no way for us to know the length of the array)
// @param args       An array of the arguments to the function, as native JS values (as in returnType)
//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
// @return           The return value, as a native JS value (as in returnType)
function ccall(ident, returnType, argTypes, args) {
  return ccallFunc(getCFunc(ident), returnType, argTypes, args);
}
Module["ccall"] = ccall;

// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
  try {
    var func = Module['_' + ident]; // closure exported function
    if (!func) func = eval('_' + ident); // explicit lookup
  } catch(e) {
  }
  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
  return func;
}

// Internal function that does a C call using a function, not an identifier
function ccallFunc(func, returnType, argTypes, args) {
  var stack = 0;
  function toC(value, type) {
    if (type == 'string') {
      if (value === null || value === undefined || value === 0) return 0; // null string
      value = intArrayFromString(value);
      type = 'array';
    }
    if (type == 'array') {
      if (!stack) stack = Runtime.stackSave();
      var ret = Runtime.stackAlloc(value.length);
      writeArrayToMemory(value, ret);
      return ret;
    }
    return value;
  }
  function fromC(value, type) {
    if (type == 'string') {
      return Pointer_stringify(value);
    }
    assert(type != 'array');
    return value;
  }
  var i = 0;
  var cArgs = args ? args.map(function(arg) {
    return toC(arg, argTypes[i++]);
  }) : [];
  var ret = fromC(func.apply(null, cArgs), returnType);
  if (stack) Runtime.stackRestore(stack);
  return ret;
}

// Returns a native JS wrapper for a C function. This is similar to ccall, but
// returns a function you can call repeatedly in a normal way. For example:
//
//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
//   alert(my_function(5, 22));
//   alert(my_function(99, 12));
//
function cwrap(ident, returnType, argTypes) {
  var func = getCFunc(ident);
  return function() {
    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
  }
}
Module["cwrap"] = cwrap;

// Sets a value in memory in a dynamic way at run-time. Uses the
// type data. This is the same as makeSetValue, except that
// makeSetValue is done at compile-time and generates the needed
// code then, whereas this function picks the right code at
// run-time.
// Note that setValue and getValue only do *aligned* writes and reads!
// Note that ccall uses JS types as for defining types, while setValue and
// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
function setValue(ptr, value, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
    switch(type) {
      case 'i1': HEAP8[(ptr)]=value; break;
      case 'i8': HEAP8[(ptr)]=value; break;
      case 'i16': HEAP16[((ptr)>>1)]=value; break;
      case 'i32': HEAP32[((ptr)>>2)]=value; break;
      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;
      case 'float': HEAPF32[((ptr)>>2)]=value; break;
      case 'double': HEAPF64[((ptr)>>3)]=value; break;
      default: abort('invalid type for setValue: ' + type);
    }
}
Module['setValue'] = setValue;

// Parallel to setValue.
function getValue(ptr, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
    switch(type) {
      case 'i1': return HEAP8[(ptr)];
      case 'i8': return HEAP8[(ptr)];
      case 'i16': return HEAP16[((ptr)>>1)];
      case 'i32': return HEAP32[((ptr)>>2)];
      case 'i64': return HEAP32[((ptr)>>2)];
      case 'float': return HEAPF32[((ptr)>>2)];
      case 'double': return HEAPF64[((ptr)>>3)];
      default: abort('invalid type for setValue: ' + type);
    }
  return null;
}
Module['getValue'] = getValue;

var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
var ALLOC_STATIC = 2; // Cannot be freed
var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
var ALLOC_NONE = 4; // Do not allocate
Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
Module['ALLOC_STACK'] = ALLOC_STACK;
Module['ALLOC_STATIC'] = ALLOC_STATIC;
Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
Module['ALLOC_NONE'] = ALLOC_NONE;

// allocate(): This is for internal use. You can use it yourself as well, but the interface
//             is a little tricky (see docs right below). The reason is that it is optimized
//             for multiple syntaxes to save space in generated code. So you should
//             normally not use allocate(), and instead allocate memory using _malloc(),
//             initialize it with setValue(), and so forth.
// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
//        in *bytes* (note that this is sometimes confusing: the next parameter does not
//        affect this!)
// @types: Either an array of types, one for each byte (or 0 if no type at that position),
//         or a single type which is used for the entire block. This only matters if there
//         is initial data - if @slab is a number, then this does not matter at all and is
//         ignored.
// @allocator: How to allocate memory, see ALLOC_*
function allocate(slab, types, allocator, ptr) {
  var zeroinit, size;
  if (typeof slab === 'number') {
    zeroinit = true;
    size = slab;
  } else {
    zeroinit = false;
    size = slab.length;
  }

  var singleType = typeof types === 'string' ? types : null;

  var ret;
  if (allocator == ALLOC_NONE) {
    ret = ptr;
  } else {
    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
  }

  if (zeroinit) {
    var ptr = ret, stop;
    assert((ret & 3) == 0);
    stop = ret + (size & ~3);
    for (; ptr < stop; ptr += 4) {
      HEAP32[((ptr)>>2)]=0;
    }
    stop = ret + size;
    while (ptr < stop) {
      HEAP8[((ptr++)|0)]=0;
    }
    return ret;
  }

  if (singleType === 'i8') {
    if (slab.subarray || slab.slice) {
      HEAPU8.set(slab, ret);
    } else {
      HEAPU8.set(new Uint8Array(slab), ret);
    }
    return ret;
  }

  var i = 0, type, typeSize, previousType;
  while (i < size) {
    var curr = slab[i];

    if (typeof curr === 'function') {
      curr = Runtime.getFunctionIndex(curr);
    }

    type = singleType || types[i];
    if (type === 0) {
      i++;
      continue;
    }

    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later

    setValue(ret+i, curr, type);

    // no need to look up size unless type changes, so cache it
    if (previousType !== type) {
      typeSize = Runtime.getNativeTypeSize(type);
      previousType = type;
    }
    i += typeSize;
  }

  return ret;
}
Module['allocate'] = allocate;

function Pointer_stringify(ptr, /* optional */ length) {
  // TODO: use TextDecoder
  // Find the length, and check for UTF while doing so
  var hasUtf = false;
  var t;
  var i = 0;
  while (1) {
    t = HEAPU8[(((ptr)+(i))|0)];
    if (t >= 128) hasUtf = true;
    else if (t == 0 && !length) break;
    i++;
    if (length && i == length) break;
  }
  if (!length) length = i;

  var ret = '';

  if (!hasUtf) {
    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
    var curr;
    while (length > 0) {
      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
      ret = ret ? ret + curr : curr;
      ptr += MAX_CHUNK;
      length -= MAX_CHUNK;
    }
    return ret;
  }

  var utf8 = new Runtime.UTF8Processor();
  for (i = 0; i < length; i++) {
    t = HEAPU8[(((ptr)+(i))|0)];
    ret += utf8.processCChar(t);
  }
  return ret;
}
Module['Pointer_stringify'] = Pointer_stringify;

// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF16ToString(ptr) {
  var i = 0;

  var str = '';
  while (1) {
    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
    if (codeUnit == 0)
      return str;
    ++i;
    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
    str += String.fromCharCode(codeUnit);
  }
}
Module['UTF16ToString'] = UTF16ToString;

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
function stringToUTF16(str, outPtr) {
  for(var i = 0; i < str.length; ++i) {
    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
}
Module['stringToUTF16'] = stringToUTF16;

// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF32ToString(ptr) {
  var i = 0;

  var str = '';
  while (1) {
    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
    if (utf32 == 0)
      return str;
    ++i;
    // 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.
    if (utf32 >= 0x10000) {
      var ch = utf32 - 0x10000;
      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
    } else {
      str += String.fromCharCode(utf32);
    }
  }
}
Module['UTF32ToString'] = UTF32ToString;

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
// 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.
function stringToUTF32(str, outPtr) {
  var iChar = 0;
  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
    // 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.
    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
      var trailSurrogate = str.charCodeAt(++iCodeUnit);
      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
    }
    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
    ++iChar;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
}
Module['stringToUTF32'] = stringToUTF32;

function demangle(func) {
  var i = 3;
  // params, etc.
  var basicTypes = {
    'v': 'void',
    'b': 'bool',
    'c': 'char',
    's': 'short',
    'i': 'int',
    'l': 'long',
    'f': 'float',
    'd': 'double',
    'w': 'wchar_t',
    'a': 'signed char',
    'h': 'unsigned char',
    't': 'unsigned short',
    'j': 'unsigned int',
    'm': 'unsigned long',
    'x': 'long long',
    'y': 'unsigned long long',
    'z': '...'
  };
  var subs = [];
  var first = true;
  function dump(x) {
    //return;
    if (x) Module.print(x);
    Module.print(func);
    var pre = '';
    for (var a = 0; a < i; a++) pre += ' ';
    Module.print (pre + '^');
  }
  function parseNested() {
    i++;
    if (func[i] === 'K') i++; // ignore const
    var parts = [];
    while (func[i] !== 'E') {
      if (func[i] === 'S') { // substitution
        i++;
        var next = func.indexOf('_', i);
        var num = func.substring(i, next) || 0;
        parts.push(subs[num] || '?');
        i = next+1;
        continue;
      }
      if (func[i] === 'C') { // constructor
        parts.push(parts[parts.length-1]);
        i += 2;
        continue;
      }
      var size = parseInt(func.substr(i));
      var pre = size.toString().length;
      if (!size || !pre) { i--; break; } // counter i++ below us
      var curr = func.substr(i + pre, size);
      parts.push(curr);
      subs.push(curr);
      i += pre + size;
    }
    i++; // skip E
    return parts;
  }
  function parse(rawList, limit, allowVoid) { // main parser
    limit = limit || Infinity;
    var ret = '', list = [];
    function flushList() {
      return '(' + list.join(', ') + ')';
    }
    var name;
    if (func[i] === 'N') {
      // namespaced N-E
      name = parseNested().join('::');
      limit--;
      if (limit === 0) return rawList ? [name] : name;
    } else {
      // not namespaced
      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
      var size = parseInt(func.substr(i));
      if (size) {
        var pre = size.toString().length;
        name = func.substr(i + pre, size);
        i += pre + size;
      }
    }
    first = false;
    if (func[i] === 'I') {
      i++;
      var iList = parse(true);
      var iRet = parse(true, 1, true);
      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
    } else {
      ret = name;
    }
    paramLoop: while (i < func.length && limit-- > 0) {
      //dump('paramLoop');
      var c = func[i++];
      if (c in basicTypes) {
        list.push(basicTypes[c]);
      } else {
        switch (c) {
          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
          case 'L': { // literal
            i++; // skip basic type
            var end = func.indexOf('E', i);
            var size = end - i;
            list.push(func.substr(i, size));
            i += size + 2; // size + 'EE'
            break;
          }
          case 'A': { // array
            var size = parseInt(func.substr(i));
            i += size.toString().length;
            if (func[i] !== '_') throw '?';
            i++; // skip _
            list.push(parse(true, 1, true)[0] + ' [' + size + ']');
            break;
          }
          case 'E': break paramLoop;
          default: ret += '?' + c; break paramLoop;
        }
      }
    }
    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
    if (rawList) {
      if (ret) {
        list.push(ret + '?');
      }
      return list;
    } else {
      return ret + flushList();
    }
  }
  try {
    // Special-case the entry point, since its name differs from other name mangling.
    if (func == 'Object._main' || func == '_main') {
      return 'main()';
    }
    if (typeof func === 'number') func = Pointer_stringify(func);
    if (func[0] !== '_') return func;
    if (func[1] !== '_') return func; // C function
    if (func[2] !== 'Z') return func;
    switch (func[3]) {
      case 'n': return 'operator new()';
      case 'd': return 'operator delete()';
    }
    return parse();
  } catch(e) {
    return func;
  }
}

function demangleAll(text) {
  return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
}

function stackTrace() {
  var stack = new Error().stack;
  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
}

// Memory management

var PAGE_SIZE = 4096;
function alignMemoryPage(x) {
  return (x+4095)&-4096;
}

var HEAP;
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;

var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk

function enlargeMemory() {
  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.');
}

var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728;
var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;

var totalMemory = 4096;
while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
  if (totalMemory < 16*1024*1024) {
    totalMemory *= 2;
  } else {
    totalMemory += 16*1024*1024
  }
}
if (totalMemory !== TOTAL_MEMORY) {
  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');
  TOTAL_MEMORY = totalMemory;
}

// Initialize the runtime's memory
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
       'JS engine does not provide full typed array support');

var buffer = new ArrayBuffer(TOTAL_MEMORY);
HEAP8 = new Int8Array(buffer);
HEAP16 = new Int16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPU8 = new Uint8Array(buffer);
HEAPU16 = new Uint16Array(buffer);
HEAPU32 = new Uint32Array(buffer);
HEAPF32 = new Float32Array(buffer);
HEAPF64 = new Float64Array(buffer);

// Endianness check (note: assumes compiler arch was little-endian)
HEAP32[0] = 255;
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');

Module['HEAP'] = HEAP;
Module['HEAP8'] = HEAP8;
Module['HEAP16'] = HEAP16;
Module['HEAP32'] = HEAP32;
Module['HEAPU8'] = HEAPU8;
Module['HEAPU16'] = HEAPU16;
Module['HEAPU32'] = HEAPU32;
Module['HEAPF32'] = HEAPF32;
Module['HEAPF64'] = HEAPF64;

function callRuntimeCallbacks(callbacks) {
  while(callbacks.length > 0) {
    var callback = callbacks.shift();
    if (typeof callback == 'function') {
      callback();
      continue;
    }
    var func = callback.func;
    if (typeof func === 'number') {
      if (callback.arg === undefined) {
        Runtime.dynCall('v', func);
      } else {
        Runtime.dynCall('vi', func, [callback.arg]);
      }
    } else {
      func(callback.arg === undefined ? null : callback.arg);
    }
  }
}

var __ATPRERUN__  = []; // functions called before the runtime is initialized
var __ATINIT__    = []; // functions called during startup
var __ATMAIN__    = []; // functions called when main() is to be run
var __ATEXIT__    = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the runtime has exited

var runtimeInitialized = false;

function preRun() {
  // compatibility - merge in anything from Module['preRun'] at this time
  if (Module['preRun']) {
    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
    while (Module['preRun'].length) {
      addOnPreRun(Module['preRun'].shift());
    }
  }
  callRuntimeCallbacks(__ATPRERUN__);
}

function ensureInitRuntime() {
  if (runtimeInitialized) return;
  runtimeInitialized = true;
  callRuntimeCallbacks(__ATINIT__);
}

function preMain() {
  callRuntimeCallbacks(__ATMAIN__);
}

function exitRuntime() {
  callRuntimeCallbacks(__ATEXIT__);
}

function postRun() {
  // compatibility - merge in anything from Module['postRun'] at this time
  if (Module['postRun']) {
    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
    while (Module['postRun'].length) {
      addOnPostRun(Module['postRun'].shift());
    }
  }
  callRuntimeCallbacks(__ATPOSTRUN__);
}

function addOnPreRun(cb) {
  __ATPRERUN__.unshift(cb);
}
Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;

function addOnInit(cb) {
  __ATINIT__.unshift(cb);
}
Module['addOnInit'] = Module.addOnInit = addOnInit;

function addOnPreMain(cb) {
  __ATMAIN__.unshift(cb);
}
Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;

function addOnExit(cb) {
  __ATEXIT__.unshift(cb);
}
Module['addOnExit'] = Module.addOnExit = addOnExit;

function addOnPostRun(cb) {
  __ATPOSTRUN__.unshift(cb);
}
Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;

// Tools

// This processes a JS string into a C-line array of numbers, 0-terminated.
// For LLVM-originating strings, see parser.js:parseLLVMString function
function intArrayFromString(stringy, dontAddNull, length /* optional */) {
  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
  if (length) {
    ret.length = length;
  }
  if (!dontAddNull) {
    ret.push(0);
  }
  return ret;
}
Module['intArrayFromString'] = intArrayFromString;

function intArrayToString(array) {
  var ret = [];
  for (var i = 0; i < array.length; i++) {
    var chr = array[i];
    if (chr > 0xFF) {
      chr &= 0xFF;
    }
    ret.push(String.fromCharCode(chr));
  }
  return ret.join('');
}
Module['intArrayToString'] = intArrayToString;

// Write a Javascript array to somewhere in the heap
function writeStringToMemory(string, buffer, dontAddNull) {
  var array = intArrayFromString(string, dontAddNull);
  var i = 0;
  while (i < array.length) {
    var chr = array[i];
    HEAP8[(((buffer)+(i))|0)]=chr;
    i = i + 1;
  }
}
Module['writeStringToMemory'] = writeStringToMemory;

function writeArrayToMemory(array, buffer) {
  for (var i = 0; i < array.length; i++) {
    HEAP8[(((buffer)+(i))|0)]=array[i];
  }
}
Module['writeArrayToMemory'] = writeArrayToMemory;

function writeAsciiToMemory(str, buffer, dontAddNull) {
  for (var i = 0; i < str.length; i++) {
    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
  }
  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
}
Module['writeAsciiToMemory'] = writeAsciiToMemory;

function unSign(value, bits, ignore) {
  if (value >= 0) {
    return value;
  }
  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
                    : Math.pow(2, bits)         + value;
}
function reSign(value, bits, ignore) {
  if (value <= 0) {
    return value;
  }
  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
                        : Math.pow(2, bits-1);
  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
                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
                                                       // TODO: In i64 mode 1, resign the two parts separately and safely
    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
  }
  return value;
}

// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
  var ah  = a >>> 16;
  var al = a & 0xffff;
  var bh  = b >>> 16;
  var bl = b & 0xffff;
  return (al*bl + ((ah*bl + al*bh) << 16))|0;
};
Math.imul = Math['imul'];


var Math_abs = Math.abs;
var Math_cos = Math.cos;
var Math_sin = Math.sin;
var Math_tan = Math.tan;
var Math_acos = Math.acos;
var Math_asin = Math.asin;
var Math_atan = Math.atan;
var Math_atan2 = Math.atan2;
var Math_exp = Math.exp;
var Math_log = Math.log;
var Math_sqrt = Math.sqrt;
var Math_ceil = Math.ceil;
var Math_floor = Math.floor;
var Math_pow = Math.pow;
var Math_imul = Math.imul;
var Math_fround = Math.fround;
var Math_min = Math.min;

// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled

function addRunDependency(id) {
  runDependencies++;
  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }
}
Module['addRunDependency'] = addRunDependency;
function removeRunDependency(id) {
  runDependencies--;
  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }
  if (runDependencies == 0) {
    if (runDependencyWatcher !== null) {
      clearInterval(runDependencyWatcher);
      runDependencyWatcher = null;
    }
    if (dependenciesFulfilled) {
      var callback = dependenciesFulfilled;
      dependenciesFulfilled = null;
      callback(); // can add another dependenciesFulfilled
    }
  }
}
Module['removeRunDependency'] = removeRunDependency;

Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data


var memoryInitializer = null;

// === Body ===
var __ZTVN10__cxxabiv117__class_type_infoE = 7024;
var __ZTVN10__cxxabiv120__si_class_type_infoE = 7064;




STATIC_BASE = 8;

STATICTOP = STATIC_BASE + Runtime.alignMemory(7731);
/* global initializers */ __ATINIT__.push();


/* memory initializer */ allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,118,72,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,114,114,111,114,58,32,37,100,92,110,0,0,0,0,0,102,114,97,109,101,32,97,118,101,114,97,103,101,115,58,32,37,46,51,102,32,43,45,32,37,46,51,102,44,32,114,97,110,103,101,58,32,37,46,51,102,32,116,111,32,37,46,51,102,32,10,0,0,0,0,0,105,102,32,40,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,41,32,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,40,41,0,0,114,101,115,112,111,110,115,105,118,101,32,109,97,105,110,32,108,111,111,112,0,0,0,0,0,0,0,0,56,1,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,49,49,98,50,69,100,103,101,83,104,97,112,101,0,0,0,55,98,50,83,104,97,112,101,0,0,0,0,0,0,0,0,120,27,0,0,32,1,0,0,160,27,0,0,16,1,0,0,48,1,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,80,111,108,121,103,111,110,83,104,97,112,101,46,99,112,112,0,0,0,0,0,0,0,48,46,48,102,32,60,61,32,108,111,119,101,114,32,38,38,32,108,111,119,101,114,32,60,61,32,105,110,112,117,116,46,109,97,120,70,114,97,99,116,105,111,110,0,0,0,0,0,82,97,121,67,97,115,116,0,109,95,118,101,114,116,101,120,67,111,117,110,116,32,62,61,32,51,0,0,0,0,0,0,67,111,109,112,117,116,101,77,97,115,115,0,0,0,0,0,97,114,101,97,32,62,32,49,46,49,57,50,48,57,50,57,48,101,45,48,55,70,0,0,0,0,0,0,48,2,0,0,3,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,49,52,98,50,80,111,108,121,103,111,110,83,104,97,112,101,0,0,0,0,0,0,0,0,160,27,0,0,24,2,0,0,48,1,0,0,0,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,1,0,0,64,1,0,0,128,1,0,0,192,1,0,0,0,2,0,0,128,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,0,48,32,60,32,115,105,122,101,0,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,98,108,111,99,107,67,111,117,110,116,32,42,32,98,108,111,99,107,83,105,122,101,32,60,61,32,98,50,95,99,104,117,110,107,83,105,122,101,0,0,70,114,101,101,0,0,0,0,98,100,45,62,112,111,115,105,116,105,111,110,46,73,115,86,97,108,105,100,40,41,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,66,111,100,121,46,99,112,112,0,0,0,0,0,0,0,98,50,66,111,100,121,0,0,98,100,45,62,108,105,110,101,97,114,86,101,108,111,99,105,116,121,46,73,115,86,97,108,105,100,40,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,108,101,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,86,101,108,111,99,105,116,121,41,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,0,0,109,95,119,111,114,108,100,45,62,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,67,114,101,97,116,101,70,105,120,116,117,114,101,0,0,0,109,95,116,121,112,101,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,0,0,82,101,115,101,116,77,97,115,115,68,97,116,97,0,0,0,109,95,73,32,62,32,48,46,48,102,0,0,0,0,0,0,0,10,0,0,0,0,0,0,240,7,0,0,0,0,0,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,104,0,0,0,0,0,0,0,71,101,116,85,115,101,114,68,97,116,97,0,0,0,0,0,71,101,116,70,97,116,65,65,66,66,0,0,0,0,0,0,0,0,0,0,32,8,0,0,5,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,49,55,98,50,67,111,110,116,97,99,116,76,105,115,116,101,110,101,114,0,0,0,0,0,120,27,0,0,8,8,0,0,109,95,112,114,111,120,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,70,105,120,116,117,114,101,46,99,112,112,0,0,0,0,67,114,101,97,116,101,80,114,111,120,105,101,115,0,0,0,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,87,111,114,108,100,46,99,112,112,0,0,0,0,0,0,67,114,101,97,116,101,66,111,100,121,0,0,0,0,0,0,98,45,62,73,115,65,99,116,105,118,101,40,41,32,61,61,32,116,114,117,101,0,0,0,83,111,108,118,101,0,0,0,115,116,97,99,107,67,111,117,110,116,32,60,32,115,116,97,99,107,83,105,122,101,0,0,116,121,112,101,65,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,32,124,124,32,116,121,112,101,66,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,97,108,112,104,97,48,32,60,32,49,46,48,102,0,0,0,46,47,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,77,97,116,104,46,104,0,65,100,118,97,110,99,101,0,109,95,106,111,105,110,116,67,111,117,110,116,32,60,32,109,95,106,111,105,110,116,67,97,112,97,99,105,116,121,0,0,46,47,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,104,0,0,0,0,0,65,100,100,0,0,0,0,0,109,95,99,111,110,116,97,99,116,67,111,117,110,116,32,60,32,109,95,99,111,110,116,97,99,116,67,97,112,97,99,105,116,121,0,0,0,0,0,0,109,95,98,111,100,121,67,111,117,110,116,32,60,32,109,95,98,111,100,121,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,40,10,0,0,7,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,49,53,98,50,67,111,110,116,97,99,116,70,105,108,116,101,114,0,0,0,0,0,0,0,120,27,0,0,16,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,99,104,97,105,110,45,62,109,95,99,111,117,110,116,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,99,112,112,0,0,83,101,116,0,0,0,0,0,102,97,108,115,101,0,0,0,98,50,68,105,115,116,97,110,99,101,0,0,0,0,0,0,71,101,116,77,101,116,114,105,99,0,0,0,0,0,0,0,71,101,116,87,105,116,110,101,115,115,80,111,105,110,116,115,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,71,101,116,67,108,111,115,101,115,116,80,111,105,110,116,0,99,97,99,104,101,45,62,99,111,117,110,116,32,60,61,32,51,0,0,0,0,0,0,0,82,101,97,100,67,97,99,104,101,0,0,0,0,0,0,0,109,95,110,111,100,101,67,111,117,110,116,32,61,61,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,99,112,112,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,78,111,100,101,0,0,0,0,48,32,60,61,32,110,111,100,101,73,100,32,38,38,32,110,111,100,101,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,70,114,101,101,78,111,100,101,0,0,0,0,0,0,0,0,48,32,60,32,109,95,110,111,100,101,67,111,117,110,116,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,109,95,110,111,100,101,115,91,112,114,111,120,121,73,100,93,46,73,115,76,101,97,102,40,41,0,0,0,0,0,0,0,77,111,118,101,80,114,111,120,121,0,0,0,0,0,0,0,99,104,105,108,100,49,32,33,61,32,40,45,49,41,0,0,73,110,115,101,114,116,76,101,97,102,0,0,0,0,0,0,99,104,105,108,100,50,32,33,61,32,40,45,49,41,0,0,105,65,32,33,61,32,40,45,49,41,0,0,0,0,0,0,66,97,108,97,110,99,101,0,48,32,60,61,32,105,66,32,38,38,32,105,66,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,67,32,38,38,32,105,67,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,70,32,38,38,32,105,70,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,71,32,38,38,32,105,71,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,67,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,48,32,60,61,32,105,68,32,38,38,32,105,68,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,69,32,38,38,32,105,69,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,66,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,97,114,103,101,116,32,62,32,116,111,108,101,114,97,110,99,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,84,105,109,101,79,102,73,109,112,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,84,105,109,101,79,102,73,109,112,97,99,116,0,0,102,97,108,115,101,0,0,0,69,118,97,108,117,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,70,105,110,100,77,105,110,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,48,32,60,32,99,111,117,110,116,32,38,38,32,99,111,117,110,116,32,60,32,51,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,95,105,110,100,101,120,32,61,61,32,48,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,126,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,60,32,98,50,95,109,97,120,83,116,97,99,107,69,110,116,114,105,101,115,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,70,114,101,101,0,0,0,0,112,32,61,61,32,101,110,116,114,121,45,62,100,97,116,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,116,121,112,101,49,32,38,38,32,116,121,112,101,49,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,46,99,112,112,0,0,0,48,32,60,61,32,116,121,112,101,50,32,38,38,32,116,121,112,101,50,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,67,114,101,97,116,101,0,0,115,95,105,110,105,116,105,97,108,105,122,101,100,32,61,61,32,116,114,117,101,0,0,0,68,101,115,116,114,111,121,0,48,32,60,61,32,116,121,112,101,65,32,38,38,32,116,121,112,101,66,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,0,0,0,0,120,17,0,0,1,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,57,98,50,67,111,110,116,97,99,116,0,0,0,0,0,0,120,27,0,0,104,17,0,0,0,0,0,0,104,18,0,0,3,0,0,0,11,0,0,0,12,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,50,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,160,27,0,0,72,18,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,19,0,0,4,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,51,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,19,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,20,0,0,5,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,53,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,160,27,0,0,64,20,0,0,120,17,0,0,0,0,0,0,0,0,0,0,72,21,0,0,6,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,49,54,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,48,21,0,0,120,17,0,0,0,0,0,0,116,111,105,73,110,100,101,120,65,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,99,112,112,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,116,111,105,73,110,100,101,120,66,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,100,101,110,32,62,32,48,46,48,102,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,69,100,103,101,46,99,112,112,0,0,0,0,0,0,0,98,50,67,111,108,108,105,100,101,69,100,103,101,65,110,100,67,105,114,99,108,101,0,0,48,32,60,61,32,101,100,103,101,49,32,38,38,32,101,100,103,101,49,32,60,32,112,111,108,121,49,45,62,109,95,118,101,114,116,101,120,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,80,111,108,121,103,111,110,46,99,112,112,0,0,0,0,98,50,70,105,110,100,73,110,99,105,100,101,110,116,69,100,103,101,0,0,0,0,0,0,98,50,69,100,103,101,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,120,23,0,0,7,0,0,0,19,0,0,0,20,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,51,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,88,23,0,0,120,17,0,0,0,0,0,0,0,0,0,0,120,24,0,0,8,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,52,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,88,24,0,0,120,17,0,0,0,0,0,0,0,0,0,0,88,25,0,0,9,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,49,53,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,25,0,0,120,17,0,0,0,0,0,0,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,46,99,112,112,0,0,0,0,0,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,0,109,97,110,105,102,111,108,100,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,112,111,105,110,116,67,111,117,110,116,32,61,61,32,49,32,124,124,32,112,111,105,110,116,67,111,117,110,116,32,61,61,32,50,0,0,0,0,0,0,83,111,108,118,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,46,120,32,62,61,32,48,46,48,102,32,38,38,32,97,46,121,32,62,61,32,48,46,48,102,0,0,0,0,0,0,112,99,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,67,104,97,105,110,83,104,97,112,101,46,99,112,112,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,32,45,32,49,0,0,0,0,0,0,0,71,101,116,67,104,105,108,100,69,100,103,101,0,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,120,27,0,0,232,26,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,160,27,0,0,0,27,0,0,248,26,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,160,27,0,0,56,27,0,0,40,27,0,0,0,0,0,0,0,0,0,0,96,27,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,232,27,0,0,25,0,0,0,29,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,11,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,160,27,0,0,192,27,0,0,96,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,30,0,0,30,0,0,0,31,0,0,0,3,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,160,27,0,0,24,30,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);




var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);

assert(tempDoublePtr % 8 == 0);

function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much

  HEAP8[tempDoublePtr] = HEAP8[ptr];

  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];

  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];

  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];

}

function copyTempDouble(ptr) {

  HEAP8[tempDoublePtr] = HEAP8[ptr];

  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];

  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];

  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];

  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];

  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];

  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];

  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];

}


  function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg) {
      Module['noExitRuntime'] = true;

      Browser.mainLoop.runner = function Browser_mainLoop_runner() {
        if (ABORT) return;
        if (Browser.mainLoop.queue.length > 0) {
          var start = Date.now();
          var blocker = Browser.mainLoop.queue.shift();
          blocker.func(blocker.arg);
          if (Browser.mainLoop.remainingBlockers) {
            var remaining = Browser.mainLoop.remainingBlockers;
            var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining);
            if (blocker.counted) {
              Browser.mainLoop.remainingBlockers = next;
            } else {
              // not counted, but move the progress along a tiny bit
              next = next + 0.5; // do not steal all the next one's progress
              Browser.mainLoop.remainingBlockers = (8*remaining + next)/9;
            }
          }
          console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); //, left: ' + Browser.mainLoop.remainingBlockers);
          Browser.mainLoop.updateStatus();
          setTimeout(Browser.mainLoop.runner, 0);
          return;
        }
        if (Browser.mainLoop.shouldPause) {
          // catch pauses from non-main loop sources
          Browser.mainLoop.paused = true;
          Browser.mainLoop.shouldPause = false;
          return;
        }

        // Signal GL rendering layer that processing of a new frame is about to start. This helps it optimize
        // VBO double-buffering and reduce GPU stalls.

        if (Browser.mainLoop.method === 'timeout' && Module.ctx) {
          Module.printErr('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!');
          Browser.mainLoop.method = ''; // just warn once per call to set main loop
        }

        if (Module['preMainLoop']) {
          Module['preMainLoop']();
        }

        try {
          if (typeof arg !== 'undefined') {
            Runtime.dynCall('vi', func, [arg]);
          } else {
            Runtime.dynCall('v', func);
          }
        } catch (e) {
          if (e instanceof ExitStatus) {
            return;
          } else {
            if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
            throw e;
          }
        }

        if (Module['postMainLoop']) {
          Module['postMainLoop']();
        }

        if (Browser.mainLoop.shouldPause) {
          // catch pauses from the main loop itself
          Browser.mainLoop.paused = true;
          Browser.mainLoop.shouldPause = false;
          return;
        }
        Browser.mainLoop.scheduler();
      }
      if (fps && fps > 0) {
        Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler() {
          setTimeout(Browser.mainLoop.runner, 1000/fps); // doing this each time means that on exception, we stop
        };
        Browser.mainLoop.method = 'timeout';
      } else {
        Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler() {
          Browser.requestAnimationFrame(Browser.mainLoop.runner);
        };
        Browser.mainLoop.method = 'rAF';
      }
      Browser.mainLoop.scheduler();

      if (simulateInfiniteLoop) {
        throw 'SimulateInfiniteLoop';
      }
    }

  var _cosf=Math_cos;

  function ___cxa_pure_virtual() {
      ABORT = true;
      throw 'Pure virtual function called!';
    }

  function _time(ptr) {
      var ret = Math.floor(Date.now()/1000);
      if (ptr) {
        HEAP32[((ptr)>>2)]=ret;
      }
      return ret;
    }

  function ___assert_fail(condition, filename, line, func) {
      ABORT = true;
      throw 'Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + stackTrace();
    }


  function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()
      return !!__ZSt18uncaught_exceptionv.uncaught_exception;
    }



  function ___cxa_is_number_type(type) {
      var isNumber = false;
      try { if (type == __ZTIi) isNumber = true } catch(e){}
      try { if (type == __ZTIj) isNumber = true } catch(e){}
      try { if (type == __ZTIl) isNumber = true } catch(e){}
      try { if (type == __ZTIm) isNumber = true } catch(e){}
      try { if (type == __ZTIx) isNumber = true } catch(e){}
      try { if (type == __ZTIy) isNumber = true } catch(e){}
      try { if (type == __ZTIf) isNumber = true } catch(e){}
      try { if (type == __ZTId) isNumber = true } catch(e){}
      try { if (type == __ZTIe) isNumber = true } catch(e){}
      try { if (type == __ZTIc) isNumber = true } catch(e){}
      try { if (type == __ZTIa) isNumber = true } catch(e){}
      try { if (type == __ZTIh) isNumber = true } catch(e){}
      try { if (type == __ZTIs) isNumber = true } catch(e){}
      try { if (type == __ZTIt) isNumber = true } catch(e){}
      return isNumber;
    }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {
      if (possibility == 0) return false;
      if (possibilityType == 0 || possibilityType == definiteType)
        return true;
      var possibility_type_info;
      if (___cxa_is_number_type(possibilityType)) {
        possibility_type_info = possibilityType;
      } else {
        var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;
        possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];
      }
      switch (possibility_type_info) {
      case 0: // possibility is a pointer
        // See if definite type is a pointer
        var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;
        var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];
        if (definite_type_info == 0) {
          // Also a pointer; compare base types of pointers
          var defPointerBaseAddr = definiteType+8;
          var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];
          var possPointerBaseAddr = possibilityType+8;
          var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];
          return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);
        } else
          return false; // one pointer and one non-pointer
      case 1: // class with no base class
        return false;
      case 2: // class with base class
        var parentTypeAddr = possibilityType + 8;
        var parentType = HEAP32[((parentTypeAddr)>>2)];
        return ___cxa_does_inherit(definiteType, parentType, possibility);
      default:
        return false; // some unencountered type
      }
    }



  var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {
      if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }
      throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
    }

  var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {
      if (thrown == -1) thrown = ___cxa_last_thrown_exception;
      header = thrown - ___cxa_exception_header_size;
      if (throwntype == -1) throwntype = HEAP32[((header)>>2)];
      var typeArray = Array.prototype.slice.call(arguments, 2);

      // If throwntype is a pointer, this means a pointer has been
      // thrown. When a pointer is thrown, actually what's thrown
      // is a pointer to the pointer. We'll dereference it.
      if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {
        var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;
        var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];
        if (throwntypeInfo == 0)
          thrown = HEAP32[((thrown)>>2)];
      }
      // The different catch blocks are denoted by different types.
      // Due to inheritance, those types may not precisely match the
      // type of the thrown object. Find one which matches, and
      // return the type of the catch block which should be called.
      for (var i = 0; i < typeArray.length; i++) {
        if (___cxa_does_inherit(typeArray[i], throwntype, thrown))
          return ((asm["setTempRet0"](typeArray[i]),thrown)|0);
      }
      // Shouldn't happen unless we have bogus data in typeArray
      // or encounter a type for which emscripten doesn't have suitable
      // typeinfo defined. Best-efforts match just in case.
      return ((asm["setTempRet0"](throwntype),thrown)|0);
    }function ___cxa_throw(ptr, type, destructor) {
      if (!___cxa_throw.initialized) {
        try {
          HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug
        } catch(e){}
        try {
          HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug
        } catch(e){}
        try {
          HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug
        } catch(e){}
        ___cxa_throw.initialized = true;
      }
      var header = ptr - ___cxa_exception_header_size;
      HEAP32[((header)>>2)]=type;
      HEAP32[(((header)+(4))>>2)]=destructor;
      ___cxa_last_thrown_exception = ptr;
      if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
        __ZSt18uncaught_exceptionv.uncaught_exception = 1;
      } else {
        __ZSt18uncaught_exceptionv.uncaught_exception++;
      }
      throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
    }


  Module["_memset"] = _memset;



  function __exit(status) {
      // void _exit(int status);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
      Module['exit'](status);
    }function _exit(status) {
      __exit(status);
    }function __ZSt9terminatev() {
      _exit(-1234);
    }

  function _abort() {
      Module['abort']();
    }





  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};

  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"};


  var ___errno_state=0;function ___setErrNo(value) {
      // For convenient setting and returning of errno.
      HEAP32[((___errno_state)>>2)]=value;
      return value;
    }

  var PATH={splitPath:function (filename) {
        var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
        return splitPathRe.exec(filename).slice(1);
      },normalizeArray:function (parts, allowAboveRoot) {
        // if the path tries to go above the root, `up` ends up > 0
        var up = 0;
        for (var i = parts.length - 1; i >= 0; i--) {
          var last = parts[i];
          if (last === '.') {
            parts.splice(i, 1);
          } else if (last === '..') {
            parts.splice(i, 1);
            up++;
          } else if (up) {
            parts.splice(i, 1);
            up--;
          }
        }
        // if the path is allowed to go above the root, restore leading ..s
        if (allowAboveRoot) {
          for (; up--; up) {
            parts.unshift('..');
          }
        }
        return parts;
      },normalize:function (path) {
        var isAbsolute = path.charAt(0) === '/',
            trailingSlash = path.substr(-1) === '/';
        // Normalize the path
        path = PATH.normalizeArray(path.split('/').filter(function(p) {
          return !!p;
        }), !isAbsolute).join('/');
        if (!path && !isAbsolute) {
          path = '.';
        }
        if (path && trailingSlash) {
          path += '/';
        }
        return (isAbsolute ? '/' : '') + path;
      },dirname:function (path) {
        var result = PATH.splitPath(path),
            root = result[0],
            dir = result[1];
        if (!root && !dir) {
          // No dirname whatsoever
          return '.';
        }
        if (dir) {
          // It has a dirname, strip trailing slash
          dir = dir.substr(0, dir.length - 1);
        }
        return root + dir;
      },basename:function (path) {
        // EMSCRIPTEN return '/'' for '/', not an empty string
        if (path === '/') return '/';
        var lastSlash = path.lastIndexOf('/');
        if (lastSlash === -1) return path;
        return path.substr(lastSlash+1);
      },extname:function (path) {
        return PATH.splitPath(path)[3];
      },join:function () {
        var paths = Array.prototype.slice.call(arguments, 0);
        return PATH.normalize(paths.join('/'));
      },join2:function (l, r) {
        return PATH.normalize(l + '/' + r);
      },resolve:function () {
        var resolvedPath = '',
          resolvedAbsolute = false;
        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
          var path = (i >= 0) ? arguments[i] : FS.cwd();
          // Skip empty and invalid entries
          if (typeof path !== 'string') {
            throw new TypeError('Arguments to path.resolve must be strings');
          } else if (!path) {
            continue;
          }
          resolvedPath = path + '/' + resolvedPath;
          resolvedAbsolute = path.charAt(0) === '/';
        }
        // At this point the path should be resolved to a full absolute path, but
        // handle relative paths to be safe (might happen when process.cwd() fails)
        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
          return !!p;
        }), !resolvedAbsolute).join('/');
        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
      },relative:function (from, to) {
        from = PATH.resolve(from).substr(1);
        to = PATH.resolve(to).substr(1);
        function trim(arr) {
          var start = 0;
          for (; start < arr.length; start++) {
            if (arr[start] !== '') break;
          }
          var end = arr.length - 1;
          for (; end >= 0; end--) {
            if (arr[end] !== '') break;
          }
          if (start > end) return [];
          return arr.slice(start, end - start + 1);
        }
        var fromParts = trim(from.split('/'));
        var toParts = trim(to.split('/'));
        var length = Math.min(fromParts.length, toParts.length);
        var samePartsLength = length;
        for (var i = 0; i < length; i++) {
          if (fromParts[i] !== toParts[i]) {
            samePartsLength = i;
            break;
          }
        }
        var outputParts = [];
        for (var i = samePartsLength; i < fromParts.length; i++) {
          outputParts.push('..');
        }
        outputParts = outputParts.concat(toParts.slice(samePartsLength));
        return outputParts.join('/');
      }};

  var TTY={ttys:[],init:function () {
        // https://github.com/kripken/emscripten/pull/1555
        // if (ENVIRONMENT_IS_NODE) {
        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY
        //   // device, it always assumes it's a TTY device. because of this, we're forcing
        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible
        //   // with text files until FS.init can be refactored.
        //   process['stdin']['setEncoding']('utf8');
        // }
      },shutdown:function () {
        // https://github.com/kripken/emscripten/pull/1555
        // if (ENVIRONMENT_IS_NODE) {
        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
        //   // 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
        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
        //   process['stdin']['pause']();
        // }
      },register:function (dev, ops) {
        TTY.ttys[dev] = { input: [], output: [], ops: ops };
        FS.registerDevice(dev, TTY.stream_ops);
      },stream_ops:{open:function (stream) {
          var tty = TTY.ttys[stream.node.rdev];
          if (!tty) {
            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
          }
          stream.tty = tty;
          stream.seekable = false;
        },close:function (stream) {
          // flush any pending line data
          if (stream.tty.output.length) {
            stream.tty.ops.put_char(stream.tty, 10);
          }
        },read:function (stream, buffer, offset, length, pos /* ignored */) {
          if (!stream.tty || !stream.tty.ops.get_char) {
            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
          }
          var bytesRead = 0;
          for (var i = 0; i < length; i++) {
            var result;
            try {
              result = stream.tty.ops.get_char(stream.tty);
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
            if (result === undefined && bytesRead === 0) {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
            if (result === null || result === undefined) break;
            bytesRead++;
            buffer[offset+i] = result;
          }
          if (bytesRead) {
            stream.node.timestamp = Date.now();
          }
          return bytesRead;
        },write:function (stream, buffer, offset, length, pos) {
          if (!stream.tty || !stream.tty.ops.put_char) {
            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
          }
          for (var i = 0; i < length; i++) {
            try {
              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
          }
          if (length) {
            stream.node.timestamp = Date.now();
          }
          return i;
        }},default_tty_ops:{get_char:function (tty) {
          if (!tty.input.length) {
            var result = null;
            if (ENVIRONMENT_IS_NODE) {
              result = process['stdin']['read']();
              if (!result) {
                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {
                  return null;  // EOF
                }
                return undefined;  // no data available
              }
            } else if (typeof window != 'undefined' &&
              typeof window.prompt == 'function') {
              // Browser.
              result = window.prompt('Input: ');  // returns null on cancel
              if (result !== null) {
                result += '\n';
              }
            } else if (typeof readline == 'function') {
              // Command line.
              result = readline();
              if (result !== null) {
                result += '\n';
              }
            }
            if (!result) {
              return null;
            }
            tty.input = intArrayFromString(result, true);
          }
          return tty.input.shift();
        },put_char:function (tty, val) {
          if (val === null || val === 10) {
            Module['print'](tty.output.join(''));
            tty.output = [];
          } else {
            tty.output.push(TTY.utf8.processCChar(val));
          }
        }},default_tty1_ops:{put_char:function (tty, val) {
          if (val === null || val === 10) {
            Module['printErr'](tty.output.join(''));
            tty.output = [];
          } else {
            tty.output.push(TTY.utf8.processCChar(val));
          }
        }}};

  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {
        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
      },createNode:function (parent, name, mode, dev) {
        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
          // no supported
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (!MEMFS.ops_table) {
          MEMFS.ops_table = {
            dir: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr,
                lookup: MEMFS.node_ops.lookup,
                mknod: MEMFS.node_ops.mknod,
                rename: MEMFS.node_ops.rename,
                unlink: MEMFS.node_ops.unlink,
                rmdir: MEMFS.node_ops.rmdir,
                readdir: MEMFS.node_ops.readdir,
                symlink: MEMFS.node_ops.symlink
              },
              stream: {
                llseek: MEMFS.stream_ops.llseek
              }
            },
            file: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr
              },
              stream: {
                llseek: MEMFS.stream_ops.llseek,
                read: MEMFS.stream_ops.read,
                write: MEMFS.stream_ops.write,
                allocate: MEMFS.stream_ops.allocate,
                mmap: MEMFS.stream_ops.mmap
              }
            },
            link: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr,
                readlink: MEMFS.node_ops.readlink
              },
              stream: {}
            },
            chrdev: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr
              },
              stream: FS.chrdev_stream_ops
            },
          };
        }
        var node = FS.createNode(parent, name, mode, dev);
        if (FS.isDir(node.mode)) {
          node.node_ops = MEMFS.ops_table.dir.node;
          node.stream_ops = MEMFS.ops_table.dir.stream;
          node.contents = {};
        } else if (FS.isFile(node.mode)) {
          node.node_ops = MEMFS.ops_table.file.node;
          node.stream_ops = MEMFS.ops_table.file.stream;
          node.contents = [];
          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
        } else if (FS.isLink(node.mode)) {
          node.node_ops = MEMFS.ops_table.link.node;
          node.stream_ops = MEMFS.ops_table.link.stream;
        } else if (FS.isChrdev(node.mode)) {
          node.node_ops = MEMFS.ops_table.chrdev.node;
          node.stream_ops = MEMFS.ops_table.chrdev.stream;
        }
        node.timestamp = Date.now();
        // add the new node to the parent
        if (parent) {
          parent.contents[name] = node;
        }
        return node;
      },ensureFlexible:function (node) {
        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
          var contents = node.contents;
          node.contents = Array.prototype.slice.call(contents);
          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
        }
      },node_ops:{getattr:function (node) {
          var attr = {};
          // device numbers reuse inode numbers.
          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
          attr.ino = node.id;
          attr.mode = node.mode;
          attr.nlink = 1;
          attr.uid = 0;
          attr.gid = 0;
          attr.rdev = node.rdev;
          if (FS.isDir(node.mode)) {
            attr.size = 4096;
          } else if (FS.isFile(node.mode)) {
            attr.size = node.contents.length;
          } else if (FS.isLink(node.mode)) {
            attr.size = node.link.length;
          } else {
            attr.size = 0;
          }
          attr.atime = new Date(node.timestamp);
          attr.mtime = new Date(node.timestamp);
          attr.ctime = new Date(node.timestamp);
          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
          //       but this is not required by the standard.
          attr.blksize = 4096;
          attr.blocks = Math.ceil(attr.size / attr.blksize);
          return attr;
        },setattr:function (node, attr) {
          if (attr.mode !== undefined) {
            node.mode = attr.mode;
          }
          if (attr.timestamp !== undefined) {
            node.timestamp = attr.timestamp;
          }
          if (attr.size !== undefined) {
            MEMFS.ensureFlexible(node);
            var contents = node.contents;
            if (attr.size < contents.length) contents.length = attr.size;
            else while (attr.size > contents.length) contents.push(0);
          }
        },lookup:function (parent, name) {
          throw FS.genericErrors[ERRNO_CODES.ENOENT];
        },mknod:function (parent, name, mode, dev) {
          return MEMFS.createNode(parent, name, mode, dev);
        },rename:function (old_node, new_dir, new_name) {
          // if we're overwriting a directory at new_name, make sure it's empty.
          if (FS.isDir(old_node.mode)) {
            var new_node;
            try {
              new_node = FS.lookupNode(new_dir, new_name);
            } catch (e) {
            }
            if (new_node) {
              for (var i in new_node.contents) {
                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
              }
            }
          }
          // do the internal rewiring
          delete old_node.parent.contents[old_node.name];
          old_node.name = new_name;
          new_dir.contents[new_name] = old_node;
          old_node.parent = new_dir;
        },unlink:function (parent, name) {
          delete parent.contents[name];
        },rmdir:function (parent, name) {
          var node = FS.lookupNode(parent, name);
          for (var i in node.contents) {
            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
          }
          delete parent.contents[name];
        },readdir:function (node) {
          var entries = ['.', '..']
          for (var key in node.contents) {
            if (!node.contents.hasOwnProperty(key)) {
              continue;
            }
            entries.push(key);
          }
          return entries;
        },symlink:function (parent, newname, oldpath) {
          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);
          node.link = oldpath;
          return node;
        },readlink:function (node) {
          if (!FS.isLink(node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          return node.link;
        }},stream_ops:{read:function (stream, buffer, offset, length, position) {
          var contents = stream.node.contents;
          if (position >= contents.length)
            return 0;
          var size = Math.min(contents.length - position, length);
          assert(size >= 0);
          if (size > 8 && contents.subarray) { // non-trivial, and typed array
            buffer.set(contents.subarray(position, position + size), offset);
          } else
          {
            for (var i = 0; i < size; i++) {
              buffer[offset + i] = contents[position + i];
            }
          }
          return size;
        },write:function (stream, buffer, offset, length, position, canOwn) {
          var node = stream.node;
          node.timestamp = Date.now();
          var contents = node.contents;
          if (length && contents.length === 0 && position === 0 && buffer.subarray) {
            // just replace it with the new data
            if (canOwn && offset === 0) {
              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
            } else {
              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
              node.contentMode = MEMFS.CONTENT_FIXED;
            }
            return length;
          }
          MEMFS.ensureFlexible(node);
          var contents = node.contents;
          while (contents.length < position) contents.push(0);
          for (var i = 0; i < length; i++) {
            contents[position + i] = buffer[offset + i];
          }
          return length;
        },llseek:function (stream, offset, whence) {
          var position = offset;
          if (whence === 1) {  // SEEK_CUR.
            position += stream.position;
          } else if (whence === 2) {  // SEEK_END.
            if (FS.isFile(stream.node.mode)) {
              position += stream.node.contents.length;
            }
          }
          if (position < 0) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          stream.ungotten = [];
          stream.position = position;
          return position;
        },allocate:function (stream, offset, length) {
          MEMFS.ensureFlexible(stream.node);
          var contents = stream.node.contents;
          var limit = offset + length;
          while (limit > contents.length) contents.push(0);
        },mmap:function (stream, buffer, offset, length, position, prot, flags) {
          if (!FS.isFile(stream.node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
          }
          var ptr;
          var allocated;
          var contents = stream.node.contents;
          // Only make a new copy when MAP_PRIVATE is specified.
          if ( !(flags & 2) &&
                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
            // We can't emulate MAP_SHARED when the file is not backed by the buffer
            // we're mapping to (e.g. the HEAP buffer).
            allocated = false;
            ptr = contents.byteOffset;
          } else {
            // Try to avoid unnecessary slices.
            if (position > 0 || position + length < contents.length) {
              if (contents.subarray) {
                contents = contents.subarray(position, position + length);
              } else {
                contents = Array.prototype.slice.call(contents, position, position + length);
              }
            }
            allocated = true;
            ptr = _malloc(length);
            if (!ptr) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
            }
            buffer.set(contents, ptr);
          }
          return { ptr: ptr, allocated: allocated };
        }}};

  var IDBFS={dbs:{},indexedDB:function () {
        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
      },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
        // reuse all of the core MEMFS functionality
        return MEMFS.mount.apply(null, arguments);
      },syncfs:function (mount, populate, callback) {
        IDBFS.getLocalSet(mount, function(err, local) {
          if (err) return callback(err);

          IDBFS.getRemoteSet(mount, function(err, remote) {
            if (err) return callback(err);

            var src = populate ? remote : local;
            var dst = populate ? local : remote;

            IDBFS.reconcile(src, dst, callback);
          });
        });
      },getDB:function (name, callback) {
        // check the cache first
        var db = IDBFS.dbs[name];
        if (db) {
          return callback(null, db);
        }

        var req;
        try {
          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
        } catch (e) {
          return callback(e);
        }
        req.onupgradeneeded = function(e) {
          var db = e.target.result;
          var transaction = e.target.transaction;

          var fileStore;

          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);
          } else {
            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);
          }

          fileStore.createIndex('timestamp', 'timestamp', { unique: false });
        };
        req.onsuccess = function() {
          db = req.result;

          // add to the cache
          IDBFS.dbs[name] = db;
          callback(null, db);
        };
        req.onerror = function() {
          callback(this.error);
        };
      },getLocalSet:function (mount, callback) {
        var entries = {};

        function isRealDir(p) {
          return p !== '.' && p !== '..';
        };
        function toAbsolute(root) {
          return function(p) {
            return PATH.join2(root, p);
          }
        };

        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));

        while (check.length) {
          var path = check.pop();
          var stat;

          try {
            stat = FS.stat(path);
          } catch (e) {
            return callback(e);
          }

          if (FS.isDir(stat.mode)) {
            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));
          }

          entries[path] = { timestamp: stat.mtime };
        }

        return callback(null, { type: 'local', entries: entries });
      },getRemoteSet:function (mount, callback) {
        var entries = {};

        IDBFS.getDB(mount.mountpoint, function(err, db) {
          if (err) return callback(err);

          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
          transaction.onerror = function() { callback(this.error); };

          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
          var index = store.index('timestamp');

          index.openKeyCursor().onsuccess = function(event) {
            var cursor = event.target.result;

            if (!cursor) {
              return callback(null, { type: 'remote', db: db, entries: entries });
            }

            entries[cursor.primaryKey] = { timestamp: cursor.key };

            cursor.continue();
          };
        });
      },loadLocalEntry:function (path, callback) {
        var stat, node;

        try {
          var lookup = FS.lookupPath(path);
          node = lookup.node;
          stat = FS.stat(path);
        } catch (e) {
          return callback(e);
        }

        if (FS.isDir(stat.mode)) {
          return callback(null, { timestamp: stat.mtime, mode: stat.mode });
        } else if (FS.isFile(stat.mode)) {
          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });
        } else {
          return callback(new Error('node type not supported'));
        }
      },storeLocalEntry:function (path, entry, callback) {
        try {
          if (FS.isDir(entry.mode)) {
            FS.mkdir(path, entry.mode);
          } else if (FS.isFile(entry.mode)) {
            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });
          } else {
            return callback(new Error('node type not supported'));
          }

          FS.utime(path, entry.timestamp, entry.timestamp);
        } catch (e) {
          return callback(e);
        }

        callback(null);
      },removeLocalEntry:function (path, callback) {
        try {
          var lookup = FS.lookupPath(path);
          var stat = FS.stat(path);

          if (FS.isDir(stat.mode)) {
            FS.rmdir(path);
          } else if (FS.isFile(stat.mode)) {
            FS.unlink(path);
          }
        } catch (e) {
          return callback(e);
        }

        callback(null);
      },loadRemoteEntry:function (store, path, callback) {
        var req = store.get(path);
        req.onsuccess = function(event) { callback(null, event.target.result); };
        req.onerror = function() { callback(this.error); };
      },storeRemoteEntry:function (store, path, entry, callback) {
        var req = store.put(entry, path);
        req.onsuccess = function() { callback(null); };
        req.onerror = function() { callback(this.error); };
      },removeRemoteEntry:function (store, path, callback) {
        var req = store.delete(path);
        req.onsuccess = function() { callback(null); };
        req.onerror = function() { callback(this.error); };
      },reconcile:function (src, dst, callback) {
        var total = 0;

        var create = [];
        Object.keys(src.entries).forEach(function (key) {
          var e = src.entries[key];
          var e2 = dst.entries[key];
          if (!e2 || e.timestamp > e2.timestamp) {
            create.push(key);
            total++;
          }
        });

        var remove = [];
        Object.keys(dst.entries).forEach(function (key) {
          var e = dst.entries[key];
          var e2 = src.entries[key];
          if (!e2) {
            remove.push(key);
            total++;
          }
        });

        if (!total) {
          return callback(null);
        }

        var errored = false;
        var completed = 0;
        var db = src.type === 'remote' ? src.db : dst.db;
        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);

        function done(err) {
          if (err) {
            if (!done.errored) {
              done.errored = true;
              return callback(err);
            }
            return;
          }
          if (++completed >= total) {
            return callback(null);
          }
        };

        transaction.onerror = function() { done(this.error); };

        // sort paths in ascending order so directory entries are created
        // before the files inside them
        create.sort().forEach(function (path) {
          if (dst.type === 'local') {
            IDBFS.loadRemoteEntry(store, path, function (err, entry) {
              if (err) return done(err);
              IDBFS.storeLocalEntry(path, entry, done);
            });
          } else {
            IDBFS.loadLocalEntry(path, function (err, entry) {
              if (err) return done(err);
              IDBFS.storeRemoteEntry(store, path, entry, done);
            });
          }
        });

        // sort paths in descending order so files are deleted before their
        // parent directories
        remove.sort().reverse().forEach(function(path) {
          if (dst.type === 'local') {
            IDBFS.removeLocalEntry(path, done);
          } else {
            IDBFS.removeRemoteEntry(store, path, done);
          }
        });
      }};

  var NODEFS={isWindows:false,staticInit:function () {
        NODEFS.isWindows = !!process.platform.match(/^win/);
      },mount:function (mount) {
        assert(ENVIRONMENT_IS_NODE);
        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
      },createNode:function (parent, name, mode, dev) {
        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var node = FS.createNode(parent, name, mode);
        node.node_ops = NODEFS.node_ops;
        node.stream_ops = NODEFS.stream_ops;
        return node;
      },getMode:function (path) {
        var stat;
        try {
          stat = fs.lstatSync(path);
          if (NODEFS.isWindows) {
            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
            // propagate write bits to execute bits.
            stat.mode = stat.mode | ((stat.mode & 146) >> 1);
          }
        } catch (e) {
          if (!e.code) throw e;
          throw new FS.ErrnoError(ERRNO_CODES[e.code]);
        }
        return stat.mode;
      },realPath:function (node) {
        var parts = [];
        while (node.parent !== node) {
          parts.push(node.name);
          node = node.parent;
        }
        parts.push(node.mount.opts.root);
        parts.reverse();
        return PATH.join.apply(null, parts);
      },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) {
        if (flags in NODEFS.flagsToPermissionStringMap) {
          return NODEFS.flagsToPermissionStringMap[flags];
        } else {
          return flags;
        }
      },node_ops:{getattr:function (node) {
          var path = NODEFS.realPath(node);
          var stat;
          try {
            stat = fs.lstatSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
          // See http://support.microsoft.com/kb/140365
          if (NODEFS.isWindows && !stat.blksize) {
            stat.blksize = 4096;
          }
          if (NODEFS.isWindows && !stat.blocks) {
            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
          }
          return {
            dev: stat.dev,
            ino: stat.ino,
            mode: stat.mode,
            nlink: stat.nlink,
            uid: stat.uid,
            gid: stat.gid,
            rdev: stat.rdev,
            size: stat.size,
            atime: stat.atime,
            mtime: stat.mtime,
            ctime: stat.ctime,
            blksize: stat.blksize,
            blocks: stat.blocks
          };
        },setattr:function (node, attr) {
          var path = NODEFS.realPath(node);
          try {
            if (attr.mode !== undefined) {
              fs.chmodSync(path, attr.mode);
              // update the common node structure mode as well
              node.mode = attr.mode;
            }
            if (attr.timestamp !== undefined) {
              var date = new Date(attr.timestamp);
              fs.utimesSync(path, date, date);
            }
            if (attr.size !== undefined) {
              fs.truncateSync(path, attr.size);
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },lookup:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          var mode = NODEFS.getMode(path);
          return NODEFS.createNode(parent, name, mode);
        },mknod:function (parent, name, mode, dev) {
          var node = NODEFS.createNode(parent, name, mode, dev);
          // create the backing node for this in the fs root as well
          var path = NODEFS.realPath(node);
          try {
            if (FS.isDir(node.mode)) {
              fs.mkdirSync(path, node.mode);
            } else {
              fs.writeFileSync(path, '', { mode: node.mode });
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          return node;
        },rename:function (oldNode, newDir, newName) {
          var oldPath = NODEFS.realPath(oldNode);
          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
          try {
            fs.renameSync(oldPath, newPath);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },unlink:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          try {
            fs.unlinkSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },rmdir:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          try {
            fs.rmdirSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },readdir:function (node) {
          var path = NODEFS.realPath(node);
          try {
            return fs.readdirSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },symlink:function (parent, newName, oldPath) {
          var newPath = PATH.join2(NODEFS.realPath(parent), newName);
          try {
            fs.symlinkSync(oldPath, newPath);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },readlink:function (node) {
          var path = NODEFS.realPath(node);
          try {
            return fs.readlinkSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        }},stream_ops:{open:function (stream) {
          var path = NODEFS.realPath(stream.node);
          try {
            if (FS.isFile(stream.node.mode)) {
              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },close:function (stream) {
          try {
            if (FS.isFile(stream.node.mode) && stream.nfd) {
              fs.closeSync(stream.nfd);
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },read:function (stream, buffer, offset, length, position) {
          // FIXME this is terrible.
          var nbuffer = new Buffer(length);
          var res;
          try {
            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          if (res > 0) {
            for (var i = 0; i < res; i++) {
              buffer[offset + i] = nbuffer[i];
            }
          }
          return res;
        },write:function (stream, buffer, offset, length, position) {
          // FIXME this is terrible.
          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
          var res;
          try {
            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          return res;
        },llseek:function (stream, offset, whence) {
          var position = offset;
          if (whence === 1) {  // SEEK_CUR.
            position += stream.position;
          } else if (whence === 2) {  // SEEK_END.
            if (FS.isFile(stream.node.mode)) {
              try {
                var stat = fs.fstatSync(stream.nfd);
                position += stat.size;
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES[e.code]);
              }
            }
          }

          if (position < 0) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }

          stream.position = position;
          return position;
        }}};

  var _stdin=allocate(1, "i32*", ALLOC_STATIC);

  var _stdout=allocate(1, "i32*", ALLOC_STATIC);

  var _stderr=allocate(1, "i32*", ALLOC_STATIC);

  function _fflush(stream) {
      // int fflush(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
      // we don't currently perform any user-space buffering of data
    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {
        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
        return ___setErrNo(e.errno);
      },lookupPath:function (path, opts) {
        path = PATH.resolve(FS.cwd(), path);
        opts = opts || {};

        var defaults = {
          follow_mount: true,
          recurse_count: 0
        };
        for (var key in defaults) {
          if (opts[key] === undefined) {
            opts[key] = defaults[key];
          }
        }

        if (opts.recurse_count > 8) {  // max recursive lookup of 8
          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
        }

        // split the path
        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
          return !!p;
        }), false);

        // start at the root
        var current = FS.root;
        var current_path = '/';

        for (var i = 0; i < parts.length; i++) {
          var islast = (i === parts.length-1);
          if (islast && opts.parent) {
            // stop resolving
            break;
          }

          current = FS.lookupNode(current, parts[i]);
          current_path = PATH.join2(current_path, parts[i]);

          // jump to the mount's root node if this is a mountpoint
          if (FS.isMountpoint(current)) {
            if (!islast || (islast && opts.follow_mount)) {
              current = current.mounted.root;
            }
          }

          // by default, lookupPath will not follow a symlink if it is the final path component.
          // setting opts.follow = true will override this behavior.
          if (!islast || opts.follow) {
            var count = 0;
            while (FS.isLink(current.mode)) {
              var link = FS.readlink(current_path);
              current_path = PATH.resolve(PATH.dirname(current_path), link);

              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
              current = lookup.node;

              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
              }
            }
          }
        }

        return { path: current_path, node: current };
      },getPath:function (node) {
        var path;
        while (true) {
          if (FS.isRoot(node)) {
            var mount = node.mount.mountpoint;
            if (!path) return mount;
            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
          }
          path = path ? node.name + '/' + path : node.name;
          node = node.parent;
        }
      },hashName:function (parentid, name) {
        var hash = 0;


        for (var i = 0; i < name.length; i++) {
          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
        }
        return ((parentid + hash) >>> 0) % FS.nameTable.length;
      },hashAddNode:function (node) {
        var hash = FS.hashName(node.parent.id, node.name);
        node.name_next = FS.nameTable[hash];
        FS.nameTable[hash] = node;
      },hashRemoveNode:function (node) {
        var hash = FS.hashName(node.parent.id, node.name);
        if (FS.nameTable[hash] === node) {
          FS.nameTable[hash] = node.name_next;
        } else {
          var current = FS.nameTable[hash];
          while (current) {
            if (current.name_next === node) {
              current.name_next = node.name_next;
              break;
            }
            current = current.name_next;
          }
        }
      },lookupNode:function (parent, name) {
        var err = FS.mayLookup(parent);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        var hash = FS.hashName(parent.id, name);
        for (var node = FS.nameTable[hash]; node; node = node.name_next) {
          var nodeName = node.name;
          if (node.parent.id === parent.id && nodeName === name) {
            return node;
          }
        }
        // if we failed to find it in the cache, call into the VFS
        return FS.lookup(parent, name);
      },createNode:function (parent, name, mode, rdev) {
        if (!FS.FSNode) {
          FS.FSNode = function(parent, name, mode, rdev) {
            if (!parent) {
              parent = this;  // root node sets parent to itself
            }
            this.parent = parent;
            this.mount = parent.mount;
            this.mounted = null;
            this.id = FS.nextInode++;
            this.name = name;
            this.mode = mode;
            this.node_ops = {};
            this.stream_ops = {};
            this.rdev = rdev;
          };

          FS.FSNode.prototype = {};

          // compatibility
          var readMode = 292 | 73;
          var writeMode = 146;

          // NOTE we must use Object.defineProperties instead of individual calls to
          // Object.defineProperty in order to make closure compiler happy
          Object.defineProperties(FS.FSNode.prototype, {
            read: {
              get: function() { return (this.mode & readMode) === readMode; },
              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
            },
            write: {
              get: function() { return (this.mode & writeMode) === writeMode; },
              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
            },
            isFolder: {
              get: function() { return FS.isDir(this.mode); },
            },
            isDevice: {
              get: function() { return FS.isChrdev(this.mode); },
            },
          });
        }

        var node = new FS.FSNode(parent, name, mode, rdev);

        FS.hashAddNode(node);

        return node;
      },destroyNode:function (node) {
        FS.hashRemoveNode(node);
      },isRoot:function (node) {
        return node === node.parent;
      },isMountpoint:function (node) {
        return !!node.mounted;
      },isFile:function (mode) {
        return (mode & 61440) === 32768;
      },isDir:function (mode) {
        return (mode & 61440) === 16384;
      },isLink:function (mode) {
        return (mode & 61440) === 40960;
      },isChrdev:function (mode) {
        return (mode & 61440) === 8192;
      },isBlkdev:function (mode) {
        return (mode & 61440) === 24576;
      },isFIFO:function (mode) {
        return (mode & 61440) === 4096;
      },isSocket:function (mode) {
        return (mode & 49152) === 49152;
      },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) {
        var flags = FS.flagModes[str];
        if (typeof flags === 'undefined') {
          throw new Error('Unknown file open mode: ' + str);
        }
        return flags;
      },flagsToPermissionString:function (flag) {
        var accmode = flag & 2097155;
        var perms = ['r', 'w', 'rw'][accmode];
        if ((flag & 512)) {
          perms += 'w';
        }
        return perms;
      },nodePermissions:function (node, perms) {
        if (FS.ignorePermissions) {
          return 0;
        }
        // return 0 if any user, group or owner bits are set.
        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
          return ERRNO_CODES.EACCES;
        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
          return ERRNO_CODES.EACCES;
        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
          return ERRNO_CODES.EACCES;
        }
        return 0;
      },mayLookup:function (dir) {
        return FS.nodePermissions(dir, 'x');
      },mayCreate:function (dir, name) {
        try {
          var node = FS.lookupNode(dir, name);
          return ERRNO_CODES.EEXIST;
        } catch (e) {
        }
        return FS.nodePermissions(dir, 'wx');
      },mayDelete:function (dir, name, isdir) {
        var node;
        try {
          node = FS.lookupNode(dir, name);
        } catch (e) {
          return e.errno;
        }
        var err = FS.nodePermissions(dir, 'wx');
        if (err) {
          return err;
        }
        if (isdir) {
          if (!FS.isDir(node.mode)) {
            return ERRNO_CODES.ENOTDIR;
          }
          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
            return ERRNO_CODES.EBUSY;
          }
        } else {
          if (FS.isDir(node.mode)) {
            return ERRNO_CODES.EISDIR;
          }
        }
        return 0;
      },mayOpen:function (node, flags) {
        if (!node) {
          return ERRNO_CODES.ENOENT;
        }
        if (FS.isLink(node.mode)) {
          return ERRNO_CODES.ELOOP;
        } else if (FS.isDir(node.mode)) {
          if ((flags & 2097155) !== 0 ||  // opening for write
              (flags & 512)) {
            return ERRNO_CODES.EISDIR;
          }
        }
        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
        fd_start = fd_start || 0;
        fd_end = fd_end || FS.MAX_OPEN_FDS;
        for (var fd = fd_start; fd <= fd_end; fd++) {
          if (!FS.streams[fd]) {
            return fd;
          }
        }
        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
      },getStream:function (fd) {
        return FS.streams[fd];
      },createStream:function (stream, fd_start, fd_end) {
        if (!FS.FSStream) {
          FS.FSStream = function(){};
          FS.FSStream.prototype = {};
          // compatibility
          Object.defineProperties(FS.FSStream.prototype, {
            object: {
              get: function() { return this.node; },
              set: function(val) { this.node = val; }
            },
            isRead: {
              get: function() { return (this.flags & 2097155) !== 1; }
            },
            isWrite: {
              get: function() { return (this.flags & 2097155) !== 0; }
            },
            isAppend: {
              get: function() { return (this.flags & 1024); }
            }
          });
        }
        if (0) {
          // reuse the object
          stream.__proto__ = FS.FSStream.prototype;
        } else {
          var newStream = new FS.FSStream();
          for (var p in stream) {
            newStream[p] = stream[p];
          }
          stream = newStream;
        }
        var fd = FS.nextfd(fd_start, fd_end);
        stream.fd = fd;
        FS.streams[fd] = stream;
        return stream;
      },closeStream:function (fd) {
        FS.streams[fd] = null;
      },getStreamFromPtr:function (ptr) {
        return FS.streams[ptr - 1];
      },getPtrForStream:function (stream) {
        return stream ? stream.fd + 1 : 0;
      },chrdev_stream_ops:{open:function (stream) {
          var device = FS.getDevice(stream.node.rdev);
          // override node's stream ops with the device's
          stream.stream_ops = device.stream_ops;
          // forward the open call
          if (stream.stream_ops.open) {
            stream.stream_ops.open(stream);
          }
        },llseek:function () {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }},major:function (dev) {
        return ((dev) >> 8);
      },minor:function (dev) {
        return ((dev) & 0xff);
      },makedev:function (ma, mi) {
        return ((ma) << 8 | (mi));
      },registerDevice:function (dev, ops) {
        FS.devices[dev] = { stream_ops: ops };
      },getDevice:function (dev) {
        return FS.devices[dev];
      },getMounts:function (mount) {
        var mounts = [];
        var check = [mount];

        while (check.length) {
          var m = check.pop();

          mounts.push(m);

          check.push.apply(check, m.mounts);
        }

        return mounts;
      },syncfs:function (populate, callback) {
        if (typeof(populate) === 'function') {
          callback = populate;
          populate = false;
        }

        var mounts = FS.getMounts(FS.root.mount);
        var completed = 0;

        function done(err) {
          if (err) {
            if (!done.errored) {
              done.errored = true;
              return callback(err);
            }
            return;
          }
          if (++completed >= mounts.length) {
            callback(null);
          }
        };

        // sync all mounts
        mounts.forEach(function (mount) {
          if (!mount.type.syncfs) {
            return done(null);
          }
          mount.type.syncfs(mount, populate, done);
        });
      },mount:function (type, opts, mountpoint) {
        var root = mountpoint === '/';
        var pseudo = !mountpoint;
        var node;

        if (root && FS.root) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        } else if (!root && !pseudo) {
          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });

          mountpoint = lookup.path;  // use the absolute path
          node = lookup.node;

          if (FS.isMountpoint(node)) {
            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
          }

          if (!FS.isDir(node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
          }
        }

        var mount = {
          type: type,
          opts: opts,
          mountpoint: mountpoint,
          mounts: []
        };

        // create a root node for the fs
        var mountRoot = type.mount(mount);
        mountRoot.mount = mount;
        mount.root = mountRoot;

        if (root) {
          FS.root = mountRoot;
        } else if (node) {
          // set as a mountpoint
          node.mounted = mount;

          // add the new mount to the current mount's children
          if (node.mount) {
            node.mount.mounts.push(mount);
          }
        }

        return mountRoot;
      },unmount:function (mountpoint) {
        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });

        if (!FS.isMountpoint(lookup.node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }

        // destroy the nodes for this mount, and all its child mounts
        var node = lookup.node;
        var mount = node.mounted;
        var mounts = FS.getMounts(mount);

        Object.keys(FS.nameTable).forEach(function (hash) {
          var current = FS.nameTable[hash];

          while (current) {
            var next = current.name_next;

            if (mounts.indexOf(current.mount) !== -1) {
              FS.destroyNode(current);
            }

            current = next;
          }
        });

        // no longer a mountpoint
        node.mounted = null;

        // remove this mount from the child mounts
        var idx = node.mount.mounts.indexOf(mount);
        assert(idx !== -1);
        node.mount.mounts.splice(idx, 1);
      },lookup:function (parent, name) {
        return parent.node_ops.lookup(parent, name);
      },mknod:function (path, mode, dev) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var err = FS.mayCreate(parent, name);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.mknod) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return parent.node_ops.mknod(parent, name, mode, dev);
      },create:function (path, mode) {
        mode = mode !== undefined ? mode : 438 /* 0666 */;
        mode &= 4095;
        mode |= 32768;
        return FS.mknod(path, mode, 0);
      },mkdir:function (path, mode) {
        mode = mode !== undefined ? mode : 511 /* 0777 */;
        mode &= 511 | 512;
        mode |= 16384;
        return FS.mknod(path, mode, 0);
      },mkdev:function (path, mode, dev) {
        if (typeof(dev) === 'undefined') {
          dev = mode;
          mode = 438 /* 0666 */;
        }
        mode |= 8192;
        return FS.mknod(path, mode, dev);
      },symlink:function (oldpath, newpath) {
        var lookup = FS.lookupPath(newpath, { parent: true });
        var parent = lookup.node;
        var newname = PATH.basename(newpath);
        var err = FS.mayCreate(parent, newname);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.symlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return parent.node_ops.symlink(parent, newname, oldpath);
      },rename:function (old_path, new_path) {
        var old_dirname = PATH.dirname(old_path);
        var new_dirname = PATH.dirname(new_path);
        var old_name = PATH.basename(old_path);
        var new_name = PATH.basename(new_path);
        // parents must exist
        var lookup, old_dir, new_dir;
        try {
          lookup = FS.lookupPath(old_path, { parent: true });
          old_dir = lookup.node;
          lookup = FS.lookupPath(new_path, { parent: true });
          new_dir = lookup.node;
        } catch (e) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        // need to be part of the same mount
        if (old_dir.mount !== new_dir.mount) {
          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
        }
        // source must exist
        var old_node = FS.lookupNode(old_dir, old_name);
        // old path should not be an ancestor of the new path
        var relative = PATH.relative(old_path, new_dirname);
        if (relative.charAt(0) !== '.') {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        // new path should not be an ancestor of the old path
        relative = PATH.relative(new_path, old_dirname);
        if (relative.charAt(0) !== '.') {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
        }
        // see if the new path already exists
        var new_node;
        try {
          new_node = FS.lookupNode(new_dir, new_name);
        } catch (e) {
          // not fatal
        }
        // early out if nothing needs to change
        if (old_node === new_node) {
          return;
        }
        // we'll need to delete the old entry
        var isdir = FS.isDir(old_node.mode);
        var err = FS.mayDelete(old_dir, old_name, isdir);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        // need delete permissions if we'll be overwriting.
        // need create permissions if new doesn't already exist.
        err = new_node ?
          FS.mayDelete(new_dir, new_name, isdir) :
          FS.mayCreate(new_dir, new_name);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!old_dir.node_ops.rename) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        // if we are going to change the parent, check write permissions
        if (new_dir !== old_dir) {
          err = FS.nodePermissions(old_dir, 'w');
          if (err) {
            throw new FS.ErrnoError(err);
          }
        }
        // remove the node from the lookup hash
        FS.hashRemoveNode(old_node);
        // do the underlying fs rename
        try {
          old_dir.node_ops.rename(old_node, new_dir, new_name);
        } catch (e) {
          throw e;
        } finally {
          // add the node back to the hash (in case node_ops.rename
          // changed its name)
          FS.hashAddNode(old_node);
        }
      },rmdir:function (path) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var node = FS.lookupNode(parent, name);
        var err = FS.mayDelete(parent, name, true);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.rmdir) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        parent.node_ops.rmdir(parent, name);
        FS.destroyNode(node);
      },readdir:function (path) {
        var lookup = FS.lookupPath(path, { follow: true });
        var node = lookup.node;
        if (!node.node_ops.readdir) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
        }
        return node.node_ops.readdir(node);
      },unlink:function (path) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var node = FS.lookupNode(parent, name);
        var err = FS.mayDelete(parent, name, false);
        if (err) {
          // POSIX says unlink should set EPERM, not EISDIR
          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.unlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        parent.node_ops.unlink(parent, name);
        FS.destroyNode(node);
      },readlink:function (path) {
        var lookup = FS.lookupPath(path);
        var link = lookup.node;
        if (!link.node_ops.readlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        return link.node_ops.readlink(link);
      },stat:function (path, dontFollow) {
        var lookup = FS.lookupPath(path, { follow: !dontFollow });
        var node = lookup.node;
        if (!node.node_ops.getattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return node.node_ops.getattr(node);
      },lstat:function (path) {
        return FS.stat(path, true);
      },chmod:function (path, mode, dontFollow) {
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: !dontFollow });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        node.node_ops.setattr(node, {
          mode: (mode & 4095) | (node.mode & ~4095),
          timestamp: Date.now()
        });
      },lchmod:function (path, mode) {
        FS.chmod(path, mode, true);
      },fchmod:function (fd, mode) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        FS.chmod(stream.node, mode);
      },chown:function (path, uid, gid, dontFollow) {
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: !dontFollow });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        node.node_ops.setattr(node, {
          timestamp: Date.now()
          // we ignore the uid / gid for now
        });
      },lchown:function (path, uid, gid) {
        FS.chown(path, uid, gid, true);
      },fchown:function (fd, uid, gid) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        FS.chown(stream.node, uid, gid);
      },truncate:function (path, len) {
        if (len < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: true });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isDir(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!FS.isFile(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var err = FS.nodePermissions(node, 'w');
        if (err) {
          throw new FS.ErrnoError(err);
        }
        node.node_ops.setattr(node, {
          size: len,
          timestamp: Date.now()
        });
      },ftruncate:function (fd, len) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        FS.truncate(stream.node, len);
      },utime:function (path, atime, mtime) {
        var lookup = FS.lookupPath(path, { follow: true });
        var node = lookup.node;
        node.node_ops.setattr(node, {
          timestamp: Math.max(atime, mtime)
        });
      },open:function (path, flags, mode, fd_start, fd_end) {
        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;
        if ((flags & 64)) {
          mode = (mode & 4095) | 32768;
        } else {
          mode = 0;
        }
        var node;
        if (typeof path === 'object') {
          node = path;
        } else {
          path = PATH.normalize(path);
          try {
            var lookup = FS.lookupPath(path, {
              follow: !(flags & 131072)
            });
            node = lookup.node;
          } catch (e) {
            // ignore
          }
        }
        // perhaps we need to create the node
        if ((flags & 64)) {
          if (node) {
            // if O_CREAT and O_EXCL are set, error out if the node already exists
            if ((flags & 128)) {
              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
            }
          } else {
            // node doesn't exist, try to create it
            node = FS.mknod(path, mode, 0);
          }
        }
        if (!node) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
        }
        // can't truncate a device
        if (FS.isChrdev(node.mode)) {
          flags &= ~512;
        }
        // check permissions
        var err = FS.mayOpen(node, flags);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        // do truncation if necessary
        if ((flags & 512)) {
          FS.truncate(node, 0);
        }
        // we've already handled these, don't pass down to the underlying vfs
        flags &= ~(128 | 512);

        // register the stream with the filesystem
        var stream = FS.createStream({
          node: node,
          path: FS.getPath(node),  // we want the absolute path to the node
          flags: flags,
          seekable: true,
          position: 0,
          stream_ops: node.stream_ops,
          // used by the file family libc calls (fopen, fwrite, ferror, etc.)
          ungotten: [],
          error: false
        }, fd_start, fd_end);
        // call the new stream's open function
        if (stream.stream_ops.open) {
          stream.stream_ops.open(stream);
        }
        if (Module['logReadFiles'] && !(flags & 1)) {
          if (!FS.readFiles) FS.readFiles = {};
          if (!(path in FS.readFiles)) {
            FS.readFiles[path] = 1;
            Module['printErr']('read file: ' + path);
          }
        }
        return stream;
      },close:function (stream) {
        try {
          if (stream.stream_ops.close) {
            stream.stream_ops.close(stream);
          }
        } catch (e) {
          throw e;
        } finally {
          FS.closeStream(stream.fd);
        }
      },llseek:function (stream, offset, whence) {
        if (!stream.seekable || !stream.stream_ops.llseek) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        return stream.stream_ops.llseek(stream, offset, whence);
      },read:function (stream, buffer, offset, length, position) {
        if (length < 0 || position < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 1) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (FS.isDir(stream.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!stream.stream_ops.read) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var seeking = true;
        if (typeof position === 'undefined') {
          position = stream.position;
          seeking = false;
        } else if (!stream.seekable) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
        if (!seeking) stream.position += bytesRead;
        return bytesRead;
      },write:function (stream, buffer, offset, length, position, canOwn) {
        if (length < 0 || position < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (FS.isDir(stream.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!stream.stream_ops.write) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var seeking = true;
        if (typeof position === 'undefined') {
          position = stream.position;
          seeking = false;
        } else if (!stream.seekable) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        if (stream.flags & 1024) {
          // seek to the end before writing in append mode
          FS.llseek(stream, 0, 2);
        }
        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
        if (!seeking) stream.position += bytesWritten;
        return bytesWritten;
      },allocate:function (stream, offset, length) {
        if (offset < 0 || length <= 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
        }
        if (!stream.stream_ops.allocate) {
          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
        }
        stream.stream_ops.allocate(stream, offset, length);
      },mmap:function (stream, buffer, offset, length, position, prot, flags) {
        // TODO if PROT is PROT_WRITE, make sure we have write access
        if ((stream.flags & 2097155) === 1) {
          throw new FS.ErrnoError(ERRNO_CODES.EACCES);
        }
        if (!stream.stream_ops.mmap) {
          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
        }
        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
      },ioctl:function (stream, cmd, arg) {
        if (!stream.stream_ops.ioctl) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
        }
        return stream.stream_ops.ioctl(stream, cmd, arg);
      },readFile:function (path, opts) {
        opts = opts || {};
        opts.flags = opts.flags || 'r';
        opts.encoding = opts.encoding || 'binary';
        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
          throw new Error('Invalid encoding type "' + opts.encoding + '"');
        }
        var ret;
        var stream = FS.open(path, opts.flags);
        var stat = FS.stat(path);
        var length = stat.size;
        var buf = new Uint8Array(length);
        FS.read(stream, buf, 0, length, 0);
        if (opts.encoding === 'utf8') {
          ret = '';
          var utf8 = new Runtime.UTF8Processor();
          for (var i = 0; i < length; i++) {
            ret += utf8.processCChar(buf[i]);
          }
        } else if (opts.encoding === 'binary') {
          ret = buf;
        }
        FS.close(stream);
        return ret;
      },writeFile:function (path, data, opts) {
        opts = opts || {};
        opts.flags = opts.flags || 'w';
        opts.encoding = opts.encoding || 'utf8';
        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
          throw new Error('Invalid encoding type "' + opts.encoding + '"');
        }
        var stream = FS.open(path, opts.flags, opts.mode);
        if (opts.encoding === 'utf8') {
          var utf8 = new Runtime.UTF8Processor();
          var buf = new Uint8Array(utf8.processJSString(data));
          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);
        } else if (opts.encoding === 'binary') {
          FS.write(stream, data, 0, data.length, 0, opts.canOwn);
        }
        FS.close(stream);
      },cwd:function () {
        return FS.currentPath;
      },chdir:function (path) {
        var lookup = FS.lookupPath(path, { follow: true });
        if (!FS.isDir(lookup.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
        }
        var err = FS.nodePermissions(lookup.node, 'x');
        if (err) {
          throw new FS.ErrnoError(err);
        }
        FS.currentPath = lookup.path;
      },createDefaultDirectories:function () {
        FS.mkdir('/tmp');
      },createDefaultDevices:function () {
        // create /dev
        FS.mkdir('/dev');
        // setup /dev/null
        FS.registerDevice(FS.makedev(1, 3), {
          read: function() { return 0; },
          write: function() { return 0; }
        });
        FS.mkdev('/dev/null', FS.makedev(1, 3));
        // setup /dev/tty and /dev/tty1
        // stderr needs to print output using Module['printErr']
        // so we register a second tty just for it.
        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
        FS.mkdev('/dev/tty', FS.makedev(5, 0));
        FS.mkdev('/dev/tty1', FS.makedev(6, 0));
        // we're not going to emulate the actual shm device,
        // just create the tmp dirs that reside in it commonly
        FS.mkdir('/dev/shm');
        FS.mkdir('/dev/shm/tmp');
      },createStandardStreams:function () {
        // TODO deprecate the old functionality of a single
        // input / output callback and that utilizes FS.createDevice
        // and instead require a unique set of stream ops

        // by default, we symlink the standard streams to the
        // default tty devices. however, if the standard streams
        // have been overwritten we create a unique device for
        // them instead.
        if (Module['stdin']) {
          FS.createDevice('/dev', 'stdin', Module['stdin']);
        } else {
          FS.symlink('/dev/tty', '/dev/stdin');
        }
        if (Module['stdout']) {
          FS.createDevice('/dev', 'stdout', null, Module['stdout']);
        } else {
          FS.symlink('/dev/tty', '/dev/stdout');
        }
        if (Module['stderr']) {
          FS.createDevice('/dev', 'stderr', null, Module['stderr']);
        } else {
          FS.symlink('/dev/tty1', '/dev/stderr');
        }

        // open default streams for the stdin, stdout and stderr devices
        var stdin = FS.open('/dev/stdin', 'r');
        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);
        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');

        var stdout = FS.open('/dev/stdout', 'w');
        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);
        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');

        var stderr = FS.open('/dev/stderr', 'w');
        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);
        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');
      },ensureErrnoError:function () {
        if (FS.ErrnoError) return;
        FS.ErrnoError = function ErrnoError(errno) {
          this.errno = errno;
          for (var key in ERRNO_CODES) {
            if (ERRNO_CODES[key] === errno) {
              this.code = key;
              break;
            }
          }
          this.message = ERRNO_MESSAGES[errno];
        };
        FS.ErrnoError.prototype = new Error();
        FS.ErrnoError.prototype.constructor = FS.ErrnoError;
        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
        [ERRNO_CODES.ENOENT].forEach(function(code) {
          FS.genericErrors[code] = new FS.ErrnoError(code);
          FS.genericErrors[code].stack = '<generic error, no stack>';
        });
      },staticInit:function () {
        FS.ensureErrnoError();

        FS.nameTable = new Array(4096);

        FS.mount(MEMFS, {}, '/');

        FS.createDefaultDirectories();
        FS.createDefaultDevices();
      },init:function (input, output, error) {
        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)');
        FS.init.initialized = true;

        FS.ensureErrnoError();

        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
        Module['stdin'] = input || Module['stdin'];
        Module['stdout'] = output || Module['stdout'];
        Module['stderr'] = error || Module['stderr'];

        FS.createStandardStreams();
      },quit:function () {
        FS.init.initialized = false;
        for (var i = 0; i < FS.streams.length; i++) {
          var stream = FS.streams[i];
          if (!stream) {
            continue;
          }
          FS.close(stream);
        }
      },getMode:function (canRead, canWrite) {
        var mode = 0;
        if (canRead) mode |= 292 | 73;
        if (canWrite) mode |= 146;
        return mode;
      },joinPath:function (parts, forceRelative) {
        var path = PATH.join.apply(null, parts);
        if (forceRelative && path[0] == '/') path = path.substr(1);
        return path;
      },absolutePath:function (relative, base) {
        return PATH.resolve(base, relative);
      },standardizePath:function (path) {
        return PATH.normalize(path);
      },findObject:function (path, dontResolveLastLink) {
        var ret = FS.analyzePath(path, dontResolveLastLink);
        if (ret.exists) {
          return ret.object;
        } else {
          ___setErrNo(ret.error);
          return null;
        }
      },analyzePath:function (path, dontResolveLastLink) {
        // operate from within the context of the symlink's target
        try {
          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
          path = lookup.path;
        } catch (e) {
        }
        var ret = {
          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,
          parentExists: false, parentPath: null, parentObject: null
        };
        try {
          var lookup = FS.lookupPath(path, { parent: true });
          ret.parentExists = true;
          ret.parentPath = lookup.path;
          ret.parentObject = lookup.node;
          ret.name = PATH.basename(path);
          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
          ret.exists = true;
          ret.path = lookup.path;
          ret.object = lookup.node;
          ret.name = lookup.node.name;
          ret.isRoot = lookup.path === '/';
        } catch (e) {
          ret.error = e.errno;
        };
        return ret;
      },createFolder:function (parent, name, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(canRead, canWrite);
        return FS.mkdir(path, mode);
      },createPath:function (parent, path, canRead, canWrite) {
        parent = typeof parent === 'string' ? parent : FS.getPath(parent);
        var parts = path.split('/').reverse();
        while (parts.length) {
          var part = parts.pop();
          if (!part) continue;
          var current = PATH.join2(parent, part);
          try {
            FS.mkdir(current);
          } catch (e) {
            // ignore EEXIST
          }
          parent = current;
        }
        return current;
      },createFile:function (parent, name, properties, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(canRead, canWrite);
        return FS.create(path, mode);
      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
        var mode = FS.getMode(canRead, canWrite);
        var node = FS.create(path, mode);
        if (data) {
          if (typeof data === 'string') {
            var arr = new Array(data.length);
            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
            data = arr;
          }
          // make sure we can write to the file
          FS.chmod(node, mode | 146);
          var stream = FS.open(node, 'w');
          FS.write(stream, data, 0, data.length, 0, canOwn);
          FS.close(stream);
          FS.chmod(node, mode);
        }
        return node;
      },createDevice:function (parent, name, input, output) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(!!input, !!output);
        if (!FS.createDevice.major) FS.createDevice.major = 64;
        var dev = FS.makedev(FS.createDevice.major++, 0);
        // Create a fake device that a set of stream ops to emulate
        // the old behavior.
        FS.registerDevice(dev, {
          open: function(stream) {
            stream.seekable = false;
          },
          close: function(stream) {
            // flush any pending line data
            if (output && output.buffer && output.buffer.length) {
              output(10);
            }
          },
          read: function(stream, buffer, offset, length, pos /* ignored */) {
            var bytesRead = 0;
            for (var i = 0; i < length; i++) {
              var result;
              try {
                result = input();
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES.EIO);
              }
              if (result === undefined && bytesRead === 0) {
                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
              }
              if (result === null || result === undefined) break;
              bytesRead++;
              buffer[offset+i] = result;
            }
            if (bytesRead) {
              stream.node.timestamp = Date.now();
            }
            return bytesRead;
          },
          write: function(stream, buffer, offset, length, pos) {
            for (var i = 0; i < length; i++) {
              try {
                output(buffer[offset+i]);
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES.EIO);
              }
            }
            if (length) {
              stream.node.timestamp = Date.now();
            }
            return i;
          }
        });
        return FS.mkdev(path, mode, dev);
      },createLink:function (parent, name, target, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        return FS.symlink(target, path);
      },forceLoadFile:function (obj) {
        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
        var success = true;
        if (typeof XMLHttpRequest !== 'undefined') {
          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.");
        } else if (Module['read']) {
          // Command-line.
          try {
            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
            //          read() will try to parse UTF8.
            obj.contents = intArrayFromString(Module['read'](obj.url), true);
          } catch (e) {
            success = false;
          }
        } else {
          throw new Error('Cannot load without read() or XMLHttpRequest.');
        }
        if (!success) ___setErrNo(ERRNO_CODES.EIO);
        return success;
      },createLazyFile:function (parent, name, url, canRead, canWrite) {
        // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
        function LazyUint8Array() {
          this.lengthKnown = false;
          this.chunks = []; // Loaded chunks. Index is the chunk number
        }
        LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
          if (idx > this.length-1 || idx < 0) {
            return undefined;
          }
          var chunkOffset = idx % this.chunkSize;
          var chunkNum = Math.floor(idx / this.chunkSize);
          return this.getter(chunkNum)[chunkOffset];
        }
        LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
          this.getter = getter;
        }
        LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
            // Find length
            var xhr = new XMLHttpRequest();
            xhr.open('HEAD', url, false);
            xhr.send(null);
            if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
            var datalength = Number(xhr.getResponseHeader("Content-length"));
            var header;
            var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
            var chunkSize = 1024*1024; // Chunk size in bytes

            if (!hasByteServing) chunkSize = datalength;

            // Function to get a range from the remote URL.
            var doXHR = (function(from, to) {
              if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
              if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");

              // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
              var xhr = new XMLHttpRequest();
              xhr.open('GET', url, false);
              if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);

              // Some hints to the browser that we want binary data.
              if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
              if (xhr.overrideMimeType) {
                xhr.overrideMimeType('text/plain; charset=x-user-defined');
              }

              xhr.send(null);
              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
              if (xhr.response !== undefined) {
                return new Uint8Array(xhr.response || []);
              } else {
                return intArrayFromString(xhr.responseText || '', true);
              }
            });
            var lazyArray = this;
            lazyArray.setDataGetter(function(chunkNum) {
              var start = chunkNum * chunkSize;
              var end = (chunkNum+1) * chunkSize - 1; // including this byte
              end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
                lazyArray.chunks[chunkNum] = doXHR(start, end);
              }
              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
              return lazyArray.chunks[chunkNum];
            });

            this._length = datalength;
            this._chunkSize = chunkSize;
            this.lengthKnown = true;
        }
        if (typeof XMLHttpRequest !== 'undefined') {
          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
          var lazyArray = new LazyUint8Array();
          Object.defineProperty(lazyArray, "length", {
              get: function() {
                  if(!this.lengthKnown) {
                      this.cacheLength();
                  }
                  return this._length;
              }
          });
          Object.defineProperty(lazyArray, "chunkSize", {
              get: function() {
                  if(!this.lengthKnown) {
                      this.cacheLength();
                  }
                  return this._chunkSize;
              }
          });

          var properties = { isDevice: false, contents: lazyArray };
        } else {
          var properties = { isDevice: false, url: url };
        }

        var node = FS.createFile(parent, name, properties, canRead, canWrite);
        // This is a total hack, but I want to get this lazy file code out of the
        // core of MEMFS. If we want to keep this lazy file concept I feel it should
        // be its own thin LAZYFS proxying calls to MEMFS.
        if (properties.contents) {
          node.contents = properties.contents;
        } else if (properties.url) {
          node.contents = null;
          node.url = properties.url;
        }
        // override each stream op with one that tries to force load the lazy file first
        var stream_ops = {};
        var keys = Object.keys(node.stream_ops);
        keys.forEach(function(key) {
          var fn = node.stream_ops[key];
          stream_ops[key] = function forceLoadLazyFile() {
            if (!FS.forceLoadFile(node)) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
            return fn.apply(null, arguments);
          };
        });
        // use a custom read function
        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
          if (!FS.forceLoadFile(node)) {
            throw new FS.ErrnoError(ERRNO_CODES.EIO);
          }
          var contents = stream.node.contents;
          if (position >= contents.length)
            return 0;
          var size = Math.min(contents.length - position, length);
          assert(size >= 0);
          if (contents.slice) { // normal array
            for (var i = 0; i < size; i++) {
              buffer[offset + i] = contents[position + i];
            }
          } else {
            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
              buffer[offset + i] = contents.get(position + i);
            }
          }
          return size;
        };
        node.stream_ops = stream_ops;
        return node;
      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {
        Browser.init();
        // TODO we should allow people to just pass in a complete filename instead
        // of parent and name being that we just join them anyways
        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
        function processData(byteArray) {
          function finish(byteArray) {
            if (!dontCreateFile) {
              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
            }
            if (onload) onload();
            removeRunDependency('cp ' + fullname);
          }
          var handled = false;
          Module['preloadPlugins'].forEach(function(plugin) {
            if (handled) return;
            if (plugin['canHandle'](fullname)) {
              plugin['handle'](byteArray, fullname, finish, function() {
                if (onerror) onerror();
                removeRunDependency('cp ' + fullname);
              });
              handled = true;
            }
          });
          if (!handled) finish(byteArray);
        }
        addRunDependency('cp ' + fullname);
        if (typeof url == 'string') {
          Browser.asyncLoad(url, function(byteArray) {
            processData(byteArray);
          }, onerror);
        } else {
          processData(url);
        }
      },indexedDB:function () {
        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
      },DB_NAME:function () {
        return 'EM_FS_' + window.location.pathname;
      },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
        onload = onload || function(){};
        onerror = onerror || function(){};
        var indexedDB = FS.indexedDB();
        try {
          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
        } catch (e) {
          return onerror(e);
        }
        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
          console.log('creating db');
          var db = openRequest.result;
          db.createObjectStore(FS.DB_STORE_NAME);
        };
        openRequest.onsuccess = function openRequest_onsuccess() {
          var db = openRequest.result;
          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
          var files = transaction.objectStore(FS.DB_STORE_NAME);
          var ok = 0, fail = 0, total = paths.length;
          function finish() {
            if (fail == 0) onload(); else onerror();
          }
          paths.forEach(function(path) {
            var putRequest = files.put(FS.analyzePath(path).object.contents, path);
            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
          });
          transaction.onerror = onerror;
        };
        openRequest.onerror = onerror;
      },loadFilesFromDB:function (paths, onload, onerror) {
        onload = onload || function(){};
        onerror = onerror || function(){};
        var indexedDB = FS.indexedDB();
        try {
          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
        } catch (e) {
          return onerror(e);
        }
        openRequest.onupgradeneeded = onerror; // no database to load from
        openRequest.onsuccess = function openRequest_onsuccess() {
          var db = openRequest.result;
          try {
            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
          } catch(e) {
            onerror(e);
            return;
          }
          var files = transaction.objectStore(FS.DB_STORE_NAME);
          var ok = 0, fail = 0, total = paths.length;
          function finish() {
            if (fail == 0) onload(); else onerror();
          }
          paths.forEach(function(path) {
            var getRequest = files.get(path);
            getRequest.onsuccess = function getRequest_onsuccess() {
              if (FS.analyzePath(path).exists) {
                FS.unlink(path);
              }
              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
              ok++;
              if (ok + fail == total) finish();
            };
            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
          });
          transaction.onerror = onerror;
        };
        openRequest.onerror = onerror;
      }};




  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {
        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
      },createSocket:function (family, type, protocol) {
        var streaming = type == 1;
        if (protocol) {
          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp
        }

        // create our internal socket structure
        var sock = {
          family: family,
          type: type,
          protocol: protocol,
          server: null,
          peers: {},
          pending: [],
          recv_queue: [],
          sock_ops: SOCKFS.websocket_sock_ops
        };

        // create the filesystem node to store the socket structure
        var name = SOCKFS.nextname();
        var node = FS.createNode(SOCKFS.root, name, 49152, 0);
        node.sock = sock;

        // and the wrapping stream that enables library functions such
        // as read and write to indirectly interact with the socket
        var stream = FS.createStream({
          path: name,
          node: node,
          flags: FS.modeStringToFlags('r+'),
          seekable: false,
          stream_ops: SOCKFS.stream_ops
        });

        // map the new stream to the socket structure (sockets have a 1:1
        // relationship with a stream)
        sock.stream = stream;

        return sock;
      },getSocket:function (fd) {
        var stream = FS.getStream(fd);
        if (!stream || !FS.isSocket(stream.node.mode)) {
          return null;
        }
        return stream.node.sock;
      },stream_ops:{poll:function (stream) {
          var sock = stream.node.sock;
          return sock.sock_ops.poll(sock);
        },ioctl:function (stream, request, varargs) {
          var sock = stream.node.sock;
          return sock.sock_ops.ioctl(sock, request, varargs);
        },read:function (stream, buffer, offset, length, position /* ignored */) {
          var sock = stream.node.sock;
          var msg = sock.sock_ops.recvmsg(sock, length);
          if (!msg) {
            // socket is closed
            return 0;
          }
          buffer.set(msg.buffer, offset);
          return msg.buffer.length;
        },write:function (stream, buffer, offset, length, position /* ignored */) {
          var sock = stream.node.sock;
          return sock.sock_ops.sendmsg(sock, buffer, offset, length);
        },close:function (stream) {
          var sock = stream.node.sock;
          sock.sock_ops.close(sock);
        }},nextname:function () {
        if (!SOCKFS.nextname.current) {
          SOCKFS.nextname.current = 0;
        }
        return 'socket[' + (SOCKFS.nextname.current++) + ']';
      },websocket_sock_ops:{createPeer:function (sock, addr, port) {
          var ws;

          if (typeof addr === 'object') {
            ws = addr;
            addr = null;
            port = null;
          }

          if (ws) {
            // for sockets that've already connected (e.g. we're the server)
            // we can inspect the _socket property for the address
            if (ws._socket) {
              addr = ws._socket.remoteAddress;
              port = ws._socket.remotePort;
            }
            // if we're just now initializing a connection to the remote,
            // inspect the url property
            else {
              var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
              if (!result) {
                throw new Error('WebSocket URL must be in the format ws(s)://address:port');
              }
              addr = result[1];
              port = parseInt(result[2], 10);
            }
          } else {
            // create the actual websocket object and connect
            try {
              // runtimeConfig gets set to true if WebSocket runtime configuration is available.
              var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket']));

              // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#'
              // comments without checking context, so we'd end up with ws:#, the replace swaps the "#" for "//" again.
              var url = 'ws:#'.replace('#', '//');

              if (runtimeConfig) {
                if ('string' === typeof Module['websocket']['url']) {
                  url = Module['websocket']['url']; // Fetch runtime WebSocket URL config.
                }
              }

              if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it.
                url = url + addr + ':' + port;
              }

              // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
              var subProtocols = 'binary'; // The default value is 'binary'

              if (runtimeConfig) {
                if ('string' === typeof Module['websocket']['subprotocol']) {
                  subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config.
                }
              }

              // The regex trims the string (removes spaces at the beginning and end, then splits the string by
              // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
              subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */);

              // The node ws library API for specifying optional subprotocol is slightly different than the browser's.
              var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols;

              // If node we use the ws library.
              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];
              ws = new WebSocket(url, opts);
              ws.binaryType = 'arraybuffer';
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);
            }
          }


          var peer = {
            addr: addr,
            port: port,
            socket: ws,
            dgram_send_queue: []
          };

          SOCKFS.websocket_sock_ops.addPeer(sock, peer);
          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);

          // if this is a bound dgram socket, send the port number first to allow
          // us to override the ephemeral port reported to us by remotePort on the
          // remote end.
          if (sock.type === 2 && typeof sock.sport !== 'undefined') {
            peer.dgram_send_queue.push(new Uint8Array([
                255, 255, 255, 255,
                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),
                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)
            ]));
          }

          return peer;
        },getPeer:function (sock, addr, port) {
          return sock.peers[addr + ':' + port];
        },addPeer:function (sock, peer) {
          sock.peers[peer.addr + ':' + peer.port] = peer;
        },removePeer:function (sock, peer) {
          delete sock.peers[peer.addr + ':' + peer.port];
        },handlePeerEvents:function (sock, peer) {
          var first = true;

          var handleOpen = function () {
            try {
              var queued = peer.dgram_send_queue.shift();
              while (queued) {
                peer.socket.send(queued);
                queued = peer.dgram_send_queue.shift();
              }
            } catch (e) {
              // not much we can do here in the way of proper error handling as we've already
              // lied and said this data was sent. shut it down.
              peer.socket.close();
            }
          };

          function handleMessage(data) {
            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer
            data = new Uint8Array(data);  // make a typed array view on the array buffer


            // if this is the port message, override the peer's port with it
            var wasfirst = first;
            first = false;
            if (wasfirst &&
                data.length === 10 &&
                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&
                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {
              // update the peer's port and it's key in the peer map
              var newport = ((data[8] << 8) | data[9]);
              SOCKFS.websocket_sock_ops.removePeer(sock, peer);
              peer.port = newport;
              SOCKFS.websocket_sock_ops.addPeer(sock, peer);
              return;
            }

            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });
          };

          if (ENVIRONMENT_IS_NODE) {
            peer.socket.on('open', handleOpen);
            peer.socket.on('message', function(data, flags) {
              if (!flags.binary) {
                return;
              }
              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer
            });
            peer.socket.on('error', function() {
              // don't throw
            });
          } else {
            peer.socket.onopen = handleOpen;
            peer.socket.onmessage = function peer_socket_onmessage(event) {
              handleMessage(event.data);
            };
          }
        },poll:function (sock) {
          if (sock.type === 1 && sock.server) {
            // listen sockets should only say they're available for reading
            // if there are pending clients.
            return sock.pending.length ? (64 | 1) : 0;
          }

          var mask = 0;
          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets
            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :
            null;

          if (sock.recv_queue.length ||
              !dest ||  // connection-less sockets are always ready to read
              (dest && dest.socket.readyState === dest.socket.CLOSING) ||
              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed
            mask |= (64 | 1);
          }

          if (!dest ||  // connection-less sockets are always ready to write
              (dest && dest.socket.readyState === dest.socket.OPEN)) {
            mask |= 4;
          }

          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||
              (dest && dest.socket.readyState === dest.socket.CLOSED)) {
            mask |= 16;
          }

          return mask;
        },ioctl:function (sock, request, arg) {
          switch (request) {
            case 21531:
              var bytes = 0;
              if (sock.recv_queue.length) {
                bytes = sock.recv_queue[0].data.length;
              }
              HEAP32[((arg)>>2)]=bytes;
              return 0;
            default:
              return ERRNO_CODES.EINVAL;
          }
        },close:function (sock) {
          // if we've spawned a listen server, close it
          if (sock.server) {
            try {
              sock.server.close();
            } catch (e) {
            }
            sock.server = null;
          }
          // close any peer connections
          var peers = Object.keys(sock.peers);
          for (var i = 0; i < peers.length; i++) {
            var peer = sock.peers[peers[i]];
            try {
              peer.socket.close();
            } catch (e) {
            }
            SOCKFS.websocket_sock_ops.removePeer(sock, peer);
          }
          return 0;
        },bind:function (sock, addr, port) {
          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound
          }
          sock.saddr = addr;
          sock.sport = port || _mkport();
          // in order to emulate dgram sockets, we need to launch a listen server when
          // binding on a connection-less socket
          // note: this is only required on the server side
          if (sock.type === 2) {
            // close the existing server if it exists
            if (sock.server) {
              sock.server.close();
              sock.server = null;
            }
            // swallow error operation not supported error that occurs when binding in the
            // browser where this isn't supported
            try {
              sock.sock_ops.listen(sock, 0);
            } catch (e) {
              if (!(e instanceof FS.ErrnoError)) throw e;
              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;
            }
          }
        },connect:function (sock, addr, port) {
          if (sock.server) {
            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);
          }

          // TODO autobind
          // if (!sock.addr && sock.type == 2) {
          // }

          // early out if we're already connected / in the middle of connecting
          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {
            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
            if (dest) {
              if (dest.socket.readyState === dest.socket.CONNECTING) {
                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);
              } else {
                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);
              }
            }
          }

          // add the socket to our peer list and set our
          // destination address / port to match
          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
          sock.daddr = peer.addr;
          sock.dport = peer.port;

          // always "fail" in non-blocking mode
          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);
        },listen:function (sock, backlog) {
          if (!ENVIRONMENT_IS_NODE) {
            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
          }
          if (sock.server) {
             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening
          }
          var WebSocketServer = require('ws').Server;
          var host = sock.saddr;
          sock.server = new WebSocketServer({
            host: host,
            port: sock.sport
            // TODO support backlog
          });

          sock.server.on('connection', function(ws) {
            if (sock.type === 1) {
              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);

              // create a peer on the new socket
              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);
              newsock.daddr = peer.addr;
              newsock.dport = peer.port;

              // push to queue for accept to pick up
              sock.pending.push(newsock);
            } else {
              // create a peer on the listen socket so calling sendto
              // with the listen socket and an address will resolve
              // to the correct client
              SOCKFS.websocket_sock_ops.createPeer(sock, ws);
            }
          });
          sock.server.on('closed', function() {
            sock.server = null;
          });
          sock.server.on('error', function() {
            // don't throw
          });
        },accept:function (listensock) {
          if (!listensock.server) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          var newsock = listensock.pending.shift();
          newsock.stream.flags = listensock.stream.flags;
          return newsock;
        },getname:function (sock, peer) {
          var addr, port;
          if (peer) {
            if (sock.daddr === undefined || sock.dport === undefined) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
            }
            addr = sock.daddr;
            port = sock.dport;
          } else {
            // TODO saddr and sport will be set for bind()'d UDP sockets, but what
            // should we be returning for TCP sockets that've been connect()'d?
            addr = sock.saddr || 0;
            port = sock.sport || 0;
          }
          return { addr: addr, port: port };
        },sendmsg:function (sock, buffer, offset, length, addr, port) {
          if (sock.type === 2) {
            // connection-less sockets will honor the message address,
            // and otherwise fall back to the bound destination address
            if (addr === undefined || port === undefined) {
              addr = sock.daddr;
              port = sock.dport;
            }
            // if there was no address to fall back to, error out
            if (addr === undefined || port === undefined) {
              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);
            }
          } else {
            // connection-based sockets will only use the bound
            addr = sock.daddr;
            port = sock.dport;
          }

          // find the peer for the destination address
          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);

          // early out if not connected with a connection-based socket
          if (sock.type === 1) {
            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
            } else if (dest.socket.readyState === dest.socket.CONNECTING) {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
          }

          // create a copy of the incoming data to send, as the WebSocket API
          // doesn't work entirely with an ArrayBufferView, it'll just send
          // the entire underlying buffer
          var data;
          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {
            data = buffer.slice(offset, offset + length);
          } else {  // ArrayBufferView
            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);
          }

          // if we're emulating a connection-less dgram socket and don't have
          // a cached connection, queue the buffer to send upon connect and
          // lie, saying the data was sent now.
          if (sock.type === 2) {
            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
              // if we're not connected, open a new connection
              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
              }
              dest.dgram_send_queue.push(data);
              return length;
            }
          }

          try {
            // send the actual data
            dest.socket.send(data);
            return length;
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
        },recvmsg:function (sock, length) {
          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
          if (sock.type === 1 && sock.server) {
            // tcp servers should not be recv()'ing on the listen socket
            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
          }

          var queued = sock.recv_queue.shift();
          if (!queued) {
            if (sock.type === 1) {
              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);

              if (!dest) {
                // if we have a destination address but are not connected, error out
                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
              }
              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
                // return null if the socket has closed
                return null;
              }
              else {
                // else, our socket is in a valid state but truly has nothing available
                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
              }
            } else {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
          }

          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
          // requeued TCP data it'll be an ArrayBufferView
          var queuedLength = queued.data.byteLength || queued.data.length;
          var queuedOffset = queued.data.byteOffset || 0;
          var queuedBuffer = queued.data.buffer || queued.data;
          var bytesRead = Math.min(length, queuedLength);
          var res = {
            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
            addr: queued.addr,
            port: queued.port
          };


          // push back any unread data for TCP connections
          if (sock.type === 1 && bytesRead < queuedLength) {
            var bytesRemaining = queuedLength - bytesRead;
            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);
            sock.recv_queue.unshift(queued);
          }

          return res;
        }}};function _send(fd, buf, len, flags) {
      var sock = SOCKFS.getSocket(fd);
      if (!sock) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      // TODO honor flags
      return _write(fd, buf, len);
    }

  function _pwrite(fildes, buf, nbyte, offset) {
      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      try {
        var slab = HEAP8;
        return FS.write(stream, slab, buf, nbyte, offset);
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }function _write(fildes, buf, nbyte) {
      // ssize_t write(int fildes, const void *buf, size_t nbyte);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }


      try {
        var slab = HEAP8;
        return FS.write(stream, slab, buf, nbyte);
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }

  function _fileno(stream) {
      // int fileno(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
      stream = FS.getStreamFromPtr(stream);
      if (!stream) return -1;
      return stream.fd;
    }function _fwrite(ptr, size, nitems, stream) {
      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html
      var bytesToWrite = nitems * size;
      if (bytesToWrite == 0) return 0;
      var fd = _fileno(stream);
      var bytesWritten = _write(fd, ptr, bytesToWrite);
      if (bytesWritten == -1) {
        var streamObj = FS.getStreamFromPtr(stream);
        if (streamObj) streamObj.error = true;
        return 0;
      } else {
        return Math.floor(bytesWritten / size);
      }
    }



  Module["_strlen"] = _strlen;

  function __reallyNegative(x) {
      return x < 0 || (x === 0 && (1/x) === -Infinity);
    }function __formatString(format, varargs) {
      var textIndex = format;
      var argIndex = 0;
      function getNextArg(type) {
        // NOTE: Explicitly ignoring type safety. Otherwise this fails:
        //       int x = 4; printf("%c\n", (char)x);
        var ret;
        if (type === 'double') {
          ret = HEAPF64[(((varargs)+(argIndex))>>3)];
        } else if (type == 'i64') {
          ret = [HEAP32[(((varargs)+(argIndex))>>2)],
                 HEAP32[(((varargs)+(argIndex+4))>>2)]];

        } else {
          type = 'i32'; // varargs are always i32, i64, or double
          ret = HEAP32[(((varargs)+(argIndex))>>2)];
        }
        argIndex += Runtime.getNativeFieldSize(type);
        return ret;
      }

      var ret = [];
      var curr, next, currArg;
      while(1) {
        var startTextIndex = textIndex;
        curr = HEAP8[(textIndex)];
        if (curr === 0) break;
        next = HEAP8[((textIndex+1)|0)];
        if (curr == 37) {
          // Handle flags.
          var flagAlwaysSigned = false;
          var flagLeftAlign = false;
          var flagAlternative = false;
          var flagZeroPad = false;
          var flagPadSign = false;
          flagsLoop: while (1) {
            switch (next) {
              case 43:
                flagAlwaysSigned = true;
                break;
              case 45:
                flagLeftAlign = true;
                break;
              case 35:
                flagAlternative = true;
                break;
              case 48:
                if (flagZeroPad) {
                  break flagsLoop;
                } else {
                  flagZeroPad = true;
                  break;
                }
              case 32:
                flagPadSign = true;
                break;
              default:
                break flagsLoop;
            }
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
          }

          // Handle width.
          var width = 0;
          if (next == 42) {
            width = getNextArg('i32');
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
          } else {
            while (next >= 48 && next <= 57) {
              width = width * 10 + (next - 48);
              textIndex++;
              next = HEAP8[((textIndex+1)|0)];
            }
          }

          // Handle precision.
          var precisionSet = false, precision = -1;
          if (next == 46) {
            precision = 0;
            precisionSet = true;
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
            if (next == 42) {
              precision = getNextArg('i32');
              textIndex++;
            } else {
              while(1) {
                var precisionChr = HEAP8[((textIndex+1)|0)];
                if (precisionChr < 48 ||
                    precisionChr > 57) break;
                precision = precision * 10 + (precisionChr - 48);
                textIndex++;
              }
            }
            next = HEAP8[((textIndex+1)|0)];
          }
          if (precision < 0) {
            precision = 6; // Standard default.
            precisionSet = false;
          }

          // Handle integer sizes. WARNING: These assume a 32-bit architecture!
          var argSize;
          switch (String.fromCharCode(next)) {
            case 'h':
              var nextNext = HEAP8[((textIndex+2)|0)];
              if (nextNext == 104) {
                textIndex++;
                argSize = 1; // char (actually i32 in varargs)
              } else {
                argSize = 2; // short (actually i32 in varargs)
              }
              break;
            case 'l':
              var nextNext = HEAP8[((textIndex+2)|0)];
              if (nextNext == 108) {
                textIndex++;
                argSize = 8; // long long
              } else {
                argSize = 4; // long
              }
              break;
            case 'L': // long long
            case 'q': // int64_t
            case 'j': // intmax_t
              argSize = 8;
              break;
            case 'z': // size_t
            case 't': // ptrdiff_t
            case 'I': // signed ptrdiff_t or unsigned size_t
              argSize = 4;
              break;
            default:
              argSize = null;
          }
          if (argSize) textIndex++;
          next = HEAP8[((textIndex+1)|0)];

          // Handle type specifier.
          switch (String.fromCharCode(next)) {
            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {
              // Integer.
              var signed = next == 100 || next == 105;
              argSize = argSize || 4;
              var currArg = getNextArg('i' + (argSize * 8));
              var argText;
              // Flatten i64-1 [low, high] into a (slightly rounded) double
              if (argSize == 8) {
                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);
              }
              // Truncate to requested size.
              if (argSize <= 4) {
                var limit = Math.pow(256, argSize) - 1;
                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
              }
              // Format the number.
              var currAbsArg = Math.abs(currArg);
              var prefix = '';
              if (next == 100 || next == 105) {
                argText = reSign(currArg, 8 * argSize, 1).toString(10);
              } else if (next == 117) {
                argText = unSign(currArg, 8 * argSize, 1).toString(10);
                currArg = Math.abs(currArg);
              } else if (next == 111) {
                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
              } else if (next == 120 || next == 88) {
                prefix = (flagAlternative && currArg != 0) ? '0x' : '';
                if (currArg < 0) {
                  // Represent negative numbers in hex as 2's complement.
                  currArg = -currArg;
                  argText = (currAbsArg - 1).toString(16);
                  var buffer = [];
                  for (var i = 0; i < argText.length; i++) {
                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));
                  }
                  argText = buffer.join('');
                  while (argText.length < argSize * 2) argText = 'f' + argText;
                } else {
                  argText = currAbsArg.toString(16);
                }
                if (next == 88) {
                  prefix = prefix.toUpperCase();
                  argText = argText.toUpperCase();
                }
              } else if (next == 112) {
                if (currAbsArg === 0) {
                  argText = '(nil)';
                } else {
                  prefix = '0x';
                  argText = currAbsArg.toString(16);
                }
              }
              if (precisionSet) {
                while (argText.length < precision) {
                  argText = '0' + argText;
                }
              }

              // Add sign if needed
              if (currArg >= 0) {
                if (flagAlwaysSigned) {
                  prefix = '+' + prefix;
                } else if (flagPadSign) {
                  prefix = ' ' + prefix;
                }
              }

              // Move sign to prefix so we zero-pad after the sign
              if (argText.charAt(0) == '-') {
                prefix = '-' + prefix;
                argText = argText.substr(1);
              }

              // Add padding.
              while (prefix.length + argText.length < width) {
                if (flagLeftAlign) {
                  argText += ' ';
                } else {
                  if (flagZeroPad) {
                    argText = '0' + argText;
                  } else {
                    prefix = ' ' + prefix;
                  }
                }
              }

              // Insert the result into the buffer.
              argText = prefix + argText;
              argText.split('').forEach(function(chr) {
                ret.push(chr.charCodeAt(0));
              });
              break;
            }
            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {
              // Float.
              var currArg = getNextArg('double');
              var argText;
              if (isNaN(currArg)) {
                argText = 'nan';
                flagZeroPad = false;
              } else if (!isFinite(currArg)) {
                argText = (currArg < 0 ? '-' : '') + 'inf';
                flagZeroPad = false;
              } else {
                var isGeneral = false;
                var effectivePrecision = Math.min(precision, 20);

                // Convert g/G to f/F or e/E, as per:
                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html
                if (next == 103 || next == 71) {
                  isGeneral = true;
                  precision = precision || 1;
                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);
                  if (precision > exponent && exponent >= -4) {
                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);
                    precision -= exponent + 1;
                  } else {
                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);
                    precision--;
                  }
                  effectivePrecision = Math.min(precision, 20);
                }

                if (next == 101 || next == 69) {
                  argText = currArg.toExponential(effectivePrecision);
                  // Make sure the exponent has at least 2 digits.
                  if (/[eE][-+]\d$/.test(argText)) {
                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);
                  }
                } else if (next == 102 || next == 70) {
                  argText = currArg.toFixed(effectivePrecision);
                  if (currArg === 0 && __reallyNegative(currArg)) {
                    argText = '-' + argText;
                  }
                }

                var parts = argText.split('e');
                if (isGeneral && !flagAlternative) {
                  // Discard trailing zeros and periods.
                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&
                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {
                    parts[0] = parts[0].slice(0, -1);
                  }
                } else {
                  // Make sure we have a period in alternative mode.
                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
                  // Zero pad until required precision.
                  while (precision > effectivePrecision++) parts[0] += '0';
                }
                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');

                // Capitalize 'E' if needed.
                if (next == 69) argText = argText.toUpperCase();

                // Add sign.
                if (currArg >= 0) {
                  if (flagAlwaysSigned) {
                    argText = '+' + argText;
                  } else if (flagPadSign) {
                    argText = ' ' + argText;
                  }
                }
              }

              // Add padding.
              while (argText.length < width) {
                if (flagLeftAlign) {
                  argText += ' ';
                } else {
                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
                    argText = argText[0] + '0' + argText.slice(1);
                  } else {
                    argText = (flagZeroPad ? '0' : ' ') + argText;
                  }
                }
              }

              // Adjust case.
              if (next < 97) argText = argText.toUpperCase();

              // Insert the result into the buffer.
              argText.split('').forEach(function(chr) {
                ret.push(chr.charCodeAt(0));
              });
              break;
            }
            case 's': {
              // String.
              var arg = getNextArg('i8*');
              var argLength = arg ? _strlen(arg) : '(null)'.length;
              if (precisionSet) argLength = Math.min(argLength, precision);
              if (!flagLeftAlign) {
                while (argLength < width--) {
                  ret.push(32);
                }
              }
              if (arg) {
                for (var i = 0; i < argLength; i++) {
                  ret.push(HEAPU8[((arg++)|0)]);
                }
              } else {
                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));
              }
              if (flagLeftAlign) {
                while (argLength < width--) {
                  ret.push(32);
                }
              }
              break;
            }
            case 'c': {
              // Character.
              if (flagLeftAlign) ret.push(getNextArg('i8'));
              while (--width > 0) {
                ret.push(32);
              }
              if (!flagLeftAlign) ret.push(getNextArg('i8'));
              break;
            }
            case 'n': {
              // Write the length written so far to the next parameter.
              var ptr = getNextArg('i32*');
              HEAP32[((ptr)>>2)]=ret.length;
              break;
            }
            case '%': {
              // Literal percent sign.
              ret.push(curr);
              break;
            }
            default: {
              // Unknown specifiers remain untouched.
              for (var i = startTextIndex; i < textIndex + 2; i++) {
                ret.push(HEAP8[(i)]);
              }
            }
          }
          textIndex += 2;
          // TODO: Support a/A (hex float) and m (last error) specifiers.
          // TODO: Support %1${specifier} for arg selection.
        } else {
          ret.push(curr);
          textIndex += 1;
        }
      }
      return ret;
    }function _fprintf(stream, format, varargs) {
      // int fprintf(FILE *restrict stream, const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      var result = __formatString(format, varargs);
      var stack = Runtime.stackSave();
      var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);
      Runtime.stackRestore(stack);
      return ret;
    }function _printf(format, varargs) {
      // int printf(const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      var stdout = HEAP32[((_stdout)>>2)];
      return _fprintf(stdout, format, varargs);
    }

  var _sinf=Math_sin;


  var _sqrtf=Math_sqrt;

  var _floorf=Math_floor;


  function _fputs(s, stream) {
      // int fputs(const char *restrict s, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
      var fd = _fileno(stream);
      return _write(fd, s, _strlen(s));
    }

  function _fputc(c, stream) {
      // int fputc(int c, FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
      var chr = unSign(c & 0xFF);
      HEAP8[((_fputc.ret)|0)]=chr;
      var fd = _fileno(stream);
      var ret = _write(fd, _fputc.ret, 1);
      if (ret == -1) {
        var streamObj = FS.getStreamFromPtr(stream);
        if (streamObj) streamObj.error = true;
        return -1;
      } else {
        return chr;
      }
    }function _puts(s) {
      // int puts(const char *s);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html
      // NOTE: puts() always writes an extra newline.
      var stdout = HEAP32[((_stdout)>>2)];
      var ret = _fputs(s, stdout);
      if (ret < 0) {
        return ret;
      } else {
        var newlineRet = _fputc(10, stdout);
        return (newlineRet < 0) ? -1 : ret + 1;
      }
    }

  function _clock() {
      if (_clock.start === undefined) _clock.start = Date.now();
      return Math.floor((Date.now() - _clock.start) * (1000000/1000));
    }


  var ___cxa_caught_exceptions=[];function ___cxa_begin_catch(ptr) {
      __ZSt18uncaught_exceptionv.uncaught_exception--;
      ___cxa_caught_exceptions.push(___cxa_last_thrown_exception);
      return ptr;
    }

  function ___errno_location() {
      return ___errno_state;
    }


  function _emscripten_memcpy_big(dest, src, num) {
      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
      return dest;
    }
  Module["_memcpy"] = _memcpy;

  function __ZNSt9exceptionD2Ev() {}

  var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false,queue:[],pause:function () {
          Browser.mainLoop.shouldPause = true;
        },resume:function () {
          if (Browser.mainLoop.paused) {
            Browser.mainLoop.paused = false;
            Browser.mainLoop.scheduler();
          }
          Browser.mainLoop.shouldPause = false;
        },updateStatus:function () {
          if (Module['setStatus']) {
            var message = Module['statusMessage'] || 'Please wait...';
            var remaining = Browser.mainLoop.remainingBlockers;
            var expected = Browser.mainLoop.expectedBlockers;
            if (remaining) {
              if (remaining < expected) {
                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
              } else {
                Module['setStatus'](message);
              }
            } else {
              Module['setStatus']('');
            }
          }
        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
        if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers

        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
        Browser.initted = true;

        try {
          new Blob();
          Browser.hasBlobConstructor = true;
        } catch(e) {
          Browser.hasBlobConstructor = false;
          console.log("warning: no blob constructor, cannot create blobs with mimetypes");
        }
        Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
        Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
          console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
          Module.noImageDecoding = true;
        }

        // Support for plugins that can process preloaded files. You can add more of these to
        // your app by creating and appending to Module.preloadPlugins.
        //
        // Each plugin is asked if it can handle a file based on the file's name. If it can,
        // it is given the file's raw data. When it is done, it calls a callback with the file's
        // (possibly modified) data. For example, a plugin might decompress a file, or it
        // might create some side data structure for use later (like an Image element, etc.).

        var imagePlugin = {};
        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
          return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
        };
        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
          var b = null;
          if (Browser.hasBlobConstructor) {
            try {
              b = new Blob([byteArray], { type: Browser.getMimetype(name) });
              if (b.size !== byteArray.length) { // Safari bug #118630
                // Safari's Blob can only take an ArrayBuffer
                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
              }
            } catch(e) {
              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
            }
          }
          if (!b) {
            var bb = new Browser.BlobBuilder();
            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
            b = bb.getBlob();
          }
          var url = Browser.URLObject.createObjectURL(b);
          var img = new Image();
          img.onload = function img_onload() {
            assert(img.complete, 'Image ' + name + ' could not be decoded');
            var canvas = document.createElement('canvas');
            canvas.width = img.width;
            canvas.height = img.height;
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0);
            Module["preloadedImages"][name] = canvas;
            Browser.URLObject.revokeObjectURL(url);
            if (onload) onload(byteArray);
          };
          img.onerror = function img_onerror(event) {
            console.log('Image ' + url + ' could not be decoded');
            if (onerror) onerror();
          };
          img.src = url;
        };
        Module['preloadPlugins'].push(imagePlugin);

        var audioPlugin = {};
        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
        };
        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
          var done = false;
          function finish(audio) {
            if (done) return;
            done = true;
            Module["preloadedAudios"][name] = audio;
            if (onload) onload(byteArray);
          }
          function fail() {
            if (done) return;
            done = true;
            Module["preloadedAudios"][name] = new Audio(); // empty shim
            if (onerror) onerror();
          }
          if (Browser.hasBlobConstructor) {
            try {
              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
            } catch(e) {
              return fail();
            }
            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
            var audio = new Audio();
            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
            audio.onerror = function audio_onerror(event) {
              if (done) return;
              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
              function encode64(data) {
                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
                var PAD = '=';
                var ret = '';
                var leftchar = 0;
                var leftbits = 0;
                for (var i = 0; i < data.length; i++) {
                  leftchar = (leftchar << 8) | data[i];
                  leftbits += 8;
                  while (leftbits >= 6) {
                    var curr = (leftchar >> (leftbits-6)) & 0x3f;
                    leftbits -= 6;
                    ret += BASE[curr];
                  }
                }
                if (leftbits == 2) {
                  ret += BASE[(leftchar&3) << 4];
                  ret += PAD + PAD;
                } else if (leftbits == 4) {
                  ret += BASE[(leftchar&0xf) << 2];
                  ret += PAD;
                }
                return ret;
              }
              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
              finish(audio); // we don't wait for confirmation this worked - but it's worth trying
            };
            audio.src = url;
            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
            Browser.safeSetTimeout(function() {
              finish(audio); // try to use it even though it is not necessarily ready to play
            }, 10000);
          } else {
            return fail();
          }
        };
        Module['preloadPlugins'].push(audioPlugin);

        // Canvas event setup

        var canvas = Module['canvas'];

        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module
        // Module['forcedAspectRatio'] = 4 / 3;

        canvas.requestPointerLock = canvas['requestPointerLock'] ||
                                    canvas['mozRequestPointerLock'] ||
                                    canvas['webkitRequestPointerLock'] ||
                                    canvas['msRequestPointerLock'] ||
                                    function(){};
        canvas.exitPointerLock = document['exitPointerLock'] ||
                                 document['mozExitPointerLock'] ||
                                 document['webkitExitPointerLock'] ||
                                 document['msExitPointerLock'] ||
                                 function(){}; // no-op if function does not exist
        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);

        function pointerLockChange() {
          Browser.pointerLock = document['pointerLockElement'] === canvas ||
                                document['mozPointerLockElement'] === canvas ||
                                document['webkitPointerLockElement'] === canvas ||
                                document['msPointerLockElement'] === canvas;
        }

        document.addEventListener('pointerlockchange', pointerLockChange, false);
        document.addEventListener('mozpointerlockchange', pointerLockChange, false);
        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
        document.addEventListener('mspointerlockchange', pointerLockChange, false);

        if (Module['elementPointerLock']) {
          canvas.addEventListener("click", function(ev) {
            if (!Browser.pointerLock && canvas.requestPointerLock) {
              canvas.requestPointerLock();
              ev.preventDefault();
            }
          }, false);
        }
      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
        var ctx;
        var errorInfo = '?';
        function onContextCreationError(event) {
          errorInfo = event.statusMessage || errorInfo;
        }
        try {
          if (useWebGL) {
            var contextAttributes = {
              antialias: false,
              alpha: false
            };

            if (webGLContextAttributes) {
              for (var attribute in webGLContextAttributes) {
                contextAttributes[attribute] = webGLContextAttributes[attribute];
              }
            }


            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
            try {
              ['experimental-webgl', 'webgl'].some(function(webglId) {
                return ctx = canvas.getContext(webglId, contextAttributes);
              });
            } finally {
              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
            }
          } else {
            ctx = canvas.getContext('2d');
          }
          if (!ctx) throw ':(';
        } catch (e) {
          Module.print('Could not create canvas: ' + [errorInfo, e]);
          return null;
        }
        if (useWebGL) {
          // Set the background of the WebGL canvas to black
          canvas.style.backgroundColor = "black";

          // Warn on context loss
          canvas.addEventListener('webglcontextlost', function(event) {
            alert('WebGL context lost. You will need to reload the page.');
          }, false);
        }
        if (setInModule) {
          GLctx = Module.ctx = ctx;
          Module.useWebGL = useWebGL;
          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
          Browser.init();
        }
        return ctx;
      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
        Browser.lockPointer = lockPointer;
        Browser.resizeCanvas = resizeCanvas;
        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;

        var canvas = Module['canvas'];
        function fullScreenChange() {
          Browser.isFullScreen = false;
          var canvasContainer = canvas.parentNode;
          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
               document['fullScreenElement'] || document['fullscreenElement'] ||
               document['msFullScreenElement'] || document['msFullscreenElement'] ||
               document['webkitCurrentFullScreenElement']) === canvasContainer) {
            canvas.cancelFullScreen = document['cancelFullScreen'] ||
                                      document['mozCancelFullScreen'] ||
                                      document['webkitCancelFullScreen'] ||
                                      document['msExitFullscreen'] ||
                                      document['exitFullscreen'] ||
                                      function() {};
            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
            if (Browser.lockPointer) canvas.requestPointerLock();
            Browser.isFullScreen = true;
            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
          } else {

            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen
            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
            canvasContainer.parentNode.removeChild(canvasContainer);

            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();
          }
          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
          Browser.updateCanvasDimensions(canvas);
        }

        if (!Browser.fullScreenHandlersInstalled) {
          Browser.fullScreenHandlersInstalled = true;
          document.addEventListener('fullscreenchange', fullScreenChange, false);
          document.addEventListener('mozfullscreenchange', fullScreenChange, false);
          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
          document.addEventListener('MSFullscreenChange', fullScreenChange, false);
        }

        // 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
        var canvasContainer = document.createElement("div");
        canvas.parentNode.insertBefore(canvasContainer, canvas);
        canvasContainer.appendChild(canvas);

        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)
        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||
                                            canvasContainer['mozRequestFullScreen'] ||
                                            canvasContainer['msRequestFullscreen'] ||
                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
        canvasContainer.requestFullScreen();
      },requestAnimationFrame:function requestAnimationFrame(func) {
        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
          setTimeout(func, 1000/60);
        } else {
          if (!window.requestAnimationFrame) {
            window.requestAnimationFrame = window['requestAnimationFrame'] ||
                                           window['mozRequestAnimationFrame'] ||
                                           window['webkitRequestAnimationFrame'] ||
                                           window['msRequestAnimationFrame'] ||
                                           window['oRequestAnimationFrame'] ||
                                           window['setTimeout'];
          }
          window.requestAnimationFrame(func);
        }
      },safeCallback:function (func) {
        return function() {
          if (!ABORT) return func.apply(null, arguments);
        };
      },safeRequestAnimationFrame:function (func) {
        return Browser.requestAnimationFrame(function() {
          if (!ABORT) func();
        });
      },safeSetTimeout:function (func, timeout) {
        return setTimeout(function() {
          if (!ABORT) func();
        }, timeout);
      },safeSetInterval:function (func, timeout) {
        return setInterval(function() {
          if (!ABORT) func();
        }, timeout);
      },getMimetype:function (name) {
        return {
          'jpg': 'image/jpeg',
          'jpeg': 'image/jpeg',
          'png': 'image/png',
          'bmp': 'image/bmp',
          'ogg': 'audio/ogg',
          'wav': 'audio/wav',
          'mp3': 'audio/mpeg'
        }[name.substr(name.lastIndexOf('.')+1)];
      },getUserMedia:function (func) {
        if(!window.getUserMedia) {
          window.getUserMedia = navigator['getUserMedia'] ||
                                navigator['mozGetUserMedia'];
        }
        window.getUserMedia(func);
      },getMovementX:function (event) {
        return event['movementX'] ||
               event['mozMovementX'] ||
               event['webkitMovementX'] ||
               0;
      },getMovementY:function (event) {
        return event['movementY'] ||
               event['mozMovementY'] ||
               event['webkitMovementY'] ||
               0;
      },getMouseWheelDelta:function (event) {
        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));
      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
        if (Browser.pointerLock) {
          // When the pointer is locked, calculate the coordinates
          // based on the movement of the mouse.
          // Workaround for Firefox bug 764498
          if (event.type != 'mousemove' &&
              ('mozMovementX' in event)) {
            Browser.mouseMovementX = Browser.mouseMovementY = 0;
          } else {
            Browser.mouseMovementX = Browser.getMovementX(event);
            Browser.mouseMovementY = Browser.getMovementY(event);
          }

          // check if SDL is available
          if (typeof SDL != "undefined") {
    Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
    Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
          } else {
    // just add the mouse delta to the current absolut mouse position
    // FIXME: ideally this should be clamped against the canvas size and zero
    Browser.mouseX += Browser.mouseMovementX;
    Browser.mouseY += Browser.mouseMovementY;
          }
        } else {
          // Otherwise, calculate the movement based on the changes
          // in the coordinates.
          var rect = Module["canvas"].getBoundingClientRect();
          var x, y;

          // Neither .scrollX or .pageXOffset are defined in a spec, but
          // we prefer .scrollX because it is currently in a spec draft.
          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
          if (event.type == 'touchstart' ||
              event.type == 'touchend' ||
              event.type == 'touchmove') {
            var t = event.touches.item(0);
            if (t) {
              x = t.pageX - (scrollX + rect.left);
              y = t.pageY - (scrollY + rect.top);
            } else {
              return;
            }
          } else {
            x = event.pageX - (scrollX + rect.left);
            y = event.pageY - (scrollY + rect.top);
          }

          // the canvas might be CSS-scaled compared to its backbuffer;
          // SDL-using content will want mouse coordinates in terms
          // of backbuffer units.
          var cw = Module["canvas"].width;
          var ch = Module["canvas"].height;
          x = x * (cw / rect.width);
          y = y * (ch / rect.height);

          Browser.mouseMovementX = x - Browser.mouseX;
          Browser.mouseMovementY = y - Browser.mouseY;
          Browser.mouseX = x;
          Browser.mouseY = y;
        }
      },xhrLoad:function (url, onload, onerror) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function xhr_onload() {
          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
            onload(xhr.response);
          } else {
            onerror();
          }
        };
        xhr.onerror = onerror;
        xhr.send(null);
      },asyncLoad:function (url, onload, onerror, noRunDep) {
        Browser.xhrLoad(url, function(arrayBuffer) {
          assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
          onload(new Uint8Array(arrayBuffer));
          if (!noRunDep) removeRunDependency('al ' + url);
        }, function(event) {
          if (onerror) {
            onerror();
          } else {
            throw 'Loading data file "' + url + '" failed.';
          }
        });
        if (!noRunDep) addRunDependency('al ' + url);
      },resizeListeners:[],updateResizeListeners:function () {
        var canvas = Module['canvas'];
        Browser.resizeListeners.forEach(function(listener) {
          listener(canvas.width, canvas.height);
        });
      },setCanvasSize:function (width, height, noUpdates) {
        var canvas = Module['canvas'];
        Browser.updateCanvasDimensions(canvas, width, height);
        if (!noUpdates) Browser.updateResizeListeners();
      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
        // check if SDL is available
        if (typeof SDL != "undefined") {
    var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
    flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
    HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
        }
        Browser.updateResizeListeners();
      },setWindowedCanvasSize:function () {
        // check if SDL is available
        if (typeof SDL != "undefined") {
    var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
    flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
    HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
        }
        Browser.updateResizeListeners();
      },updateCanvasDimensions:function (canvas, wNative, hNative) {
        if (wNative && hNative) {
          canvas.widthNative = wNative;
          canvas.heightNative = hNative;
        } else {
          wNative = canvas.widthNative;
          hNative = canvas.heightNative;
        }
        var w = wNative;
        var h = hNative;
        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {
          if (w/h < Module['forcedAspectRatio']) {
            w = Math.round(h * Module['forcedAspectRatio']);
          } else {
            h = Math.round(w / Module['forcedAspectRatio']);
          }
        }
        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
             document['fullScreenElement'] || document['fullscreenElement'] ||
             document['msFullScreenElement'] || document['msFullscreenElement'] ||
             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {
           var factor = Math.min(screen.width / w, screen.height / h);
           w = Math.round(w * factor);
           h = Math.round(h * factor);
        }
        if (Browser.resizeCanvas) {
          if (canvas.width  != w) canvas.width  = w;
          if (canvas.height != h) canvas.height = h;
          if (typeof canvas.style != 'undefined') {
            canvas.style.removeProperty( "width");
            canvas.style.removeProperty("height");
          }
        } else {
          if (canvas.width  != wNative) canvas.width  = wNative;
          if (canvas.height != hNative) canvas.height = hNative;
          if (typeof canvas.style != 'undefined') {
            if (w != wNative || h != hNative) {
              canvas.style.setProperty( "width", w + "px", "important");
              canvas.style.setProperty("height", h + "px", "important");
            } else {
              canvas.style.removeProperty( "width");
              canvas.style.removeProperty("height");
            }
          }
        }
      }};

  function _sbrk(bytes) {
      // Implement a Linux-like 'memory area' for our 'process'.
      // Changes the size of the memory area by |bytes|; returns the
      // address of the previous top ('break') of the memory area
      // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
      var self = _sbrk;
      if (!self.called) {
        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
        self.called = true;
        assert(Runtime.dynamicAlloc);
        self.alloc = Runtime.dynamicAlloc;
        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
      }
      var ret = DYNAMICTOP;
      if (bytes != 0) self.alloc(bytes);
      return ret;  // Previous break location.
    }

  function _sysconf(name) {
      // long sysconf(int name);
      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
      switch(name) {
        case 30: return PAGE_SIZE;
        case 132:
        case 133:
        case 12:
        case 137:
        case 138:
        case 15:
        case 235:
        case 16:
        case 17:
        case 18:
        case 19:
        case 20:
        case 149:
        case 13:
        case 10:
        case 236:
        case 153:
        case 9:
        case 21:
        case 22:
        case 159:
        case 154:
        case 14:
        case 77:
        case 78:
        case 139:
        case 80:
        case 81:
        case 79:
        case 82:
        case 68:
        case 67:
        case 164:
        case 11:
        case 29:
        case 47:
        case 48:
        case 95:
        case 52:
        case 51:
        case 46:
          return 200809;
        case 27:
        case 246:
        case 127:
        case 128:
        case 23:
        case 24:
        case 160:
        case 161:
        case 181:
        case 182:
        case 242:
        case 183:
        case 184:
        case 243:
        case 244:
        case 245:
        case 165:
        case 178:
        case 179:
        case 49:
        case 50:
        case 168:
        case 169:
        case 175:
        case 170:
        case 171:
        case 172:
        case 97:
        case 76:
        case 32:
        case 173:
        case 35:
          return -1;
        case 176:
        case 177:
        case 7:
        case 155:
        case 8:
        case 157:
        case 125:
        case 126:
        case 92:
        case 93:
        case 129:
        case 130:
        case 131:
        case 94:
        case 91:
          return 1;
        case 74:
        case 60:
        case 69:
        case 70:
        case 4:
          return 1024;
        case 31:
        case 42:
        case 72:
          return 32;
        case 87:
        case 26:
        case 33:
          return 2147483647;
        case 34:
        case 1:
          return 47839;
        case 38:
        case 36:
          return 99;
        case 43:
        case 37:
          return 2048;
        case 0: return 2097152;
        case 3: return 65536;
        case 28: return 32768;
        case 44: return 32767;
        case 75: return 16384;
        case 39: return 1000;
        case 89: return 700;
        case 71: return 256;
        case 40: return 255;
        case 2: return 100;
        case 180: return 64;
        case 25: return 20;
        case 5: return 16;
        case 6: return 6;
        case 73: return 4;
        case 84: return 1;
      }
      ___setErrNo(ERRNO_CODES.EINVAL);
      return -1;
    }

  function _emscripten_run_script(ptr) {
      eval(Pointer_stringify(ptr));
    }


  function _malloc(bytes) {
      /* Over-allocate to make sure it is byte-aligned by 8.
       * This will leak memory, but this is only the dummy
       * implementation (replaced by dlmalloc normally) so
       * not an issue.
       */
      var ptr = Runtime.dynamicAlloc(bytes + 8);
      return (ptr+8) & 0xFFFFFFF8;
    }
  Module["_malloc"] = _malloc;function ___cxa_allocate_exception(size) {
      var ptr = _malloc(size + ___cxa_exception_header_size);
      return ptr + ___cxa_exception_header_size;
    }

  function _emscripten_cancel_main_loop() {
      Browser.mainLoop.scheduler = null;
      Browser.mainLoop.shouldPause = true;
    }

  var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], "i8", ALLOC_STATIC)+8, 0], "i32", ALLOC_STATIC);
FS.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;
___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });
_fputc.ret = allocate([0], "i8", ALLOC_STATIC);
Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
  Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
  Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
  Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
  Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
  Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);

staticSealed = true; // seal the static portion of memory

STACK_MAX = STACK_BASE + 5242880;

DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);

assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");


var Math_min = Math.min;
function invoke_iiii(index,a1,a2,a3) {
  try {
    return Module["dynCall_iiii"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiiii(index,a1,a2,a3,a4,a5) {
  try {
    Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_vi(index,a1) {
  try {
    Module["dynCall_vi"](index,a1);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_vii(index,a1,a2) {
  try {
    Module["dynCall_vii"](index,a1,a2);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_ii(index,a1) {
  try {
    return Module["dynCall_ii"](index,a1);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viii(index,a1,a2,a3) {
  try {
    Module["dynCall_viii"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_v(index) {
  try {
    Module["dynCall_v"](index);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viid(index,a1,a2,a3) {
  try {
    Module["dynCall_viid"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
  try {
    Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_iii(index,a1,a2) {
  try {
    return Module["dynCall_iii"](index,a1,a2);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_iiiiii(index,a1,a2,a3,a4,a5) {
  try {
    return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiii(index,a1,a2,a3,a4) {
  try {
    Module["dynCall_viiii"](index,a1,a2,a3,a4);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function asmPrintInt(x, y) {
  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
}
function asmPrintFloat(x, y) {
  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
}
// EMSCRIPTEN_START_ASM
var asm = Wasm.instantiateModuleFromAsm((function Module(global, env, buffer) {
  'use asm';
  var HEAP8 = new global.Int8Array(buffer);
  var HEAP16 = new global.Int16Array(buffer);
  var HEAP32 = new global.Int32Array(buffer);
  var HEAPU8 = new global.Uint8Array(buffer);
  var HEAPU16 = new global.Uint16Array(buffer);
  var HEAPU32 = new global.Uint32Array(buffer);
  var HEAPF32 = new global.Float32Array(buffer);
  var HEAPF64 = new global.Float64Array(buffer);

  var STACKTOP=env.STACKTOP|0;
  var STACK_MAX=env.STACK_MAX|0;
  var tempDoublePtr=env.tempDoublePtr|0;
  var ABORT=env.ABORT|0;
  var __ZTISt9exception=env.__ZTISt9exception|0;

  var __THREW__ = 0;
  var threwValue = 0;
  var setjmpId = 0;
  var undef = 0;
  var nan = +env.NaN, inf = +env.Infinity;
  var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;

  var tempRet0 = 0;
  var tempRet1 = 0;
  var tempRet2 = 0;
  var tempRet3 = 0;
  var tempRet4 = 0;
  var tempRet5 = 0;
  var tempRet6 = 0;
  var tempRet7 = 0;
  var tempRet8 = 0;
  var tempRet9 = 0;
  var Math_floor=global.Math.floor;
  var Math_abs=global.Math.abs;
  var Math_sqrt=global.Math.sqrt;
  var Math_pow=global.Math.pow;
  var Math_cos=global.Math.cos;
  var Math_sin=global.Math.sin;
  var Math_tan=global.Math.tan;
  var Math_acos=global.Math.acos;
  var Math_asin=global.Math.asin;
  var Math_atan=global.Math.atan;
  var Math_atan2=global.Math.atan2;
  var Math_exp=global.Math.exp;
  var Math_log=global.Math.log;
  var Math_ceil=global.Math.ceil;
  var Math_imul=global.Math.imul;
  var abort=env.abort;
  var assert=env.assert;
  var asmPrintInt=env.asmPrintInt;
  var asmPrintFloat=env.asmPrintFloat;
  var Math_min=env.min;
  var invoke_iiii=env.invoke_iiii;
  var invoke_viiiii=env.invoke_viiiii;
  var invoke_vi=env.invoke_vi;
  var invoke_vii=env.invoke_vii;
  var invoke_ii=env.invoke_ii;
  var invoke_viii=env.invoke_viii;
  var invoke_v=env.invoke_v;
  var invoke_viid=env.invoke_viid;
  var invoke_viiiiii=env.invoke_viiiiii;
  var invoke_iii=env.invoke_iii;
  var invoke_iiiiii=env.invoke_iiiiii;
  var invoke_viiii=env.invoke_viiii;
  var ___cxa_throw=env.___cxa_throw;
  var _emscripten_run_script=env._emscripten_run_script;
  var _cosf=env._cosf;
  var _send=env._send;
  var __ZSt9terminatev=env.__ZSt9terminatev;
  var __reallyNegative=env.__reallyNegative;
  var ___cxa_is_number_type=env.___cxa_is_number_type;
  var ___assert_fail=env.___assert_fail;
  var ___cxa_allocate_exception=env.___cxa_allocate_exception;
  var ___cxa_find_matching_catch=env.___cxa_find_matching_catch;
  var _fflush=env._fflush;
  var _pwrite=env._pwrite;
  var ___setErrNo=env.___setErrNo;
  var _sbrk=env._sbrk;
  var ___cxa_begin_catch=env.___cxa_begin_catch;
  var _sinf=env._sinf;
  var _fileno=env._fileno;
  var ___resumeException=env.___resumeException;
  var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv;
  var _sysconf=env._sysconf;
  var _clock=env._clock;
  var _emscripten_memcpy_big=env._emscripten_memcpy_big;
  var _puts=env._puts;
  var _mkport=env._mkport;
  var _floorf=env._floorf;
  var _sqrtf=env._sqrtf;
  var _write=env._write;
  var _emscripten_set_main_loop=env._emscripten_set_main_loop;
  var ___errno_location=env.___errno_location;
  var __ZNSt9exceptionD2Ev=env.__ZNSt9exceptionD2Ev;
  var _printf=env._printf;
  var ___cxa_does_inherit=env.___cxa_does_inherit;
  var __exit=env.__exit;
  var _fputc=env._fputc;
  var _abort=env._abort;
  var _fwrite=env._fwrite;
  var _time=env._time;
  var _fprintf=env._fprintf;
  var _emscripten_cancel_main_loop=env._emscripten_cancel_main_loop;
  var __formatString=env.__formatString;
  var _fputs=env._fputs;
  var _exit=env._exit;
  var ___cxa_pure_virtual=env.___cxa_pure_virtual;
  var tempFloat = 0.0;

// EMSCRIPTEN_START_FUNCS
function _malloc(i12) {
 i12 = i12 | 0;
 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;
 i1 = STACKTOP;
 do {
  if (i12 >>> 0 < 245) {
   if (i12 >>> 0 < 11) {
    i12 = 16;
   } else {
    i12 = i12 + 11 & -8;
   }
   i20 = i12 >>> 3;
   i18 = HEAP32[1790] | 0;
   i21 = i18 >>> i20;
   if ((i21 & 3 | 0) != 0) {
    i6 = (i21 & 1 ^ 1) + i20 | 0;
    i5 = i6 << 1;
    i3 = 7200 + (i5 << 2) | 0;
    i5 = 7200 + (i5 + 2 << 2) | 0;
    i7 = HEAP32[i5 >> 2] | 0;
    i2 = i7 + 8 | 0;
    i4 = HEAP32[i2 >> 2] | 0;
    do {
     if ((i3 | 0) != (i4 | 0)) {
      if (i4 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i8 = i4 + 12 | 0;
      if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) {
       HEAP32[i8 >> 2] = i3;
       HEAP32[i5 >> 2] = i4;
       break;
      } else {
       _abort();
      }
     } else {
      HEAP32[1790] = i18 & ~(1 << i6);
     }
    } while (0);
    i32 = i6 << 3;
    HEAP32[i7 + 4 >> 2] = i32 | 3;
    i32 = i7 + (i32 | 4) | 0;
    HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
    i32 = i2;
    STACKTOP = i1;
    return i32 | 0;
   }
   if (i12 >>> 0 > (HEAP32[7168 >> 2] | 0) >>> 0) {
    if ((i21 | 0) != 0) {
     i7 = 2 << i20;
     i7 = i21 << i20 & (i7 | 0 - i7);
     i7 = (i7 & 0 - i7) + -1 | 0;
     i2 = i7 >>> 12 & 16;
     i7 = i7 >>> i2;
     i6 = i7 >>> 5 & 8;
     i7 = i7 >>> i6;
     i5 = i7 >>> 2 & 4;
     i7 = i7 >>> i5;
     i4 = i7 >>> 1 & 2;
     i7 = i7 >>> i4;
     i3 = i7 >>> 1 & 1;
     i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0;
     i7 = i3 << 1;
     i4 = 7200 + (i7 << 2) | 0;
     i7 = 7200 + (i7 + 2 << 2) | 0;
     i5 = HEAP32[i7 >> 2] | 0;
     i2 = i5 + 8 | 0;
     i6 = HEAP32[i2 >> 2] | 0;
     do {
      if ((i4 | 0) != (i6 | 0)) {
       if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       }
       i8 = i6 + 12 | 0;
       if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) {
        HEAP32[i8 >> 2] = i4;
        HEAP32[i7 >> 2] = i6;
        break;
       } else {
        _abort();
       }
      } else {
       HEAP32[1790] = i18 & ~(1 << i3);
      }
     } while (0);
     i6 = i3 << 3;
     i4 = i6 - i12 | 0;
     HEAP32[i5 + 4 >> 2] = i12 | 3;
     i3 = i5 + i12 | 0;
     HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1;
     HEAP32[i5 + i6 >> 2] = i4;
     i6 = HEAP32[7168 >> 2] | 0;
     if ((i6 | 0) != 0) {
      i5 = HEAP32[7180 >> 2] | 0;
      i8 = i6 >>> 3;
      i9 = i8 << 1;
      i6 = 7200 + (i9 << 2) | 0;
      i7 = HEAP32[1790] | 0;
      i8 = 1 << i8;
      if ((i7 & i8 | 0) != 0) {
       i7 = 7200 + (i9 + 2 << 2) | 0;
       i8 = HEAP32[i7 >> 2] | 0;
       if (i8 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i28 = i7;
        i27 = i8;
       }
      } else {
       HEAP32[1790] = i7 | i8;
       i28 = 7200 + (i9 + 2 << 2) | 0;
       i27 = i6;
      }
      HEAP32[i28 >> 2] = i5;
      HEAP32[i27 + 12 >> 2] = i5;
      HEAP32[i5 + 8 >> 2] = i27;
      HEAP32[i5 + 12 >> 2] = i6;
     }
     HEAP32[7168 >> 2] = i4;
     HEAP32[7180 >> 2] = i3;
     i32 = i2;
     STACKTOP = i1;
     return i32 | 0;
    }
    i18 = HEAP32[7164 >> 2] | 0;
    if ((i18 | 0) != 0) {
     i2 = (i18 & 0 - i18) + -1 | 0;
     i31 = i2 >>> 12 & 16;
     i2 = i2 >>> i31;
     i30 = i2 >>> 5 & 8;
     i2 = i2 >>> i30;
     i32 = i2 >>> 2 & 4;
     i2 = i2 >>> i32;
     i6 = i2 >>> 1 & 2;
     i2 = i2 >>> i6;
     i3 = i2 >>> 1 & 1;
     i3 = HEAP32[7464 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0;
     i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0;
     i6 = i3;
     while (1) {
      i5 = HEAP32[i6 + 16 >> 2] | 0;
      if ((i5 | 0) == 0) {
       i5 = HEAP32[i6 + 20 >> 2] | 0;
       if ((i5 | 0) == 0) {
        break;
       }
      }
      i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0;
      i4 = i6 >>> 0 < i2 >>> 0;
      i2 = i4 ? i6 : i2;
      i6 = i5;
      i3 = i4 ? i5 : i3;
     }
     i6 = HEAP32[7176 >> 2] | 0;
     if (i3 >>> 0 < i6 >>> 0) {
      _abort();
     }
     i4 = i3 + i12 | 0;
     if (!(i3 >>> 0 < i4 >>> 0)) {
      _abort();
     }
     i5 = HEAP32[i3 + 24 >> 2] | 0;
     i7 = HEAP32[i3 + 12 >> 2] | 0;
     do {
      if ((i7 | 0) == (i3 | 0)) {
       i8 = i3 + 20 | 0;
       i7 = HEAP32[i8 >> 2] | 0;
       if ((i7 | 0) == 0) {
        i8 = i3 + 16 | 0;
        i7 = HEAP32[i8 >> 2] | 0;
        if ((i7 | 0) == 0) {
         i26 = 0;
         break;
        }
       }
       while (1) {
        i10 = i7 + 20 | 0;
        i9 = HEAP32[i10 >> 2] | 0;
        if ((i9 | 0) != 0) {
         i7 = i9;
         i8 = i10;
         continue;
        }
        i10 = i7 + 16 | 0;
        i9 = HEAP32[i10 >> 2] | 0;
        if ((i9 | 0) == 0) {
         break;
        } else {
         i7 = i9;
         i8 = i10;
        }
       }
       if (i8 >>> 0 < i6 >>> 0) {
        _abort();
       } else {
        HEAP32[i8 >> 2] = 0;
        i26 = i7;
        break;
       }
      } else {
       i8 = HEAP32[i3 + 8 >> 2] | 0;
       if (i8 >>> 0 < i6 >>> 0) {
        _abort();
       }
       i6 = i8 + 12 | 0;
       if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) {
        _abort();
       }
       i9 = i7 + 8 | 0;
       if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) {
        HEAP32[i6 >> 2] = i7;
        HEAP32[i9 >> 2] = i8;
        i26 = i7;
        break;
       } else {
        _abort();
       }
      }
     } while (0);
     do {
      if ((i5 | 0) != 0) {
       i7 = HEAP32[i3 + 28 >> 2] | 0;
       i6 = 7464 + (i7 << 2) | 0;
       if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) {
        HEAP32[i6 >> 2] = i26;
        if ((i26 | 0) == 0) {
         HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i7);
         break;
        }
       } else {
        if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        }
        i6 = i5 + 16 | 0;
        if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) {
         HEAP32[i6 >> 2] = i26;
        } else {
         HEAP32[i5 + 20 >> 2] = i26;
        }
        if ((i26 | 0) == 0) {
         break;
        }
       }
       if (i26 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       }
       HEAP32[i26 + 24 >> 2] = i5;
       i5 = HEAP32[i3 + 16 >> 2] | 0;
       do {
        if ((i5 | 0) != 0) {
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i26 + 16 >> 2] = i5;
          HEAP32[i5 + 24 >> 2] = i26;
          break;
         }
        }
       } while (0);
       i5 = HEAP32[i3 + 20 >> 2] | 0;
       if ((i5 | 0) != 0) {
        if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        } else {
         HEAP32[i26 + 20 >> 2] = i5;
         HEAP32[i5 + 24 >> 2] = i26;
         break;
        }
       }
      }
     } while (0);
     if (i2 >>> 0 < 16) {
      i32 = i2 + i12 | 0;
      HEAP32[i3 + 4 >> 2] = i32 | 3;
      i32 = i3 + (i32 + 4) | 0;
      HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
     } else {
      HEAP32[i3 + 4 >> 2] = i12 | 3;
      HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1;
      HEAP32[i3 + (i2 + i12) >> 2] = i2;
      i6 = HEAP32[7168 >> 2] | 0;
      if ((i6 | 0) != 0) {
       i5 = HEAP32[7180 >> 2] | 0;
       i8 = i6 >>> 3;
       i9 = i8 << 1;
       i6 = 7200 + (i9 << 2) | 0;
       i7 = HEAP32[1790] | 0;
       i8 = 1 << i8;
       if ((i7 & i8 | 0) != 0) {
        i7 = 7200 + (i9 + 2 << 2) | 0;
        i8 = HEAP32[i7 >> 2] | 0;
        if (i8 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        } else {
         i25 = i7;
         i24 = i8;
        }
       } else {
        HEAP32[1790] = i7 | i8;
        i25 = 7200 + (i9 + 2 << 2) | 0;
        i24 = i6;
       }
       HEAP32[i25 >> 2] = i5;
       HEAP32[i24 + 12 >> 2] = i5;
       HEAP32[i5 + 8 >> 2] = i24;
       HEAP32[i5 + 12 >> 2] = i6;
      }
      HEAP32[7168 >> 2] = i2;
      HEAP32[7180 >> 2] = i4;
     }
     i32 = i3 + 8 | 0;
     STACKTOP = i1;
     return i32 | 0;
    }
   }
  } else {
   if (!(i12 >>> 0 > 4294967231)) {
    i24 = i12 + 11 | 0;
    i12 = i24 & -8;
    i26 = HEAP32[7164 >> 2] | 0;
    if ((i26 | 0) != 0) {
     i25 = 0 - i12 | 0;
     i24 = i24 >>> 8;
     if ((i24 | 0) != 0) {
      if (i12 >>> 0 > 16777215) {
       i27 = 31;
      } else {
       i31 = (i24 + 1048320 | 0) >>> 16 & 8;
       i32 = i24 << i31;
       i30 = (i32 + 520192 | 0) >>> 16 & 4;
       i32 = i32 << i30;
       i27 = (i32 + 245760 | 0) >>> 16 & 2;
       i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0;
       i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1;
      }
     } else {
      i27 = 0;
     }
     i30 = HEAP32[7464 + (i27 << 2) >> 2] | 0;
     L126 : do {
      if ((i30 | 0) == 0) {
       i29 = 0;
       i24 = 0;
      } else {
       if ((i27 | 0) == 31) {
        i24 = 0;
       } else {
        i24 = 25 - (i27 >>> 1) | 0;
       }
       i29 = 0;
       i28 = i12 << i24;
       i24 = 0;
       while (1) {
        i32 = HEAP32[i30 + 4 >> 2] & -8;
        i31 = i32 - i12 | 0;
        if (i31 >>> 0 < i25 >>> 0) {
         if ((i32 | 0) == (i12 | 0)) {
          i25 = i31;
          i29 = i30;
          i24 = i30;
          break L126;
         } else {
          i25 = i31;
          i24 = i30;
         }
        }
        i31 = HEAP32[i30 + 20 >> 2] | 0;
        i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0;
        i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31;
        if ((i30 | 0) == 0) {
         break;
        } else {
         i28 = i28 << 1;
        }
       }
      }
     } while (0);
     if ((i29 | 0) == 0 & (i24 | 0) == 0) {
      i32 = 2 << i27;
      i26 = i26 & (i32 | 0 - i32);
      if ((i26 | 0) == 0) {
       break;
      }
      i32 = (i26 & 0 - i26) + -1 | 0;
      i28 = i32 >>> 12 & 16;
      i32 = i32 >>> i28;
      i27 = i32 >>> 5 & 8;
      i32 = i32 >>> i27;
      i30 = i32 >>> 2 & 4;
      i32 = i32 >>> i30;
      i31 = i32 >>> 1 & 2;
      i32 = i32 >>> i31;
      i29 = i32 >>> 1 & 1;
      i29 = HEAP32[7464 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0;
     }
     if ((i29 | 0) != 0) {
      while (1) {
       i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0;
       i26 = i27 >>> 0 < i25 >>> 0;
       i25 = i26 ? i27 : i25;
       i24 = i26 ? i29 : i24;
       i26 = HEAP32[i29 + 16 >> 2] | 0;
       if ((i26 | 0) != 0) {
        i29 = i26;
        continue;
       }
       i29 = HEAP32[i29 + 20 >> 2] | 0;
       if ((i29 | 0) == 0) {
        break;
       }
      }
     }
     if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[7168 >> 2] | 0) - i12 | 0) >>> 0 : 0) {
      i4 = HEAP32[7176 >> 2] | 0;
      if (i24 >>> 0 < i4 >>> 0) {
       _abort();
      }
      i2 = i24 + i12 | 0;
      if (!(i24 >>> 0 < i2 >>> 0)) {
       _abort();
      }
      i3 = HEAP32[i24 + 24 >> 2] | 0;
      i6 = HEAP32[i24 + 12 >> 2] | 0;
      do {
       if ((i6 | 0) == (i24 | 0)) {
        i6 = i24 + 20 | 0;
        i5 = HEAP32[i6 >> 2] | 0;
        if ((i5 | 0) == 0) {
         i6 = i24 + 16 | 0;
         i5 = HEAP32[i6 >> 2] | 0;
         if ((i5 | 0) == 0) {
          i22 = 0;
          break;
         }
        }
        while (1) {
         i8 = i5 + 20 | 0;
         i7 = HEAP32[i8 >> 2] | 0;
         if ((i7 | 0) != 0) {
          i5 = i7;
          i6 = i8;
          continue;
         }
         i7 = i5 + 16 | 0;
         i8 = HEAP32[i7 >> 2] | 0;
         if ((i8 | 0) == 0) {
          break;
         } else {
          i5 = i8;
          i6 = i7;
         }
        }
        if (i6 >>> 0 < i4 >>> 0) {
         _abort();
        } else {
         HEAP32[i6 >> 2] = 0;
         i22 = i5;
         break;
        }
       } else {
        i5 = HEAP32[i24 + 8 >> 2] | 0;
        if (i5 >>> 0 < i4 >>> 0) {
         _abort();
        }
        i7 = i5 + 12 | 0;
        if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) {
         _abort();
        }
        i4 = i6 + 8 | 0;
        if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
         HEAP32[i7 >> 2] = i6;
         HEAP32[i4 >> 2] = i5;
         i22 = i6;
         break;
        } else {
         _abort();
        }
       }
      } while (0);
      do {
       if ((i3 | 0) != 0) {
        i4 = HEAP32[i24 + 28 >> 2] | 0;
        i5 = 7464 + (i4 << 2) | 0;
        if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) {
         HEAP32[i5 >> 2] = i22;
         if ((i22 | 0) == 0) {
          HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i4);
          break;
         }
        } else {
         if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         }
         i4 = i3 + 16 | 0;
         if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
          HEAP32[i4 >> 2] = i22;
         } else {
          HEAP32[i3 + 20 >> 2] = i22;
         }
         if ((i22 | 0) == 0) {
          break;
         }
        }
        if (i22 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        }
        HEAP32[i22 + 24 >> 2] = i3;
        i3 = HEAP32[i24 + 16 >> 2] | 0;
        do {
         if ((i3 | 0) != 0) {
          if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           HEAP32[i22 + 16 >> 2] = i3;
           HEAP32[i3 + 24 >> 2] = i22;
           break;
          }
         }
        } while (0);
        i3 = HEAP32[i24 + 20 >> 2] | 0;
        if ((i3 | 0) != 0) {
         if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i22 + 20 >> 2] = i3;
          HEAP32[i3 + 24 >> 2] = i22;
          break;
         }
        }
       }
      } while (0);
      L204 : do {
       if (!(i25 >>> 0 < 16)) {
        HEAP32[i24 + 4 >> 2] = i12 | 3;
        HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1;
        HEAP32[i24 + (i25 + i12) >> 2] = i25;
        i4 = i25 >>> 3;
        if (i25 >>> 0 < 256) {
         i6 = i4 << 1;
         i3 = 7200 + (i6 << 2) | 0;
         i5 = HEAP32[1790] | 0;
         i4 = 1 << i4;
         if ((i5 & i4 | 0) != 0) {
          i5 = 7200 + (i6 + 2 << 2) | 0;
          i4 = HEAP32[i5 >> 2] | 0;
          if (i4 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           i21 = i5;
           i20 = i4;
          }
         } else {
          HEAP32[1790] = i5 | i4;
          i21 = 7200 + (i6 + 2 << 2) | 0;
          i20 = i3;
         }
         HEAP32[i21 >> 2] = i2;
         HEAP32[i20 + 12 >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i20;
         HEAP32[i24 + (i12 + 12) >> 2] = i3;
         break;
        }
        i3 = i25 >>> 8;
        if ((i3 | 0) != 0) {
         if (i25 >>> 0 > 16777215) {
          i3 = 31;
         } else {
          i31 = (i3 + 1048320 | 0) >>> 16 & 8;
          i32 = i3 << i31;
          i30 = (i32 + 520192 | 0) >>> 16 & 4;
          i32 = i32 << i30;
          i3 = (i32 + 245760 | 0) >>> 16 & 2;
          i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
          i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1;
         }
        } else {
         i3 = 0;
        }
        i6 = 7464 + (i3 << 2) | 0;
        HEAP32[i24 + (i12 + 28) >> 2] = i3;
        HEAP32[i24 + (i12 + 20) >> 2] = 0;
        HEAP32[i24 + (i12 + 16) >> 2] = 0;
        i4 = HEAP32[7164 >> 2] | 0;
        i5 = 1 << i3;
        if ((i4 & i5 | 0) == 0) {
         HEAP32[7164 >> 2] = i4 | i5;
         HEAP32[i6 >> 2] = i2;
         HEAP32[i24 + (i12 + 24) >> 2] = i6;
         HEAP32[i24 + (i12 + 12) >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i2;
         break;
        }
        i4 = HEAP32[i6 >> 2] | 0;
        if ((i3 | 0) == 31) {
         i3 = 0;
        } else {
         i3 = 25 - (i3 >>> 1) | 0;
        }
        L225 : do {
         if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) {
          i3 = i25 << i3;
          while (1) {
           i6 = i4 + (i3 >>> 31 << 2) + 16 | 0;
           i5 = HEAP32[i6 >> 2] | 0;
           if ((i5 | 0) == 0) {
            break;
           }
           if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) {
            i18 = i5;
            break L225;
           } else {
            i3 = i3 << 1;
            i4 = i5;
           }
          }
          if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           HEAP32[i6 >> 2] = i2;
           HEAP32[i24 + (i12 + 24) >> 2] = i4;
           HEAP32[i24 + (i12 + 12) >> 2] = i2;
           HEAP32[i24 + (i12 + 8) >> 2] = i2;
           break L204;
          }
         } else {
          i18 = i4;
         }
        } while (0);
        i4 = i18 + 8 | 0;
        i3 = HEAP32[i4 >> 2] | 0;
        i5 = HEAP32[7176 >> 2] | 0;
        if (i18 >>> 0 < i5 >>> 0) {
         _abort();
        }
        if (i3 >>> 0 < i5 >>> 0) {
         _abort();
        } else {
         HEAP32[i3 + 12 >> 2] = i2;
         HEAP32[i4 >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i3;
         HEAP32[i24 + (i12 + 12) >> 2] = i18;
         HEAP32[i24 + (i12 + 24) >> 2] = 0;
         break;
        }
       } else {
        i32 = i25 + i12 | 0;
        HEAP32[i24 + 4 >> 2] = i32 | 3;
        i32 = i24 + (i32 + 4) | 0;
        HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
       }
      } while (0);
      i32 = i24 + 8 | 0;
      STACKTOP = i1;
      return i32 | 0;
     }
    }
   } else {
    i12 = -1;
   }
  }
 } while (0);
 i18 = HEAP32[7168 >> 2] | 0;
 if (!(i12 >>> 0 > i18 >>> 0)) {
  i3 = i18 - i12 | 0;
  i2 = HEAP32[7180 >> 2] | 0;
  if (i3 >>> 0 > 15) {
   HEAP32[7180 >> 2] = i2 + i12;
   HEAP32[7168 >> 2] = i3;
   HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1;
   HEAP32[i2 + i18 >> 2] = i3;
   HEAP32[i2 + 4 >> 2] = i12 | 3;
  } else {
   HEAP32[7168 >> 2] = 0;
   HEAP32[7180 >> 2] = 0;
   HEAP32[i2 + 4 >> 2] = i18 | 3;
   i32 = i2 + (i18 + 4) | 0;
   HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
  }
  i32 = i2 + 8 | 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 i18 = HEAP32[7172 >> 2] | 0;
 if (i12 >>> 0 < i18 >>> 0) {
  i31 = i18 - i12 | 0;
  HEAP32[7172 >> 2] = i31;
  i32 = HEAP32[7184 >> 2] | 0;
  HEAP32[7184 >> 2] = i32 + i12;
  HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
  HEAP32[i32 + 4 >> 2] = i12 | 3;
  i32 = i32 + 8 | 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 do {
  if ((HEAP32[1908] | 0) == 0) {
   i18 = _sysconf(30) | 0;
   if ((i18 + -1 & i18 | 0) == 0) {
    HEAP32[7640 >> 2] = i18;
    HEAP32[7636 >> 2] = i18;
    HEAP32[7644 >> 2] = -1;
    HEAP32[7648 >> 2] = -1;
    HEAP32[7652 >> 2] = 0;
    HEAP32[7604 >> 2] = 0;
    HEAP32[1908] = (_time(0) | 0) & -16 ^ 1431655768;
    break;
   } else {
    _abort();
   }
  }
 } while (0);
 i20 = i12 + 48 | 0;
 i25 = HEAP32[7640 >> 2] | 0;
 i21 = i12 + 47 | 0;
 i22 = i25 + i21 | 0;
 i25 = 0 - i25 | 0;
 i18 = i22 & i25;
 if (!(i18 >>> 0 > i12 >>> 0)) {
  i32 = 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 i24 = HEAP32[7600 >> 2] | 0;
 if ((i24 | 0) != 0 ? (i31 = HEAP32[7592 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) {
  i32 = 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 L269 : do {
  if ((HEAP32[7604 >> 2] & 4 | 0) == 0) {
   i26 = HEAP32[7184 >> 2] | 0;
   L271 : do {
    if ((i26 | 0) != 0) {
     i24 = 7608 | 0;
     while (1) {
      i27 = HEAP32[i24 >> 2] | 0;
      if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2] | 0) | 0) >>> 0 > i26 >>> 0) : 0) {
       break;
      }
      i24 = HEAP32[i24 + 8 >> 2] | 0;
      if ((i24 | 0) == 0) {
       i13 = 182;
       break L271;
      }
     }
     if ((i24 | 0) != 0) {
      i25 = i22 - (HEAP32[7172 >> 2] | 0) & i25;
      if (i25 >>> 0 < 2147483647) {
       i13 = _sbrk(i25 | 0) | 0;
       i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0);
       i22 = i13;
       i24 = i25;
       i23 = i26 ? i13 : -1;
       i25 = i26 ? i25 : 0;
       i13 = 191;
      } else {
       i25 = 0;
      }
     } else {
      i13 = 182;
     }
    } else {
     i13 = 182;
    }
   } while (0);
   do {
    if ((i13 | 0) == 182) {
     i23 = _sbrk(0) | 0;
     if ((i23 | 0) != (-1 | 0)) {
      i24 = i23;
      i22 = HEAP32[7636 >> 2] | 0;
      i25 = i22 + -1 | 0;
      if ((i25 & i24 | 0) == 0) {
       i25 = i18;
      } else {
       i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0;
      }
      i24 = HEAP32[7592 >> 2] | 0;
      i26 = i24 + i25 | 0;
      if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) {
       i22 = HEAP32[7600 >> 2] | 0;
       if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) {
        i25 = 0;
        break;
       }
       i22 = _sbrk(i25 | 0) | 0;
       i13 = (i22 | 0) == (i23 | 0);
       i24 = i25;
       i23 = i13 ? i23 : -1;
       i25 = i13 ? i25 : 0;
       i13 = 191;
      } else {
       i25 = 0;
      }
     } else {
      i25 = 0;
     }
    }
   } while (0);
   L291 : do {
    if ((i13 | 0) == 191) {
     i13 = 0 - i24 | 0;
     if ((i23 | 0) != (-1 | 0)) {
      i17 = i23;
      i14 = i25;
      i13 = 202;
      break L269;
     }
     do {
      if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[7640 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 2147483647) : 0) {
       if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) {
        _sbrk(i13 | 0) | 0;
        break L291;
       } else {
        i24 = i19 + i24 | 0;
        break;
       }
      }
     } while (0);
     if ((i22 | 0) != (-1 | 0)) {
      i17 = i22;
      i14 = i24;
      i13 = 202;
      break L269;
     }
    }
   } while (0);
   HEAP32[7604 >> 2] = HEAP32[7604 >> 2] | 4;
   i13 = 199;
  } else {
   i25 = 0;
   i13 = 199;
  }
 } while (0);
 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) {
  i14 = i14 ? i15 : i25;
  i13 = 202;
 }
 if ((i13 | 0) == 202) {
  i15 = (HEAP32[7592 >> 2] | 0) + i14 | 0;
  HEAP32[7592 >> 2] = i15;
  if (i15 >>> 0 > (HEAP32[7596 >> 2] | 0) >>> 0) {
   HEAP32[7596 >> 2] = i15;
  }
  i15 = HEAP32[7184 >> 2] | 0;
  L311 : do {
   if ((i15 | 0) != 0) {
    i21 = 7608 | 0;
    while (1) {
     i16 = HEAP32[i21 >> 2] | 0;
     i19 = i21 + 4 | 0;
     i20 = HEAP32[i19 >> 2] | 0;
     if ((i17 | 0) == (i16 + i20 | 0)) {
      i13 = 214;
      break;
     }
     i18 = HEAP32[i21 + 8 >> 2] | 0;
     if ((i18 | 0) == 0) {
      break;
     } else {
      i21 = i18;
     }
    }
    if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) {
     HEAP32[i19 >> 2] = i20 + i14;
     i2 = (HEAP32[7172 >> 2] | 0) + i14 | 0;
     i3 = i15 + 8 | 0;
     if ((i3 & 7 | 0) == 0) {
      i3 = 0;
     } else {
      i3 = 0 - i3 & 7;
     }
     i32 = i2 - i3 | 0;
     HEAP32[7184 >> 2] = i15 + i3;
     HEAP32[7172 >> 2] = i32;
     HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1;
     HEAP32[i15 + (i2 + 4) >> 2] = 40;
     HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
     break;
    }
    if (i17 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
     HEAP32[7176 >> 2] = i17;
    }
    i19 = i17 + i14 | 0;
    i16 = 7608 | 0;
    while (1) {
     if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) {
      i13 = 224;
      break;
     }
     i18 = HEAP32[i16 + 8 >> 2] | 0;
     if ((i18 | 0) == 0) {
      break;
     } else {
      i16 = i18;
     }
    }
    if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) {
     HEAP32[i16 >> 2] = i17;
     i6 = i16 + 4 | 0;
     HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14;
     i6 = i17 + 8 | 0;
     if ((i6 & 7 | 0) == 0) {
      i6 = 0;
     } else {
      i6 = 0 - i6 & 7;
     }
     i7 = i17 + (i14 + 8) | 0;
     if ((i7 & 7 | 0) == 0) {
      i13 = 0;
     } else {
      i13 = 0 - i7 & 7;
     }
     i15 = i17 + (i13 + i14) | 0;
     i8 = i6 + i12 | 0;
     i7 = i17 + i8 | 0;
     i10 = i15 - (i17 + i6) - i12 | 0;
     HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3;
     L348 : do {
      if ((i15 | 0) != (HEAP32[7184 >> 2] | 0)) {
       if ((i15 | 0) == (HEAP32[7180 >> 2] | 0)) {
        i32 = (HEAP32[7168 >> 2] | 0) + i10 | 0;
        HEAP32[7168 >> 2] = i32;
        HEAP32[7180 >> 2] = i7;
        HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
        HEAP32[i17 + (i32 + i8) >> 2] = i32;
        break;
       }
       i12 = i14 + 4 | 0;
       i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0;
       if ((i18 & 3 | 0) == 1) {
        i11 = i18 & -8;
        i16 = i18 >>> 3;
        do {
         if (!(i18 >>> 0 < 256)) {
          i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0;
          i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
          do {
           if ((i19 | 0) == (i15 | 0)) {
            i19 = i13 | 16;
            i18 = i17 + (i12 + i19) | 0;
            i16 = HEAP32[i18 >> 2] | 0;
            if ((i16 | 0) == 0) {
             i18 = i17 + (i19 + i14) | 0;
             i16 = HEAP32[i18 >> 2] | 0;
             if ((i16 | 0) == 0) {
              i5 = 0;
              break;
             }
            }
            while (1) {
             i20 = i16 + 20 | 0;
             i19 = HEAP32[i20 >> 2] | 0;
             if ((i19 | 0) != 0) {
              i16 = i19;
              i18 = i20;
              continue;
             }
             i19 = i16 + 16 | 0;
             i20 = HEAP32[i19 >> 2] | 0;
             if ((i20 | 0) == 0) {
              break;
             } else {
              i16 = i20;
              i18 = i19;
             }
            }
            if (i18 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            } else {
             HEAP32[i18 >> 2] = 0;
             i5 = i16;
             break;
            }
           } else {
            i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
            if (i18 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            }
            i16 = i18 + 12 | 0;
            if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) {
             _abort();
            }
            i20 = i19 + 8 | 0;
            if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) {
             HEAP32[i16 >> 2] = i19;
             HEAP32[i20 >> 2] = i18;
             i5 = i19;
             break;
            } else {
             _abort();
            }
           }
          } while (0);
          if ((i9 | 0) != 0) {
           i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0;
           i18 = 7464 + (i16 << 2) | 0;
           if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) {
            HEAP32[i18 >> 2] = i5;
            if ((i5 | 0) == 0) {
             HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i16);
             break;
            }
           } else {
            if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            }
            i16 = i9 + 16 | 0;
            if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
             HEAP32[i16 >> 2] = i5;
            } else {
             HEAP32[i9 + 20 >> 2] = i5;
            }
            if ((i5 | 0) == 0) {
             break;
            }
           }
           if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           HEAP32[i5 + 24 >> 2] = i9;
           i15 = i13 | 16;
           i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0;
           do {
            if ((i9 | 0) != 0) {
             if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
              _abort();
             } else {
              HEAP32[i5 + 16 >> 2] = i9;
              HEAP32[i9 + 24 >> 2] = i5;
              break;
             }
            }
           } while (0);
           i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0;
           if ((i9 | 0) != 0) {
            if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            } else {
             HEAP32[i5 + 20 >> 2] = i9;
             HEAP32[i9 + 24 >> 2] = i5;
             break;
            }
           }
          }
         } else {
          i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
          i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
          i18 = 7200 + (i16 << 1 << 2) | 0;
          if ((i5 | 0) != (i18 | 0)) {
           if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) {
            _abort();
           }
          }
          if ((i12 | 0) == (i5 | 0)) {
           HEAP32[1790] = HEAP32[1790] & ~(1 << i16);
           break;
          }
          if ((i12 | 0) != (i18 | 0)) {
           if (i12 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           i16 = i12 + 8 | 0;
           if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
            i9 = i16;
           } else {
            _abort();
           }
          } else {
           i9 = i12 + 8 | 0;
          }
          HEAP32[i5 + 12 >> 2] = i12;
          HEAP32[i9 >> 2] = i5;
         }
        } while (0);
        i15 = i17 + ((i11 | i13) + i14) | 0;
        i10 = i11 + i10 | 0;
       }
       i5 = i15 + 4 | 0;
       HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2;
       HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1;
       HEAP32[i17 + (i10 + i8) >> 2] = i10;
       i5 = i10 >>> 3;
       if (i10 >>> 0 < 256) {
        i10 = i5 << 1;
        i2 = 7200 + (i10 << 2) | 0;
        i9 = HEAP32[1790] | 0;
        i5 = 1 << i5;
        if ((i9 & i5 | 0) != 0) {
         i9 = 7200 + (i10 + 2 << 2) | 0;
         i5 = HEAP32[i9 >> 2] | 0;
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          i3 = i9;
          i4 = i5;
         }
        } else {
         HEAP32[1790] = i9 | i5;
         i3 = 7200 + (i10 + 2 << 2) | 0;
         i4 = i2;
        }
        HEAP32[i3 >> 2] = i7;
        HEAP32[i4 + 12 >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i4;
        HEAP32[i17 + (i8 + 12) >> 2] = i2;
        break;
       }
       i3 = i10 >>> 8;
       if ((i3 | 0) != 0) {
        if (i10 >>> 0 > 16777215) {
         i3 = 31;
        } else {
         i31 = (i3 + 1048320 | 0) >>> 16 & 8;
         i32 = i3 << i31;
         i30 = (i32 + 520192 | 0) >>> 16 & 4;
         i32 = i32 << i30;
         i3 = (i32 + 245760 | 0) >>> 16 & 2;
         i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
         i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1;
        }
       } else {
        i3 = 0;
       }
       i4 = 7464 + (i3 << 2) | 0;
       HEAP32[i17 + (i8 + 28) >> 2] = i3;
       HEAP32[i17 + (i8 + 20) >> 2] = 0;
       HEAP32[i17 + (i8 + 16) >> 2] = 0;
       i9 = HEAP32[7164 >> 2] | 0;
       i5 = 1 << i3;
       if ((i9 & i5 | 0) == 0) {
        HEAP32[7164 >> 2] = i9 | i5;
        HEAP32[i4 >> 2] = i7;
        HEAP32[i17 + (i8 + 24) >> 2] = i4;
        HEAP32[i17 + (i8 + 12) >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i7;
        break;
       }
       i4 = HEAP32[i4 >> 2] | 0;
       if ((i3 | 0) == 31) {
        i3 = 0;
       } else {
        i3 = 25 - (i3 >>> 1) | 0;
       }
       L444 : do {
        if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) {
         i3 = i10 << i3;
         while (1) {
          i5 = i4 + (i3 >>> 31 << 2) + 16 | 0;
          i9 = HEAP32[i5 >> 2] | 0;
          if ((i9 | 0) == 0) {
           break;
          }
          if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) {
           i2 = i9;
           break L444;
          } else {
           i3 = i3 << 1;
           i4 = i9;
          }
         }
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i5 >> 2] = i7;
          HEAP32[i17 + (i8 + 24) >> 2] = i4;
          HEAP32[i17 + (i8 + 12) >> 2] = i7;
          HEAP32[i17 + (i8 + 8) >> 2] = i7;
          break L348;
         }
        } else {
         i2 = i4;
        }
       } while (0);
       i4 = i2 + 8 | 0;
       i3 = HEAP32[i4 >> 2] | 0;
       i5 = HEAP32[7176 >> 2] | 0;
       if (i2 >>> 0 < i5 >>> 0) {
        _abort();
       }
       if (i3 >>> 0 < i5 >>> 0) {
        _abort();
       } else {
        HEAP32[i3 + 12 >> 2] = i7;
        HEAP32[i4 >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i3;
        HEAP32[i17 + (i8 + 12) >> 2] = i2;
        HEAP32[i17 + (i8 + 24) >> 2] = 0;
        break;
       }
      } else {
       i32 = (HEAP32[7172 >> 2] | 0) + i10 | 0;
       HEAP32[7172 >> 2] = i32;
       HEAP32[7184 >> 2] = i7;
       HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
      }
     } while (0);
     i32 = i17 + (i6 | 8) | 0;
     STACKTOP = i1;
     return i32 | 0;
    }
    i3 = 7608 | 0;
    while (1) {
     i2 = HEAP32[i3 >> 2] | 0;
     if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i11 | 0, i10 >>> 0 > i15 >>> 0) : 0) {
      break;
     }
     i3 = HEAP32[i3 + 8 >> 2] | 0;
    }
    i3 = i2 + (i11 + -39) | 0;
    if ((i3 & 7 | 0) == 0) {
     i3 = 0;
    } else {
     i3 = 0 - i3 & 7;
    }
    i2 = i2 + (i11 + -47 + i3) | 0;
    i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2;
    i3 = i2 + 8 | 0;
    i4 = i17 + 8 | 0;
    if ((i4 & 7 | 0) == 0) {
     i4 = 0;
    } else {
     i4 = 0 - i4 & 7;
    }
    i32 = i14 + -40 - i4 | 0;
    HEAP32[7184 >> 2] = i17 + i4;
    HEAP32[7172 >> 2] = i32;
    HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
    HEAP32[i2 + 4 >> 2] = 27;
    HEAP32[i3 + 0 >> 2] = HEAP32[7608 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[7612 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[7616 >> 2];
    HEAP32[i3 + 12 >> 2] = HEAP32[7620 >> 2];
    HEAP32[7608 >> 2] = i17;
    HEAP32[7612 >> 2] = i14;
    HEAP32[7620 >> 2] = 0;
    HEAP32[7616 >> 2] = i3;
    i4 = i2 + 28 | 0;
    HEAP32[i4 >> 2] = 7;
    if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) {
     while (1) {
      i3 = i4 + 4 | 0;
      HEAP32[i3 >> 2] = 7;
      if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) {
       i4 = i3;
      } else {
       break;
      }
     }
    }
    if ((i2 | 0) != (i15 | 0)) {
     i2 = i2 - i15 | 0;
     i3 = i15 + (i2 + 4) | 0;
     HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2;
     HEAP32[i15 + 4 >> 2] = i2 | 1;
     HEAP32[i15 + i2 >> 2] = i2;
     i3 = i2 >>> 3;
     if (i2 >>> 0 < 256) {
      i4 = i3 << 1;
      i2 = 7200 + (i4 << 2) | 0;
      i5 = HEAP32[1790] | 0;
      i3 = 1 << i3;
      if ((i5 & i3 | 0) != 0) {
       i4 = 7200 + (i4 + 2 << 2) | 0;
       i3 = HEAP32[i4 >> 2] | 0;
       if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i7 = i4;
        i8 = i3;
       }
      } else {
       HEAP32[1790] = i5 | i3;
       i7 = 7200 + (i4 + 2 << 2) | 0;
       i8 = i2;
      }
      HEAP32[i7 >> 2] = i15;
      HEAP32[i8 + 12 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i8;
      HEAP32[i15 + 12 >> 2] = i2;
      break;
     }
     i3 = i2 >>> 8;
     if ((i3 | 0) != 0) {
      if (i2 >>> 0 > 16777215) {
       i3 = 31;
      } else {
       i31 = (i3 + 1048320 | 0) >>> 16 & 8;
       i32 = i3 << i31;
       i30 = (i32 + 520192 | 0) >>> 16 & 4;
       i32 = i32 << i30;
       i3 = (i32 + 245760 | 0) >>> 16 & 2;
       i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
       i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1;
      }
     } else {
      i3 = 0;
     }
     i7 = 7464 + (i3 << 2) | 0;
     HEAP32[i15 + 28 >> 2] = i3;
     HEAP32[i15 + 20 >> 2] = 0;
     HEAP32[i15 + 16 >> 2] = 0;
     i4 = HEAP32[7164 >> 2] | 0;
     i5 = 1 << i3;
     if ((i4 & i5 | 0) == 0) {
      HEAP32[7164 >> 2] = i4 | i5;
      HEAP32[i7 >> 2] = i15;
      HEAP32[i15 + 24 >> 2] = i7;
      HEAP32[i15 + 12 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i15;
      break;
     }
     i4 = HEAP32[i7 >> 2] | 0;
     if ((i3 | 0) == 31) {
      i3 = 0;
     } else {
      i3 = 25 - (i3 >>> 1) | 0;
     }
     L499 : do {
      if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) {
       i3 = i2 << i3;
       while (1) {
        i7 = i4 + (i3 >>> 31 << 2) + 16 | 0;
        i5 = HEAP32[i7 >> 2] | 0;
        if ((i5 | 0) == 0) {
         break;
        }
        if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) {
         i6 = i5;
         break L499;
        } else {
         i3 = i3 << 1;
         i4 = i5;
        }
       }
       if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[i7 >> 2] = i15;
        HEAP32[i15 + 24 >> 2] = i4;
        HEAP32[i15 + 12 >> 2] = i15;
        HEAP32[i15 + 8 >> 2] = i15;
        break L311;
       }
      } else {
       i6 = i4;
      }
     } while (0);
     i4 = i6 + 8 | 0;
     i3 = HEAP32[i4 >> 2] | 0;
     i2 = HEAP32[7176 >> 2] | 0;
     if (i6 >>> 0 < i2 >>> 0) {
      _abort();
     }
     if (i3 >>> 0 < i2 >>> 0) {
      _abort();
     } else {
      HEAP32[i3 + 12 >> 2] = i15;
      HEAP32[i4 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i3;
      HEAP32[i15 + 12 >> 2] = i6;
      HEAP32[i15 + 24 >> 2] = 0;
      break;
     }
    }
   } else {
    i32 = HEAP32[7176 >> 2] | 0;
    if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) {
     HEAP32[7176 >> 2] = i17;
    }
    HEAP32[7608 >> 2] = i17;
    HEAP32[7612 >> 2] = i14;
    HEAP32[7620 >> 2] = 0;
    HEAP32[7196 >> 2] = HEAP32[1908];
    HEAP32[7192 >> 2] = -1;
    i2 = 0;
    do {
     i32 = i2 << 1;
     i31 = 7200 + (i32 << 2) | 0;
     HEAP32[7200 + (i32 + 3 << 2) >> 2] = i31;
     HEAP32[7200 + (i32 + 2 << 2) >> 2] = i31;
     i2 = i2 + 1 | 0;
    } while ((i2 | 0) != 32);
    i2 = i17 + 8 | 0;
    if ((i2 & 7 | 0) == 0) {
     i2 = 0;
    } else {
     i2 = 0 - i2 & 7;
    }
    i32 = i14 + -40 - i2 | 0;
    HEAP32[7184 >> 2] = i17 + i2;
    HEAP32[7172 >> 2] = i32;
    HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
   }
  } while (0);
  i2 = HEAP32[7172 >> 2] | 0;
  if (i2 >>> 0 > i12 >>> 0) {
   i31 = i2 - i12 | 0;
   HEAP32[7172 >> 2] = i31;
   i32 = HEAP32[7184 >> 2] | 0;
   HEAP32[7184 >> 2] = i32 + i12;
   HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
   HEAP32[i32 + 4 >> 2] = i12 | 3;
   i32 = i32 + 8 | 0;
   STACKTOP = i1;
   return i32 | 0;
  }
 }
 HEAP32[(___errno_location() | 0) >> 2] = 12;
 i32 = 0;
 STACKTOP = i1;
 return i32 | 0;
}
function __ZN12b2EPCollider7CollideEP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS7_(i12, i2, i16, i5, i8, i6) {
 i12 = i12 | 0;
 i2 = i2 | 0;
 i16 = i16 | 0;
 i5 = i5 | 0;
 i8 = i8 | 0;
 i6 = i6 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, i29 = 0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, i34 = 0, i35 = 0, d36 = 0.0, d37 = 0.0, i38 = 0, d39 = 0.0, i40 = 0, i41 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 144 | 0;
 i18 = i1 + 128 | 0;
 i11 = i1 + 24 | 0;
 i9 = i1 + 72 | 0;
 i10 = i1 + 48 | 0;
 i3 = i1;
 i4 = i12 + 132 | 0;
 d28 = +HEAPF32[i5 + 12 >> 2];
 d37 = +HEAPF32[i6 + 8 >> 2];
 d23 = +HEAPF32[i5 + 8 >> 2];
 d27 = +HEAPF32[i6 + 12 >> 2];
 d22 = d28 * d37 - d23 * d27;
 d27 = d37 * d23 + d28 * d27;
 d37 = +d22;
 d26 = +d27;
 d25 = +HEAPF32[i6 >> 2] - +HEAPF32[i5 >> 2];
 d36 = +HEAPF32[i6 + 4 >> 2] - +HEAPF32[i5 + 4 >> 2];
 d24 = d28 * d25 + d23 * d36;
 d25 = d28 * d36 - d23 * d25;
 d23 = +d24;
 d36 = +d25;
 i5 = i4;
 HEAPF32[i5 >> 2] = d23;
 HEAPF32[i5 + 4 >> 2] = d36;
 i5 = i12 + 140 | 0;
 HEAPF32[i5 >> 2] = d37;
 HEAPF32[i5 + 4 >> 2] = d26;
 i5 = i12 + 144 | 0;
 d26 = +HEAPF32[i8 + 12 >> 2];
 i7 = i12 + 140 | 0;
 d37 = +HEAPF32[i8 + 16 >> 2];
 d24 = d24 + (d27 * d26 - d22 * d37);
 i6 = i12 + 136 | 0;
 d25 = d26 * d22 + d27 * d37 + d25;
 d37 = +d24;
 d27 = +d25;
 i34 = i12 + 148 | 0;
 HEAPF32[i34 >> 2] = d37;
 HEAPF32[i34 + 4 >> 2] = d27;
 i34 = i16 + 28 | 0;
 i29 = HEAP32[i34 >> 2] | 0;
 i34 = HEAP32[i34 + 4 >> 2] | 0;
 i14 = i12 + 156 | 0;
 HEAP32[i14 >> 2] = i29;
 HEAP32[i14 + 4 >> 2] = i34;
 i14 = i12 + 164 | 0;
 i17 = i16 + 12 | 0;
 i40 = HEAP32[i17 >> 2] | 0;
 i17 = HEAP32[i17 + 4 >> 2] | 0;
 i13 = i14;
 HEAP32[i13 >> 2] = i40;
 HEAP32[i13 + 4 >> 2] = i17;
 i13 = i12 + 172 | 0;
 i20 = i16 + 20 | 0;
 i41 = HEAP32[i20 >> 2] | 0;
 i20 = HEAP32[i20 + 4 >> 2] | 0;
 i38 = i13;
 HEAP32[i38 >> 2] = i41;
 HEAP32[i38 + 4 >> 2] = i20;
 i38 = i16 + 36 | 0;
 i35 = HEAP32[i38 >> 2] | 0;
 i38 = HEAP32[i38 + 4 >> 2] | 0;
 i19 = i12 + 180 | 0;
 HEAP32[i19 >> 2] = i35;
 HEAP32[i19 + 4 >> 2] = i38;
 i19 = (HEAP8[i16 + 44 | 0] | 0) != 0;
 i21 = (HEAP8[i16 + 45 | 0] | 0) != 0;
 d27 = (HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
 d37 = (HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
 d22 = d27 - d37;
 d26 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]);
 i20 = i12 + 168 | 0;
 d36 = (HEAP32[tempDoublePtr >> 2] = i17, +HEAPF32[tempDoublePtr >> 2]);
 d23 = d26 - d36;
 d28 = +Math_sqrt(+(d22 * d22 + d23 * d23));
 d33 = (HEAP32[tempDoublePtr >> 2] = i29, +HEAPF32[tempDoublePtr >> 2]);
 d32 = (HEAP32[tempDoublePtr >> 2] = i34, +HEAPF32[tempDoublePtr >> 2]);
 d31 = (HEAP32[tempDoublePtr >> 2] = i35, +HEAPF32[tempDoublePtr >> 2]);
 d30 = (HEAP32[tempDoublePtr >> 2] = i38, +HEAPF32[tempDoublePtr >> 2]);
 if (!(d28 < 1.1920928955078125e-7)) {
  d39 = 1.0 / d28;
  d22 = d22 * d39;
  d23 = d23 * d39;
 }
 i16 = i12 + 196 | 0;
 d28 = -d22;
 HEAPF32[i16 >> 2] = d23;
 i17 = i12 + 200 | 0;
 HEAPF32[i17 >> 2] = d28;
 d28 = (d24 - d37) * d23 + (d25 - d36) * d28;
 if (i19) {
  d37 = d37 - d33;
  d36 = d36 - d32;
  d39 = +Math_sqrt(+(d37 * d37 + d36 * d36));
  if (!(d39 < 1.1920928955078125e-7)) {
   d39 = 1.0 / d39;
   d37 = d37 * d39;
   d36 = d36 * d39;
  }
  d39 = -d37;
  HEAPF32[i12 + 188 >> 2] = d36;
  HEAPF32[i12 + 192 >> 2] = d39;
  i29 = d23 * d37 - d22 * d36 >= 0.0;
  d32 = (d24 - d33) * d36 + (d25 - d32) * d39;
 } else {
  i29 = 0;
  d32 = 0.0;
 }
 L10 : do {
  if (!i21) {
   if (!i19) {
    i41 = d28 >= 0.0;
    HEAP8[i12 + 248 | 0] = i41 & 1;
    i19 = i12 + 212 | 0;
    if (i41) {
     i15 = 64;
     break;
    } else {
     i15 = 65;
     break;
    }
   }
   i19 = d32 >= 0.0;
   if (i29) {
    if (!i19) {
     i41 = d28 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (!i41) {
      d37 = +-d23;
      d39 = +d22;
      i38 = i19;
      HEAPF32[i38 >> 2] = d37;
      HEAPF32[i38 + 4 >> 2] = d39;
      i38 = i16;
      i40 = HEAP32[i38 >> 2] | 0;
      i38 = HEAP32[i38 + 4 >> 2] | 0;
      i41 = i12 + 228 | 0;
      HEAP32[i41 >> 2] = i40;
      HEAP32[i41 + 4 >> 2] = i38;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = -(HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
    i41 = i16;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i19;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i12 + 188 | 0;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 228 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    d37 = +-+HEAPF32[i16 >> 2];
    d39 = +-+HEAPF32[i17 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   } else {
    if (i19) {
     i41 = d28 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (i41) {
      i38 = i16;
      i41 = HEAP32[i38 >> 2] | 0;
      i38 = HEAP32[i38 + 4 >> 2] | 0;
      i40 = i19;
      HEAP32[i40 >> 2] = i41;
      HEAP32[i40 + 4 >> 2] = i38;
      i40 = i12 + 228 | 0;
      HEAP32[i40 >> 2] = i41;
      HEAP32[i40 + 4 >> 2] = i38;
      d37 = +-(HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
      d39 = +d22;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 0;
     i19 = i12 + 212 | 0;
    }
    d39 = +-d23;
    d37 = +d22;
    i38 = i19;
    HEAPF32[i38 >> 2] = d39;
    HEAPF32[i38 + 4 >> 2] = d37;
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 228 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    d37 = +-+HEAPF32[i12 + 188 >> 2];
    d39 = +-+HEAPF32[i12 + 192 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   }
  } else {
   d33 = d31 - d27;
   d31 = d30 - d26;
   d30 = +Math_sqrt(+(d33 * d33 + d31 * d31));
   if (d30 < 1.1920928955078125e-7) {
    d30 = d33;
   } else {
    d39 = 1.0 / d30;
    d30 = d33 * d39;
    d31 = d31 * d39;
   }
   d39 = -d30;
   i34 = i12 + 204 | 0;
   HEAPF32[i34 >> 2] = d31;
   i35 = i12 + 208 | 0;
   HEAPF32[i35 >> 2] = d39;
   i38 = d22 * d31 - d23 * d30 > 0.0;
   d24 = (d24 - d27) * d31 + (d25 - d26) * d39;
   if (!i19) {
    i19 = d28 >= 0.0;
    if (!i21) {
     HEAP8[i12 + 248 | 0] = i19 & 1;
     i15 = i12 + 212 | 0;
     if (i19) {
      i19 = i15;
      i15 = 64;
      break;
     } else {
      i19 = i15;
      i15 = 65;
      break;
     }
    }
    if (i38) {
     if (!i19) {
      i41 = d24 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (!i41) {
       d37 = +-d23;
       d39 = +d22;
       i38 = i19;
       HEAPF32[i38 >> 2] = d37;
       HEAPF32[i38 + 4 >> 2] = d39;
       i38 = i12 + 228 | 0;
       HEAPF32[i38 >> 2] = d37;
       HEAPF32[i38 + 4 >> 2] = d39;
       i38 = i16;
       i40 = HEAP32[i38 + 4 >> 2] | 0;
       i41 = i12 + 236 | 0;
       HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
       HEAP32[i41 + 4 >> 2] = i40;
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 1;
      i19 = i12 + 212 | 0;
     }
     i41 = i16;
     i40 = HEAP32[i41 + 4 >> 2] | 0;
     i38 = i19;
     HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
     HEAP32[i38 + 4 >> 2] = i40;
     d37 = +-+HEAPF32[i16 >> 2];
     d39 = +-+HEAPF32[i17 >> 2];
     i38 = i12 + 228 | 0;
     HEAPF32[i38 >> 2] = d37;
     HEAPF32[i38 + 4 >> 2] = d39;
     i38 = i12 + 204 | 0;
     i40 = HEAP32[i38 + 4 >> 2] | 0;
     i41 = i12 + 236 | 0;
     HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
     HEAP32[i41 + 4 >> 2] = i40;
     break;
    } else {
     if (i19) {
      i41 = d24 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (i41) {
       i40 = i16;
       i38 = HEAP32[i40 >> 2] | 0;
       i40 = HEAP32[i40 + 4 >> 2] | 0;
       i41 = i19;
       HEAP32[i41 >> 2] = i38;
       HEAP32[i41 + 4 >> 2] = i40;
       d37 = +-(HEAP32[tempDoublePtr >> 2] = i38, +HEAPF32[tempDoublePtr >> 2]);
       d39 = +d22;
       i41 = i12 + 228 | 0;
       HEAPF32[i41 >> 2] = d37;
       HEAPF32[i41 + 4 >> 2] = d39;
       i41 = i12 + 236 | 0;
       HEAP32[i41 >> 2] = i38;
       HEAP32[i41 + 4 >> 2] = i40;
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 0;
      i19 = i12 + 212 | 0;
     }
     d39 = +-d23;
     d37 = +d22;
     i38 = i19;
     HEAPF32[i38 >> 2] = d39;
     HEAPF32[i38 + 4 >> 2] = d37;
     d37 = +-+HEAPF32[i12 + 204 >> 2];
     d39 = +-+HEAPF32[i12 + 208 >> 2];
     i38 = i12 + 228 | 0;
     HEAPF32[i38 >> 2] = d37;
     HEAPF32[i38 + 4 >> 2] = d39;
     i38 = i16;
     i40 = HEAP32[i38 + 4 >> 2] | 0;
     i41 = i12 + 236 | 0;
     HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
     HEAP32[i41 + 4 >> 2] = i40;
     break;
    }
   }
   if (i29 & i38) {
    if (!(d32 >= 0.0) & !(d28 >= 0.0)) {
     i41 = d24 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (!i41) {
      d37 = +-d23;
      d39 = +d22;
      i41 = i19;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      i41 = i12 + 228 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i19;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    i41 = i12 + 188 | 0;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i12 + 228 | 0;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i12 + 204 | 0;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 236 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    break;
   }
   if (i29) {
    do {
     if (!(d32 >= 0.0)) {
      if (d28 >= 0.0) {
       i41 = d24 >= 0.0;
       HEAP8[i12 + 248 | 0] = i41 & 1;
       i19 = i12 + 212 | 0;
       if (i41) {
        break;
       }
      } else {
       HEAP8[i12 + 248 | 0] = 0;
       i19 = i12 + 212 | 0;
      }
      d37 = +-d23;
      d39 = +d22;
      i41 = i19;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      d39 = +-+HEAPF32[i34 >> 2];
      d37 = +-+HEAPF32[i35 >> 2];
      i41 = i12 + 228 | 0;
      HEAPF32[i41 >> 2] = d39;
      HEAPF32[i41 + 4 >> 2] = d37;
      d37 = +-+HEAPF32[i16 >> 2];
      d39 = +-+HEAPF32[i17 >> 2];
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break L10;
     } else {
      HEAP8[i12 + 248 | 0] = 1;
      i19 = i12 + 212 | 0;
     }
    } while (0);
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i19;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    i41 = i12 + 188 | 0;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i12 + 228 | 0;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 236 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    break;
   }
   if (!i38) {
    if (!(!(d32 >= 0.0) | !(d28 >= 0.0))) {
     i41 = d24 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (i41) {
      i40 = i16;
      i38 = HEAP32[i40 >> 2] | 0;
      i40 = HEAP32[i40 + 4 >> 2] | 0;
      i41 = i19;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      i41 = i12 + 228 | 0;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      i41 = i12 + 236 | 0;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 0;
     i19 = i12 + 212 | 0;
    }
    d37 = +-d23;
    d39 = +d22;
    i41 = i19;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    d39 = +-+HEAPF32[i34 >> 2];
    d37 = +-+HEAPF32[i35 >> 2];
    i41 = i12 + 228 | 0;
    HEAPF32[i41 >> 2] = d39;
    HEAPF32[i41 + 4 >> 2] = d37;
    d37 = +-+HEAPF32[i12 + 188 >> 2];
    d39 = +-+HEAPF32[i12 + 192 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   }
   do {
    if (!(d24 >= 0.0)) {
     if (d32 >= 0.0) {
      i41 = d28 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (i41) {
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 0;
      i19 = i12 + 212 | 0;
     }
     d37 = +-d23;
     d39 = +d22;
     i41 = i19;
     HEAPF32[i41 >> 2] = d37;
     HEAPF32[i41 + 4 >> 2] = d39;
     d39 = +-+HEAPF32[i16 >> 2];
     d37 = +-+HEAPF32[i17 >> 2];
     i41 = i12 + 228 | 0;
     HEAPF32[i41 >> 2] = d39;
     HEAPF32[i41 + 4 >> 2] = d37;
     d37 = +-+HEAPF32[i12 + 188 >> 2];
     d39 = +-+HEAPF32[i12 + 192 >> 2];
     i41 = i12 + 236 | 0;
     HEAPF32[i41 >> 2] = d37;
     HEAPF32[i41 + 4 >> 2] = d39;
     break L10;
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
   } while (0);
   i38 = i16;
   i40 = HEAP32[i38 + 4 >> 2] | 0;
   i41 = i19;
   HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i41 + 4 >> 2] = i40;
   i41 = i16;
   i40 = HEAP32[i41 + 4 >> 2] | 0;
   i38 = i12 + 228 | 0;
   HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
   HEAP32[i38 + 4 >> 2] = i40;
   i38 = i12 + 204 | 0;
   i40 = HEAP32[i38 + 4 >> 2] | 0;
   i41 = i12 + 236 | 0;
   HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i41 + 4 >> 2] = i40;
  }
 } while (0);
 if ((i15 | 0) == 64) {
  i38 = i16;
  i41 = HEAP32[i38 >> 2] | 0;
  i38 = HEAP32[i38 + 4 >> 2] | 0;
  i40 = i19;
  HEAP32[i40 >> 2] = i41;
  HEAP32[i40 + 4 >> 2] = i38;
  d37 = +-(HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
  d39 = +d22;
  i41 = i12 + 228 | 0;
  HEAPF32[i41 >> 2] = d37;
  HEAPF32[i41 + 4 >> 2] = d39;
  i41 = i12 + 236 | 0;
  HEAPF32[i41 >> 2] = d37;
  HEAPF32[i41 + 4 >> 2] = d39;
 } else if ((i15 | 0) == 65) {
  d37 = +-d23;
  d39 = +d22;
  i40 = i19;
  HEAPF32[i40 >> 2] = d37;
  HEAPF32[i40 + 4 >> 2] = d39;
  i40 = i16;
  i38 = HEAP32[i40 >> 2] | 0;
  i40 = HEAP32[i40 + 4 >> 2] | 0;
  i41 = i12 + 228 | 0;
  HEAP32[i41 >> 2] = i38;
  HEAP32[i41 + 4 >> 2] = i40;
  i41 = i12 + 236 | 0;
  HEAP32[i41 >> 2] = i38;
  HEAP32[i41 + 4 >> 2] = i40;
 }
 i21 = i8 + 148 | 0;
 i34 = i12 + 128 | 0;
 HEAP32[i34 >> 2] = HEAP32[i21 >> 2];
 if ((HEAP32[i21 >> 2] | 0) > 0) {
  i19 = 0;
  do {
   d33 = +HEAPF32[i5 >> 2];
   d37 = +HEAPF32[i8 + (i19 << 3) + 20 >> 2];
   d39 = +HEAPF32[i7 >> 2];
   d36 = +HEAPF32[i8 + (i19 << 3) + 24 >> 2];
   d32 = +(+HEAPF32[i4 >> 2] + (d33 * d37 - d39 * d36));
   d36 = +(d37 * d39 + d33 * d36 + +HEAPF32[i6 >> 2]);
   i41 = i12 + (i19 << 3) | 0;
   HEAPF32[i41 >> 2] = d32;
   HEAPF32[i41 + 4 >> 2] = d36;
   d36 = +HEAPF32[i5 >> 2];
   d32 = +HEAPF32[i8 + (i19 << 3) + 84 >> 2];
   d33 = +HEAPF32[i7 >> 2];
   d39 = +HEAPF32[i8 + (i19 << 3) + 88 >> 2];
   d37 = +(d36 * d32 - d33 * d39);
   d39 = +(d32 * d33 + d36 * d39);
   i41 = i12 + (i19 << 3) + 64 | 0;
   HEAPF32[i41 >> 2] = d37;
   HEAPF32[i41 + 4 >> 2] = d39;
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i21 >> 2] | 0));
 }
 i21 = i12 + 244 | 0;
 HEAPF32[i21 >> 2] = .019999999552965164;
 i19 = i2 + 60 | 0;
 HEAP32[i19 >> 2] = 0;
 i29 = i12 + 248 | 0;
 i35 = HEAP32[i34 >> 2] | 0;
 if ((i35 | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 d23 = +HEAPF32[i12 + 164 >> 2];
 d26 = +HEAPF32[i20 >> 2];
 d24 = +HEAPF32[i12 + 212 >> 2];
 d27 = +HEAPF32[i12 + 216 >> 2];
 d22 = 3.4028234663852886e+38;
 i20 = 0;
 do {
  d25 = d24 * (+HEAPF32[i12 + (i20 << 3) >> 2] - d23) + d27 * (+HEAPF32[i12 + (i20 << 3) + 4 >> 2] - d26);
  d22 = d25 < d22 ? d25 : d22;
  i20 = i20 + 1 | 0;
 } while ((i20 | 0) != (i35 | 0));
 if (d22 > .019999999552965164) {
  STACKTOP = i1;
  return;
 }
 __ZN12b2EPCollider24ComputePolygonSeparationEv(i18, i12);
 i20 = HEAP32[i18 >> 2] | 0;
 if ((i20 | 0) != 0) {
  d23 = +HEAPF32[i18 + 8 >> 2];
  if (d23 > +HEAPF32[i21 >> 2]) {
   STACKTOP = i1;
   return;
  }
  if (d23 > d22 * .9800000190734863 + .0010000000474974513) {
   i18 = HEAP32[i18 + 4 >> 2] | 0;
   i35 = i2 + 56 | 0;
   if ((i20 | 0) == 1) {
    i18 = i11;
    i15 = 77;
   } else {
    HEAP32[i35 >> 2] = 2;
    i40 = i14;
    i41 = HEAP32[i40 + 4 >> 2] | 0;
    i38 = i11;
    HEAP32[i38 >> 2] = HEAP32[i40 >> 2];
    HEAP32[i38 + 4 >> 2] = i41;
    i38 = i11 + 8 | 0;
    HEAP8[i38] = 0;
    i41 = i18 & 255;
    HEAP8[i38 + 1 | 0] = i41;
    HEAP8[i38 + 2 | 0] = 0;
    HEAP8[i38 + 3 | 0] = 1;
    i38 = i13;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i13 = i11 + 12 | 0;
    HEAP32[i13 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i13 + 4 >> 2] = i40;
    i13 = i11 + 20 | 0;
    HEAP8[i13] = 0;
    HEAP8[i13 + 1 | 0] = i41;
    HEAP8[i13 + 2 | 0] = 0;
    HEAP8[i13 + 3 | 0] = 1;
    HEAP32[i9 >> 2] = i18;
    i13 = i18 + 1 | 0;
    i16 = (i13 | 0) < (HEAP32[i34 >> 2] | 0) ? i13 : 0;
    HEAP32[i9 + 4 >> 2] = i16;
    i17 = i12 + (i18 << 3) | 0;
    i13 = HEAP32[i17 >> 2] | 0;
    i17 = HEAP32[i17 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i13;
    HEAP32[i29 + 4 >> 2] = i17;
    i16 = i12 + (i16 << 3) | 0;
    i29 = HEAP32[i16 >> 2] | 0;
    i16 = HEAP32[i16 + 4 >> 2] | 0;
    i20 = i9 + 16 | 0;
    HEAP32[i20 >> 2] = i29;
    HEAP32[i20 + 4 >> 2] = i16;
    i20 = i12 + (i18 << 3) + 64 | 0;
    i12 = HEAP32[i20 >> 2] | 0;
    i20 = HEAP32[i20 + 4 >> 2] | 0;
    i14 = i9 + 24 | 0;
    HEAP32[i14 >> 2] = i12;
    HEAP32[i14 + 4 >> 2] = i20;
    i14 = 0;
   }
  } else {
   i15 = 75;
  }
 } else {
  i15 = 75;
 }
 if ((i15 | 0) == 75) {
  i18 = i11;
  i35 = i2 + 56 | 0;
  i15 = 77;
 }
 do {
  if ((i15 | 0) == 77) {
   HEAP32[i35 >> 2] = 1;
   i15 = HEAP32[i34 >> 2] | 0;
   if ((i15 | 0) > 1) {
    d23 = +HEAPF32[i12 + 216 >> 2];
    d22 = +HEAPF32[i12 + 212 >> 2];
    i34 = 0;
    d24 = d22 * +HEAPF32[i12 + 64 >> 2] + d23 * +HEAPF32[i12 + 68 >> 2];
    i35 = 1;
    while (1) {
     d25 = d22 * +HEAPF32[i12 + (i35 << 3) + 64 >> 2] + d23 * +HEAPF32[i12 + (i35 << 3) + 68 >> 2];
     i20 = d25 < d24;
     i34 = i20 ? i35 : i34;
     i35 = i35 + 1 | 0;
     if ((i35 | 0) < (i15 | 0)) {
      d24 = i20 ? d25 : d24;
     } else {
      break;
     }
    }
   } else {
    i34 = 0;
   }
   i20 = i34 + 1 | 0;
   i40 = (i20 | 0) < (i15 | 0) ? i20 : 0;
   i41 = i12 + (i34 << 3) | 0;
   i38 = HEAP32[i41 + 4 >> 2] | 0;
   i35 = i11;
   HEAP32[i35 >> 2] = HEAP32[i41 >> 2];
   HEAP32[i35 + 4 >> 2] = i38;
   i35 = i11 + 8 | 0;
   HEAP8[i35] = 0;
   HEAP8[i35 + 1 | 0] = i34;
   HEAP8[i35 + 2 | 0] = 1;
   HEAP8[i35 + 3 | 0] = 0;
   i35 = i12 + (i40 << 3) | 0;
   i38 = HEAP32[i35 + 4 >> 2] | 0;
   i41 = i11 + 12 | 0;
   HEAP32[i41 >> 2] = HEAP32[i35 >> 2];
   HEAP32[i41 + 4 >> 2] = i38;
   i41 = i11 + 20 | 0;
   HEAP8[i41] = 0;
   HEAP8[i41 + 1 | 0] = i40;
   HEAP8[i41 + 2 | 0] = 1;
   HEAP8[i41 + 3 | 0] = 0;
   if ((HEAP8[i29] | 0) == 0) {
    HEAP32[i9 >> 2] = 1;
    HEAP32[i9 + 4 >> 2] = 0;
    i11 = i13;
    i13 = HEAP32[i11 >> 2] | 0;
    i11 = HEAP32[i11 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i13;
    HEAP32[i29 + 4 >> 2] = i11;
    i29 = HEAP32[i14 >> 2] | 0;
    i14 = HEAP32[i14 + 4 >> 2] | 0;
    i12 = i9 + 16 | 0;
    HEAP32[i12 >> 2] = i29;
    HEAP32[i12 + 4 >> 2] = i14;
    i12 = (HEAPF32[tempDoublePtr >> 2] = -+HEAPF32[i16 >> 2], HEAP32[tempDoublePtr >> 2] | 0);
    i20 = (HEAPF32[tempDoublePtr >> 2] = -+HEAPF32[i17 >> 2], HEAP32[tempDoublePtr >> 2] | 0);
    i16 = i9 + 24 | 0;
    HEAP32[i16 >> 2] = i12;
    HEAP32[i16 + 4 >> 2] = i20;
    i16 = i14;
    i17 = i11;
    i11 = i18;
    i18 = 1;
    i14 = 1;
    break;
   } else {
    HEAP32[i9 >> 2] = 0;
    HEAP32[i9 + 4 >> 2] = 1;
    i17 = i14;
    i11 = HEAP32[i17 >> 2] | 0;
    i17 = HEAP32[i17 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i11;
    HEAP32[i29 + 4 >> 2] = i17;
    i29 = HEAP32[i13 >> 2] | 0;
    i13 = HEAP32[i13 + 4 >> 2] | 0;
    i20 = i9 + 16 | 0;
    HEAP32[i20 >> 2] = i29;
    HEAP32[i20 + 4 >> 2] = i13;
    i20 = i16;
    i12 = HEAP32[i20 >> 2] | 0;
    i20 = HEAP32[i20 + 4 >> 2] | 0;
    i16 = i9 + 24 | 0;
    HEAP32[i16 >> 2] = i12;
    HEAP32[i16 + 4 >> 2] = i20;
    i16 = i13;
    i13 = i11;
    i11 = i18;
    i18 = 0;
    i14 = 1;
    break;
   }
  }
 } while (0);
 d30 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]);
 d39 = (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]);
 d31 = (HEAP32[tempDoublePtr >> 2] = i13, +HEAPF32[tempDoublePtr >> 2]);
 d32 = (HEAP32[tempDoublePtr >> 2] = i17, +HEAPF32[tempDoublePtr >> 2]);
 d33 = (HEAP32[tempDoublePtr >> 2] = i29, +HEAPF32[tempDoublePtr >> 2]);
 d37 = (HEAP32[tempDoublePtr >> 2] = i16, +HEAPF32[tempDoublePtr >> 2]);
 i41 = i9 + 32 | 0;
 i16 = i9 + 24 | 0;
 i13 = i9 + 28 | 0;
 d39 = -d39;
 HEAPF32[i41 >> 2] = d30;
 HEAPF32[i9 + 36 >> 2] = d39;
 i20 = i9 + 44 | 0;
 d36 = -d30;
 i17 = i20;
 HEAPF32[i17 >> 2] = d36;
 HEAP32[i17 + 4 >> 2] = i12;
 i17 = i9 + 8 | 0;
 i15 = i9 + 12 | 0;
 d39 = d30 * d31 + d32 * d39;
 HEAPF32[i9 + 40 >> 2] = d39;
 i29 = i9 + 52 | 0;
 HEAPF32[i29 >> 2] = d33 * d36 + (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]) * d37;
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i10, i11, i41, d39, i18) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i3, i10, i20, +HEAPF32[i29 >> 2], HEAP32[i9 + 4 >> 2] | 0) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 i10 = i2 + 40 | 0;
 if (i14) {
  i40 = i16;
  i41 = HEAP32[i40 >> 2] | 0;
  i40 = HEAP32[i40 + 4 >> 2] | 0;
  i35 = i10;
  HEAP32[i35 >> 2] = i41;
  HEAP32[i35 + 4 >> 2] = i40;
  i35 = i17;
  i40 = HEAP32[i35 >> 2] | 0;
  i35 = HEAP32[i35 + 4 >> 2] | 0;
  i38 = i2 + 48 | 0;
  HEAP32[i38 >> 2] = i40;
  HEAP32[i38 + 4 >> 2] = i35;
  d23 = (HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
  d22 = (HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
  d24 = +HEAPF32[i15 >> 2];
  d25 = +HEAPF32[i13 >> 2];
  d28 = +HEAPF32[i3 >> 2];
  d27 = +HEAPF32[i3 + 4 >> 2];
  d26 = +HEAPF32[i21 >> 2];
  if (!((d28 - d23) * d22 + (d27 - d24) * d25 <= d26)) {
   d28 = d26;
   i8 = 0;
  } else {
   d37 = d28 - +HEAPF32[i4 >> 2];
   d36 = d27 - +HEAPF32[i6 >> 2];
   d33 = +HEAPF32[i5 >> 2];
   d28 = +HEAPF32[i7 >> 2];
   d39 = +(d37 * d33 + d36 * d28);
   d28 = +(d33 * d36 - d37 * d28);
   i8 = i2;
   HEAPF32[i8 >> 2] = d39;
   HEAPF32[i8 + 4 >> 2] = d28;
   HEAP32[i2 + 16 >> 2] = HEAP32[i3 + 8 >> 2];
   d28 = +HEAPF32[i21 >> 2];
   i8 = 1;
  }
  d26 = +HEAPF32[i3 + 12 >> 2];
  d27 = +HEAPF32[i3 + 16 >> 2];
  if ((d26 - d23) * d22 + (d27 - d24) * d25 <= d28) {
   d36 = d26 - +HEAPF32[i4 >> 2];
   d33 = d27 - +HEAPF32[i6 >> 2];
   d32 = +HEAPF32[i5 >> 2];
   d39 = +HEAPF32[i7 >> 2];
   d37 = +(d36 * d32 + d33 * d39);
   d39 = +(d32 * d33 - d36 * d39);
   i41 = i2 + (i8 * 20 | 0) | 0;
   HEAPF32[i41 >> 2] = d37;
   HEAPF32[i41 + 4 >> 2] = d39;
   HEAP32[i2 + (i8 * 20 | 0) + 16 >> 2] = HEAP32[i3 + 20 >> 2];
   i8 = i8 + 1 | 0;
  }
 } else {
  i38 = HEAP32[i9 >> 2] | 0;
  i35 = i8 + (i38 << 3) + 84 | 0;
  i41 = HEAP32[i35 + 4 >> 2] | 0;
  i40 = i10;
  HEAP32[i40 >> 2] = HEAP32[i35 >> 2];
  HEAP32[i40 + 4 >> 2] = i41;
  i38 = i8 + (i38 << 3) + 20 | 0;
  i40 = HEAP32[i38 + 4 >> 2] | 0;
  i41 = i2 + 48 | 0;
  HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
  HEAP32[i41 + 4 >> 2] = i40;
  d22 = +HEAPF32[i17 >> 2];
  d23 = +HEAPF32[i16 >> 2];
  d24 = +HEAPF32[i15 >> 2];
  d25 = +HEAPF32[i13 >> 2];
  d26 = +HEAPF32[i21 >> 2];
  if (!((+HEAPF32[i3 >> 2] - d22) * d23 + (+HEAPF32[i3 + 4 >> 2] - d24) * d25 <= d26)) {
   i8 = 0;
  } else {
   i40 = i3;
   i8 = HEAP32[i40 + 4 >> 2] | 0;
   i41 = i2;
   HEAP32[i41 >> 2] = HEAP32[i40 >> 2];
   HEAP32[i41 + 4 >> 2] = i8;
   i41 = i3 + 8 | 0;
   i8 = i2 + 16 | 0;
   HEAP8[i8 + 2 | 0] = HEAP8[i41 + 3 | 0] | 0;
   HEAP8[i8 + 3 | 0] = HEAP8[i41 + 2 | 0] | 0;
   HEAP8[i8] = HEAP8[i41 + 1 | 0] | 0;
   HEAP8[i8 + 1 | 0] = HEAP8[i41] | 0;
   d26 = +HEAPF32[i21 >> 2];
   i8 = 1;
  }
  i4 = i3 + 12 | 0;
  if ((+HEAPF32[i4 >> 2] - d22) * d23 + (+HEAPF32[i3 + 16 >> 2] - d24) * d25 <= d26) {
   i38 = i4;
   i41 = HEAP32[i38 + 4 >> 2] | 0;
   i40 = i2 + (i8 * 20 | 0) | 0;
   HEAP32[i40 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i40 + 4 >> 2] = i41;
   i40 = i3 + 20 | 0;
   i41 = i2 + (i8 * 20 | 0) + 16 | 0;
   HEAP8[i41 + 2 | 0] = HEAP8[i40 + 3 | 0] | 0;
   HEAP8[i41 + 3 | 0] = HEAP8[i40 + 2 | 0] | 0;
   HEAP8[i41] = HEAP8[i40 + 1 | 0] | 0;
   HEAP8[i41 + 1 | 0] = HEAP8[i40] | 0;
   i8 = i8 + 1 | 0;
  }
 }
 HEAP32[i19 >> 2] = i8;
 STACKTOP = i1;
 return;
}
function __ZN7b2World8SolveTOIERK10b2TimeStep(i30, i11) {
 i30 = i30 | 0;
 i11 = i11 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 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, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, i39 = 0, i40 = 0, i41 = 0, d42 = 0.0, i43 = 0, i44 = 0, i45 = 0, i46 = 0, i47 = 0, i48 = 0, i49 = 0, i50 = 0, i51 = 0, i52 = 0, i53 = 0, i54 = 0, i55 = 0, i56 = 0, i57 = 0, i58 = 0, i59 = 0, i60 = 0, i61 = 0, i62 = 0, i63 = 0, i64 = 0, i65 = 0, i66 = 0, d67 = 0.0, d68 = 0.0, d69 = 0.0, d70 = 0.0, d71 = 0.0, d72 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 336 | 0;
 i3 = i1 + 284 | 0;
 i6 = i1 + 152 | 0;
 i5 = i1 + 144 | 0;
 i4 = i1 + 108 | 0;
 i8 = i1 + 72 | 0;
 i7 = i1 + 64 | 0;
 i14 = i1 + 24 | 0;
 i9 = i1;
 i10 = i30 + 102872 | 0;
 i13 = i30 + 102944 | 0;
 __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i3, 64, 32, 0, i30 + 68 | 0, HEAP32[i13 >> 2] | 0);
 i2 = i30 + 102995 | 0;
 if ((HEAP8[i2] | 0) != 0) {
  i15 = HEAP32[i30 + 102952 >> 2] | 0;
  if ((i15 | 0) != 0) {
   do {
    i66 = i15 + 4 | 0;
    HEAP16[i66 >> 1] = HEAP16[i66 >> 1] & 65534;
    HEAPF32[i15 + 60 >> 2] = 0.0;
    i15 = HEAP32[i15 + 96 >> 2] | 0;
   } while ((i15 | 0) != 0);
  }
  i15 = i30 + 102932 | 0;
  i16 = HEAP32[i15 >> 2] | 0;
  if ((i16 | 0) != 0) {
   do {
    i66 = i16 + 4 | 0;
    HEAP32[i66 >> 2] = HEAP32[i66 >> 2] & -34;
    HEAP32[i16 + 128 >> 2] = 0;
    HEAPF32[i16 + 132 >> 2] = 1.0;
    i16 = HEAP32[i16 + 12 >> 2] | 0;
   } while ((i16 | 0) != 0);
  }
 } else {
  i15 = i30 + 102932 | 0;
 }
 i25 = i3 + 28 | 0;
 i26 = i3 + 36 | 0;
 i27 = i3 + 32 | 0;
 i28 = i3 + 40 | 0;
 i29 = i3 + 8 | 0;
 i24 = i3 + 44 | 0;
 i23 = i3 + 12 | 0;
 i22 = i7 + 4 | 0;
 i21 = i9 + 4 | 0;
 i20 = i9 + 8 | 0;
 i19 = i9 + 16 | 0;
 i18 = i11 + 12 | 0;
 i17 = i9 + 12 | 0;
 i16 = i9 + 20 | 0;
 i39 = i30 + 102994 | 0;
 i37 = i6 + 16 | 0;
 i36 = i6 + 20 | 0;
 i35 = i6 + 24 | 0;
 i34 = i6 + 44 | 0;
 i33 = i6 + 48 | 0;
 i32 = i6 + 52 | 0;
 i41 = i6 + 28 | 0;
 i31 = i6 + 56 | 0;
 i40 = i6 + 92 | 0;
 i30 = i6 + 128 | 0;
 i38 = i5 + 4 | 0;
 L11 : while (1) {
  i47 = HEAP32[i15 >> 2] | 0;
  if ((i47 | 0) == 0) {
   i4 = 36;
   break;
  } else {
   d42 = 1.0;
   i44 = 0;
  }
  do {
   i48 = i47 + 4 | 0;
   i43 = HEAP32[i48 >> 2] | 0;
   do {
    if ((i43 & 4 | 0) != 0 ? (HEAP32[i47 + 128 >> 2] | 0) <= 8 : 0) {
     if ((i43 & 32 | 0) == 0) {
      i43 = HEAP32[i47 + 48 >> 2] | 0;
      i45 = HEAP32[i47 + 52 >> 2] | 0;
      if ((HEAP8[i43 + 38 | 0] | 0) != 0) {
       break;
      }
      if ((HEAP8[i45 + 38 | 0] | 0) != 0) {
       break;
      }
      i46 = HEAP32[i43 + 8 >> 2] | 0;
      i50 = HEAP32[i45 + 8 >> 2] | 0;
      i53 = HEAP32[i46 >> 2] | 0;
      i52 = HEAP32[i50 >> 2] | 0;
      if (!((i53 | 0) == 2 | (i52 | 0) == 2)) {
       i4 = 16;
       break L11;
      }
      i51 = HEAP16[i46 + 4 >> 1] | 0;
      i49 = HEAP16[i50 + 4 >> 1] | 0;
      if (!((i51 & 2) != 0 & (i53 | 0) != 0 | (i49 & 2) != 0 & (i52 | 0) != 0)) {
       break;
      }
      if (!((i51 & 8) != 0 | (i53 | 0) != 2 | ((i49 & 8) != 0 | (i52 | 0) != 2))) {
       break;
      }
      i51 = i46 + 28 | 0;
      i52 = i46 + 60 | 0;
      d68 = +HEAPF32[i52 >> 2];
      i49 = i50 + 28 | 0;
      i53 = i50 + 60 | 0;
      d67 = +HEAPF32[i53 >> 2];
      if (!(d68 < d67)) {
       if (d67 < d68) {
        if (!(d67 < 1.0)) {
         i4 = 25;
         break L11;
        }
        d67 = (d68 - d67) / (1.0 - d67);
        i66 = i50 + 36 | 0;
        d69 = 1.0 - d67;
        d71 = +(+HEAPF32[i66 >> 2] * d69 + d67 * +HEAPF32[i50 + 44 >> 2]);
        d70 = +(d69 * +HEAPF32[i50 + 40 >> 2] + d67 * +HEAPF32[i50 + 48 >> 2]);
        HEAPF32[i66 >> 2] = d71;
        HEAPF32[i66 + 4 >> 2] = d70;
        i66 = i50 + 52 | 0;
        HEAPF32[i66 >> 2] = d69 * +HEAPF32[i66 >> 2] + d67 * +HEAPF32[i50 + 56 >> 2];
        HEAPF32[i53 >> 2] = d68;
        d67 = d68;
       } else {
        d67 = d68;
       }
      } else {
       if (!(d68 < 1.0)) {
        i4 = 21;
        break L11;
       }
       d71 = (d67 - d68) / (1.0 - d68);
       i66 = i46 + 36 | 0;
       d70 = 1.0 - d71;
       d68 = +(+HEAPF32[i66 >> 2] * d70 + d71 * +HEAPF32[i46 + 44 >> 2]);
       d69 = +(d70 * +HEAPF32[i46 + 40 >> 2] + d71 * +HEAPF32[i46 + 48 >> 2]);
       HEAPF32[i66 >> 2] = d68;
       HEAPF32[i66 + 4 >> 2] = d69;
       i66 = i46 + 52 | 0;
       HEAPF32[i66 >> 2] = d70 * +HEAPF32[i66 >> 2] + d71 * +HEAPF32[i46 + 56 >> 2];
       HEAPF32[i52 >> 2] = d67;
      }
      if (!(d67 < 1.0)) {
       i4 = 28;
       break L11;
      }
      i66 = HEAP32[i47 + 56 >> 2] | 0;
      i46 = HEAP32[i47 + 60 >> 2] | 0;
      HEAP32[i37 >> 2] = 0;
      HEAP32[i36 >> 2] = 0;
      HEAPF32[i35 >> 2] = 0.0;
      HEAP32[i34 >> 2] = 0;
      HEAP32[i33 >> 2] = 0;
      HEAPF32[i32 >> 2] = 0.0;
      __ZN15b2DistanceProxy3SetEPK7b2Shapei(i6, HEAP32[i43 + 12 >> 2] | 0, i66);
      __ZN15b2DistanceProxy3SetEPK7b2Shapei(i41, HEAP32[i45 + 12 >> 2] | 0, i46);
      i43 = i31 + 0 | 0;
      i45 = i51 + 0 | 0;
      i46 = i43 + 36 | 0;
      do {
       HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
       i43 = i43 + 4 | 0;
       i45 = i45 + 4 | 0;
      } while ((i43 | 0) < (i46 | 0));
      i43 = i40 + 0 | 0;
      i45 = i49 + 0 | 0;
      i46 = i43 + 36 | 0;
      do {
       HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
       i43 = i43 + 4 | 0;
       i45 = i45 + 4 | 0;
      } while ((i43 | 0) < (i46 | 0));
      HEAPF32[i30 >> 2] = 1.0;
      __Z14b2TimeOfImpactP11b2TOIOutputPK10b2TOIInput(i5, i6);
      if ((HEAP32[i5 >> 2] | 0) == 3) {
       d67 = d67 + (1.0 - d67) * +HEAPF32[i38 >> 2];
       d67 = d67 < 1.0 ? d67 : 1.0;
      } else {
       d67 = 1.0;
      }
      HEAPF32[i47 + 132 >> 2] = d67;
      HEAP32[i48 >> 2] = HEAP32[i48 >> 2] | 32;
     } else {
      d67 = +HEAPF32[i47 + 132 >> 2];
     }
     if (d67 < d42) {
      d42 = d67;
      i44 = i47;
     }
    }
   } while (0);
   i47 = HEAP32[i47 + 12 >> 2] | 0;
  } while ((i47 | 0) != 0);
  if ((i44 | 0) == 0 | d42 > .9999988079071045) {
   i4 = 36;
   break;
  }
  i47 = HEAP32[(HEAP32[i44 + 48 >> 2] | 0) + 8 >> 2] | 0;
  i48 = HEAP32[(HEAP32[i44 + 52 >> 2] | 0) + 8 >> 2] | 0;
  i49 = i47 + 28 | 0;
  i43 = i4 + 0 | 0;
  i45 = i49 + 0 | 0;
  i46 = i43 + 36 | 0;
  do {
   HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
   i43 = i43 + 4 | 0;
   i45 = i45 + 4 | 0;
  } while ((i43 | 0) < (i46 | 0));
  i50 = i48 + 28 | 0;
  i43 = i8 + 0 | 0;
  i45 = i50 + 0 | 0;
  i46 = i43 + 36 | 0;
  do {
   HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
   i43 = i43 + 4 | 0;
   i45 = i45 + 4 | 0;
  } while ((i43 | 0) < (i46 | 0));
  i43 = i47 + 60 | 0;
  d67 = +HEAPF32[i43 >> 2];
  if (!(d67 < 1.0)) {
   i4 = 38;
   break;
  }
  d70 = (d42 - d67) / (1.0 - d67);
  i57 = i47 + 36 | 0;
  d67 = 1.0 - d70;
  i52 = i47 + 44 | 0;
  i53 = i47 + 48 | 0;
  d71 = +HEAPF32[i57 >> 2] * d67 + d70 * +HEAPF32[i52 >> 2];
  d72 = d67 * +HEAPF32[i47 + 40 >> 2] + d70 * +HEAPF32[i53 >> 2];
  d69 = +d71;
  d68 = +d72;
  HEAPF32[i57 >> 2] = d69;
  HEAPF32[i57 + 4 >> 2] = d68;
  i57 = i47 + 52 | 0;
  i51 = i47 + 56 | 0;
  d70 = d67 * +HEAPF32[i57 >> 2] + d70 * +HEAPF32[i51 >> 2];
  HEAPF32[i57 >> 2] = d70;
  HEAPF32[i43 >> 2] = d42;
  i57 = i47 + 44 | 0;
  HEAPF32[i57 >> 2] = d69;
  HEAPF32[i57 + 4 >> 2] = d68;
  HEAPF32[i51 >> 2] = d70;
  d68 = +Math_sin(+d70);
  i57 = i47 + 20 | 0;
  HEAPF32[i57 >> 2] = d68;
  d70 = +Math_cos(+d70);
  i56 = i47 + 24 | 0;
  HEAPF32[i56 >> 2] = d70;
  i58 = i47 + 12 | 0;
  i55 = i47 + 28 | 0;
  d69 = +HEAPF32[i55 >> 2];
  i54 = i47 + 32 | 0;
  d67 = +HEAPF32[i54 >> 2];
  d71 = +(d71 - (d70 * d69 - d68 * d67));
  d67 = +(d72 - (d68 * d69 + d70 * d67));
  i43 = i58;
  HEAPF32[i43 >> 2] = d71;
  HEAPF32[i43 + 4 >> 2] = d67;
  i43 = i48 + 60 | 0;
  d67 = +HEAPF32[i43 >> 2];
  if (!(d67 < 1.0)) {
   i4 = 40;
   break;
  }
  d70 = (d42 - d67) / (1.0 - d67);
  i64 = i48 + 36 | 0;
  d72 = 1.0 - d70;
  i61 = i48 + 44 | 0;
  i60 = i48 + 48 | 0;
  d71 = +HEAPF32[i64 >> 2] * d72 + d70 * +HEAPF32[i61 >> 2];
  d67 = d72 * +HEAPF32[i48 + 40 >> 2] + d70 * +HEAPF32[i60 >> 2];
  d69 = +d71;
  d68 = +d67;
  HEAPF32[i64 >> 2] = d69;
  HEAPF32[i64 + 4 >> 2] = d68;
  i64 = i48 + 52 | 0;
  i59 = i48 + 56 | 0;
  d70 = d72 * +HEAPF32[i64 >> 2] + d70 * +HEAPF32[i59 >> 2];
  HEAPF32[i64 >> 2] = d70;
  HEAPF32[i43 >> 2] = d42;
  i64 = i48 + 44 | 0;
  HEAPF32[i64 >> 2] = d69;
  HEAPF32[i64 + 4 >> 2] = d68;
  HEAPF32[i59 >> 2] = d70;
  d68 = +Math_sin(+d70);
  i64 = i48 + 20 | 0;
  HEAPF32[i64 >> 2] = d68;
  d70 = +Math_cos(+d70);
  i63 = i48 + 24 | 0;
  HEAPF32[i63 >> 2] = d70;
  i65 = i48 + 12 | 0;
  i62 = i48 + 28 | 0;
  d69 = +HEAPF32[i62 >> 2];
  i66 = i48 + 32 | 0;
  d72 = +HEAPF32[i66 >> 2];
  d71 = +(d71 - (d70 * d69 - d68 * d72));
  d72 = +(d67 - (d68 * d69 + d70 * d72));
  i43 = i65;
  HEAPF32[i43 >> 2] = d71;
  HEAPF32[i43 + 4 >> 2] = d72;
  __ZN9b2Contact6UpdateEP17b2ContactListener(i44, HEAP32[i13 >> 2] | 0);
  i43 = i44 + 4 | 0;
  i45 = HEAP32[i43 >> 2] | 0;
  HEAP32[i43 >> 2] = i45 & -33;
  i46 = i44 + 128 | 0;
  HEAP32[i46 >> 2] = (HEAP32[i46 >> 2] | 0) + 1;
  if ((i45 & 6 | 0) != 6) {
   HEAP32[i43 >> 2] = i45 & -37;
   i43 = i49 + 0 | 0;
   i45 = i4 + 0 | 0;
   i46 = i43 + 36 | 0;
   do {
    HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
    i43 = i43 + 4 | 0;
    i45 = i45 + 4 | 0;
   } while ((i43 | 0) < (i46 | 0));
   i43 = i50 + 0 | 0;
   i45 = i8 + 0 | 0;
   i46 = i43 + 36 | 0;
   do {
    HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
    i43 = i43 + 4 | 0;
    i45 = i45 + 4 | 0;
   } while ((i43 | 0) < (i46 | 0));
   d69 = +HEAPF32[i51 >> 2];
   d71 = +Math_sin(+d69);
   HEAPF32[i57 >> 2] = d71;
   d69 = +Math_cos(+d69);
   HEAPF32[i56 >> 2] = d69;
   d72 = +HEAPF32[i55 >> 2];
   d70 = +HEAPF32[i54 >> 2];
   d68 = +(+HEAPF32[i52 >> 2] - (d69 * d72 - d71 * d70));
   d70 = +(+HEAPF32[i53 >> 2] - (d71 * d72 + d69 * d70));
   HEAPF32[i58 >> 2] = d68;
   HEAPF32[i58 + 4 >> 2] = d70;
   d70 = +HEAPF32[i59 >> 2];
   d68 = +Math_sin(+d70);
   HEAPF32[i64 >> 2] = d68;
   d70 = +Math_cos(+d70);
   HEAPF32[i63 >> 2] = d70;
   d69 = +HEAPF32[i62 >> 2];
   d72 = +HEAPF32[i66 >> 2];
   d71 = +(+HEAPF32[i61 >> 2] - (d70 * d69 - d68 * d72));
   d72 = +(+HEAPF32[i60 >> 2] - (d68 * d69 + d70 * d72));
   i66 = i65;
   HEAPF32[i66 >> 2] = d71;
   HEAPF32[i66 + 4 >> 2] = d72;
   continue;
  }
  i45 = i47 + 4 | 0;
  i46 = HEAPU16[i45 >> 1] | 0;
  if ((i46 & 2 | 0) == 0) {
   HEAP16[i45 >> 1] = i46 | 2;
   HEAPF32[i47 + 144 >> 2] = 0.0;
  }
  i46 = i48 + 4 | 0;
  i49 = HEAPU16[i46 >> 1] | 0;
  if ((i49 & 2 | 0) == 0) {
   HEAP16[i46 >> 1] = i49 | 2;
   HEAPF32[i48 + 144 >> 2] = 0.0;
  }
  HEAP32[i25 >> 2] = 0;
  HEAP32[i26 >> 2] = 0;
  HEAP32[i27 >> 2] = 0;
  if ((HEAP32[i28 >> 2] | 0) <= 0) {
   i4 = 48;
   break;
  }
  i49 = i47 + 8 | 0;
  HEAP32[i49 >> 2] = 0;
  i51 = HEAP32[i25 >> 2] | 0;
  HEAP32[(HEAP32[i29 >> 2] | 0) + (i51 << 2) >> 2] = i47;
  i51 = i51 + 1 | 0;
  HEAP32[i25 >> 2] = i51;
  if ((i51 | 0) >= (HEAP32[i28 >> 2] | 0)) {
   i4 = 50;
   break;
  }
  i50 = i48 + 8 | 0;
  HEAP32[i50 >> 2] = i51;
  i51 = HEAP32[i25 >> 2] | 0;
  HEAP32[(HEAP32[i29 >> 2] | 0) + (i51 << 2) >> 2] = i48;
  HEAP32[i25 >> 2] = i51 + 1;
  i51 = HEAP32[i26 >> 2] | 0;
  if ((i51 | 0) >= (HEAP32[i24 >> 2] | 0)) {
   i4 = 52;
   break;
  }
  HEAP32[i26 >> 2] = i51 + 1;
  HEAP32[(HEAP32[i23 >> 2] | 0) + (i51 << 2) >> 2] = i44;
  HEAP16[i45 >> 1] = HEAPU16[i45 >> 1] | 1;
  HEAP16[i46 >> 1] = HEAPU16[i46 >> 1] | 1;
  HEAP32[i43 >> 2] = HEAP32[i43 >> 2] | 1;
  HEAP32[i7 >> 2] = i47;
  HEAP32[i22 >> 2] = i48;
  i44 = 1;
  while (1) {
   L58 : do {
    if ((HEAP32[i47 >> 2] | 0) == 2 ? (i12 = HEAP32[i47 + 112 >> 2] | 0, (i12 | 0) != 0) : 0) {
     i47 = i47 + 4 | 0;
     i51 = i12;
     do {
      if ((HEAP32[i25 >> 2] | 0) == (HEAP32[i28 >> 2] | 0)) {
       break L58;
      }
      if ((HEAP32[i26 >> 2] | 0) == (HEAP32[i24 >> 2] | 0)) {
       break L58;
      }
      i52 = HEAP32[i51 + 4 >> 2] | 0;
      i53 = i52 + 4 | 0;
      do {
       if ((HEAP32[i53 >> 2] & 1 | 0) == 0) {
        i48 = HEAP32[i51 >> 2] | 0;
        if (((HEAP32[i48 >> 2] | 0) == 2 ? (HEAP16[i47 >> 1] & 8) == 0 : 0) ? (HEAP16[i48 + 4 >> 1] & 8) == 0 : 0) {
         break;
        }
        if ((HEAP8[(HEAP32[i52 + 48 >> 2] | 0) + 38 | 0] | 0) == 0 ? (HEAP8[(HEAP32[i52 + 52 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) {
         i54 = i48 + 28 | 0;
         i43 = i14 + 0 | 0;
         i45 = i54 + 0 | 0;
         i46 = i43 + 36 | 0;
         do {
          HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
          i43 = i43 + 4 | 0;
          i45 = i45 + 4 | 0;
         } while ((i43 | 0) < (i46 | 0));
         i43 = i48 + 4 | 0;
         if ((HEAP16[i43 >> 1] & 1) == 0) {
          i45 = i48 + 60 | 0;
          d67 = +HEAPF32[i45 >> 2];
          if (!(d67 < 1.0)) {
           i4 = 67;
           break L11;
          }
          d70 = (d42 - d67) / (1.0 - d67);
          i65 = i48 + 36 | 0;
          d72 = 1.0 - d70;
          d71 = +HEAPF32[i65 >> 2] * d72 + d70 * +HEAPF32[i48 + 44 >> 2];
          d67 = d72 * +HEAPF32[i48 + 40 >> 2] + d70 * +HEAPF32[i48 + 48 >> 2];
          d69 = +d71;
          d68 = +d67;
          HEAPF32[i65 >> 2] = d69;
          HEAPF32[i65 + 4 >> 2] = d68;
          i65 = i48 + 52 | 0;
          i66 = i48 + 56 | 0;
          d70 = d72 * +HEAPF32[i65 >> 2] + d70 * +HEAPF32[i66 >> 2];
          HEAPF32[i65 >> 2] = d70;
          HEAPF32[i45 >> 2] = d42;
          i65 = i48 + 44 | 0;
          HEAPF32[i65 >> 2] = d69;
          HEAPF32[i65 + 4 >> 2] = d68;
          HEAPF32[i66 >> 2] = d70;
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(d71 - (d70 * d69 - d68 * d72));
          d72 = +(d67 - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
         }
         __ZN9b2Contact6UpdateEP17b2ContactListener(i52, HEAP32[i13 >> 2] | 0);
         i45 = HEAP32[i53 >> 2] | 0;
         if ((i45 & 4 | 0) == 0) {
          i43 = i54 + 0 | 0;
          i45 = i14 + 0 | 0;
          i46 = i43 + 36 | 0;
          do {
           HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
           i43 = i43 + 4 | 0;
           i45 = i45 + 4 | 0;
          } while ((i43 | 0) < (i46 | 0));
          d70 = +HEAPF32[i48 + 56 >> 2];
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(+HEAPF32[i48 + 44 >> 2] - (d70 * d69 - d68 * d72));
          d72 = +(+HEAPF32[i48 + 48 >> 2] - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
          break;
         }
         if ((i45 & 2 | 0) == 0) {
          i43 = i54 + 0 | 0;
          i45 = i14 + 0 | 0;
          i46 = i43 + 36 | 0;
          do {
           HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
           i43 = i43 + 4 | 0;
           i45 = i45 + 4 | 0;
          } while ((i43 | 0) < (i46 | 0));
          d70 = +HEAPF32[i48 + 56 >> 2];
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(+HEAPF32[i48 + 44 >> 2] - (d70 * d69 - d68 * d72));
          d72 = +(+HEAPF32[i48 + 48 >> 2] - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
          break;
         }
         HEAP32[i53 >> 2] = i45 | 1;
         i45 = HEAP32[i26 >> 2] | 0;
         if ((i45 | 0) >= (HEAP32[i24 >> 2] | 0)) {
          i4 = 74;
          break L11;
         }
         HEAP32[i26 >> 2] = i45 + 1;
         HEAP32[(HEAP32[i23 >> 2] | 0) + (i45 << 2) >> 2] = i52;
         i45 = HEAPU16[i43 >> 1] | 0;
         if ((i45 & 1 | 0) == 0) {
          HEAP16[i43 >> 1] = i45 | 1;
          if ((HEAP32[i48 >> 2] | 0) != 0 ? (i45 & 2 | 0) == 0 : 0) {
           HEAP16[i43 >> 1] = i45 | 3;
           HEAPF32[i48 + 144 >> 2] = 0.0;
          }
          i43 = HEAP32[i25 >> 2] | 0;
          if ((i43 | 0) >= (HEAP32[i28 >> 2] | 0)) {
           i4 = 80;
           break L11;
          }
          HEAP32[i48 + 8 >> 2] = i43;
          i66 = HEAP32[i25 >> 2] | 0;
          HEAP32[(HEAP32[i29 >> 2] | 0) + (i66 << 2) >> 2] = i48;
          HEAP32[i25 >> 2] = i66 + 1;
         }
        }
       }
      } while (0);
      i51 = HEAP32[i51 + 12 >> 2] | 0;
     } while ((i51 | 0) != 0);
    }
   } while (0);
   if ((i44 | 0) >= 2) {
    break;
   }
   i47 = HEAP32[i7 + (i44 << 2) >> 2] | 0;
   i44 = i44 + 1 | 0;
  }
  d72 = (1.0 - d42) * +HEAPF32[i11 >> 2];
  HEAPF32[i9 >> 2] = d72;
  HEAPF32[i21 >> 2] = 1.0 / d72;
  HEAPF32[i20 >> 2] = 1.0;
  HEAP32[i19 >> 2] = 20;
  HEAP32[i17 >> 2] = HEAP32[i18 >> 2];
  HEAP8[i16] = 0;
  __ZN8b2Island8SolveTOIERK10b2TimeStepii(i3, i9, HEAP32[i49 >> 2] | 0, HEAP32[i50 >> 2] | 0);
  i44 = HEAP32[i25 >> 2] | 0;
  if ((i44 | 0) > 0) {
   i43 = 0;
   do {
    i45 = HEAP32[(HEAP32[i29 >> 2] | 0) + (i43 << 2) >> 2] | 0;
    i66 = i45 + 4 | 0;
    HEAP16[i66 >> 1] = HEAP16[i66 >> 1] & 65534;
    if ((HEAP32[i45 >> 2] | 0) == 2) {
     __ZN6b2Body19SynchronizeFixturesEv(i45);
     i44 = HEAP32[i45 + 112 >> 2] | 0;
     if ((i44 | 0) != 0) {
      do {
       i66 = (HEAP32[i44 + 4 >> 2] | 0) + 4 | 0;
       HEAP32[i66 >> 2] = HEAP32[i66 >> 2] & -34;
       i44 = HEAP32[i44 + 12 >> 2] | 0;
      } while ((i44 | 0) != 0);
     }
     i44 = HEAP32[i25 >> 2] | 0;
    }
    i43 = i43 + 1 | 0;
   } while ((i43 | 0) < (i44 | 0));
  }
  __ZN16b2ContactManager15FindNewContactsEv(i10);
  if ((HEAP8[i39] | 0) != 0) {
   i4 = 92;
   break;
  }
 }
 if ((i4 | 0) == 16) {
  ___assert_fail(2288, 2184, 641, 2344);
 } else if ((i4 | 0) == 21) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 25) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 28) {
  ___assert_fail(2360, 2184, 676, 2344);
 } else if ((i4 | 0) == 36) {
  HEAP8[i2] = 1;
  __ZN8b2IslandD2Ev(i3);
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 38) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 40) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 48) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 50) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 52) {
  ___assert_fail(2480, 2440, 62, 2472);
 } else if ((i4 | 0) == 67) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 74) {
  ___assert_fail(2480, 2440, 62, 2472);
 } else if ((i4 | 0) == 80) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 92) {
  HEAP8[i2] = 0;
  __ZN8b2IslandD2Ev(i3);
  STACKTOP = i1;
  return;
 }
}
function __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i8, i1) {
 i5 = i5 | 0;
 i8 = i8 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i3;
 L1 : while (1) {
  i7 = i8;
  i4 = i8 + -12 | 0;
  L3 : while (1) {
   i9 = i5;
   i11 = i7 - i9 | 0;
   switch ((i11 | 0) / 12 | 0 | 0) {
   case 4:
    {
     i6 = 14;
     break L1;
    }
   case 2:
    {
     i6 = 4;
     break L1;
    }
   case 3:
    {
     i6 = 6;
     break L1;
    }
   case 5:
    {
     i6 = 15;
     break L1;
    }
   case 1:
   case 0:
    {
     i6 = 67;
     break L1;
    }
   default:
    {}
   }
   if ((i11 | 0) < 372) {
    i6 = 21;
    break L1;
   }
   i12 = (i11 | 0) / 24 | 0;
   i10 = i5 + (i12 * 12 | 0) | 0;
   do {
    if ((i11 | 0) > 11988) {
     i14 = (i11 | 0) / 48 | 0;
     i11 = i5 + (i14 * 12 | 0) | 0;
     i14 = i5 + ((i14 + i12 | 0) * 12 | 0) | 0;
     i12 = __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i11, i10, i14, i1) | 0;
     if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i14) | 0) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
      HEAP32[i14 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i14 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i14 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i13 = i12 + 1 | 0;
      if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i14, i10) | 0) {
       HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
       HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
       HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
       HEAP32[i10 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
       HEAP32[i10 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
       HEAP32[i10 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
       HEAP32[i14 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
       HEAP32[i14 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
       HEAP32[i14 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
       i13 = i12 + 2 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i11) | 0) {
        HEAP32[i2 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
        HEAP32[i2 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
        HEAP32[i2 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
        HEAP32[i11 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
        HEAP32[i11 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
        HEAP32[i11 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
        HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
        HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
        HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
        if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i11, i5) | 0) {
         HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
         HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
         HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
         HEAP32[i5 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
         HEAP32[i5 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
         HEAP32[i5 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
         HEAP32[i11 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
         HEAP32[i11 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
         HEAP32[i11 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
         i12 = i12 + 4 | 0;
        } else {
         i12 = i12 + 3 | 0;
        }
       } else {
        i12 = i13;
       }
      } else {
       i12 = i13;
      }
     }
    } else {
     i15 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i5) | 0;
     i11 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i10) | 0;
     if (!i15) {
      if (!i11) {
       i12 = 0;
       break;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i5) | 0)) {
       i12 = 1;
       break;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 2;
      break;
     }
     if (i11) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 1;
      break;
     }
     HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
     HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
     HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
     HEAP32[i5 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
     HEAP32[i5 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
     HEAP32[i5 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
     HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
     HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
     HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
     if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i10) | 0) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 2;
     } else {
      i12 = 1;
     }
    }
   } while (0);
   do {
    if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
     i13 = i4;
    } else {
     i13 = i4;
     while (1) {
      i13 = i13 + -12 | 0;
      if ((i5 | 0) == (i13 | 0)) {
       break;
      }
      if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i13, i10) | 0) {
       i6 = 50;
       break;
      }
     }
     if ((i6 | 0) == 50) {
      i6 = 0;
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i13 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i13 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i13 + 8 >> 2];
      HEAP32[i13 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i13 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i13 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = i12 + 1 | 0;
      break;
     }
     i10 = i5 + 12 | 0;
     if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i4) | 0)) {
      if ((i10 | 0) == (i4 | 0)) {
       i6 = 67;
       break L1;
      }
      while (1) {
       i9 = i10 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
        break;
       }
       if ((i9 | 0) == (i4 | 0)) {
        i6 = 67;
        break L1;
       } else {
        i10 = i9;
       }
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i10 = i9;
     }
     if ((i10 | 0) == (i4 | 0)) {
      i6 = 67;
      break L1;
     } else {
      i9 = i4;
     }
     while (1) {
      while (1) {
       i11 = i10 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
        break;
       } else {
        i10 = i11;
       }
      }
      do {
       i9 = i9 + -12 | 0;
      } while (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i9) | 0);
      if (!(i10 >>> 0 < i9 >>> 0)) {
       i5 = i10;
       continue L3;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i10 = i11;
     }
    }
   } while (0);
   i11 = i5 + 12 | 0;
   L47 : do {
    if (i11 >>> 0 < i13 >>> 0) {
     while (1) {
      i15 = i11;
      while (1) {
       i11 = i15 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i15, i10) | 0) {
        i15 = i11;
       } else {
        i14 = i13;
        break;
       }
      }
      do {
       i14 = i14 + -12 | 0;
      } while (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i14, i10) | 0));
      if (i15 >>> 0 > i14 >>> 0) {
       i11 = i15;
       break L47;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i15 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i15 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i15 + 8 >> 2];
      HEAP32[i15 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
      HEAP32[i15 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
      HEAP32[i15 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
      HEAP32[i14 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i14 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i14 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i13 = i14;
      i10 = (i10 | 0) == (i15 | 0) ? i14 : i10;
      i12 = i12 + 1 | 0;
     }
    }
   } while (0);
   if ((i11 | 0) != (i10 | 0) ? FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i11) | 0 : 0) {
    HEAP32[i2 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
    HEAP32[i2 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
    HEAP32[i2 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
    HEAP32[i11 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
    HEAP32[i11 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
    HEAP32[i11 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
    HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
    HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
    HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
    i12 = i12 + 1 | 0;
   }
   if ((i12 | 0) == 0) {
    i12 = __ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i5, i11, i1) | 0;
    i10 = i11 + 12 | 0;
    if (__ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i10, i8, i1) | 0) {
     i6 = 62;
     break;
    }
    if (i12) {
     i5 = i10;
     continue;
    }
   }
   i15 = i11;
   if ((i15 - i9 | 0) >= (i7 - i15 | 0)) {
    i6 = 66;
    break;
   }
   __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i11, i1);
   i5 = i11 + 12 | 0;
  }
  if ((i6 | 0) == 62) {
   i6 = 0;
   if (i12) {
    i6 = 67;
    break;
   } else {
    i8 = i11;
    continue;
   }
  } else if ((i6 | 0) == 66) {
   i6 = 0;
   __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i11 + 12 | 0, i8, i1);
   i8 = i11;
   continue;
  }
 }
 if ((i6 | 0) == 4) {
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i5) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 6) {
  i6 = i5 + 12 | 0;
  i15 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0;
  i7 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i6) | 0;
  if (!i15) {
   if (!i7) {
    STACKTOP = i3;
    return;
   }
   HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0)) {
    STACKTOP = i3;
    return;
   }
   HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   STACKTOP = i3;
   return;
  }
  if (i7) {
   HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i6) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 14) {
  __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i5 + 12 | 0, i5 + 24 | 0, i4, i1) | 0;
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 15) {
  i6 = i5 + 12 | 0;
  i7 = i5 + 24 | 0;
  i8 = i5 + 36 | 0;
  __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i6, i7, i8, i1) | 0;
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i8) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
  HEAP32[i8 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i8 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i8 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i8, i7) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  HEAP32[i7 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
  HEAP32[i7 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
  HEAP32[i7 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
  HEAP32[i8 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i8 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i8 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  HEAP32[i7 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i7 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i7 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 21) {
  __ZNSt3__118__insertion_sort_3IRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i8, i1);
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 67) {
  STACKTOP = i3;
  return;
 }
}
function _free(i7) {
 i7 = i7 | 0;
 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;
 i1 = STACKTOP;
 if ((i7 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 i15 = i7 + -8 | 0;
 i16 = HEAP32[7176 >> 2] | 0;
 if (i15 >>> 0 < i16 >>> 0) {
  _abort();
 }
 i13 = HEAP32[i7 + -4 >> 2] | 0;
 i12 = i13 & 3;
 if ((i12 | 0) == 1) {
  _abort();
 }
 i8 = i13 & -8;
 i6 = i7 + (i8 + -8) | 0;
 do {
  if ((i13 & 1 | 0) == 0) {
   i19 = HEAP32[i15 >> 2] | 0;
   if ((i12 | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   i15 = -8 - i19 | 0;
   i13 = i7 + i15 | 0;
   i12 = i19 + i8 | 0;
   if (i13 >>> 0 < i16 >>> 0) {
    _abort();
   }
   if ((i13 | 0) == (HEAP32[7180 >> 2] | 0)) {
    i2 = i7 + (i8 + -4) | 0;
    if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
     i2 = i13;
     i11 = i12;
     break;
    }
    HEAP32[7168 >> 2] = i12;
    HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2;
    HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1;
    HEAP32[i6 >> 2] = i12;
    STACKTOP = i1;
    return;
   }
   i18 = i19 >>> 3;
   if (i19 >>> 0 < 256) {
    i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
    i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
    i14 = 7200 + (i18 << 1 << 2) | 0;
    if ((i2 | 0) != (i14 | 0)) {
     if (i2 >>> 0 < i16 >>> 0) {
      _abort();
     }
     if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) {
      _abort();
     }
    }
    if ((i11 | 0) == (i2 | 0)) {
     HEAP32[1790] = HEAP32[1790] & ~(1 << i18);
     i2 = i13;
     i11 = i12;
     break;
    }
    if ((i11 | 0) != (i14 | 0)) {
     if (i11 >>> 0 < i16 >>> 0) {
      _abort();
     }
     i14 = i11 + 8 | 0;
     if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) {
      i17 = i14;
     } else {
      _abort();
     }
    } else {
     i17 = i11 + 8 | 0;
    }
    HEAP32[i2 + 12 >> 2] = i11;
    HEAP32[i17 >> 2] = i2;
    i2 = i13;
    i11 = i12;
    break;
   }
   i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0;
   i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
   do {
    if ((i18 | 0) == (i13 | 0)) {
     i19 = i7 + (i15 + 20) | 0;
     i18 = HEAP32[i19 >> 2] | 0;
     if ((i18 | 0) == 0) {
      i19 = i7 + (i15 + 16) | 0;
      i18 = HEAP32[i19 >> 2] | 0;
      if ((i18 | 0) == 0) {
       i14 = 0;
       break;
      }
     }
     while (1) {
      i21 = i18 + 20 | 0;
      i20 = HEAP32[i21 >> 2] | 0;
      if ((i20 | 0) != 0) {
       i18 = i20;
       i19 = i21;
       continue;
      }
      i20 = i18 + 16 | 0;
      i21 = HEAP32[i20 >> 2] | 0;
      if ((i21 | 0) == 0) {
       break;
      } else {
       i18 = i21;
       i19 = i20;
      }
     }
     if (i19 >>> 0 < i16 >>> 0) {
      _abort();
     } else {
      HEAP32[i19 >> 2] = 0;
      i14 = i18;
      break;
     }
    } else {
     i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
     if (i19 >>> 0 < i16 >>> 0) {
      _abort();
     }
     i16 = i19 + 12 | 0;
     if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) {
      _abort();
     }
     i20 = i18 + 8 | 0;
     if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) {
      HEAP32[i16 >> 2] = i18;
      HEAP32[i20 >> 2] = i19;
      i14 = i18;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   if ((i17 | 0) != 0) {
    i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0;
    i16 = 7464 + (i18 << 2) | 0;
    if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) {
     HEAP32[i16 >> 2] = i14;
     if ((i14 | 0) == 0) {
      HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i18);
      i2 = i13;
      i11 = i12;
      break;
     }
    } else {
     if (i17 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     i16 = i17 + 16 | 0;
     if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) {
      HEAP32[i16 >> 2] = i14;
     } else {
      HEAP32[i17 + 20 >> 2] = i14;
     }
     if ((i14 | 0) == 0) {
      i2 = i13;
      i11 = i12;
      break;
     }
    }
    if (i14 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
     _abort();
    }
    HEAP32[i14 + 24 >> 2] = i17;
    i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0;
    do {
     if ((i16 | 0) != 0) {
      if (i16 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i14 + 16 >> 2] = i16;
       HEAP32[i16 + 24 >> 2] = i14;
       break;
      }
     }
    } while (0);
    i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0;
    if ((i15 | 0) != 0) {
     if (i15 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i14 + 20 >> 2] = i15;
      HEAP32[i15 + 24 >> 2] = i14;
      i2 = i13;
      i11 = i12;
      break;
     }
    } else {
     i2 = i13;
     i11 = i12;
    }
   } else {
    i2 = i13;
    i11 = i12;
   }
  } else {
   i2 = i15;
   i11 = i8;
  }
 } while (0);
 if (!(i2 >>> 0 < i6 >>> 0)) {
  _abort();
 }
 i12 = i7 + (i8 + -4) | 0;
 i13 = HEAP32[i12 >> 2] | 0;
 if ((i13 & 1 | 0) == 0) {
  _abort();
 }
 if ((i13 & 2 | 0) == 0) {
  if ((i6 | 0) == (HEAP32[7184 >> 2] | 0)) {
   i21 = (HEAP32[7172 >> 2] | 0) + i11 | 0;
   HEAP32[7172 >> 2] = i21;
   HEAP32[7184 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i21 | 1;
   if ((i2 | 0) != (HEAP32[7180 >> 2] | 0)) {
    STACKTOP = i1;
    return;
   }
   HEAP32[7180 >> 2] = 0;
   HEAP32[7168 >> 2] = 0;
   STACKTOP = i1;
   return;
  }
  if ((i6 | 0) == (HEAP32[7180 >> 2] | 0)) {
   i21 = (HEAP32[7168 >> 2] | 0) + i11 | 0;
   HEAP32[7168 >> 2] = i21;
   HEAP32[7180 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i21 | 1;
   HEAP32[i2 + i21 >> 2] = i21;
   STACKTOP = i1;
   return;
  }
  i11 = (i13 & -8) + i11 | 0;
  i12 = i13 >>> 3;
  do {
   if (!(i13 >>> 0 < 256)) {
    i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0;
    i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
    do {
     if ((i15 | 0) == (i6 | 0)) {
      i13 = i7 + (i8 + 12) | 0;
      i12 = HEAP32[i13 >> 2] | 0;
      if ((i12 | 0) == 0) {
       i13 = i7 + (i8 + 8) | 0;
       i12 = HEAP32[i13 >> 2] | 0;
       if ((i12 | 0) == 0) {
        i9 = 0;
        break;
       }
      }
      while (1) {
       i14 = i12 + 20 | 0;
       i15 = HEAP32[i14 >> 2] | 0;
       if ((i15 | 0) != 0) {
        i12 = i15;
        i13 = i14;
        continue;
       }
       i14 = i12 + 16 | 0;
       i15 = HEAP32[i14 >> 2] | 0;
       if ((i15 | 0) == 0) {
        break;
       } else {
        i12 = i15;
        i13 = i14;
       }
      }
      if (i13 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i13 >> 2] = 0;
       i9 = i12;
       break;
      }
     } else {
      i13 = HEAP32[i7 + i8 >> 2] | 0;
      if (i13 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i14 = i13 + 12 | 0;
      if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) {
       _abort();
      }
      i12 = i15 + 8 | 0;
      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
       HEAP32[i14 >> 2] = i15;
       HEAP32[i12 >> 2] = i13;
       i9 = i15;
       break;
      } else {
       _abort();
      }
     }
    } while (0);
    if ((i10 | 0) != 0) {
     i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0;
     i13 = 7464 + (i12 << 2) | 0;
     if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) {
      HEAP32[i13 >> 2] = i9;
      if ((i9 | 0) == 0) {
       HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i12);
       break;
      }
     } else {
      if (i10 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i12 = i10 + 16 | 0;
      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
       HEAP32[i12 >> 2] = i9;
      } else {
       HEAP32[i10 + 20 >> 2] = i9;
      }
      if ((i9 | 0) == 0) {
       break;
      }
     }
     if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     HEAP32[i9 + 24 >> 2] = i10;
     i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0;
     do {
      if ((i6 | 0) != 0) {
       if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[i9 + 16 >> 2] = i6;
        HEAP32[i6 + 24 >> 2] = i9;
        break;
       }
      }
     } while (0);
     i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0;
     if ((i6 | 0) != 0) {
      if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i9 + 20 >> 2] = i6;
       HEAP32[i6 + 24 >> 2] = i9;
       break;
      }
     }
    }
   } else {
    i9 = HEAP32[i7 + i8 >> 2] | 0;
    i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
    i8 = 7200 + (i12 << 1 << 2) | 0;
    if ((i9 | 0) != (i8 | 0)) {
     if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) {
      _abort();
     }
    }
    if ((i7 | 0) == (i9 | 0)) {
     HEAP32[1790] = HEAP32[1790] & ~(1 << i12);
     break;
    }
    if ((i7 | 0) != (i8 | 0)) {
     if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     i8 = i7 + 8 | 0;
     if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) {
      i10 = i8;
     } else {
      _abort();
     }
    } else {
     i10 = i7 + 8 | 0;
    }
    HEAP32[i9 + 12 >> 2] = i7;
    HEAP32[i10 >> 2] = i9;
   }
  } while (0);
  HEAP32[i2 + 4 >> 2] = i11 | 1;
  HEAP32[i2 + i11 >> 2] = i11;
  if ((i2 | 0) == (HEAP32[7180 >> 2] | 0)) {
   HEAP32[7168 >> 2] = i11;
   STACKTOP = i1;
   return;
  }
 } else {
  HEAP32[i12 >> 2] = i13 & -2;
  HEAP32[i2 + 4 >> 2] = i11 | 1;
  HEAP32[i2 + i11 >> 2] = i11;
 }
 i6 = i11 >>> 3;
 if (i11 >>> 0 < 256) {
  i7 = i6 << 1;
  i3 = 7200 + (i7 << 2) | 0;
  i8 = HEAP32[1790] | 0;
  i6 = 1 << i6;
  if ((i8 & i6 | 0) != 0) {
   i6 = 7200 + (i7 + 2 << 2) | 0;
   i7 = HEAP32[i6 >> 2] | 0;
   if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
    _abort();
   } else {
    i4 = i6;
    i5 = i7;
   }
  } else {
   HEAP32[1790] = i8 | i6;
   i4 = 7200 + (i7 + 2 << 2) | 0;
   i5 = i3;
  }
  HEAP32[i4 >> 2] = i2;
  HEAP32[i5 + 12 >> 2] = i2;
  HEAP32[i2 + 8 >> 2] = i5;
  HEAP32[i2 + 12 >> 2] = i3;
  STACKTOP = i1;
  return;
 }
 i4 = i11 >>> 8;
 if ((i4 | 0) != 0) {
  if (i11 >>> 0 > 16777215) {
   i4 = 31;
  } else {
   i20 = (i4 + 1048320 | 0) >>> 16 & 8;
   i21 = i4 << i20;
   i19 = (i21 + 520192 | 0) >>> 16 & 4;
   i21 = i21 << i19;
   i4 = (i21 + 245760 | 0) >>> 16 & 2;
   i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0;
   i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1;
  }
 } else {
  i4 = 0;
 }
 i5 = 7464 + (i4 << 2) | 0;
 HEAP32[i2 + 28 >> 2] = i4;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 i7 = HEAP32[7164 >> 2] | 0;
 i6 = 1 << i4;
 L199 : do {
  if ((i7 & i6 | 0) != 0) {
   i5 = HEAP32[i5 >> 2] | 0;
   if ((i4 | 0) == 31) {
    i4 = 0;
   } else {
    i4 = 25 - (i4 >>> 1) | 0;
   }
   L204 : do {
    if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) {
     i4 = i11 << i4;
     i7 = i5;
     while (1) {
      i6 = i7 + (i4 >>> 31 << 2) + 16 | 0;
      i5 = HEAP32[i6 >> 2] | 0;
      if ((i5 | 0) == 0) {
       break;
      }
      if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) {
       i3 = i5;
       break L204;
      } else {
       i4 = i4 << 1;
       i7 = i5;
      }
     }
     if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i6 >> 2] = i2;
      HEAP32[i2 + 24 >> 2] = i7;
      HEAP32[i2 + 12 >> 2] = i2;
      HEAP32[i2 + 8 >> 2] = i2;
      break L199;
     }
    } else {
     i3 = i5;
    }
   } while (0);
   i5 = i3 + 8 | 0;
   i4 = HEAP32[i5 >> 2] | 0;
   i6 = HEAP32[7176 >> 2] | 0;
   if (i3 >>> 0 < i6 >>> 0) {
    _abort();
   }
   if (i4 >>> 0 < i6 >>> 0) {
    _abort();
   } else {
    HEAP32[i4 + 12 >> 2] = i2;
    HEAP32[i5 >> 2] = i2;
    HEAP32[i2 + 8 >> 2] = i4;
    HEAP32[i2 + 12 >> 2] = i3;
    HEAP32[i2 + 24 >> 2] = 0;
    break;
   }
  } else {
   HEAP32[7164 >> 2] = i7 | i6;
   HEAP32[i5 >> 2] = i2;
   HEAP32[i2 + 24 >> 2] = i5;
   HEAP32[i2 + 12 >> 2] = i2;
   HEAP32[i2 + 8 >> 2] = i2;
  }
 } while (0);
 i21 = (HEAP32[7192 >> 2] | 0) + -1 | 0;
 HEAP32[7192 >> 2] = i21;
 if ((i21 | 0) == 0) {
  i2 = 7616 | 0;
 } else {
  STACKTOP = i1;
  return;
 }
 while (1) {
  i2 = HEAP32[i2 >> 2] | 0;
  if ((i2 | 0) == 0) {
   break;
  } else {
   i2 = i2 + 8 | 0;
  }
 }
 HEAP32[7192 >> 2] = -1;
 STACKTOP = i1;
 return;
}
function __ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i3, i4, i2) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i7 = i1 + 12 | 0;
 i6 = i1;
 switch ((i4 - i3 | 0) / 12 | 0 | 0) {
 case 5:
  {
   i6 = i3 + 12 | 0;
   i8 = i3 + 24 | 0;
   i5 = i3 + 36 | 0;
   i4 = i4 + -12 | 0;
   __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i3, i6, i8, i5, i2) | 0;
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i8) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i6) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i3) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 4:
  {
   __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i3, i3 + 12 | 0, i3 + 24 | 0, i4 + -12 | 0, i2) | 0;
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 3:
  {
   i5 = i3 + 12 | 0;
   i4 = i4 + -12 | 0;
   i10 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i3) | 0;
   i6 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0;
   if (!i10) {
    if (!i6) {
     i10 = 1;
     STACKTOP = i1;
     return i10 | 0;
    }
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
    HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i3) | 0)) {
     i10 = 1;
     STACKTOP = i1;
     return i10 | 0;
    }
    HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   if (i6) {
    HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    HEAP32[i3 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
    HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 2:
  {
   i4 = i4 + -12 | 0;
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i3) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 1:
 case 0:
  {
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 default:
  {
   i9 = i3 + 24 | 0;
   i10 = i3 + 12 | 0;
   i11 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i10, i3) | 0;
   i8 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i9, i10) | 0;
   do {
    if (i11) {
     if (i8) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
      HEAP32[i3 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i3 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i3 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      break;
     }
     HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
     HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
     HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
     HEAP32[i3 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
     HEAP32[i3 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
     HEAP32[i3 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
     HEAP32[i10 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i10 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i10 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i9, i10) | 0) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     }
    } else {
     if (i8) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i10, i3) | 0) {
       HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
       HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
       HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
       HEAP32[i3 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
       HEAP32[i3 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
       HEAP32[i3 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
       HEAP32[i10 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
       HEAP32[i10 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
       HEAP32[i10 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      }
     }
    }
   } while (0);
   i7 = i3 + 36 | 0;
   if ((i7 | 0) == (i4 | 0)) {
    i11 = 1;
    STACKTOP = i1;
    return i11 | 0;
   }
   i8 = 0;
   while (1) {
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i9) | 0) {
     HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     i10 = i7;
     while (1) {
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      if ((i9 | 0) == (i3 | 0)) {
       break;
      }
      i10 = i9 + -12 | 0;
      if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i10) | 0) {
       i11 = i9;
       i9 = i10;
       i10 = i11;
      } else {
       break;
      }
     }
     HEAP32[i9 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i9 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i9 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
     i8 = i8 + 1 | 0;
     if ((i8 | 0) == 8) {
      break;
     }
    }
    i9 = i7 + 12 | 0;
    if ((i9 | 0) == (i4 | 0)) {
     i2 = 1;
     i5 = 35;
     break;
    } else {
     i11 = i7;
     i7 = i9;
     i9 = i11;
    }
   }
   if ((i5 | 0) == 35) {
    STACKTOP = i1;
    return i2 | 0;
   }
   i11 = (i7 + 12 | 0) == (i4 | 0);
   STACKTOP = i1;
   return i11 | 0;
  }
 }
 return 0;
}
function __ZN13b2DynamicTree7BalanceEi(i11, i6) {
 i11 = i11 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, d19 = 0.0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0;
 i1 = STACKTOP;
 if ((i6 | 0) == -1) {
  ___assert_fail(3216, 2944, 382, 3232);
 }
 i5 = HEAP32[i11 + 4 >> 2] | 0;
 i13 = i5 + (i6 * 36 | 0) | 0;
 i18 = i5 + (i6 * 36 | 0) + 24 | 0;
 i8 = HEAP32[i18 >> 2] | 0;
 if ((i8 | 0) == -1) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i2 = i5 + (i6 * 36 | 0) + 32 | 0;
 if ((HEAP32[i2 >> 2] | 0) < 2) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i20 = i5 + (i6 * 36 | 0) + 28 | 0;
 i7 = HEAP32[i20 >> 2] | 0;
 if (!((i8 | 0) > -1)) {
  ___assert_fail(3240, 2944, 392, 3232);
 }
 i12 = HEAP32[i11 + 12 >> 2] | 0;
 if ((i8 | 0) >= (i12 | 0)) {
  ___assert_fail(3240, 2944, 392, 3232);
 }
 if (!((i7 | 0) > -1 & (i7 | 0) < (i12 | 0))) {
  ___assert_fail(3272, 2944, 393, 3232);
 }
 i9 = i5 + (i8 * 36 | 0) | 0;
 i10 = i5 + (i7 * 36 | 0) | 0;
 i3 = i5 + (i7 * 36 | 0) + 32 | 0;
 i4 = i5 + (i8 * 36 | 0) + 32 | 0;
 i14 = (HEAP32[i3 >> 2] | 0) - (HEAP32[i4 >> 2] | 0) | 0;
 if ((i14 | 0) > 1) {
  i21 = i5 + (i7 * 36 | 0) + 24 | 0;
  i14 = HEAP32[i21 >> 2] | 0;
  i18 = i5 + (i7 * 36 | 0) + 28 | 0;
  i15 = HEAP32[i18 >> 2] | 0;
  i16 = i5 + (i14 * 36 | 0) | 0;
  i17 = i5 + (i15 * 36 | 0) | 0;
  if (!((i14 | 0) > -1 & (i14 | 0) < (i12 | 0))) {
   ___assert_fail(3304, 2944, 407, 3232);
  }
  if (!((i15 | 0) > -1 & (i15 | 0) < (i12 | 0))) {
   ___assert_fail(3336, 2944, 408, 3232);
  }
  HEAP32[i21 >> 2] = i6;
  i21 = i5 + (i6 * 36 | 0) + 20 | 0;
  i12 = i5 + (i7 * 36 | 0) + 20 | 0;
  HEAP32[i12 >> 2] = HEAP32[i21 >> 2];
  HEAP32[i21 >> 2] = i7;
  i12 = HEAP32[i12 >> 2] | 0;
  do {
   if (!((i12 | 0) == -1)) {
    i11 = i5 + (i12 * 36 | 0) + 24 | 0;
    if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
     HEAP32[i11 >> 2] = i7;
     break;
    }
    i11 = i5 + (i12 * 36 | 0) + 28 | 0;
    if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
     HEAP32[i11 >> 2] = i7;
     break;
    } else {
     ___assert_fail(3368, 2944, 424, 3232);
    }
   } else {
    HEAP32[i11 >> 2] = i7;
   }
  } while (0);
  i11 = i5 + (i14 * 36 | 0) + 32 | 0;
  i12 = i5 + (i15 * 36 | 0) + 32 | 0;
  if ((HEAP32[i11 >> 2] | 0) > (HEAP32[i12 >> 2] | 0)) {
   HEAP32[i18 >> 2] = i14;
   HEAP32[i20 >> 2] = i15;
   HEAP32[i5 + (i15 * 36 | 0) + 20 >> 2] = i6;
   d19 = +HEAPF32[i9 >> 2];
   d22 = +HEAPF32[i17 >> 2];
   d19 = d19 < d22 ? d19 : d22;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 4 >> 2];
   d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
   d24 = +d19;
   d23 = +(d23 < d22 ? d23 : d22);
   i21 = i13;
   HEAPF32[i21 >> 2] = d24;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 8 >> 2];
   d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i8 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
   d23 = +(d23 > d24 ? d23 : d24);
   d24 = +(d22 > d25 ? d22 : d25);
   i21 = i5 + (i6 * 36 | 0) + 8 | 0;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d24;
   d24 = +HEAPF32[i16 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
   d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
   d19 = +(d19 < d24 ? d19 : d24);
   d22 = +(d22 < d23 ? d22 : d23);
   i21 = i10;
   HEAPF32[i21 >> 2] = d19;
   HEAPF32[i21 + 4 >> 2] = d22;
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
   d19 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
   d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
   d19 = +(d22 > d19 ? d22 : d19);
   d25 = +(d23 > d24 ? d23 : d24);
   i5 = i5 + (i7 * 36 | 0) + 8 | 0;
   HEAPF32[i5 >> 2] = d19;
   HEAPF32[i5 + 4 >> 2] = d25;
   i4 = HEAP32[i4 >> 2] | 0;
   i5 = HEAP32[i12 >> 2] | 0;
   i4 = ((i4 | 0) > (i5 | 0) ? i4 : i5) + 1 | 0;
   HEAP32[i2 >> 2] = i4;
   i2 = HEAP32[i11 >> 2] | 0;
   i2 = (i4 | 0) > (i2 | 0) ? i4 : i2;
  } else {
   HEAP32[i18 >> 2] = i15;
   HEAP32[i20 >> 2] = i14;
   HEAP32[i5 + (i14 * 36 | 0) + 20 >> 2] = i6;
   d19 = +HEAPF32[i9 >> 2];
   d22 = +HEAPF32[i16 >> 2];
   d19 = d19 < d22 ? d19 : d22;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 4 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
   d22 = +d19;
   d23 = +(d23 < d24 ? d23 : d24);
   i21 = i13;
   HEAPF32[i21 >> 2] = d22;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 8 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i8 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
   d23 = +(d23 > d24 ? d23 : d24);
   d24 = +(d22 > d25 ? d22 : d25);
   i21 = i5 + (i6 * 36 | 0) + 8 | 0;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d24;
   d24 = +HEAPF32[i17 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
   d23 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
   d19 = +(d19 < d24 ? d19 : d24);
   d23 = +(d22 < d23 ? d22 : d23);
   i21 = i10;
   HEAPF32[i21 >> 2] = d19;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
   d19 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
   d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
   d19 = +(d23 > d19 ? d23 : d19);
   d25 = +(d22 > d24 ? d22 : d24);
   i5 = i5 + (i7 * 36 | 0) + 8 | 0;
   HEAPF32[i5 >> 2] = d19;
   HEAPF32[i5 + 4 >> 2] = d25;
   i4 = HEAP32[i4 >> 2] | 0;
   i5 = HEAP32[i11 >> 2] | 0;
   i4 = ((i4 | 0) > (i5 | 0) ? i4 : i5) + 1 | 0;
   HEAP32[i2 >> 2] = i4;
   i2 = HEAP32[i12 >> 2] | 0;
   i2 = (i4 | 0) > (i2 | 0) ? i4 : i2;
  }
  HEAP32[i3 >> 2] = i2 + 1;
  i21 = i7;
  STACKTOP = i1;
  return i21 | 0;
 }
 if (!((i14 | 0) < -1)) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i21 = i5 + (i8 * 36 | 0) + 24 | 0;
 i14 = HEAP32[i21 >> 2] | 0;
 i20 = i5 + (i8 * 36 | 0) + 28 | 0;
 i15 = HEAP32[i20 >> 2] | 0;
 i17 = i5 + (i14 * 36 | 0) | 0;
 i16 = i5 + (i15 * 36 | 0) | 0;
 if (!((i14 | 0) > -1 & (i14 | 0) < (i12 | 0))) {
  ___assert_fail(3400, 2944, 467, 3232);
 }
 if (!((i15 | 0) > -1 & (i15 | 0) < (i12 | 0))) {
  ___assert_fail(3432, 2944, 468, 3232);
 }
 HEAP32[i21 >> 2] = i6;
 i21 = i5 + (i6 * 36 | 0) + 20 | 0;
 i12 = i5 + (i8 * 36 | 0) + 20 | 0;
 HEAP32[i12 >> 2] = HEAP32[i21 >> 2];
 HEAP32[i21 >> 2] = i8;
 i12 = HEAP32[i12 >> 2] | 0;
 do {
  if (!((i12 | 0) == -1)) {
   i11 = i5 + (i12 * 36 | 0) + 24 | 0;
   if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
    HEAP32[i11 >> 2] = i8;
    break;
   }
   i11 = i5 + (i12 * 36 | 0) + 28 | 0;
   if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
    HEAP32[i11 >> 2] = i8;
    break;
   } else {
    ___assert_fail(3464, 2944, 484, 3232);
   }
  } else {
   HEAP32[i11 >> 2] = i8;
  }
 } while (0);
 i12 = i5 + (i14 * 36 | 0) + 32 | 0;
 i11 = i5 + (i15 * 36 | 0) + 32 | 0;
 if ((HEAP32[i12 >> 2] | 0) > (HEAP32[i11 >> 2] | 0)) {
  HEAP32[i20 >> 2] = i14;
  HEAP32[i18 >> 2] = i15;
  HEAP32[i5 + (i15 * 36 | 0) + 20 >> 2] = i6;
  d19 = +HEAPF32[i10 >> 2];
  d22 = +HEAPF32[i16 >> 2];
  d19 = d19 < d22 ? d19 : d22;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
  d24 = +d19;
  d23 = +(d23 < d22 ? d23 : d22);
  i21 = i13;
  HEAPF32[i21 >> 2] = d24;
  HEAPF32[i21 + 4 >> 2] = d23;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 8 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
  d24 = +HEAPF32[i5 + (i7 * 36 | 0) + 12 >> 2];
  d25 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
  d22 = +(d23 > d22 ? d23 : d22);
  d24 = +(d24 > d25 ? d24 : d25);
  i21 = i5 + (i6 * 36 | 0) + 8 | 0;
  HEAPF32[i21 >> 2] = d22;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i17 >> 2];
  d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
  d19 = +(d19 < d24 ? d19 : d24);
  d22 = +(d23 < d22 ? d23 : d22);
  i21 = i9;
  HEAPF32[i21 >> 2] = d19;
  HEAPF32[i21 + 4 >> 2] = d22;
  d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
  d19 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
  d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
  d22 = +(d22 > d23 ? d22 : d23);
  d25 = +(d19 > d24 ? d19 : d24);
  i5 = i5 + (i8 * 36 | 0) + 8 | 0;
  HEAPF32[i5 >> 2] = d22;
  HEAPF32[i5 + 4 >> 2] = d25;
  i3 = HEAP32[i3 >> 2] | 0;
  i5 = HEAP32[i11 >> 2] | 0;
  i3 = ((i3 | 0) > (i5 | 0) ? i3 : i5) + 1 | 0;
  HEAP32[i2 >> 2] = i3;
  i2 = HEAP32[i12 >> 2] | 0;
  i2 = (i3 | 0) > (i2 | 0) ? i3 : i2;
 } else {
  HEAP32[i20 >> 2] = i15;
  HEAP32[i18 >> 2] = i14;
  HEAP32[i5 + (i14 * 36 | 0) + 20 >> 2] = i6;
  d19 = +HEAPF32[i10 >> 2];
  d22 = +HEAPF32[i17 >> 2];
  d19 = d19 < d22 ? d19 : d22;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 4 >> 2];
  d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
  d22 = +d19;
  d24 = +(d23 < d24 ? d23 : d24);
  i21 = i13;
  HEAPF32[i21 >> 2] = d22;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i5 + (i7 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
  d22 = +HEAPF32[i5 + (i7 * 36 | 0) + 12 >> 2];
  d25 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
  d23 = +(d24 > d23 ? d24 : d23);
  d24 = +(d22 > d25 ? d22 : d25);
  i21 = i5 + (i6 * 36 | 0) + 8 | 0;
  HEAPF32[i21 >> 2] = d23;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i16 >> 2];
  d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
  d19 = +(d19 < d24 ? d19 : d24);
  d22 = +(d23 < d22 ? d23 : d22);
  i21 = i9;
  HEAPF32[i21 >> 2] = d19;
  HEAPF32[i21 + 4 >> 2] = d22;
  d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
  d19 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
  d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
  d22 = +(d22 > d23 ? d22 : d23);
  d25 = +(d19 > d24 ? d19 : d24);
  i5 = i5 + (i8 * 36 | 0) + 8 | 0;
  HEAPF32[i5 >> 2] = d22;
  HEAPF32[i5 + 4 >> 2] = d25;
  i3 = HEAP32[i3 >> 2] | 0;
  i5 = HEAP32[i12 >> 2] | 0;
  i3 = ((i3 | 0) > (i5 | 0) ? i3 : i5) + 1 | 0;
  HEAP32[i2 >> 2] = i3;
  i2 = HEAP32[i11 >> 2] | 0;
  i2 = (i3 | 0) > (i2 | 0) ? i3 : i2;
 }
 HEAP32[i4 >> 2] = i2 + 1;
 i21 = i8;
 STACKTOP = i1;
 return i21 | 0;
}
function __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i2, i5, i3) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i6 = 0, d7 = 0.0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, i23 = 0, d24 = 0.0, d25 = 0.0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, d36 = 0.0, d37 = 0.0, d38 = 0.0, i39 = 0, i40 = 0, i41 = 0, i42 = 0, d43 = 0.0, d44 = 0.0, d45 = 0.0, i46 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 176 | 0;
 i11 = i1 + 152 | 0;
 i10 = i1 + 136 | 0;
 i4 = i1 + 24 | 0;
 i14 = i1 + 12 | 0;
 i15 = i1;
 HEAP32[652] = (HEAP32[652] | 0) + 1;
 i9 = i3 + 28 | 0;
 i31 = i3 + 56 | 0;
 HEAP32[i11 + 0 >> 2] = HEAP32[i31 + 0 >> 2];
 HEAP32[i11 + 4 >> 2] = HEAP32[i31 + 4 >> 2];
 HEAP32[i11 + 8 >> 2] = HEAP32[i31 + 8 >> 2];
 HEAP32[i11 + 12 >> 2] = HEAP32[i31 + 12 >> 2];
 i31 = i3 + 72 | 0;
 HEAP32[i10 + 0 >> 2] = HEAP32[i31 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i31 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i31 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i31 + 12 >> 2];
 __ZN9b2Simplex9ReadCacheEPK14b2SimplexCachePK15b2DistanceProxyRK11b2TransformS5_S8_(i4, i5, i3, i11, i9, i10);
 i9 = i4 + 108 | 0;
 i31 = HEAP32[i9 >> 2] | 0;
 if ((i31 | 0) == 3 | (i31 | 0) == 2 | (i31 | 0) == 1) {
  i8 = i4 + 16 | 0;
  i6 = i4 + 20 | 0;
  d17 = +HEAPF32[i11 + 12 >> 2];
  d18 = +HEAPF32[i11 + 8 >> 2];
  i13 = i3 + 16 | 0;
  i12 = i3 + 20 | 0;
  d16 = +HEAPF32[i11 >> 2];
  d21 = +HEAPF32[i11 + 4 >> 2];
  d19 = +HEAPF32[i10 + 12 >> 2];
  d22 = +HEAPF32[i10 + 8 >> 2];
  i23 = i3 + 44 | 0;
  i20 = i3 + 48 | 0;
  d24 = +HEAPF32[i10 >> 2];
  d25 = +HEAPF32[i10 + 4 >> 2];
  i11 = i4 + 52 | 0;
  i10 = i4 + 56 | 0;
  i30 = i4 + 16 | 0;
  i27 = i4 + 36 | 0;
  i26 = i4 + 52 | 0;
  i29 = i4 + 24 | 0;
  i28 = i4 + 60 | 0;
  i33 = 0;
  L3 : while (1) {
   i32 = (i31 | 0) > 0;
   if (i32) {
    i34 = 0;
    do {
     HEAP32[i14 + (i34 << 2) >> 2] = HEAP32[i4 + (i34 * 36 | 0) + 28 >> 2];
     HEAP32[i15 + (i34 << 2) >> 2] = HEAP32[i4 + (i34 * 36 | 0) + 32 >> 2];
     i34 = i34 + 1 | 0;
    } while ((i34 | 0) != (i31 | 0));
   }
   do {
    if ((i31 | 0) == 2) {
     i46 = i30;
     d45 = +HEAPF32[i46 >> 2];
     d36 = +HEAPF32[i46 + 4 >> 2];
     i46 = i26;
     d38 = +HEAPF32[i46 >> 2];
     d37 = +HEAPF32[i46 + 4 >> 2];
     d43 = d38 - d45;
     d44 = d37 - d36;
     d36 = d45 * d43 + d36 * d44;
     if (d36 >= -0.0) {
      HEAPF32[i29 >> 2] = 1.0;
      HEAP32[i9 >> 2] = 1;
      i35 = 17;
      break;
     }
     d37 = d38 * d43 + d37 * d44;
     if (!(d37 <= 0.0)) {
      d45 = 1.0 / (d37 - d36);
      HEAPF32[i29 >> 2] = d37 * d45;
      HEAPF32[i28 >> 2] = -(d36 * d45);
      HEAP32[i9 >> 2] = 2;
      i35 = 18;
      break;
     } else {
      HEAPF32[i28 >> 2] = 1.0;
      HEAP32[i9 >> 2] = 1;
      i34 = i4 + 0 | 0;
      i39 = i27 + 0 | 0;
      i35 = i34 + 36 | 0;
      do {
       HEAP32[i34 >> 2] = HEAP32[i39 >> 2];
       i34 = i34 + 4 | 0;
       i39 = i39 + 4 | 0;
      } while ((i34 | 0) < (i35 | 0));
      i35 = 17;
      break;
     }
    } else if ((i31 | 0) == 3) {
     __ZN9b2Simplex6Solve3Ev(i4);
     i34 = HEAP32[i9 >> 2] | 0;
     if ((i34 | 0) == 1) {
      i35 = 17;
     } else if ((i34 | 0) == 0) {
      i35 = 15;
      break L3;
     } else if ((i34 | 0) == 2) {
      i35 = 18;
     } else if ((i34 | 0) == 3) {
      i35 = 42;
      break L3;
     } else {
      i35 = 16;
      break L3;
     }
    } else if ((i31 | 0) == 1) {
     i35 = 17;
    } else {
     i35 = 13;
     break L3;
    }
   } while (0);
   do {
    if ((i35 | 0) == 17) {
     d36 = -+HEAPF32[i8 >> 2];
     d37 = -+HEAPF32[i6 >> 2];
     i34 = 1;
    } else if ((i35 | 0) == 18) {
     d44 = +HEAPF32[i8 >> 2];
     d37 = +HEAPF32[i11 >> 2] - d44;
     d45 = +HEAPF32[i6 >> 2];
     d36 = +HEAPF32[i10 >> 2] - d45;
     if (d44 * d36 - d37 * d45 > 0.0) {
      d36 = -d36;
      i34 = 2;
      break;
     } else {
      d37 = -d37;
      i34 = 2;
      break;
     }
    }
   } while (0);
   if (d37 * d37 + d36 * d36 < 1.4210854715202004e-14) {
    i35 = 42;
    break;
   }
   i39 = i4 + (i34 * 36 | 0) | 0;
   d44 = -d36;
   d45 = -d37;
   d43 = d17 * d44 + d18 * d45;
   d44 = d17 * d45 - d18 * d44;
   i40 = HEAP32[i13 >> 2] | 0;
   i41 = HEAP32[i12 >> 2] | 0;
   if ((i41 | 0) > 1) {
    i42 = 0;
    d45 = d44 * +HEAPF32[i40 + 4 >> 2] + d43 * +HEAPF32[i40 >> 2];
    i46 = 1;
    while (1) {
     d38 = d43 * +HEAPF32[i40 + (i46 << 3) >> 2] + d44 * +HEAPF32[i40 + (i46 << 3) + 4 >> 2];
     i35 = d38 > d45;
     i42 = i35 ? i46 : i42;
     i46 = i46 + 1 | 0;
     if ((i46 | 0) == (i41 | 0)) {
      break;
     } else {
      d45 = i35 ? d38 : d45;
     }
    }
    i35 = i4 + (i34 * 36 | 0) + 28 | 0;
    HEAP32[i35 >> 2] = i42;
    if (!((i42 | 0) > -1)) {
     i35 = 28;
     break;
    }
   } else {
    i35 = i4 + (i34 * 36 | 0) + 28 | 0;
    HEAP32[i35 >> 2] = 0;
    i42 = 0;
   }
   if ((i41 | 0) <= (i42 | 0)) {
    i35 = 28;
    break;
   }
   d45 = +HEAPF32[i40 + (i42 << 3) >> 2];
   d43 = +HEAPF32[i40 + (i42 << 3) + 4 >> 2];
   d38 = d16 + (d17 * d45 - d18 * d43);
   d44 = +d38;
   d43 = +(d45 * d18 + d17 * d43 + d21);
   i40 = i39;
   HEAPF32[i40 >> 2] = d44;
   HEAPF32[i40 + 4 >> 2] = d43;
   d43 = d36 * d19 + d37 * d22;
   d44 = d37 * d19 - d36 * d22;
   i40 = HEAP32[i23 >> 2] | 0;
   i39 = HEAP32[i20 >> 2] | 0;
   if ((i39 | 0) > 1) {
    i41 = 0;
    d37 = d44 * +HEAPF32[i40 + 4 >> 2] + d43 * +HEAPF32[i40 >> 2];
    i42 = 1;
    while (1) {
     d36 = d43 * +HEAPF32[i40 + (i42 << 3) >> 2] + d44 * +HEAPF32[i40 + (i42 << 3) + 4 >> 2];
     i46 = d36 > d37;
     i41 = i46 ? i42 : i41;
     i42 = i42 + 1 | 0;
     if ((i42 | 0) == (i39 | 0)) {
      break;
     } else {
      d37 = i46 ? d36 : d37;
     }
    }
    i42 = i4 + (i34 * 36 | 0) + 32 | 0;
    HEAP32[i42 >> 2] = i41;
    if (!((i41 | 0) > -1)) {
     i35 = 35;
     break;
    }
   } else {
    i42 = i4 + (i34 * 36 | 0) + 32 | 0;
    HEAP32[i42 >> 2] = 0;
    i41 = 0;
   }
   if ((i39 | 0) <= (i41 | 0)) {
    i35 = 35;
    break;
   }
   d37 = +HEAPF32[i40 + (i41 << 3) >> 2];
   d45 = +HEAPF32[i40 + (i41 << 3) + 4 >> 2];
   d44 = d24 + (d19 * d37 - d22 * d45);
   d43 = +d44;
   d45 = +(d37 * d22 + d19 * d45 + d25);
   i46 = i4 + (i34 * 36 | 0) + 8 | 0;
   HEAPF32[i46 >> 2] = d43;
   HEAPF32[i46 + 4 >> 2] = d45;
   d44 = +(d44 - d38);
   d45 = +(+HEAPF32[i4 + (i34 * 36 | 0) + 12 >> 2] - +HEAPF32[i4 + (i34 * 36 | 0) + 4 >> 2]);
   i46 = i4 + (i34 * 36 | 0) + 16 | 0;
   HEAPF32[i46 >> 2] = d44;
   HEAPF32[i46 + 4 >> 2] = d45;
   i33 = i33 + 1 | 0;
   HEAP32[654] = (HEAP32[654] | 0) + 1;
   if (i32) {
    i34 = HEAP32[i35 >> 2] | 0;
    i32 = 0;
    do {
     if ((i34 | 0) == (HEAP32[i14 + (i32 << 2) >> 2] | 0) ? (HEAP32[i42 >> 2] | 0) == (HEAP32[i15 + (i32 << 2) >> 2] | 0) : 0) {
      i35 = 42;
      break L3;
     }
     i32 = i32 + 1 | 0;
    } while ((i32 | 0) < (i31 | 0));
   }
   i31 = (HEAP32[i9 >> 2] | 0) + 1 | 0;
   HEAP32[i9 >> 2] = i31;
   if ((i33 | 0) >= 20) {
    i35 = 42;
    break;
   }
  }
  if ((i35 | 0) == 13) {
   ___assert_fail(2712, 2672, 498, 2720);
  } else if ((i35 | 0) == 15) {
   ___assert_fail(2712, 2672, 194, 2856);
  } else if ((i35 | 0) == 16) {
   ___assert_fail(2712, 2672, 207, 2856);
  } else if ((i35 | 0) == 28) {
   ___assert_fail(2776, 2808, 103, 2840);
  } else if ((i35 | 0) == 35) {
   ___assert_fail(2776, 2808, 103, 2840);
  } else if ((i35 | 0) == 42) {
   i12 = HEAP32[656] | 0;
   HEAP32[656] = (i12 | 0) > (i33 | 0) ? i12 : i33;
   i14 = i2 + 8 | 0;
   __ZNK9b2Simplex16GetWitnessPointsEP6b2Vec2S1_(i4, i2, i14);
   d44 = +HEAPF32[i2 >> 2] - +HEAPF32[i14 >> 2];
   i13 = i2 + 4 | 0;
   i12 = i2 + 12 | 0;
   d45 = +HEAPF32[i13 >> 2] - +HEAPF32[i12 >> 2];
   i15 = i2 + 16 | 0;
   HEAPF32[i15 >> 2] = +Math_sqrt(+(d44 * d44 + d45 * d45));
   HEAP32[i2 + 20 >> 2] = i33;
   i9 = HEAP32[i9 >> 2] | 0;
   if ((i9 | 0) == 2) {
    d45 = +HEAPF32[i8 >> 2] - +HEAPF32[i11 >> 2];
    d7 = +HEAPF32[i6 >> 2] - +HEAPF32[i10 >> 2];
    d7 = +Math_sqrt(+(d45 * d45 + d7 * d7));
   } else if ((i9 | 0) == 3) {
    d7 = +HEAPF32[i8 >> 2];
    d45 = +HEAPF32[i6 >> 2];
    d7 = (+HEAPF32[i11 >> 2] - d7) * (+HEAPF32[i4 + 92 >> 2] - d45) - (+HEAPF32[i10 >> 2] - d45) * (+HEAPF32[i4 + 88 >> 2] - d7);
   } else if ((i9 | 0) == 1) {
    d7 = 0.0;
   } else if ((i9 | 0) == 0) {
    ___assert_fail(2712, 2672, 246, 2736);
   } else {
    ___assert_fail(2712, 2672, 259, 2736);
   }
   HEAPF32[i5 >> 2] = d7;
   HEAP16[i5 + 4 >> 1] = i9;
   i6 = 0;
   do {
    HEAP8[i5 + i6 + 6 | 0] = HEAP32[i4 + (i6 * 36 | 0) + 28 >> 2];
    HEAP8[i5 + i6 + 9 | 0] = HEAP32[i4 + (i6 * 36 | 0) + 32 >> 2];
    i6 = i6 + 1 | 0;
   } while ((i6 | 0) < (i9 | 0));
   if ((HEAP8[i3 + 88 | 0] | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   d7 = +HEAPF32[i3 + 24 >> 2];
   d16 = +HEAPF32[i3 + 52 >> 2];
   d18 = +HEAPF32[i15 >> 2];
   d17 = d7 + d16;
   if (!(d18 > d17 & d18 > 1.1920928955078125e-7)) {
    d44 = +((+HEAPF32[i2 >> 2] + +HEAPF32[i14 >> 2]) * .5);
    d45 = +((+HEAPF32[i13 >> 2] + +HEAPF32[i12 >> 2]) * .5);
    i46 = i2;
    HEAPF32[i46 >> 2] = d44;
    HEAPF32[i46 + 4 >> 2] = d45;
    i46 = i14;
    HEAPF32[i46 >> 2] = d44;
    HEAPF32[i46 + 4 >> 2] = d45;
    HEAPF32[i15 >> 2] = 0.0;
    STACKTOP = i1;
    return;
   }
   HEAPF32[i15 >> 2] = d18 - d17;
   d18 = +HEAPF32[i14 >> 2];
   d21 = +HEAPF32[i2 >> 2];
   d24 = d18 - d21;
   d17 = +HEAPF32[i12 >> 2];
   d19 = +HEAPF32[i13 >> 2];
   d22 = d17 - d19;
   d25 = +Math_sqrt(+(d24 * d24 + d22 * d22));
   if (!(d25 < 1.1920928955078125e-7)) {
    d45 = 1.0 / d25;
    d24 = d24 * d45;
    d22 = d22 * d45;
   }
   HEAPF32[i2 >> 2] = d7 * d24 + d21;
   HEAPF32[i13 >> 2] = d7 * d22 + d19;
   HEAPF32[i14 >> 2] = d18 - d16 * d24;
   HEAPF32[i12 >> 2] = d17 - d16 * d22;
   STACKTOP = i1;
   return;
  }
 } else if ((i31 | 0) == 0) {
  ___assert_fail(2712, 2672, 194, 2856);
 } else {
  ___assert_fail(2712, 2672, 207, 2856);
 }
}
function __ZN8b2Island5SolveEP9b2ProfileRK10b2TimeStepRK6b2Vec2b(i4, i8, i11, i17, i7) {
 i4 = i4 | 0;
 i8 = i8 | 0;
 i11 = i11 | 0;
 i17 = i17 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, d5 = 0.0, i6 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i18 = 0, i19 = 0, i20 = 0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, i30 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 160 | 0;
 i6 = i3 + 128 | 0;
 i9 = i3 + 148 | 0;
 i10 = i3 + 96 | 0;
 i16 = i3 + 52 | 0;
 i2 = i3;
 __ZN7b2TimerC2Ev(i9);
 d5 = +HEAPF32[i11 >> 2];
 i1 = i4 + 28 | 0;
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i13 = i4 + 8 | 0;
  i12 = i17 + 4 | 0;
  i15 = i4 + 20 | 0;
  i14 = i4 + 24 | 0;
  i19 = 0;
  do {
   i22 = HEAP32[(HEAP32[i13 >> 2] | 0) + (i19 << 2) >> 2] | 0;
   i18 = i22 + 44 | 0;
   i20 = HEAP32[i18 >> 2] | 0;
   i18 = HEAP32[i18 + 4 >> 2] | 0;
   d21 = +HEAPF32[i22 + 56 >> 2];
   i30 = i22 + 64 | 0;
   d27 = +HEAPF32[i30 >> 2];
   d24 = +HEAPF32[i30 + 4 >> 2];
   d23 = +HEAPF32[i22 + 72 >> 2];
   i30 = i22 + 36 | 0;
   HEAP32[i30 >> 2] = i20;
   HEAP32[i30 + 4 >> 2] = i18;
   HEAPF32[i22 + 52 >> 2] = d21;
   if ((HEAP32[i22 >> 2] | 0) == 2) {
    d25 = +HEAPF32[i22 + 140 >> 2];
    d26 = +HEAPF32[i22 + 120 >> 2];
    d28 = 1.0 - d5 * +HEAPF32[i22 + 132 >> 2];
    d28 = d28 < 1.0 ? d28 : 1.0;
    d28 = d28 < 0.0 ? 0.0 : d28;
    d29 = 1.0 - d5 * +HEAPF32[i22 + 136 >> 2];
    d29 = d29 < 1.0 ? d29 : 1.0;
    d27 = (d27 + d5 * (d25 * +HEAPF32[i17 >> 2] + d26 * +HEAPF32[i22 + 76 >> 2])) * d28;
    d24 = (d24 + d5 * (d25 * +HEAPF32[i12 >> 2] + d26 * +HEAPF32[i22 + 80 >> 2])) * d28;
    d23 = (d23 + d5 * +HEAPF32[i22 + 128 >> 2] * +HEAPF32[i22 + 84 >> 2]) * (d29 < 0.0 ? 0.0 : d29);
   }
   i30 = (HEAP32[i15 >> 2] | 0) + (i19 * 12 | 0) | 0;
   HEAP32[i30 >> 2] = i20;
   HEAP32[i30 + 4 >> 2] = i18;
   HEAPF32[(HEAP32[i15 >> 2] | 0) + (i19 * 12 | 0) + 8 >> 2] = d21;
   d28 = +d27;
   d29 = +d24;
   i30 = (HEAP32[i14 >> 2] | 0) + (i19 * 12 | 0) | 0;
   HEAPF32[i30 >> 2] = d28;
   HEAPF32[i30 + 4 >> 2] = d29;
   HEAPF32[(HEAP32[i14 >> 2] | 0) + (i19 * 12 | 0) + 8 >> 2] = d23;
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i1 >> 2] | 0));
 } else {
  i14 = i4 + 24 | 0;
  i15 = i4 + 20 | 0;
 }
 HEAP32[i10 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i10 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i10 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 i22 = HEAP32[i15 >> 2] | 0;
 HEAP32[i10 + 24 >> 2] = i22;
 i30 = HEAP32[i14 >> 2] | 0;
 HEAP32[i10 + 28 >> 2] = i30;
 HEAP32[i16 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i16 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i16 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i16 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i16 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i16 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 i13 = i4 + 12 | 0;
 HEAP32[i16 + 24 >> 2] = HEAP32[i13 >> 2];
 i12 = i4 + 36 | 0;
 HEAP32[i16 + 28 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i16 + 32 >> 2] = i22;
 HEAP32[i16 + 36 >> 2] = i30;
 HEAP32[i16 + 40 >> 2] = HEAP32[i4 >> 2];
 __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i2, i16);
 __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i2);
 if ((HEAP8[i11 + 20 | 0] | 0) != 0) {
  __ZN15b2ContactSolver9WarmStartEv(i2);
 }
 i16 = i4 + 32 | 0;
 if ((HEAP32[i16 >> 2] | 0) > 0) {
  i18 = i4 + 16 | 0;
  i17 = 0;
  do {
   i30 = HEAP32[(HEAP32[i18 >> 2] | 0) + (i17 << 2) >> 2] | 0;
   FUNCTION_TABLE_vii[HEAP32[(HEAP32[i30 >> 2] | 0) + 28 >> 2] & 15](i30, i10);
   i17 = i17 + 1 | 0;
  } while ((i17 | 0) < (HEAP32[i16 >> 2] | 0));
 }
 HEAPF32[i8 + 12 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 i17 = i11 + 12 | 0;
 if ((HEAP32[i17 >> 2] | 0) > 0) {
  i20 = i4 + 16 | 0;
  i19 = 0;
  do {
   if ((HEAP32[i16 >> 2] | 0) > 0) {
    i18 = 0;
    do {
     i30 = HEAP32[(HEAP32[i20 >> 2] | 0) + (i18 << 2) >> 2] | 0;
     FUNCTION_TABLE_vii[HEAP32[(HEAP32[i30 >> 2] | 0) + 32 >> 2] & 15](i30, i10);
     i18 = i18 + 1 | 0;
    } while ((i18 | 0) < (HEAP32[i16 >> 2] | 0));
   }
   __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i2);
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i17 >> 2] | 0));
 }
 __ZN15b2ContactSolver13StoreImpulsesEv(i2);
 HEAPF32[i8 + 16 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i19 = HEAP32[i14 >> 2] | 0;
  i18 = 0;
  do {
   i30 = HEAP32[i15 >> 2] | 0;
   i17 = i30 + (i18 * 12 | 0) | 0;
   i22 = i17;
   d23 = +HEAPF32[i22 >> 2];
   d21 = +HEAPF32[i22 + 4 >> 2];
   d24 = +HEAPF32[i30 + (i18 * 12 | 0) + 8 >> 2];
   i30 = i19 + (i18 * 12 | 0) | 0;
   d26 = +HEAPF32[i30 >> 2];
   d27 = +HEAPF32[i30 + 4 >> 2];
   d25 = +HEAPF32[i19 + (i18 * 12 | 0) + 8 >> 2];
   d29 = d5 * d26;
   d28 = d5 * d27;
   d28 = d29 * d29 + d28 * d28;
   if (d28 > 4.0) {
    d29 = 2.0 / +Math_sqrt(+d28);
    d26 = d26 * d29;
    d27 = d27 * d29;
   }
   d28 = d5 * d25;
   if (d28 * d28 > 2.4674012660980225) {
    if (!(d28 > 0.0)) {
     d28 = -d28;
    }
    d25 = d25 * (1.5707963705062866 / d28);
   }
   d29 = +(d23 + d5 * d26);
   d28 = +(d21 + d5 * d27);
   i19 = i17;
   HEAPF32[i19 >> 2] = d29;
   HEAPF32[i19 + 4 >> 2] = d28;
   HEAPF32[(HEAP32[i15 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2] = d24 + d5 * d25;
   d28 = +d26;
   d29 = +d27;
   i19 = (HEAP32[i14 >> 2] | 0) + (i18 * 12 | 0) | 0;
   HEAPF32[i19 >> 2] = d28;
   HEAPF32[i19 + 4 >> 2] = d29;
   i19 = HEAP32[i14 >> 2] | 0;
   HEAPF32[i19 + (i18 * 12 | 0) + 8 >> 2] = d25;
   i18 = i18 + 1 | 0;
  } while ((i18 | 0) < (HEAP32[i1 >> 2] | 0));
 }
 i11 = i11 + 16 | 0;
 L41 : do {
  if ((HEAP32[i11 >> 2] | 0) > 0) {
   i17 = i4 + 16 | 0;
   i19 = 0;
   while (1) {
    i18 = __ZN15b2ContactSolver24SolvePositionConstraintsEv(i2) | 0;
    if ((HEAP32[i16 >> 2] | 0) > 0) {
     i20 = 0;
     i22 = 1;
     do {
      i30 = HEAP32[(HEAP32[i17 >> 2] | 0) + (i20 << 2) >> 2] | 0;
      i22 = i22 & (FUNCTION_TABLE_iii[HEAP32[(HEAP32[i30 >> 2] | 0) + 36 >> 2] & 3](i30, i10) | 0);
      i20 = i20 + 1 | 0;
     } while ((i20 | 0) < (HEAP32[i16 >> 2] | 0));
    } else {
     i22 = 1;
    }
    i19 = i19 + 1 | 0;
    if (i18 & i22) {
     i10 = 0;
     break L41;
    }
    if ((i19 | 0) >= (HEAP32[i11 >> 2] | 0)) {
     i10 = 1;
     break;
    }
   }
  } else {
   i10 = 1;
  }
 } while (0);
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i11 = i4 + 8 | 0;
  i16 = 0;
  do {
   i30 = HEAP32[(HEAP32[i11 >> 2] | 0) + (i16 << 2) >> 2] | 0;
   i22 = (HEAP32[i15 >> 2] | 0) + (i16 * 12 | 0) | 0;
   i20 = HEAP32[i22 >> 2] | 0;
   i22 = HEAP32[i22 + 4 >> 2] | 0;
   i17 = i30 + 44 | 0;
   HEAP32[i17 >> 2] = i20;
   HEAP32[i17 + 4 >> 2] = i22;
   d27 = +HEAPF32[(HEAP32[i15 >> 2] | 0) + (i16 * 12 | 0) + 8 >> 2];
   HEAPF32[i30 + 56 >> 2] = d27;
   i17 = (HEAP32[i14 >> 2] | 0) + (i16 * 12 | 0) | 0;
   i18 = HEAP32[i17 + 4 >> 2] | 0;
   i19 = i30 + 64 | 0;
   HEAP32[i19 >> 2] = HEAP32[i17 >> 2];
   HEAP32[i19 + 4 >> 2] = i18;
   HEAPF32[i30 + 72 >> 2] = +HEAPF32[(HEAP32[i14 >> 2] | 0) + (i16 * 12 | 0) + 8 >> 2];
   d25 = +Math_sin(+d27);
   HEAPF32[i30 + 20 >> 2] = d25;
   d27 = +Math_cos(+d27);
   HEAPF32[i30 + 24 >> 2] = d27;
   d26 = +HEAPF32[i30 + 28 >> 2];
   d29 = +HEAPF32[i30 + 32 >> 2];
   d28 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]) - (d27 * d26 - d25 * d29);
   d29 = (HEAP32[tempDoublePtr >> 2] = i22, +HEAPF32[tempDoublePtr >> 2]) - (d25 * d26 + d27 * d29);
   d28 = +d28;
   d29 = +d29;
   i30 = i30 + 12 | 0;
   HEAPF32[i30 >> 2] = d28;
   HEAPF32[i30 + 4 >> 2] = d29;
   i16 = i16 + 1 | 0;
  } while ((i16 | 0) < (HEAP32[i1 >> 2] | 0));
 }
 HEAPF32[i8 + 20 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 i9 = HEAP32[i2 + 40 >> 2] | 0;
 i8 = i4 + 4 | 0;
 if ((HEAP32[i8 >> 2] | 0) != 0 ? (HEAP32[i12 >> 2] | 0) > 0 : 0) {
  i11 = i6 + 16 | 0;
  i14 = 0;
  do {
   i15 = HEAP32[(HEAP32[i13 >> 2] | 0) + (i14 << 2) >> 2] | 0;
   i16 = HEAP32[i9 + (i14 * 152 | 0) + 144 >> 2] | 0;
   HEAP32[i11 >> 2] = i16;
   if ((i16 | 0) > 0) {
    i17 = 0;
    do {
     HEAPF32[i6 + (i17 << 2) >> 2] = +HEAPF32[i9 + (i14 * 152 | 0) + (i17 * 36 | 0) + 16 >> 2];
     HEAPF32[i6 + (i17 << 2) + 8 >> 2] = +HEAPF32[i9 + (i14 * 152 | 0) + (i17 * 36 | 0) + 20 >> 2];
     i17 = i17 + 1 | 0;
    } while ((i17 | 0) != (i16 | 0));
   }
   i30 = HEAP32[i8 >> 2] | 0;
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[i30 >> 2] | 0) + 20 >> 2] & 3](i30, i15, i6);
   i14 = i14 + 1 | 0;
  } while ((i14 | 0) < (HEAP32[i12 >> 2] | 0));
 }
 if (!i7) {
  __ZN15b2ContactSolverD2Ev(i2);
  STACKTOP = i3;
  return;
 }
 i7 = HEAP32[i1 >> 2] | 0;
 i6 = (i7 | 0) > 0;
 if (i6) {
  i8 = HEAP32[i4 + 8 >> 2] | 0;
  i9 = 0;
  d21 = 3.4028234663852886e+38;
  do {
   i11 = HEAP32[i8 + (i9 << 2) >> 2] | 0;
   do {
    if ((HEAP32[i11 >> 2] | 0) != 0) {
     if ((!((HEAP16[i11 + 4 >> 1] & 4) == 0) ? (d29 = +HEAPF32[i11 + 72 >> 2], !(d29 * d29 > .001218469929881394)) : 0) ? (d28 = +HEAPF32[i11 + 64 >> 2], d29 = +HEAPF32[i11 + 68 >> 2], !(d28 * d28 + d29 * d29 > 9999999747378752.0e-20)) : 0) {
      i30 = i11 + 144 | 0;
      d23 = d5 + +HEAPF32[i30 >> 2];
      HEAPF32[i30 >> 2] = d23;
      d21 = d21 < d23 ? d21 : d23;
      break;
     }
     HEAPF32[i11 + 144 >> 2] = 0.0;
     d21 = 0.0;
    }
   } while (0);
   i9 = i9 + 1 | 0;
  } while ((i9 | 0) < (i7 | 0));
 } else {
  d21 = 3.4028234663852886e+38;
 }
 if (!(d21 >= .5) | i10 | i6 ^ 1) {
  __ZN15b2ContactSolverD2Ev(i2);
  STACKTOP = i3;
  return;
 }
 i4 = i4 + 8 | 0;
 i6 = 0;
 do {
  i30 = HEAP32[(HEAP32[i4 >> 2] | 0) + (i6 << 2) >> 2] | 0;
  i22 = i30 + 4 | 0;
  HEAP16[i22 >> 1] = HEAP16[i22 >> 1] & 65533;
  HEAPF32[i30 + 144 >> 2] = 0.0;
  i30 = i30 + 64 | 0;
  HEAP32[i30 + 0 >> 2] = 0;
  HEAP32[i30 + 4 >> 2] = 0;
  HEAP32[i30 + 8 >> 2] = 0;
  HEAP32[i30 + 12 >> 2] = 0;
  HEAP32[i30 + 16 >> 2] = 0;
  HEAP32[i30 + 20 >> 2] = 0;
  i6 = i6 + 1 | 0;
 } while ((i6 | 0) < (HEAP32[i1 >> 2] | 0));
 __ZN15b2ContactSolverD2Ev(i2);
 STACKTOP = i3;
 return;
}
function __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, i32 = 0, i33 = 0, d34 = 0.0, d35 = 0.0, d36 = 0.0, d37 = 0.0, d38 = 0.0, d39 = 0.0, d40 = 0.0, i41 = 0, i42 = 0, d43 = 0.0, d44 = 0.0;
 i1 = STACKTOP;
 i2 = i4 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 40 | 0;
 i4 = i4 + 28 | 0;
 i42 = HEAP32[i4 >> 2] | 0;
 i5 = 0;
 L4 : while (1) {
  i19 = HEAP32[i3 >> 2] | 0;
  i22 = i19 + (i5 * 152 | 0) | 0;
  i8 = HEAP32[i19 + (i5 * 152 | 0) + 112 >> 2] | 0;
  i6 = HEAP32[i19 + (i5 * 152 | 0) + 116 >> 2] | 0;
  d12 = +HEAPF32[i19 + (i5 * 152 | 0) + 120 >> 2];
  d10 = +HEAPF32[i19 + (i5 * 152 | 0) + 128 >> 2];
  d11 = +HEAPF32[i19 + (i5 * 152 | 0) + 124 >> 2];
  d9 = +HEAPF32[i19 + (i5 * 152 | 0) + 132 >> 2];
  i32 = i19 + (i5 * 152 | 0) + 144 | 0;
  i33 = HEAP32[i32 >> 2] | 0;
  i7 = i42 + (i8 * 12 | 0) | 0;
  i41 = i7;
  d21 = +HEAPF32[i41 >> 2];
  d20 = +HEAPF32[i41 + 4 >> 2];
  i41 = i42 + (i6 * 12 | 0) | 0;
  d14 = +HEAPF32[i41 >> 2];
  d13 = +HEAPF32[i41 + 4 >> 2];
  i41 = i19 + (i5 * 152 | 0) + 72 | 0;
  d17 = +HEAPF32[i41 >> 2];
  d16 = +HEAPF32[i41 + 4 >> 2];
  d23 = -d17;
  d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 136 >> 2];
  if ((i33 + -1 | 0) >>> 0 < 2) {
   i41 = 0;
   d18 = +HEAPF32[i42 + (i8 * 12 | 0) + 8 >> 2];
   d15 = +HEAPF32[i42 + (i6 * 12 | 0) + 8 >> 2];
  } else {
   i2 = 4;
   break;
  }
  do {
   d30 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 8 >> 2];
   d26 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 4 >> 2];
   d27 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) >> 2];
   d34 = d24 * +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 16 >> 2];
   i42 = i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 20 | 0;
   d28 = +HEAPF32[i42 >> 2];
   d31 = d28 - +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 28 >> 2] * (d16 * (d14 - d15 * d30 - d21 + d18 * d26) + (d13 + d15 * d25 - d20 - d18 * d27) * d23);
   d29 = -d34;
   d31 = d31 < d34 ? d31 : d34;
   d40 = d31 < d29 ? d29 : d31;
   d39 = d40 - d28;
   HEAPF32[i42 >> 2] = d40;
   d40 = d16 * d39;
   d39 = d39 * d23;
   d21 = d21 - d12 * d40;
   d20 = d20 - d12 * d39;
   d18 = d18 - d10 * (d27 * d39 - d26 * d40);
   d14 = d14 + d11 * d40;
   d13 = d13 + d11 * d39;
   d15 = d15 + d9 * (d25 * d39 - d30 * d40);
   i41 = i41 + 1 | 0;
  } while ((i41 | 0) != (i33 | 0));
  do {
   if ((HEAP32[i32 >> 2] | 0) != 1) {
    i32 = i19 + (i5 * 152 | 0) + 16 | 0;
    d31 = +HEAPF32[i32 >> 2];
    i33 = i19 + (i5 * 152 | 0) + 52 | 0;
    d34 = +HEAPF32[i33 >> 2];
    if (!(d31 >= 0.0) | !(d34 >= 0.0)) {
     i2 = 9;
     break L4;
    }
    d23 = +HEAPF32[i19 + (i5 * 152 | 0) + 12 >> 2];
    d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 8 >> 2];
    d26 = +HEAPF32[i19 + (i5 * 152 | 0) + 4 >> 2];
    d30 = +HEAPF32[i22 >> 2];
    d27 = +HEAPF32[i19 + (i5 * 152 | 0) + 48 >> 2];
    d25 = +HEAPF32[i19 + (i5 * 152 | 0) + 44 >> 2];
    d28 = +HEAPF32[i19 + (i5 * 152 | 0) + 40 >> 2];
    d29 = +HEAPF32[i19 + (i5 * 152 | 0) + 36 >> 2];
    d37 = +HEAPF32[i19 + (i5 * 152 | 0) + 104 >> 2];
    d38 = +HEAPF32[i19 + (i5 * 152 | 0) + 100 >> 2];
    d35 = d17 * (d14 - d15 * d23 - d21 + d18 * d26) + d16 * (d13 + d15 * d24 - d20 - d18 * d30) - +HEAPF32[i19 + (i5 * 152 | 0) + 32 >> 2] - (d31 * +HEAPF32[i19 + (i5 * 152 | 0) + 96 >> 2] + d34 * d37);
    d36 = d17 * (d14 - d15 * d27 - d21 + d18 * d28) + d16 * (d13 + d15 * d25 - d20 - d18 * d29) - +HEAPF32[i19 + (i5 * 152 | 0) + 68 >> 2] - (d31 * d38 + d34 * +HEAPF32[i19 + (i5 * 152 | 0) + 108 >> 2]);
    d44 = +HEAPF32[i19 + (i5 * 152 | 0) + 80 >> 2] * d35 + +HEAPF32[i19 + (i5 * 152 | 0) + 88 >> 2] * d36;
    d43 = d35 * +HEAPF32[i19 + (i5 * 152 | 0) + 84 >> 2] + d36 * +HEAPF32[i19 + (i5 * 152 | 0) + 92 >> 2];
    d40 = -d44;
    d39 = -d43;
    if (!(!(d44 <= -0.0) | !(d43 <= -0.0))) {
     d37 = d40 - d31;
     d43 = d39 - d34;
     d38 = d17 * d37;
     d37 = d16 * d37;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d35 = d38 + d44;
     d36 = d37 + d43;
     HEAPF32[i32 >> 2] = d40;
     HEAPF32[i33 >> 2] = d39;
     d21 = d21 - d12 * d35;
     d20 = d20 - d12 * d36;
     d14 = d14 + d11 * d35;
     d13 = d13 + d11 * d36;
     d18 = d18 - d10 * (d30 * d37 - d26 * d38 + (d29 * d43 - d28 * d44));
     d15 = d15 + d9 * (d24 * d37 - d23 * d38 + (d25 * d43 - d27 * d44));
     break;
    }
    d44 = d35 * +HEAPF32[i19 + (i5 * 152 | 0) + 24 >> 2];
    d39 = -d44;
    if (d44 <= -0.0 ? d36 + d38 * d39 >= 0.0 : 0) {
     d38 = d39 - d31;
     d43 = 0.0 - d34;
     d40 = d17 * d38;
     d38 = d16 * d38;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d36 = d44 + d40;
     d37 = d43 + d38;
     HEAPF32[i32 >> 2] = d39;
     HEAPF32[i33 >> 2] = 0.0;
     d21 = d21 - d12 * d36;
     d20 = d20 - d12 * d37;
     d14 = d14 + d11 * d36;
     d13 = d13 + d11 * d37;
     d18 = d18 - d10 * (d38 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d38 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
     break;
    }
    d44 = d36 * +HEAPF32[i19 + (i5 * 152 | 0) + 60 >> 2];
    d38 = -d44;
    if (d44 <= -0.0 ? d35 + d37 * d38 >= 0.0 : 0) {
     d39 = 0.0 - d31;
     d43 = d38 - d34;
     d40 = d17 * d39;
     d39 = d16 * d39;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d36 = d40 + d44;
     d37 = d39 + d43;
     HEAPF32[i32 >> 2] = 0.0;
     HEAPF32[i33 >> 2] = d38;
     d21 = d21 - d12 * d36;
     d20 = d20 - d12 * d37;
     d14 = d14 + d11 * d36;
     d13 = d13 + d11 * d37;
     d18 = d18 - d10 * (d39 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d39 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
     break;
    }
    if (!(!(d35 >= 0.0) | !(d36 >= 0.0))) {
     d39 = 0.0 - d31;
     d43 = 0.0 - d34;
     d40 = d17 * d39;
     d39 = d16 * d39;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d37 = d40 + d44;
     d38 = d39 + d43;
     HEAPF32[i32 >> 2] = 0.0;
     HEAPF32[i33 >> 2] = 0.0;
     d21 = d21 - d12 * d37;
     d20 = d20 - d12 * d38;
     d14 = d14 + d11 * d37;
     d13 = d13 + d11 * d38;
     d18 = d18 - d10 * (d39 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d39 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
    }
   } else {
    d23 = +HEAPF32[i19 + (i5 * 152 | 0) + 12 >> 2];
    d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 8 >> 2];
    d25 = +HEAPF32[i19 + (i5 * 152 | 0) + 4 >> 2];
    d26 = +HEAPF32[i22 >> 2];
    i22 = i19 + (i5 * 152 | 0) + 16 | 0;
    d27 = +HEAPF32[i22 >> 2];
    d28 = d27 - +HEAPF32[i19 + (i5 * 152 | 0) + 24 >> 2] * (d17 * (d14 - d15 * d23 - d21 + d18 * d25) + d16 * (d13 + d15 * d24 - d20 - d18 * d26) - +HEAPF32[i19 + (i5 * 152 | 0) + 32 >> 2]);
    d44 = d28 > 0.0 ? d28 : 0.0;
    d43 = d44 - d27;
    HEAPF32[i22 >> 2] = d44;
    d44 = d17 * d43;
    d43 = d16 * d43;
    d21 = d21 - d12 * d44;
    d20 = d20 - d12 * d43;
    d14 = d14 + d11 * d44;
    d13 = d13 + d11 * d43;
    d18 = d18 - d10 * (d26 * d43 - d25 * d44);
    d15 = d15 + d9 * (d24 * d43 - d23 * d44);
   }
  } while (0);
  d44 = +d21;
  d43 = +d20;
  i42 = i7;
  HEAPF32[i42 >> 2] = d44;
  HEAPF32[i42 + 4 >> 2] = d43;
  i42 = HEAP32[i4 >> 2] | 0;
  HEAPF32[i42 + (i8 * 12 | 0) + 8 >> 2] = d18;
  d43 = +d14;
  d44 = +d13;
  i42 = i42 + (i6 * 12 | 0) | 0;
  HEAPF32[i42 >> 2] = d43;
  HEAPF32[i42 + 4 >> 2] = d44;
  i42 = HEAP32[i4 >> 2] | 0;
  HEAPF32[i42 + (i6 * 12 | 0) + 8 >> 2] = d15;
  i5 = i5 + 1 | 0;
  if ((i5 | 0) >= (HEAP32[i2 >> 2] | 0)) {
   i2 = 21;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6648, 6520, 311, 6688);
 } else if ((i2 | 0) == 9) {
  ___assert_fail(6720, 6520, 406, 6688);
 } else if ((i2 | 0) == 21) {
  STACKTOP = i1;
  return;
 }
}
function __Z14b2TimeOfImpactP11b2TOIOutputPK10b2TOIInput(i3, i11) {
 i3 = i3 | 0;
 i11 = i11 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, d14 = 0.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, d28 = 0.0, i29 = 0, d30 = 0.0, d31 = 0.0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, i39 = 0, d40 = 0.0, i41 = 0, d42 = 0.0, d43 = 0.0, i44 = 0, i45 = 0, d46 = 0.0, i47 = 0, d48 = 0.0, d49 = 0.0, d50 = 0.0, d51 = 0.0, i52 = 0, d53 = 0.0, d54 = 0.0, d55 = 0.0, d56 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 320 | 0;
 i12 = i1 + 276 | 0;
 i10 = i1 + 240 | 0;
 i13 = i1 + 228 | 0;
 i5 = i1 + 136 | 0;
 i7 = i1 + 112 | 0;
 i8 = i1 + 8 | 0;
 i9 = i1 + 4 | 0;
 i4 = i1;
 HEAP32[874] = (HEAP32[874] | 0) + 1;
 HEAP32[i3 >> 2] = 0;
 i19 = i11 + 128 | 0;
 i2 = i3 + 4 | 0;
 HEAPF32[i2 >> 2] = +HEAPF32[i19 >> 2];
 i6 = i11 + 28 | 0;
 i16 = i12 + 0 | 0;
 i15 = i11 + 56 | 0;
 i17 = i16 + 36 | 0;
 do {
  HEAP32[i16 >> 2] = HEAP32[i15 >> 2];
  i16 = i16 + 4 | 0;
  i15 = i15 + 4 | 0;
 } while ((i16 | 0) < (i17 | 0));
 i16 = i10 + 0 | 0;
 i15 = i11 + 92 | 0;
 i17 = i16 + 36 | 0;
 do {
  HEAP32[i16 >> 2] = HEAP32[i15 >> 2];
  i16 = i16 + 4 | 0;
  i15 = i15 + 4 | 0;
 } while ((i16 | 0) < (i17 | 0));
 i15 = i12 + 24 | 0;
 d42 = +HEAPF32[i15 >> 2];
 d43 = +Math_floor(+(d42 / 6.2831854820251465)) * 6.2831854820251465;
 d42 = d42 - d43;
 HEAPF32[i15 >> 2] = d42;
 i16 = i12 + 28 | 0;
 d43 = +HEAPF32[i16 >> 2] - d43;
 HEAPF32[i16 >> 2] = d43;
 i17 = i10 + 24 | 0;
 d46 = +HEAPF32[i17 >> 2];
 d40 = +Math_floor(+(d46 / 6.2831854820251465)) * 6.2831854820251465;
 d46 = d46 - d40;
 HEAPF32[i17 >> 2] = d46;
 i18 = i10 + 28 | 0;
 d40 = +HEAPF32[i18 >> 2] - d40;
 HEAPF32[i18 >> 2] = d40;
 d14 = +HEAPF32[i19 >> 2];
 d28 = +HEAPF32[i11 + 24 >> 2] + +HEAPF32[i11 + 52 >> 2] + -.014999999664723873;
 d28 = d28 < .004999999888241291 ? .004999999888241291 : d28;
 if (!(d28 > .0012499999720603228)) {
  ___assert_fail(3536, 3560, 280, 3600);
 }
 HEAP16[i13 + 4 >> 1] = 0;
 HEAP32[i5 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i5 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i5 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i5 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 HEAP32[i5 + 24 >> 2] = HEAP32[i11 + 24 >> 2];
 i38 = i5 + 28 | 0;
 HEAP32[i38 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
 HEAP32[i38 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
 HEAP32[i38 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
 HEAP32[i38 + 12 >> 2] = HEAP32[i6 + 12 >> 2];
 HEAP32[i38 + 16 >> 2] = HEAP32[i6 + 16 >> 2];
 HEAP32[i38 + 20 >> 2] = HEAP32[i6 + 20 >> 2];
 HEAP32[i38 + 24 >> 2] = HEAP32[i6 + 24 >> 2];
 HEAP8[i5 + 88 | 0] = 0;
 i38 = i12 + 8 | 0;
 i27 = i12 + 12 | 0;
 i29 = i12 + 16 | 0;
 i22 = i12 + 20 | 0;
 i32 = i12 + 4 | 0;
 i34 = i10 + 8 | 0;
 i36 = i10 + 12 | 0;
 i35 = i10 + 16 | 0;
 i37 = i10 + 20 | 0;
 i33 = i10 + 4 | 0;
 i26 = i5 + 56 | 0;
 i25 = i5 + 64 | 0;
 i24 = i5 + 68 | 0;
 i23 = i5 + 72 | 0;
 i20 = i5 + 80 | 0;
 i19 = i5 + 84 | 0;
 i21 = i7 + 16 | 0;
 d30 = d28 + .0012499999720603228;
 d31 = d28 + -.0012499999720603228;
 d48 = d40;
 i39 = 0;
 d40 = 0.0;
 L4 : while (1) {
  d56 = 1.0 - d40;
  d49 = d56 * d42 + d40 * d43;
  d43 = +Math_sin(+d49);
  d49 = +Math_cos(+d49);
  d55 = +HEAPF32[i12 >> 2];
  d54 = +HEAPF32[i32 >> 2];
  d42 = d56 * d46 + d40 * d48;
  d53 = +Math_sin(+d42);
  d42 = +Math_cos(+d42);
  d46 = +HEAPF32[i10 >> 2];
  d51 = +HEAPF32[i33 >> 2];
  d50 = d56 * +HEAPF32[i34 >> 2] + d40 * +HEAPF32[i35 >> 2] - (d42 * d46 - d53 * d51);
  d51 = d56 * +HEAPF32[i36 >> 2] + d40 * +HEAPF32[i37 >> 2] - (d53 * d46 + d42 * d51);
  d46 = +(d56 * +HEAPF32[i38 >> 2] + d40 * +HEAPF32[i29 >> 2] - (d49 * d55 - d43 * d54));
  d48 = +(d56 * +HEAPF32[i27 >> 2] + d40 * +HEAPF32[i22 >> 2] - (d43 * d55 + d49 * d54));
  i52 = i26;
  HEAPF32[i52 >> 2] = d46;
  HEAPF32[i52 + 4 >> 2] = d48;
  HEAPF32[i25 >> 2] = d43;
  HEAPF32[i24 >> 2] = d49;
  d50 = +d50;
  d51 = +d51;
  i52 = i23;
  HEAPF32[i52 >> 2] = d50;
  HEAPF32[i52 + 4 >> 2] = d51;
  HEAPF32[i20 >> 2] = d53;
  HEAPF32[i19 >> 2] = d42;
  __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i7, i13, i5);
  d42 = +HEAPF32[i21 >> 2];
  if (d42 <= 0.0) {
   i4 = 5;
   break;
  }
  if (d42 < d30) {
   i4 = 7;
   break;
  }
  +__ZN20b2SeparationFunction10InitializeEPK14b2SimplexCachePK15b2DistanceProxyRK7b2SweepS5_S8_f(i8, i13, i11, i12, i6, i10, d40);
  i41 = 0;
  d42 = d14;
  do {
   d50 = +__ZNK20b2SeparationFunction17FindMinSeparationEPiS0_f(i8, i9, i4, d42);
   if (d50 > d30) {
    i4 = 10;
    break L4;
   }
   if (d50 > d31) {
    d40 = d42;
    break;
   }
   i45 = HEAP32[i9 >> 2] | 0;
   i44 = HEAP32[i4 >> 2] | 0;
   d48 = +__ZNK20b2SeparationFunction8EvaluateEiif(i8, i45, i44, d40);
   if (d48 < d31) {
    i4 = 13;
    break L4;
   }
   if (!(d48 <= d30)) {
    d43 = d40;
    d46 = d42;
    i47 = 0;
   } else {
    i4 = 15;
    break L4;
   }
   while (1) {
    if ((i47 & 1 | 0) == 0) {
     d49 = (d43 + d46) * .5;
    } else {
     d49 = d43 + (d28 - d48) * (d46 - d43) / (d50 - d48);
    }
    d51 = +__ZNK20b2SeparationFunction8EvaluateEiif(i8, i45, i44, d49);
    d53 = d51 - d28;
    if (!(d53 > 0.0)) {
     d53 = -d53;
    }
    if (d53 < .0012499999720603228) {
     d42 = d49;
     break;
    }
    i52 = d51 > d28;
    i47 = i47 + 1 | 0;
    HEAP32[880] = (HEAP32[880] | 0) + 1;
    if ((i47 | 0) == 50) {
     i47 = 50;
     break;
    } else {
     d43 = i52 ? d49 : d43;
     d46 = i52 ? d46 : d49;
     d48 = i52 ? d51 : d48;
     d50 = i52 ? d50 : d51;
    }
   }
   i44 = HEAP32[882] | 0;
   HEAP32[882] = (i44 | 0) > (i47 | 0) ? i44 : i47;
   i41 = i41 + 1 | 0;
  } while ((i41 | 0) != 8);
  i39 = i39 + 1 | 0;
  HEAP32[876] = (HEAP32[876] | 0) + 1;
  if ((i39 | 0) == 20) {
   i4 = 27;
   break;
  }
  d42 = +HEAPF32[i15 >> 2];
  d43 = +HEAPF32[i16 >> 2];
  d46 = +HEAPF32[i17 >> 2];
  d48 = +HEAPF32[i18 >> 2];
 }
 if ((i4 | 0) == 5) {
  HEAP32[i3 >> 2] = 2;
  HEAPF32[i2 >> 2] = 0.0;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 7) {
  HEAP32[i3 >> 2] = 3;
  HEAPF32[i2 >> 2] = d40;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 10) {
  HEAP32[i3 >> 2] = 4;
  HEAPF32[i2 >> 2] = d14;
 } else if ((i4 | 0) == 13) {
  HEAP32[i3 >> 2] = 1;
  HEAPF32[i2 >> 2] = d40;
 } else if ((i4 | 0) == 15) {
  HEAP32[i3 >> 2] = 3;
  HEAPF32[i2 >> 2] = d40;
 } else if ((i4 | 0) == 27) {
  HEAP32[i3 >> 2] = 1;
  HEAPF32[i2 >> 2] = d40;
  i39 = 20;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 }
 HEAP32[876] = (HEAP32[876] | 0) + 1;
 i39 = i39 + 1 | 0;
 i2 = HEAP32[878] | 0;
 i52 = (i2 | 0) > (i39 | 0);
 i52 = i52 ? i2 : i39;
 HEAP32[878] = i52;
 STACKTOP = i1;
 return;
}
function __ZN7b2World5SolveERK10b2TimeStep(i5, i15) {
 i5 = i5 | 0;
 i15 = i15 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 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, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, d39 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 96 | 0;
 i4 = i3 + 32 | 0;
 i9 = i3;
 i2 = i3 + 84 | 0;
 i11 = i5 + 103008 | 0;
 HEAPF32[i11 >> 2] = 0.0;
 i14 = i5 + 103012 | 0;
 HEAPF32[i14 >> 2] = 0.0;
 i8 = i5 + 103016 | 0;
 HEAPF32[i8 >> 2] = 0.0;
 i16 = i5 + 102960 | 0;
 i1 = i5 + 102872 | 0;
 i6 = i5 + 68 | 0;
 __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i4, HEAP32[i16 >> 2] | 0, HEAP32[i5 + 102936 >> 2] | 0, HEAP32[i5 + 102964 >> 2] | 0, i6, HEAP32[i5 + 102944 >> 2] | 0);
 i7 = i5 + 102952 | 0;
 i17 = HEAP32[i7 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   i38 = i17 + 4 | 0;
   HEAP16[i38 >> 1] = HEAP16[i38 >> 1] & 65534;
   i17 = HEAP32[i17 + 96 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i17 = HEAP32[i5 + 102932 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   i38 = i17 + 4 | 0;
   HEAP32[i38 >> 2] = HEAP32[i38 >> 2] & -2;
   i17 = HEAP32[i17 + 12 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i17 = HEAP32[i5 + 102956 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   HEAP8[i17 + 60 | 0] = 0;
   i17 = HEAP32[i17 + 12 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i24 = HEAP32[i16 >> 2] | 0;
 i16 = __ZN16b2StackAllocator8AllocateEi(i6, i24 << 2) | 0;
 i32 = HEAP32[i7 >> 2] | 0;
 L13 : do {
  if ((i32 | 0) != 0) {
   i18 = i4 + 28 | 0;
   i30 = i4 + 36 | 0;
   i27 = i4 + 32 | 0;
   i17 = i4 + 40 | 0;
   i23 = i4 + 8 | 0;
   i29 = i4 + 48 | 0;
   i28 = i4 + 16 | 0;
   i26 = i4 + 44 | 0;
   i31 = i4 + 12 | 0;
   i25 = i5 + 102968 | 0;
   i22 = i5 + 102976 | 0;
   i21 = i9 + 12 | 0;
   i20 = i9 + 16 | 0;
   i19 = i9 + 20 | 0;
   L15 : while (1) {
    i33 = i32 + 4 | 0;
    i34 = HEAP16[i33 >> 1] | 0;
    if ((i34 & 35) == 34 ? (HEAP32[i32 >> 2] | 0) != 0 : 0) {
     HEAP32[i18 >> 2] = 0;
     HEAP32[i30 >> 2] = 0;
     HEAP32[i27 >> 2] = 0;
     HEAP32[i16 >> 2] = i32;
     HEAP16[i33 >> 1] = i34 & 65535 | 1;
     i35 = 1;
     do {
      i35 = i35 + -1 | 0;
      i33 = HEAP32[i16 + (i35 << 2) >> 2] | 0;
      i34 = i33 + 4 | 0;
      i36 = HEAP16[i34 >> 1] | 0;
      if ((i36 & 32) == 0) {
       i8 = 13;
       break L15;
      }
      i37 = HEAP32[i18 >> 2] | 0;
      if ((i37 | 0) >= (HEAP32[i17 >> 2] | 0)) {
       i8 = 15;
       break L15;
      }
      HEAP32[i33 + 8 >> 2] = i37;
      i38 = HEAP32[i18 >> 2] | 0;
      HEAP32[(HEAP32[i23 >> 2] | 0) + (i38 << 2) >> 2] = i33;
      HEAP32[i18 >> 2] = i38 + 1;
      i36 = i36 & 65535;
      if ((i36 & 2 | 0) == 0) {
       HEAP16[i34 >> 1] = i36 | 2;
       HEAPF32[i33 + 144 >> 2] = 0.0;
      }
      if ((HEAP32[i33 >> 2] | 0) != 0) {
       i34 = HEAP32[i33 + 112 >> 2] | 0;
       if ((i34 | 0) != 0) {
        do {
         i38 = HEAP32[i34 + 4 >> 2] | 0;
         i36 = i38 + 4 | 0;
         if (((HEAP32[i36 >> 2] & 7 | 0) == 6 ? (HEAP8[(HEAP32[i38 + 48 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) ? (HEAP8[(HEAP32[i38 + 52 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) {
          i37 = HEAP32[i30 >> 2] | 0;
          if ((i37 | 0) >= (HEAP32[i26 >> 2] | 0)) {
           i8 = 25;
           break L15;
          }
          HEAP32[i30 >> 2] = i37 + 1;
          HEAP32[(HEAP32[i31 >> 2] | 0) + (i37 << 2) >> 2] = i38;
          HEAP32[i36 >> 2] = HEAP32[i36 >> 2] | 1;
          i38 = HEAP32[i34 >> 2] | 0;
          i36 = i38 + 4 | 0;
          i37 = HEAP16[i36 >> 1] | 0;
          if ((i37 & 1) == 0) {
           if ((i35 | 0) >= (i24 | 0)) {
            i8 = 28;
            break L15;
           }
           HEAP32[i16 + (i35 << 2) >> 2] = i38;
           HEAP16[i36 >> 1] = i37 & 65535 | 1;
           i35 = i35 + 1 | 0;
          }
         }
         i34 = HEAP32[i34 + 12 >> 2] | 0;
        } while ((i34 | 0) != 0);
       }
       i33 = HEAP32[i33 + 108 >> 2] | 0;
       if ((i33 | 0) != 0) {
        do {
         i37 = i33 + 4 | 0;
         i36 = HEAP32[i37 >> 2] | 0;
         if ((HEAP8[i36 + 60 | 0] | 0) == 0 ? (i10 = HEAP32[i33 >> 2] | 0, i13 = i10 + 4 | 0, i12 = HEAP16[i13 >> 1] | 0, !((i12 & 32) == 0)) : 0) {
          i34 = HEAP32[i27 >> 2] | 0;
          if ((i34 | 0) >= (HEAP32[i29 >> 2] | 0)) {
           i8 = 35;
           break L15;
          }
          HEAP32[i27 >> 2] = i34 + 1;
          HEAP32[(HEAP32[i28 >> 2] | 0) + (i34 << 2) >> 2] = i36;
          HEAP8[(HEAP32[i37 >> 2] | 0) + 60 | 0] = 1;
          if ((i12 & 1) == 0) {
           if ((i35 | 0) >= (i24 | 0)) {
            i8 = 38;
            break L15;
           }
           HEAP32[i16 + (i35 << 2) >> 2] = i10;
           HEAP16[i13 >> 1] = i12 & 65535 | 1;
           i35 = i35 + 1 | 0;
          }
         }
         i33 = HEAP32[i33 + 12 >> 2] | 0;
        } while ((i33 | 0) != 0);
       }
      }
     } while ((i35 | 0) > 0);
     __ZN8b2Island5SolveEP9b2ProfileRK10b2TimeStepRK6b2Vec2b(i4, i9, i15, i25, (HEAP8[i22] | 0) != 0);
     HEAPF32[i11 >> 2] = +HEAPF32[i21 >> 2] + +HEAPF32[i11 >> 2];
     HEAPF32[i14 >> 2] = +HEAPF32[i20 >> 2] + +HEAPF32[i14 >> 2];
     HEAPF32[i8 >> 2] = +HEAPF32[i19 >> 2] + +HEAPF32[i8 >> 2];
     i35 = HEAP32[i18 >> 2] | 0;
     if ((i35 | 0) > 0) {
      i33 = HEAP32[i23 >> 2] | 0;
      i36 = 0;
      do {
       i34 = HEAP32[i33 + (i36 << 2) >> 2] | 0;
       if ((HEAP32[i34 >> 2] | 0) == 0) {
        i38 = i34 + 4 | 0;
        HEAP16[i38 >> 1] = HEAP16[i38 >> 1] & 65534;
       }
       i36 = i36 + 1 | 0;
      } while ((i36 | 0) < (i35 | 0));
     }
    }
    i32 = HEAP32[i32 + 96 >> 2] | 0;
    if ((i32 | 0) == 0) {
     break L13;
    }
   }
   if ((i8 | 0) == 13) {
    ___assert_fail(2232, 2184, 445, 2256);
   } else if ((i8 | 0) == 15) {
    ___assert_fail(2520, 2440, 54, 2472);
   } else if ((i8 | 0) == 25) {
    ___assert_fail(2480, 2440, 62, 2472);
   } else if ((i8 | 0) == 28) {
    ___assert_fail(2264, 2184, 495, 2256);
   } else if ((i8 | 0) == 35) {
    ___assert_fail(2408, 2440, 68, 2472);
   } else if ((i8 | 0) == 38) {
    ___assert_fail(2264, 2184, 524, 2256);
   }
  }
 } while (0);
 __ZN16b2StackAllocator4FreeEPv(i6, i16);
 __ZN7b2TimerC2Ev(i2);
 i6 = HEAP32[i7 >> 2] | 0;
 if ((i6 | 0) == 0) {
  __ZN16b2ContactManager15FindNewContactsEv(i1);
  d39 = +__ZNK7b2Timer15GetMillisecondsEv(i2);
  i38 = i5 + 103020 | 0;
  HEAPF32[i38 >> 2] = d39;
  __ZN8b2IslandD2Ev(i4);
  STACKTOP = i3;
  return;
 }
 do {
  if (!((HEAP16[i6 + 4 >> 1] & 1) == 0) ? (HEAP32[i6 >> 2] | 0) != 0 : 0) {
   __ZN6b2Body19SynchronizeFixturesEv(i6);
  }
  i6 = HEAP32[i6 + 96 >> 2] | 0;
 } while ((i6 | 0) != 0);
 __ZN16b2ContactManager15FindNewContactsEv(i1);
 d39 = +__ZNK7b2Timer15GetMillisecondsEv(i2);
 i38 = i5 + 103020 | 0;
 HEAPF32[i38 >> 2] = d39;
 __ZN8b2IslandD2Ev(i4);
 STACKTOP = i3;
 return;
}
function __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i10) {
 i10 = i10 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, i31 = 0, d32 = 0.0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, i42 = 0, d43 = 0.0, d44 = 0.0, d45 = 0.0, d46 = 0.0, d47 = 0.0, d48 = 0.0, i49 = 0, i50 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i8 = i1 + 40 | 0;
 i3 = i1 + 24 | 0;
 i5 = i1;
 i4 = i10 + 48 | 0;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i9 = i10 + 40 | 0;
 i2 = i10 + 36 | 0;
 i7 = i10 + 44 | 0;
 i6 = i10 + 24 | 0;
 i13 = i10 + 28 | 0;
 i14 = i8 + 8 | 0;
 i12 = i8 + 12 | 0;
 i11 = i3 + 8 | 0;
 i10 = i3 + 12 | 0;
 i16 = 0;
 while (1) {
  i15 = HEAP32[i9 >> 2] | 0;
  i33 = HEAP32[i2 >> 2] | 0;
  i31 = HEAP32[(HEAP32[i7 >> 2] | 0) + (HEAP32[i15 + (i16 * 152 | 0) + 148 >> 2] << 2) >> 2] | 0;
  i35 = HEAP32[i15 + (i16 * 152 | 0) + 112 >> 2] | 0;
  i42 = HEAP32[i15 + (i16 * 152 | 0) + 116 >> 2] | 0;
  d30 = +HEAPF32[i15 + (i16 * 152 | 0) + 120 >> 2];
  d24 = +HEAPF32[i15 + (i16 * 152 | 0) + 124 >> 2];
  d17 = +HEAPF32[i15 + (i16 * 152 | 0) + 128 >> 2];
  d18 = +HEAPF32[i15 + (i16 * 152 | 0) + 132 >> 2];
  i36 = i33 + (i16 * 88 | 0) + 48 | 0;
  d39 = +HEAPF32[i36 >> 2];
  d40 = +HEAPF32[i36 + 4 >> 2];
  i36 = i33 + (i16 * 88 | 0) + 56 | 0;
  d41 = +HEAPF32[i36 >> 2];
  d43 = +HEAPF32[i36 + 4 >> 2];
  i36 = HEAP32[i6 >> 2] | 0;
  i37 = i36 + (i35 * 12 | 0) | 0;
  d26 = +HEAPF32[i37 >> 2];
  d27 = +HEAPF32[i37 + 4 >> 2];
  d32 = +HEAPF32[i36 + (i35 * 12 | 0) + 8 >> 2];
  i37 = HEAP32[i13 >> 2] | 0;
  i34 = i37 + (i35 * 12 | 0) | 0;
  d22 = +HEAPF32[i34 >> 2];
  d25 = +HEAPF32[i34 + 4 >> 2];
  d23 = +HEAPF32[i37 + (i35 * 12 | 0) + 8 >> 2];
  i35 = i36 + (i42 * 12 | 0) | 0;
  d28 = +HEAPF32[i35 >> 2];
  d29 = +HEAPF32[i35 + 4 >> 2];
  d38 = +HEAPF32[i36 + (i42 * 12 | 0) + 8 >> 2];
  i36 = i37 + (i42 * 12 | 0) | 0;
  d20 = +HEAPF32[i36 >> 2];
  d19 = +HEAPF32[i36 + 4 >> 2];
  d21 = +HEAPF32[i37 + (i42 * 12 | 0) + 8 >> 2];
  if ((HEAP32[i31 + 124 >> 2] | 0) <= 0) {
   i2 = 4;
   break;
  }
  d44 = +HEAPF32[i33 + (i16 * 88 | 0) + 80 >> 2];
  d45 = +HEAPF32[i33 + (i16 * 88 | 0) + 76 >> 2];
  d47 = +Math_sin(+d32);
  HEAPF32[i14 >> 2] = d47;
  d48 = +Math_cos(+d32);
  HEAPF32[i12 >> 2] = d48;
  d32 = +Math_sin(+d38);
  HEAPF32[i11 >> 2] = d32;
  d38 = +Math_cos(+d38);
  HEAPF32[i10 >> 2] = d38;
  d46 = +(d26 - (d39 * d48 - d40 * d47));
  d40 = +(d27 - (d40 * d48 + d39 * d47));
  i37 = i8;
  HEAPF32[i37 >> 2] = d46;
  HEAPF32[i37 + 4 >> 2] = d40;
  d40 = +(d28 - (d41 * d38 - d43 * d32));
  d43 = +(d29 - (d43 * d38 + d41 * d32));
  i37 = i3;
  HEAPF32[i37 >> 2] = d40;
  HEAPF32[i37 + 4 >> 2] = d43;
  __ZN15b2WorldManifold10InitializeEPK10b2ManifoldRK11b2TransformfS5_f(i5, i31 + 64 | 0, i8, d45, i3, d44);
  i37 = i15 + (i16 * 152 | 0) + 72 | 0;
  i42 = i5;
  i33 = HEAP32[i42 + 4 >> 2] | 0;
  i31 = i37;
  HEAP32[i31 >> 2] = HEAP32[i42 >> 2];
  HEAP32[i31 + 4 >> 2] = i33;
  i31 = i15 + (i16 * 152 | 0) + 144 | 0;
  i33 = HEAP32[i31 >> 2] | 0;
  do {
   if ((i33 | 0) > 0) {
    i36 = i15 + (i16 * 152 | 0) + 76 | 0;
    d32 = d30 + d24;
    i35 = i15 + (i16 * 152 | 0) + 140 | 0;
    i34 = 0;
    do {
     i49 = i5 + (i34 << 3) + 8 | 0;
     d41 = +HEAPF32[i49 >> 2] - d26;
     i42 = i5 + (i34 << 3) + 12 | 0;
     d39 = +d41;
     d40 = +(+HEAPF32[i42 >> 2] - d27);
     i50 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) | 0;
     HEAPF32[i50 >> 2] = d39;
     HEAPF32[i50 + 4 >> 2] = d40;
     d40 = +HEAPF32[i49 >> 2] - d28;
     d39 = +d40;
     d47 = +(+HEAPF32[i42 >> 2] - d29);
     i42 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 8 | 0;
     HEAPF32[i42 >> 2] = d39;
     HEAPF32[i42 + 4 >> 2] = d47;
     d47 = +HEAPF32[i36 >> 2];
     d39 = +HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 4 >> 2];
     d43 = +HEAPF32[i37 >> 2];
     d48 = d41 * d47 - d39 * d43;
     d38 = +HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 12 >> 2];
     d43 = d47 * d40 - d43 * d38;
     d43 = d32 + d48 * d17 * d48 + d43 * d18 * d43;
     if (d43 > 0.0) {
      d43 = 1.0 / d43;
     } else {
      d43 = 0.0;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 24 >> 2] = d43;
     d43 = +HEAPF32[i36 >> 2];
     d47 = -+HEAPF32[i37 >> 2];
     d48 = d41 * d47 - d43 * d39;
     d43 = d40 * d47 - d43 * d38;
     d43 = d32 + d48 * d17 * d48 + d43 * d18 * d43;
     if (d43 > 0.0) {
      d43 = 1.0 / d43;
     } else {
      d43 = 0.0;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 28 >> 2] = d43;
     i42 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 32 | 0;
     HEAPF32[i42 >> 2] = 0.0;
     d38 = +HEAPF32[i37 >> 2] * (d20 - d21 * d38 - d22 + d23 * d39) + +HEAPF32[i36 >> 2] * (d19 + d21 * d40 - d25 - d23 * d41);
     if (d38 < -1.0) {
      HEAPF32[i42 >> 2] = -(d38 * +HEAPF32[i35 >> 2]);
     }
     i34 = i34 + 1 | 0;
    } while ((i34 | 0) != (i33 | 0));
    if ((HEAP32[i31 >> 2] | 0) == 2) {
     d45 = +HEAPF32[i15 + (i16 * 152 | 0) + 76 >> 2];
     d20 = +HEAPF32[i37 >> 2];
     d44 = +HEAPF32[i15 + (i16 * 152 | 0) >> 2] * d45 - +HEAPF32[i15 + (i16 * 152 | 0) + 4 >> 2] * d20;
     d19 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 8 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 12 >> 2];
     d47 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 36 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 40 >> 2];
     d20 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 44 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 48 >> 2];
     d45 = d30 + d24;
     d46 = d17 * d44;
     d48 = d18 * d19;
     d19 = d45 + d44 * d46 + d19 * d48;
     d18 = d45 + d47 * d17 * d47 + d20 * d18 * d20;
     d17 = d45 + d46 * d47 + d48 * d20;
     d20 = d19 * d18 - d17 * d17;
     if (!(d19 * d19 < d20 * 1.0e3)) {
      HEAP32[i31 >> 2] = 1;
      break;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + 96 >> 2] = d19;
     HEAPF32[i15 + (i16 * 152 | 0) + 100 >> 2] = d17;
     HEAPF32[i15 + (i16 * 152 | 0) + 104 >> 2] = d17;
     HEAPF32[i15 + (i16 * 152 | 0) + 108 >> 2] = d18;
     if (d20 != 0.0) {
      d20 = 1.0 / d20;
     }
     d48 = -(d20 * d17);
     HEAPF32[i15 + (i16 * 152 | 0) + 80 >> 2] = d18 * d20;
     HEAPF32[i15 + (i16 * 152 | 0) + 84 >> 2] = d48;
     HEAPF32[i15 + (i16 * 152 | 0) + 88 >> 2] = d48;
     HEAPF32[i15 + (i16 * 152 | 0) + 92 >> 2] = d19 * d20;
    }
   }
  } while (0);
  i16 = i16 + 1 | 0;
  if ((i16 | 0) >= (HEAP32[i4 >> 2] | 0)) {
   i2 = 21;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6584, 6520, 168, 6616);
 } else if ((i2 | 0) == 21) {
  STACKTOP = i1;
  return;
 }
}
function __Z17b2CollidePolygonsP10b2ManifoldPK14b2PolygonShapeRK11b2TransformS3_S6_(i5, i27, i28, i24, i14) {
 i5 = i5 | 0;
 i27 = i27 | 0;
 i28 = i28 | 0;
 i24 = i24 | 0;
 i14 = i14 | 0;
 var i1 = 0, i2 = 0, d3 = 0.0, i4 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d25 = 0.0, d26 = 0.0, d29 = 0.0, d30 = 0.0, i31 = 0, d32 = 0.0, i33 = 0, i34 = 0, d35 = 0.0, d36 = 0.0, d37 = 0.0, d38 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 96 | 0;
 i17 = i1 + 92 | 0;
 i20 = i1 + 88 | 0;
 i13 = i1;
 i11 = i1 + 80 | 0;
 i12 = i1 + 56 | 0;
 i4 = i1 + 32 | 0;
 i10 = i1 + 24 | 0;
 i2 = i5 + 60 | 0;
 HEAP32[i2 >> 2] = 0;
 d3 = +HEAPF32[i27 + 8 >> 2] + +HEAPF32[i24 + 8 >> 2];
 HEAP32[i17 >> 2] = 0;
 d7 = +__ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i17, i27, i28, i24, i14);
 if (d7 > d3) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i20 >> 2] = 0;
 d6 = +__ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i20, i24, i14, i27, i28);
 if (d6 > d3) {
  STACKTOP = i1;
  return;
 }
 if (d6 > d7 * .9800000190734863 + .0010000000474974513) {
  d18 = +HEAPF32[i14 >> 2];
  d19 = +HEAPF32[i14 + 4 >> 2];
  d15 = +HEAPF32[i14 + 8 >> 2];
  d16 = +HEAPF32[i14 + 12 >> 2];
  d9 = +HEAPF32[i28 >> 2];
  d6 = +HEAPF32[i28 + 4 >> 2];
  d7 = +HEAPF32[i28 + 8 >> 2];
  d8 = +HEAPF32[i28 + 12 >> 2];
  i17 = HEAP32[i20 >> 2] | 0;
  HEAP32[i5 + 56 >> 2] = 2;
  i14 = 1;
  i20 = i24;
 } else {
  d18 = +HEAPF32[i28 >> 2];
  d19 = +HEAPF32[i28 + 4 >> 2];
  d15 = +HEAPF32[i28 + 8 >> 2];
  d16 = +HEAPF32[i28 + 12 >> 2];
  d9 = +HEAPF32[i14 >> 2];
  d6 = +HEAPF32[i14 + 4 >> 2];
  d7 = +HEAPF32[i14 + 8 >> 2];
  d8 = +HEAPF32[i14 + 12 >> 2];
  i17 = HEAP32[i17 >> 2] | 0;
  HEAP32[i5 + 56 >> 2] = 1;
  i14 = 0;
  i20 = i27;
  i27 = i24;
 }
 i28 = HEAP32[i27 + 148 >> 2] | 0;
 if (!((i17 | 0) > -1)) {
  ___assert_fail(5640, 5688, 151, 5728);
 }
 i24 = HEAP32[i20 + 148 >> 2] | 0;
 if ((i24 | 0) <= (i17 | 0)) {
  ___assert_fail(5640, 5688, 151, 5728);
 }
 d21 = +HEAPF32[i20 + (i17 << 3) + 84 >> 2];
 d36 = +HEAPF32[i20 + (i17 << 3) + 88 >> 2];
 d22 = d16 * d21 - d15 * d36;
 d36 = d15 * d21 + d16 * d36;
 d21 = d8 * d22 + d7 * d36;
 d22 = d8 * d36 - d7 * d22;
 if ((i28 | 0) > 0) {
  i33 = 0;
  i34 = 0;
  d23 = 3.4028234663852886e+38;
  while (1) {
   d25 = d21 * +HEAPF32[i27 + (i33 << 3) + 84 >> 2] + d22 * +HEAPF32[i27 + (i33 << 3) + 88 >> 2];
   i31 = d25 < d23;
   i34 = i31 ? i33 : i34;
   i33 = i33 + 1 | 0;
   if ((i33 | 0) == (i28 | 0)) {
    break;
   } else {
    d23 = i31 ? d25 : d23;
   }
  }
 } else {
  i34 = 0;
 }
 i31 = i34 + 1 | 0;
 i33 = (i31 | 0) < (i28 | 0) ? i31 : 0;
 d35 = +HEAPF32[i27 + (i34 << 3) + 20 >> 2];
 d32 = +HEAPF32[i27 + (i34 << 3) + 24 >> 2];
 d36 = +(d9 + (d8 * d35 - d7 * d32));
 d32 = +(d6 + (d7 * d35 + d8 * d32));
 i31 = i13;
 HEAPF32[i31 >> 2] = d36;
 HEAPF32[i31 + 4 >> 2] = d32;
 i31 = i17 & 255;
 i28 = i13 + 8 | 0;
 HEAP8[i28] = i31;
 HEAP8[i28 + 1 | 0] = i34;
 HEAP8[i28 + 2 | 0] = 1;
 HEAP8[i28 + 3 | 0] = 0;
 d32 = +HEAPF32[i27 + (i33 << 3) + 20 >> 2];
 d36 = +HEAPF32[i27 + (i33 << 3) + 24 >> 2];
 d35 = +(d9 + (d8 * d32 - d7 * d36));
 d36 = +(d6 + (d7 * d32 + d8 * d36));
 i27 = i13 + 12 | 0;
 HEAPF32[i27 >> 2] = d35;
 HEAPF32[i27 + 4 >> 2] = d36;
 i27 = i13 + 20 | 0;
 HEAP8[i27] = i31;
 HEAP8[i27 + 1 | 0] = i33;
 HEAP8[i27 + 2 | 0] = 1;
 HEAP8[i27 + 3 | 0] = 0;
 i27 = i17 + 1 | 0;
 i24 = (i27 | 0) < (i24 | 0) ? i27 : 0;
 i34 = i20 + (i17 << 3) + 20 | 0;
 d26 = +HEAPF32[i34 >> 2];
 d25 = +HEAPF32[i34 + 4 >> 2];
 i34 = i20 + (i24 << 3) + 20 | 0;
 d30 = +HEAPF32[i34 >> 2];
 d29 = +HEAPF32[i34 + 4 >> 2];
 d32 = d30 - d26;
 d35 = d29 - d25;
 d21 = +Math_sqrt(+(d32 * d32 + d35 * d35));
 if (!(d21 < 1.1920928955078125e-7)) {
  d36 = 1.0 / d21;
  d32 = d32 * d36;
  d35 = d35 * d36;
 }
 d36 = d16 * d32 - d15 * d35;
 d21 = d16 * d35 + d15 * d32;
 HEAPF32[i11 >> 2] = d36;
 HEAPF32[i11 + 4 >> 2] = d21;
 d22 = -d36;
 d38 = d18 + (d16 * d26 - d15 * d25);
 d37 = d19 + (d15 * d26 + d16 * d25);
 d23 = d38 * d21 + d37 * d22;
 HEAPF32[i10 >> 2] = d22;
 HEAPF32[i10 + 4 >> 2] = -d21;
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i12, i13, i10, d3 - (d38 * d36 + d37 * d21), i17) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i4, i12, i11, d3 + ((d18 + (d16 * d30 - d15 * d29)) * d36 + (d19 + (d15 * d30 + d16 * d29)) * d21), i24) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 d16 = +d35;
 d15 = +-d32;
 i10 = i5 + 40 | 0;
 HEAPF32[i10 >> 2] = d16;
 HEAPF32[i10 + 4 >> 2] = d15;
 d15 = +((d26 + d30) * .5);
 d16 = +((d25 + d29) * .5);
 i10 = i5 + 48 | 0;
 HEAPF32[i10 >> 2] = d15;
 HEAPF32[i10 + 4 >> 2] = d16;
 d16 = +HEAPF32[i4 >> 2];
 d15 = +HEAPF32[i4 + 4 >> 2];
 i10 = !(d21 * d16 + d15 * d22 - d23 <= d3);
 if (i14 << 24 >> 24 == 0) {
  if (i10) {
   i10 = 0;
  } else {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i10 = i5;
   HEAPF32[i10 >> 2] = d37;
   HEAPF32[i10 + 4 >> 2] = d38;
   HEAP32[i5 + 16 >> 2] = HEAP32[i4 + 8 >> 2];
   i10 = 1;
  }
  d16 = +HEAPF32[i4 + 12 >> 2];
  d15 = +HEAPF32[i4 + 16 >> 2];
  if (d21 * d16 + d15 * d22 - d23 <= d3) {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i34 = i5 + (i10 * 20 | 0) | 0;
   HEAPF32[i34 >> 2] = d37;
   HEAPF32[i34 + 4 >> 2] = d38;
   HEAP32[i5 + (i10 * 20 | 0) + 16 >> 2] = HEAP32[i4 + 20 >> 2];
   i10 = i10 + 1 | 0;
  }
 } else {
  if (i10) {
   i10 = 0;
  } else {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i10 = i5;
   HEAPF32[i10 >> 2] = d37;
   HEAPF32[i10 + 4 >> 2] = d38;
   i10 = i5 + 16 | 0;
   i34 = HEAP32[i4 + 8 >> 2] | 0;
   HEAP32[i10 >> 2] = i34;
   HEAP8[i10] = i34 >>> 8;
   HEAP8[i10 + 1 | 0] = i34;
   HEAP8[i10 + 2 | 0] = i34 >>> 24;
   HEAP8[i10 + 3 | 0] = i34 >>> 16;
   i10 = 1;
  }
  d16 = +HEAPF32[i4 + 12 >> 2];
  d15 = +HEAPF32[i4 + 16 >> 2];
  if (d21 * d16 + d15 * d22 - d23 <= d3) {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i34 = i5 + (i10 * 20 | 0) | 0;
   HEAPF32[i34 >> 2] = d37;
   HEAPF32[i34 + 4 >> 2] = d38;
   i34 = i5 + (i10 * 20 | 0) + 16 | 0;
   i33 = HEAP32[i4 + 20 >> 2] | 0;
   HEAP32[i34 >> 2] = i33;
   HEAP8[i34] = i33 >>> 8;
   HEAP8[i34 + 1 | 0] = i33;
   HEAP8[i34 + 2 | 0] = i33 >>> 24;
   HEAP8[i34 + 3 | 0] = i33 >>> 16;
   i10 = i10 + 1 | 0;
  }
 }
 HEAP32[i2 >> 2] = i10;
 STACKTOP = i1;
 return;
}
function __ZN8b2Island8SolveTOIERK10b2TimeStepii(i4, i11, i15, i18) {
 i4 = i4 | 0;
 i11 = i11 | 0;
 i15 = i15 | 0;
 i18 = i18 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d16 = 0.0, d17 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, d26 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 128 | 0;
 i2 = i1 + 96 | 0;
 i10 = i1 + 52 | 0;
 i3 = i1;
 i6 = i4 + 28 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 if ((i5 | 0) <= (i15 | 0)) {
  ___assert_fail(5464, 5488, 386, 5520);
 }
 if ((i5 | 0) <= (i18 | 0)) {
  ___assert_fail(5536, 5488, 387, 5520);
 }
 if ((i5 | 0) > 0) {
  i9 = i4 + 8 | 0;
  i8 = i4 + 20 | 0;
  i7 = i4 + 24 | 0;
  i22 = 0;
  while (1) {
   i23 = HEAP32[(HEAP32[i9 >> 2] | 0) + (i22 << 2) >> 2] | 0;
   i5 = i23 + 44 | 0;
   i24 = HEAP32[i5 + 4 >> 2] | 0;
   i25 = (HEAP32[i8 >> 2] | 0) + (i22 * 12 | 0) | 0;
   HEAP32[i25 >> 2] = HEAP32[i5 >> 2];
   HEAP32[i25 + 4 >> 2] = i24;
   HEAPF32[(HEAP32[i8 >> 2] | 0) + (i22 * 12 | 0) + 8 >> 2] = +HEAPF32[i23 + 56 >> 2];
   i25 = i23 + 64 | 0;
   i24 = HEAP32[i25 + 4 >> 2] | 0;
   i5 = (HEAP32[i7 >> 2] | 0) + (i22 * 12 | 0) | 0;
   HEAP32[i5 >> 2] = HEAP32[i25 >> 2];
   HEAP32[i5 + 4 >> 2] = i24;
   i5 = HEAP32[i7 >> 2] | 0;
   HEAPF32[i5 + (i22 * 12 | 0) + 8 >> 2] = +HEAPF32[i23 + 72 >> 2];
   i22 = i22 + 1 | 0;
   if ((i22 | 0) >= (HEAP32[i6 >> 2] | 0)) {
    i22 = i5;
    break;
   }
  }
 } else {
  i8 = i4 + 20 | 0;
  i22 = HEAP32[i4 + 24 >> 2] | 0;
 }
 i5 = i4 + 12 | 0;
 HEAP32[i10 + 24 >> 2] = HEAP32[i5 >> 2];
 i7 = i4 + 36 | 0;
 HEAP32[i10 + 28 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i10 + 40 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i10 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i10 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i10 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 HEAP32[i10 + 32 >> 2] = HEAP32[i8 >> 2];
 i9 = i4 + 24 | 0;
 HEAP32[i10 + 36 >> 2] = i22;
 __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i3, i10);
 i10 = i11 + 16 | 0;
 L13 : do {
  if ((HEAP32[i10 >> 2] | 0) > 0) {
   i22 = 0;
   do {
    i22 = i22 + 1 | 0;
    if (__ZN15b2ContactSolver27SolveTOIPositionConstraintsEii(i3, i15, i18) | 0) {
     break L13;
    }
   } while ((i22 | 0) < (HEAP32[i10 >> 2] | 0));
  }
 } while (0);
 i10 = i4 + 8 | 0;
 i24 = (HEAP32[i8 >> 2] | 0) + (i15 * 12 | 0) | 0;
 i25 = HEAP32[i24 + 4 >> 2] | 0;
 i23 = (HEAP32[(HEAP32[i10 >> 2] | 0) + (i15 << 2) >> 2] | 0) + 36 | 0;
 HEAP32[i23 >> 2] = HEAP32[i24 >> 2];
 HEAP32[i23 + 4 >> 2] = i25;
 i23 = HEAP32[i8 >> 2] | 0;
 i25 = HEAP32[i10 >> 2] | 0;
 HEAPF32[(HEAP32[i25 + (i15 << 2) >> 2] | 0) + 52 >> 2] = +HEAPF32[i23 + (i15 * 12 | 0) + 8 >> 2];
 i23 = i23 + (i18 * 12 | 0) | 0;
 i24 = HEAP32[i23 + 4 >> 2] | 0;
 i25 = (HEAP32[i25 + (i18 << 2) >> 2] | 0) + 36 | 0;
 HEAP32[i25 >> 2] = HEAP32[i23 >> 2];
 HEAP32[i25 + 4 >> 2] = i24;
 HEAPF32[(HEAP32[(HEAP32[i10 >> 2] | 0) + (i18 << 2) >> 2] | 0) + 52 >> 2] = +HEAPF32[(HEAP32[i8 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2];
 __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i3);
 i18 = i11 + 12 | 0;
 if ((HEAP32[i18 >> 2] | 0) > 0) {
  i15 = 0;
  do {
   __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i3);
   i15 = i15 + 1 | 0;
  } while ((i15 | 0) < (HEAP32[i18 >> 2] | 0));
 }
 d16 = +HEAPF32[i11 >> 2];
 if ((HEAP32[i6 >> 2] | 0) > 0) {
  i15 = 0;
  do {
   i25 = HEAP32[i8 >> 2] | 0;
   i11 = i25 + (i15 * 12 | 0) | 0;
   i24 = i11;
   d12 = +HEAPF32[i24 >> 2];
   d14 = +HEAPF32[i24 + 4 >> 2];
   d13 = +HEAPF32[i25 + (i15 * 12 | 0) + 8 >> 2];
   i25 = HEAP32[i9 >> 2] | 0;
   i24 = i25 + (i15 * 12 | 0) | 0;
   d19 = +HEAPF32[i24 >> 2];
   d20 = +HEAPF32[i24 + 4 >> 2];
   d17 = +HEAPF32[i25 + (i15 * 12 | 0) + 8 >> 2];
   d26 = d16 * d19;
   d21 = d16 * d20;
   d21 = d26 * d26 + d21 * d21;
   if (d21 > 4.0) {
    d26 = 2.0 / +Math_sqrt(+d21);
    d19 = d19 * d26;
    d20 = d20 * d26;
   }
   d21 = d16 * d17;
   if (d21 * d21 > 2.4674012660980225) {
    if (!(d21 > 0.0)) {
     d21 = -d21;
    }
    d17 = d17 * (1.5707963705062866 / d21);
   }
   d21 = d12 + d16 * d19;
   d14 = d14 + d16 * d20;
   d26 = d13 + d16 * d17;
   d12 = +d21;
   d13 = +d14;
   i25 = i11;
   HEAPF32[i25 >> 2] = d12;
   HEAPF32[i25 + 4 >> 2] = d13;
   HEAPF32[(HEAP32[i8 >> 2] | 0) + (i15 * 12 | 0) + 8 >> 2] = d26;
   d19 = +d19;
   d20 = +d20;
   i25 = (HEAP32[i9 >> 2] | 0) + (i15 * 12 | 0) | 0;
   HEAPF32[i25 >> 2] = d19;
   HEAPF32[i25 + 4 >> 2] = d20;
   HEAPF32[(HEAP32[i9 >> 2] | 0) + (i15 * 12 | 0) + 8 >> 2] = d17;
   i25 = HEAP32[(HEAP32[i10 >> 2] | 0) + (i15 << 2) >> 2] | 0;
   i24 = i25 + 44 | 0;
   HEAPF32[i24 >> 2] = d12;
   HEAPF32[i24 + 4 >> 2] = d13;
   HEAPF32[i25 + 56 >> 2] = d26;
   i24 = i25 + 64 | 0;
   HEAPF32[i24 >> 2] = d19;
   HEAPF32[i24 + 4 >> 2] = d20;
   HEAPF32[i25 + 72 >> 2] = d17;
   d17 = +Math_sin(+d26);
   HEAPF32[i25 + 20 >> 2] = d17;
   d20 = +Math_cos(+d26);
   HEAPF32[i25 + 24 >> 2] = d20;
   d19 = +HEAPF32[i25 + 28 >> 2];
   d26 = +HEAPF32[i25 + 32 >> 2];
   d21 = +(d21 - (d20 * d19 - d17 * d26));
   d26 = +(d14 - (d17 * d19 + d20 * d26));
   i25 = i25 + 12 | 0;
   HEAPF32[i25 >> 2] = d21;
   HEAPF32[i25 + 4 >> 2] = d26;
   i15 = i15 + 1 | 0;
  } while ((i15 | 0) < (HEAP32[i6 >> 2] | 0));
 }
 i6 = HEAP32[i3 + 40 >> 2] | 0;
 i4 = i4 + 4 | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  __ZN15b2ContactSolverD2Ev(i3);
  STACKTOP = i1;
  return;
 }
 if ((HEAP32[i7 >> 2] | 0) <= 0) {
  __ZN15b2ContactSolverD2Ev(i3);
  STACKTOP = i1;
  return;
 }
 i8 = i2 + 16 | 0;
 i9 = 0;
 do {
  i10 = HEAP32[(HEAP32[i5 >> 2] | 0) + (i9 << 2) >> 2] | 0;
  i11 = HEAP32[i6 + (i9 * 152 | 0) + 144 >> 2] | 0;
  HEAP32[i8 >> 2] = i11;
  if ((i11 | 0) > 0) {
   i15 = 0;
   do {
    HEAPF32[i2 + (i15 << 2) >> 2] = +HEAPF32[i6 + (i9 * 152 | 0) + (i15 * 36 | 0) + 16 >> 2];
    HEAPF32[i2 + (i15 << 2) + 8 >> 2] = +HEAPF32[i6 + (i9 * 152 | 0) + (i15 * 36 | 0) + 20 >> 2];
    i15 = i15 + 1 | 0;
   } while ((i15 | 0) != (i11 | 0));
  }
  i25 = HEAP32[i4 >> 2] | 0;
  FUNCTION_TABLE_viii[HEAP32[(HEAP32[i25 >> 2] | 0) + 20 >> 2] & 3](i25, i10, i2);
  i9 = i9 + 1 | 0;
 } while ((i9 | 0) < (HEAP32[i7 >> 2] | 0));
 __ZN15b2ContactSolverD2Ev(i3);
 STACKTOP = i1;
 return;
}
function __ZN20b2SeparationFunction10InitializeEPK14b2SimplexCachePK15b2DistanceProxyRK7b2SweepS5_S8_f(i2, i11, i13, i21, i12, i24, d9) {
 i2 = i2 | 0;
 i11 = i11 | 0;
 i13 = i13 | 0;
 i21 = i21 | 0;
 i12 = i12 | 0;
 i24 = i24 | 0;
 d9 = +d9;
 var i1 = 0, d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d10 = 0.0, i14 = 0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d22 = 0.0, i23 = 0, i25 = 0, i26 = 0, i27 = 0, d28 = 0.0, d29 = 0.0;
 i1 = STACKTOP;
 HEAP32[i2 >> 2] = i13;
 HEAP32[i2 + 4 >> 2] = i12;
 i14 = HEAP16[i11 + 4 >> 1] | 0;
 if (!(i14 << 16 >> 16 != 0 & (i14 & 65535) < 3)) {
  ___assert_fail(3744, 3560, 50, 3768);
 }
 i23 = i2 + 8 | 0;
 i25 = i23 + 0 | 0;
 i27 = i21 + 0 | 0;
 i26 = i25 + 36 | 0;
 do {
  HEAP32[i25 >> 2] = HEAP32[i27 >> 2];
  i25 = i25 + 4 | 0;
  i27 = i27 + 4 | 0;
 } while ((i25 | 0) < (i26 | 0));
 i21 = i2 + 44 | 0;
 i25 = i21 + 0 | 0;
 i27 = i24 + 0 | 0;
 i26 = i25 + 36 | 0;
 do {
  HEAP32[i25 >> 2] = HEAP32[i27 >> 2];
  i25 = i25 + 4 | 0;
  i27 = i27 + 4 | 0;
 } while ((i25 | 0) < (i26 | 0));
 d19 = 1.0 - d9;
 d4 = d19 * +HEAPF32[i2 + 32 >> 2] + +HEAPF32[i2 + 36 >> 2] * d9;
 d3 = +Math_sin(+d4);
 d4 = +Math_cos(+d4);
 d7 = +HEAPF32[i23 >> 2];
 d5 = +HEAPF32[i2 + 12 >> 2];
 d8 = d19 * +HEAPF32[i2 + 16 >> 2] + +HEAPF32[i2 + 24 >> 2] * d9 - (d4 * d7 - d3 * d5);
 d5 = d19 * +HEAPF32[i2 + 20 >> 2] + +HEAPF32[i2 + 28 >> 2] * d9 - (d3 * d7 + d4 * d5);
 d7 = d19 * +HEAPF32[i2 + 68 >> 2] + +HEAPF32[i2 + 72 >> 2] * d9;
 d6 = +Math_sin(+d7);
 d7 = +Math_cos(+d7);
 d20 = +HEAPF32[i21 >> 2];
 d22 = +HEAPF32[i2 + 48 >> 2];
 d10 = d19 * +HEAPF32[i2 + 52 >> 2] + +HEAPF32[i2 + 60 >> 2] * d9 - (d7 * d20 - d6 * d22);
 d9 = d19 * +HEAPF32[i2 + 56 >> 2] + +HEAPF32[i2 + 64 >> 2] * d9 - (d6 * d20 + d7 * d22);
 if (i14 << 16 >> 16 == 1) {
  HEAP32[i2 + 80 >> 2] = 0;
  i14 = HEAPU8[i11 + 6 | 0] | 0;
  if ((HEAP32[i13 + 20 >> 2] | 0) <= (i14 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i13 + 16 >> 2] | 0) + (i14 << 3) | 0;
  d15 = +HEAPF32[i27 >> 2];
  d16 = +HEAPF32[i27 + 4 >> 2];
  i11 = HEAPU8[i11 + 9 | 0] | 0;
  if ((HEAP32[i12 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i11 = (HEAP32[i12 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d20 = +HEAPF32[i11 >> 2];
  d22 = +HEAPF32[i11 + 4 >> 2];
  i11 = i2 + 92 | 0;
  d8 = d10 + (d7 * d20 - d6 * d22) - (d8 + (d4 * d15 - d3 * d16));
  d4 = d9 + (d6 * d20 + d7 * d22) - (d5 + (d3 * d15 + d4 * d16));
  d22 = +d8;
  d3 = +d4;
  i27 = i11;
  HEAPF32[i27 >> 2] = d22;
  HEAPF32[i27 + 4 >> 2] = d3;
  d3 = +Math_sqrt(+(d8 * d8 + d4 * d4));
  if (d3 < 1.1920928955078125e-7) {
   d22 = 0.0;
   STACKTOP = i1;
   return +d22;
  }
  d22 = 1.0 / d3;
  HEAPF32[i11 >> 2] = d8 * d22;
  HEAPF32[i2 + 96 >> 2] = d4 * d22;
  d22 = d3;
  STACKTOP = i1;
  return +d22;
 }
 i14 = i11 + 6 | 0;
 i21 = i11 + 7 | 0;
 i23 = i2 + 80 | 0;
 if ((HEAP8[i14] | 0) == (HEAP8[i21] | 0)) {
  HEAP32[i23 >> 2] = 2;
  i23 = HEAPU8[i11 + 9 | 0] | 0;
  i21 = HEAP32[i12 + 20 >> 2] | 0;
  if ((i21 | 0) <= (i23 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i12 = HEAP32[i12 + 16 >> 2] | 0;
  i27 = i12 + (i23 << 3) | 0;
  d16 = +HEAPF32[i27 >> 2];
  d15 = +HEAPF32[i27 + 4 >> 2];
  i11 = HEAPU8[i11 + 10 | 0] | 0;
  if ((i21 | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i11 = i12 + (i11 << 3) | 0;
  d20 = +HEAPF32[i11 >> 2];
  d18 = +HEAPF32[i11 + 4 >> 2];
  i11 = i2 + 92 | 0;
  d22 = d20 - d16;
  d19 = d18 - d15;
  d17 = -d22;
  d29 = +d19;
  d28 = +d17;
  i27 = i11;
  HEAPF32[i27 >> 2] = d29;
  HEAPF32[i27 + 4 >> 2] = d28;
  d22 = +Math_sqrt(+(d19 * d19 + d22 * d22));
  if (!(d22 < 1.1920928955078125e-7)) {
   d29 = 1.0 / d22;
   d19 = d19 * d29;
   HEAPF32[i11 >> 2] = d19;
   d17 = d29 * d17;
   HEAPF32[i2 + 96 >> 2] = d17;
  }
  d16 = (d16 + d20) * .5;
  d15 = (d15 + d18) * .5;
  d28 = +d16;
  d29 = +d15;
  i2 = i2 + 84 | 0;
  HEAPF32[i2 >> 2] = d28;
  HEAPF32[i2 + 4 >> 2] = d29;
  i2 = HEAPU8[i14] | 0;
  if ((HEAP32[i13 + 20 >> 2] | 0) <= (i2 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i13 + 16 >> 2] | 0) + (i2 << 3) | 0;
  d28 = +HEAPF32[i27 >> 2];
  d29 = +HEAPF32[i27 + 4 >> 2];
  d3 = (d7 * d19 - d6 * d17) * (d8 + (d4 * d28 - d3 * d29) - (d10 + (d7 * d16 - d6 * d15))) + (d6 * d19 + d7 * d17) * (d5 + (d3 * d28 + d4 * d29) - (d9 + (d6 * d16 + d7 * d15)));
  if (!(d3 < 0.0)) {
   d29 = d3;
   STACKTOP = i1;
   return +d29;
  }
  d28 = +-d19;
  d29 = +-d17;
  i27 = i11;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d29 = -d3;
  STACKTOP = i1;
  return +d29;
 } else {
  HEAP32[i23 >> 2] = 1;
  i23 = HEAPU8[i14] | 0;
  i14 = HEAP32[i13 + 20 >> 2] | 0;
  if ((i14 | 0) <= (i23 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i13 = HEAP32[i13 + 16 >> 2] | 0;
  i27 = i13 + (i23 << 3) | 0;
  d16 = +HEAPF32[i27 >> 2];
  d15 = +HEAPF32[i27 + 4 >> 2];
  i21 = HEAPU8[i21] | 0;
  if ((i14 | 0) <= (i21 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i13 = i13 + (i21 << 3) | 0;
  d20 = +HEAPF32[i13 >> 2];
  d18 = +HEAPF32[i13 + 4 >> 2];
  i13 = i2 + 92 | 0;
  d22 = d20 - d16;
  d19 = d18 - d15;
  d17 = -d22;
  d28 = +d19;
  d29 = +d17;
  i27 = i13;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d22 = +Math_sqrt(+(d19 * d19 + d22 * d22));
  if (!(d22 < 1.1920928955078125e-7)) {
   d29 = 1.0 / d22;
   d19 = d19 * d29;
   HEAPF32[i13 >> 2] = d19;
   d17 = d29 * d17;
   HEAPF32[i2 + 96 >> 2] = d17;
  }
  d16 = (d16 + d20) * .5;
  d15 = (d15 + d18) * .5;
  d28 = +d16;
  d29 = +d15;
  i2 = i2 + 84 | 0;
  HEAPF32[i2 >> 2] = d28;
  HEAPF32[i2 + 4 >> 2] = d29;
  i2 = HEAPU8[i11 + 9 | 0] | 0;
  if ((HEAP32[i12 + 20 >> 2] | 0) <= (i2 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i12 + 16 >> 2] | 0) + (i2 << 3) | 0;
  d28 = +HEAPF32[i27 >> 2];
  d29 = +HEAPF32[i27 + 4 >> 2];
  d3 = (d4 * d19 - d3 * d17) * (d10 + (d7 * d28 - d6 * d29) - (d8 + (d4 * d16 - d3 * d15))) + (d3 * d19 + d4 * d17) * (d9 + (d6 * d28 + d7 * d29) - (d5 + (d3 * d16 + d4 * d15)));
  if (!(d3 < 0.0)) {
   d29 = d3;
   STACKTOP = i1;
   return +d29;
  }
  d28 = +-d19;
  d29 = +-d17;
  i27 = i13;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d29 = -d3;
  STACKTOP = i1;
  return +d29;
 }
 return 0.0;
}
function __ZNK20b2SeparationFunction17FindMinSeparationEPiS0_f(i12, i10, i9, d5) {
 i12 = i12 | 0;
 i10 = i10 | 0;
 i9 = i9 | 0;
 d5 = +d5;
 var i1 = 0, d2 = 0.0, d3 = 0.0, d4 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d11 = 0.0, d13 = 0.0, d14 = 0.0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, i25 = 0, i26 = 0, i27 = 0;
 i1 = STACKTOP;
 d21 = 1.0 - d5;
 d6 = d21 * +HEAPF32[i12 + 32 >> 2] + +HEAPF32[i12 + 36 >> 2] * d5;
 d7 = +Math_sin(+d6);
 d6 = +Math_cos(+d6);
 d3 = +HEAPF32[i12 + 8 >> 2];
 d8 = +HEAPF32[i12 + 12 >> 2];
 d11 = d21 * +HEAPF32[i12 + 16 >> 2] + +HEAPF32[i12 + 24 >> 2] * d5 - (d6 * d3 - d7 * d8);
 d8 = d21 * +HEAPF32[i12 + 20 >> 2] + +HEAPF32[i12 + 28 >> 2] * d5 - (d7 * d3 + d6 * d8);
 d3 = d21 * +HEAPF32[i12 + 68 >> 2] + +HEAPF32[i12 + 72 >> 2] * d5;
 d2 = +Math_sin(+d3);
 d3 = +Math_cos(+d3);
 d23 = +HEAPF32[i12 + 44 >> 2];
 d24 = +HEAPF32[i12 + 48 >> 2];
 d4 = d21 * +HEAPF32[i12 + 52 >> 2] + +HEAPF32[i12 + 60 >> 2] * d5 - (d3 * d23 - d2 * d24);
 d5 = d21 * +HEAPF32[i12 + 56 >> 2] + +HEAPF32[i12 + 64 >> 2] * d5 - (d2 * d23 + d3 * d24);
 i19 = HEAP32[i12 + 80 >> 2] | 0;
 if ((i19 | 0) == 1) {
  d23 = +HEAPF32[i12 + 92 >> 2];
  d14 = +HEAPF32[i12 + 96 >> 2];
  d13 = d6 * d23 - d7 * d14;
  d14 = d7 * d23 + d6 * d14;
  d23 = +HEAPF32[i12 + 84 >> 2];
  d24 = +HEAPF32[i12 + 88 >> 2];
  d11 = d11 + (d6 * d23 - d7 * d24);
  d6 = d8 + (d7 * d23 + d6 * d24);
  d7 = -d13;
  d24 = -d14;
  d8 = d3 * d7 + d2 * d24;
  d7 = d3 * d24 - d2 * d7;
  HEAP32[i10 >> 2] = -1;
  i25 = i12 + 4 | 0;
  i22 = HEAP32[i25 >> 2] | 0;
  i19 = HEAP32[i22 + 16 >> 2] | 0;
  i22 = HEAP32[i22 + 20 >> 2] | 0;
  if ((i22 | 0) > 1) {
   i10 = 0;
   d18 = d7 * +HEAPF32[i19 + 4 >> 2] + d8 * +HEAPF32[i19 >> 2];
   i12 = 1;
   while (1) {
    d17 = d8 * +HEAPF32[i19 + (i12 << 3) >> 2] + d7 * +HEAPF32[i19 + (i12 << 3) + 4 >> 2];
    i16 = d17 > d18;
    i10 = i16 ? i12 : i10;
    i12 = i12 + 1 | 0;
    if ((i12 | 0) == (i22 | 0)) {
     break;
    } else {
     d18 = i16 ? d17 : d18;
    }
   }
   HEAP32[i9 >> 2] = i10;
   if ((i10 | 0) > -1) {
    i15 = i10;
   } else {
    ___assert_fail(3640, 3672, 103, 3704);
   }
  } else {
   HEAP32[i9 >> 2] = 0;
   i15 = 0;
  }
  i9 = HEAP32[i25 >> 2] | 0;
  if ((HEAP32[i9 + 20 >> 2] | 0) <= (i15 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i9 + 16 >> 2] | 0) + (i15 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d13 * (d4 + (d3 * d23 - d2 * d24) - d11) + d14 * (d5 + (d2 * d23 + d3 * d24) - d6);
  STACKTOP = i1;
  return +d24;
 } else if ((i19 | 0) == 0) {
  d13 = +HEAPF32[i12 + 92 >> 2];
  d14 = +HEAPF32[i12 + 96 >> 2];
  d21 = d6 * d13 + d7 * d14;
  d24 = d6 * d14 - d7 * d13;
  d17 = -d13;
  d23 = -d14;
  d18 = d3 * d17 + d2 * d23;
  d17 = d3 * d23 - d2 * d17;
  i15 = HEAP32[i12 >> 2] | 0;
  i16 = HEAP32[i15 + 16 >> 2] | 0;
  i15 = i15 + 20 | 0;
  i19 = HEAP32[i15 >> 2] | 0;
  if ((i19 | 0) > 1) {
   i25 = 0;
   d23 = d24 * +HEAPF32[i16 + 4 >> 2] + d21 * +HEAPF32[i16 >> 2];
   i26 = 1;
   while (1) {
    d20 = d21 * +HEAPF32[i16 + (i26 << 3) >> 2] + d24 * +HEAPF32[i16 + (i26 << 3) + 4 >> 2];
    i22 = d20 > d23;
    i25 = i22 ? i26 : i25;
    i26 = i26 + 1 | 0;
    if ((i26 | 0) == (i19 | 0)) {
     break;
    } else {
     d23 = i22 ? d20 : d23;
    }
   }
  } else {
   i25 = 0;
  }
  HEAP32[i10 >> 2] = i25;
  i19 = HEAP32[i12 + 4 >> 2] | 0;
  i12 = HEAP32[i19 + 16 >> 2] | 0;
  i19 = i19 + 20 | 0;
  i25 = HEAP32[i19 >> 2] | 0;
  if ((i25 | 0) > 1) {
   i27 = 0;
   d20 = d17 * +HEAPF32[i12 + 4 >> 2] + d18 * +HEAPF32[i12 >> 2];
   i26 = 1;
   while (1) {
    d21 = d18 * +HEAPF32[i12 + (i26 << 3) >> 2] + d17 * +HEAPF32[i12 + (i26 << 3) + 4 >> 2];
    i22 = d21 > d20;
    i27 = i22 ? i26 : i27;
    i26 = i26 + 1 | 0;
    if ((i26 | 0) == (i25 | 0)) {
     break;
    } else {
     d20 = i22 ? d21 : d20;
    }
   }
  } else {
   i27 = 0;
  }
  HEAP32[i9 >> 2] = i27;
  i9 = HEAP32[i10 >> 2] | 0;
  if (!((i9 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i15 >> 2] | 0) <= (i9 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i26 = i16 + (i9 << 3) | 0;
  d18 = +HEAPF32[i26 >> 2];
  d17 = +HEAPF32[i26 + 4 >> 2];
  if (!((i27 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i19 >> 2] | 0) <= (i27 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = i12 + (i27 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d13 * (d4 + (d3 * d23 - d2 * d24) - (d11 + (d6 * d18 - d7 * d17))) + d14 * (d5 + (d2 * d23 + d3 * d24) - (d8 + (d7 * d18 + d6 * d17)));
  STACKTOP = i1;
  return +d24;
 } else if ((i19 | 0) == 2) {
  d23 = +HEAPF32[i12 + 92 >> 2];
  d13 = +HEAPF32[i12 + 96 >> 2];
  d14 = d3 * d23 - d2 * d13;
  d13 = d2 * d23 + d3 * d13;
  d23 = +HEAPF32[i12 + 84 >> 2];
  d24 = +HEAPF32[i12 + 88 >> 2];
  d4 = d4 + (d3 * d23 - d2 * d24);
  d2 = d5 + (d2 * d23 + d3 * d24);
  d3 = -d14;
  d24 = -d13;
  d5 = d6 * d3 + d7 * d24;
  d3 = d6 * d24 - d7 * d3;
  HEAP32[i9 >> 2] = -1;
  i22 = HEAP32[i12 >> 2] | 0;
  i15 = HEAP32[i22 + 16 >> 2] | 0;
  i22 = HEAP32[i22 + 20 >> 2] | 0;
  if ((i22 | 0) > 1) {
   i9 = 0;
   d17 = d3 * +HEAPF32[i15 + 4 >> 2] + d5 * +HEAPF32[i15 >> 2];
   i19 = 1;
   while (1) {
    d18 = d5 * +HEAPF32[i15 + (i19 << 3) >> 2] + d3 * +HEAPF32[i15 + (i19 << 3) + 4 >> 2];
    i25 = d18 > d17;
    i9 = i25 ? i19 : i9;
    i19 = i19 + 1 | 0;
    if ((i19 | 0) == (i22 | 0)) {
     break;
    } else {
     d17 = i25 ? d18 : d17;
    }
   }
   HEAP32[i10 >> 2] = i9;
   if ((i9 | 0) > -1) {
    i16 = i9;
   } else {
    ___assert_fail(3640, 3672, 103, 3704);
   }
  } else {
   HEAP32[i10 >> 2] = 0;
   i16 = 0;
  }
  i9 = HEAP32[i12 >> 2] | 0;
  if ((HEAP32[i9 + 20 >> 2] | 0) <= (i16 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i9 + 16 >> 2] | 0) + (i16 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d14 * (d11 + (d6 * d23 - d7 * d24) - d4) + d13 * (d8 + (d7 * d23 + d6 * d24) - d2);
  STACKTOP = i1;
  return +d24;
 } else {
  ___assert_fail(3616, 3560, 183, 3720);
 }
 return 0.0;
}
function __ZN13b2DynamicTree10InsertLeafEi(i3, i4) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0, i24 = 0;
 i1 = STACKTOP;
 i11 = i3 + 24 | 0;
 HEAP32[i11 >> 2] = (HEAP32[i11 >> 2] | 0) + 1;
 i11 = HEAP32[i3 >> 2] | 0;
 if ((i11 | 0) == -1) {
  HEAP32[i3 >> 2] = i4;
  HEAP32[(HEAP32[i3 + 4 >> 2] | 0) + (i4 * 36 | 0) + 20 >> 2] = -1;
  STACKTOP = i1;
  return;
 }
 i2 = i3 + 4 | 0;
 i9 = HEAP32[i2 >> 2] | 0;
 d8 = +HEAPF32[i9 + (i4 * 36 | 0) >> 2];
 d7 = +HEAPF32[i9 + (i4 * 36 | 0) + 4 >> 2];
 d6 = +HEAPF32[i9 + (i4 * 36 | 0) + 8 >> 2];
 d5 = +HEAPF32[i9 + (i4 * 36 | 0) + 12 >> 2];
 i10 = HEAP32[i9 + (i11 * 36 | 0) + 24 >> 2] | 0;
 L5 : do {
  if (!((i10 | 0) == -1)) {
   do {
    i12 = HEAP32[i9 + (i11 * 36 | 0) + 28 >> 2] | 0;
    d14 = +HEAPF32[i9 + (i11 * 36 | 0) + 8 >> 2];
    d15 = +HEAPF32[i9 + (i11 * 36 | 0) >> 2];
    d17 = +HEAPF32[i9 + (i11 * 36 | 0) + 12 >> 2];
    d16 = +HEAPF32[i9 + (i11 * 36 | 0) + 4 >> 2];
    d21 = ((d14 > d6 ? d14 : d6) - (d15 < d8 ? d15 : d8) + ((d17 > d5 ? d17 : d5) - (d16 < d7 ? d16 : d7))) * 2.0;
    d13 = d21 * 2.0;
    d14 = (d21 - (d14 - d15 + (d17 - d16)) * 2.0) * 2.0;
    d21 = +HEAPF32[i9 + (i10 * 36 | 0) >> 2];
    d16 = d8 < d21 ? d8 : d21;
    d17 = +HEAPF32[i9 + (i10 * 36 | 0) + 4 >> 2];
    d18 = d7 < d17 ? d7 : d17;
    d19 = +HEAPF32[i9 + (i10 * 36 | 0) + 8 >> 2];
    d20 = d6 > d19 ? d6 : d19;
    d15 = +HEAPF32[i9 + (i10 * 36 | 0) + 12 >> 2];
    d22 = d5 > d15 ? d5 : d15;
    if ((HEAP32[i9 + (i10 * 36 | 0) + 24 >> 2] | 0) == -1) {
     d15 = (d20 - d16 + (d22 - d18)) * 2.0;
    } else {
     d15 = (d20 - d16 + (d22 - d18)) * 2.0 - (d19 - d21 + (d15 - d17)) * 2.0;
    }
    d15 = d14 + d15;
    d17 = +HEAPF32[i9 + (i12 * 36 | 0) >> 2];
    d18 = d8 < d17 ? d8 : d17;
    d23 = +HEAPF32[i9 + (i12 * 36 | 0) + 4 >> 2];
    d22 = d7 < d23 ? d7 : d23;
    d21 = +HEAPF32[i9 + (i12 * 36 | 0) + 8 >> 2];
    d20 = d6 > d21 ? d6 : d21;
    d19 = +HEAPF32[i9 + (i12 * 36 | 0) + 12 >> 2];
    d16 = d5 > d19 ? d5 : d19;
    if ((HEAP32[i9 + (i12 * 36 | 0) + 24 >> 2] | 0) == -1) {
     d16 = (d20 - d18 + (d16 - d22)) * 2.0;
    } else {
     d16 = (d20 - d18 + (d16 - d22)) * 2.0 - (d21 - d17 + (d19 - d23)) * 2.0;
    }
    d14 = d14 + d16;
    if (d13 < d15 & d13 < d14) {
     break L5;
    }
    i11 = d15 < d14 ? i10 : i12;
    i10 = HEAP32[i9 + (i11 * 36 | 0) + 24 >> 2] | 0;
   } while (!((i10 | 0) == -1));
  }
 } while (0);
 i9 = HEAP32[i9 + (i11 * 36 | 0) + 20 >> 2] | 0;
 i10 = __ZN13b2DynamicTree12AllocateNodeEv(i3) | 0;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i12 + (i10 * 36 | 0) + 20 >> 2] = i9;
 HEAP32[i12 + (i10 * 36 | 0) + 16 >> 2] = 0;
 i12 = HEAP32[i2 >> 2] | 0;
 d14 = +HEAPF32[i12 + (i11 * 36 | 0) >> 2];
 d13 = +HEAPF32[i12 + (i11 * 36 | 0) + 4 >> 2];
 d8 = +(d8 < d14 ? d8 : d14);
 d7 = +(d7 < d13 ? d7 : d13);
 i24 = i12 + (i10 * 36 | 0) | 0;
 HEAPF32[i24 >> 2] = d8;
 HEAPF32[i24 + 4 >> 2] = d7;
 d8 = +HEAPF32[i12 + (i11 * 36 | 0) + 8 >> 2];
 d7 = +HEAPF32[i12 + (i11 * 36 | 0) + 12 >> 2];
 d6 = +(d6 > d8 ? d6 : d8);
 d23 = +(d5 > d7 ? d5 : d7);
 i12 = i12 + (i10 * 36 | 0) + 8 | 0;
 HEAPF32[i12 >> 2] = d6;
 HEAPF32[i12 + 4 >> 2] = d23;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i12 + (i10 * 36 | 0) + 32 >> 2] = (HEAP32[i12 + (i11 * 36 | 0) + 32 >> 2] | 0) + 1;
 if ((i9 | 0) == -1) {
  HEAP32[i12 + (i10 * 36 | 0) + 24 >> 2] = i11;
  HEAP32[i12 + (i10 * 36 | 0) + 28 >> 2] = i4;
  HEAP32[i12 + (i11 * 36 | 0) + 20 >> 2] = i10;
  i24 = i12 + (i4 * 36 | 0) + 20 | 0;
  HEAP32[i24 >> 2] = i10;
  HEAP32[i3 >> 2] = i10;
  i10 = HEAP32[i24 >> 2] | 0;
 } else {
  i24 = i12 + (i9 * 36 | 0) + 24 | 0;
  if ((HEAP32[i24 >> 2] | 0) == (i11 | 0)) {
   HEAP32[i24 >> 2] = i10;
  } else {
   HEAP32[i12 + (i9 * 36 | 0) + 28 >> 2] = i10;
  }
  HEAP32[i12 + (i10 * 36 | 0) + 24 >> 2] = i11;
  HEAP32[i12 + (i10 * 36 | 0) + 28 >> 2] = i4;
  HEAP32[i12 + (i11 * 36 | 0) + 20 >> 2] = i10;
  HEAP32[i12 + (i4 * 36 | 0) + 20 >> 2] = i10;
 }
 if ((i10 | 0) == -1) {
  STACKTOP = i1;
  return;
 }
 while (1) {
  i9 = __ZN13b2DynamicTree7BalanceEi(i3, i10) | 0;
  i4 = HEAP32[i2 >> 2] | 0;
  i11 = HEAP32[i4 + (i9 * 36 | 0) + 24 >> 2] | 0;
  i10 = HEAP32[i4 + (i9 * 36 | 0) + 28 >> 2] | 0;
  if ((i11 | 0) == -1) {
   i2 = 20;
   break;
  }
  if ((i10 | 0) == -1) {
   i2 = 22;
   break;
  }
  i12 = HEAP32[i4 + (i11 * 36 | 0) + 32 >> 2] | 0;
  i24 = HEAP32[i4 + (i10 * 36 | 0) + 32 >> 2] | 0;
  HEAP32[i4 + (i9 * 36 | 0) + 32 >> 2] = ((i12 | 0) > (i24 | 0) ? i12 : i24) + 1;
  d7 = +HEAPF32[i4 + (i11 * 36 | 0) >> 2];
  d8 = +HEAPF32[i4 + (i10 * 36 | 0) >> 2];
  d5 = +HEAPF32[i4 + (i11 * 36 | 0) + 4 >> 2];
  d6 = +HEAPF32[i4 + (i10 * 36 | 0) + 4 >> 2];
  d7 = +(d7 < d8 ? d7 : d8);
  d5 = +(d5 < d6 ? d5 : d6);
  i24 = i4 + (i9 * 36 | 0) | 0;
  HEAPF32[i24 >> 2] = d7;
  HEAPF32[i24 + 4 >> 2] = d5;
  d5 = +HEAPF32[i4 + (i11 * 36 | 0) + 8 >> 2];
  d6 = +HEAPF32[i4 + (i10 * 36 | 0) + 8 >> 2];
  d7 = +HEAPF32[i4 + (i11 * 36 | 0) + 12 >> 2];
  d8 = +HEAPF32[i4 + (i10 * 36 | 0) + 12 >> 2];
  d5 = +(d5 > d6 ? d5 : d6);
  d23 = +(d7 > d8 ? d7 : d8);
  i10 = i4 + (i9 * 36 | 0) + 8 | 0;
  HEAPF32[i10 >> 2] = d5;
  HEAPF32[i10 + 4 >> 2] = d23;
  i10 = HEAP32[(HEAP32[i2 >> 2] | 0) + (i9 * 36 | 0) + 20 >> 2] | 0;
  if ((i10 | 0) == -1) {
   i2 = 24;
   break;
  }
 }
 if ((i2 | 0) == 20) {
  ___assert_fail(3168, 2944, 307, 3184);
 } else if ((i2 | 0) == 22) {
  ___assert_fail(3200, 2944, 308, 3184);
 } else if ((i2 | 0) == 24) {
  STACKTOP = i1;
  return;
 }
}
function __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i7, i5) {
 i7 = i7 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, d15 = 0.0, d16 = 0.0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0;
 i1 = STACKTOP;
 HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i7 + 12 >> 2] = HEAP32[i5 + 12 >> 2];
 HEAP32[i7 + 16 >> 2] = HEAP32[i5 + 16 >> 2];
 HEAP32[i7 + 20 >> 2] = HEAP32[i5 + 20 >> 2];
 i14 = HEAP32[i5 + 40 >> 2] | 0;
 i9 = i7 + 32 | 0;
 HEAP32[i9 >> 2] = i14;
 i2 = HEAP32[i5 + 28 >> 2] | 0;
 i4 = i7 + 48 | 0;
 HEAP32[i4 >> 2] = i2;
 i3 = i7 + 36 | 0;
 HEAP32[i3 >> 2] = __ZN16b2StackAllocator8AllocateEi(i14, i2 * 88 | 0) | 0;
 i2 = i7 + 40 | 0;
 HEAP32[i2 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i9 >> 2] | 0, (HEAP32[i4 >> 2] | 0) * 152 | 0) | 0;
 HEAP32[i7 + 24 >> 2] = HEAP32[i5 + 32 >> 2];
 HEAP32[i7 + 28 >> 2] = HEAP32[i5 + 36 >> 2];
 i9 = HEAP32[i5 + 24 >> 2] | 0;
 i5 = i7 + 44 | 0;
 HEAP32[i5 >> 2] = i9;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i6 = i7 + 20 | 0;
 i7 = i7 + 8 | 0;
 i8 = 0;
 while (1) {
  i10 = HEAP32[i9 + (i8 << 2) >> 2] | 0;
  i11 = HEAP32[i10 + 48 >> 2] | 0;
  i12 = HEAP32[i10 + 52 >> 2] | 0;
  i14 = HEAP32[i11 + 8 >> 2] | 0;
  i13 = HEAP32[i12 + 8 >> 2] | 0;
  i9 = HEAP32[i10 + 124 >> 2] | 0;
  if ((i9 | 0) <= 0) {
   i2 = 4;
   break;
  }
  d15 = +HEAPF32[(HEAP32[i12 + 12 >> 2] | 0) + 8 >> 2];
  d16 = +HEAPF32[(HEAP32[i11 + 12 >> 2] | 0) + 8 >> 2];
  i12 = HEAP32[i2 >> 2] | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 136 >> 2] = +HEAPF32[i10 + 136 >> 2];
  HEAPF32[i12 + (i8 * 152 | 0) + 140 >> 2] = +HEAPF32[i10 + 140 >> 2];
  i22 = i14 + 8 | 0;
  HEAP32[i12 + (i8 * 152 | 0) + 112 >> 2] = HEAP32[i22 >> 2];
  i21 = i13 + 8 | 0;
  HEAP32[i12 + (i8 * 152 | 0) + 116 >> 2] = HEAP32[i21 >> 2];
  i19 = i14 + 120 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 120 >> 2] = +HEAPF32[i19 >> 2];
  i20 = i13 + 120 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 124 >> 2] = +HEAPF32[i20 >> 2];
  i18 = i14 + 128 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 128 >> 2] = +HEAPF32[i18 >> 2];
  i17 = i13 + 128 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 132 >> 2] = +HEAPF32[i17 >> 2];
  HEAP32[i12 + (i8 * 152 | 0) + 148 >> 2] = i8;
  HEAP32[i12 + (i8 * 152 | 0) + 144 >> 2] = i9;
  i11 = i12 + (i8 * 152 | 0) + 80 | 0;
  HEAP32[i11 + 0 >> 2] = 0;
  HEAP32[i11 + 4 >> 2] = 0;
  HEAP32[i11 + 8 >> 2] = 0;
  HEAP32[i11 + 12 >> 2] = 0;
  HEAP32[i11 + 16 >> 2] = 0;
  HEAP32[i11 + 20 >> 2] = 0;
  HEAP32[i11 + 24 >> 2] = 0;
  HEAP32[i11 + 28 >> 2] = 0;
  i11 = HEAP32[i3 >> 2] | 0;
  HEAP32[i11 + (i8 * 88 | 0) + 32 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i11 + (i8 * 88 | 0) + 36 >> 2] = HEAP32[i21 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 40 >> 2] = +HEAPF32[i19 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 44 >> 2] = +HEAPF32[i20 >> 2];
  i20 = i14 + 28 | 0;
  i14 = HEAP32[i20 + 4 >> 2] | 0;
  i19 = i11 + (i8 * 88 | 0) + 48 | 0;
  HEAP32[i19 >> 2] = HEAP32[i20 >> 2];
  HEAP32[i19 + 4 >> 2] = i14;
  i19 = i13 + 28 | 0;
  i14 = HEAP32[i19 + 4 >> 2] | 0;
  i13 = i11 + (i8 * 88 | 0) + 56 | 0;
  HEAP32[i13 >> 2] = HEAP32[i19 >> 2];
  HEAP32[i13 + 4 >> 2] = i14;
  HEAPF32[i11 + (i8 * 88 | 0) + 64 >> 2] = +HEAPF32[i18 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 68 >> 2] = +HEAPF32[i17 >> 2];
  i13 = i10 + 104 | 0;
  i14 = HEAP32[i13 + 4 >> 2] | 0;
  i17 = i11 + (i8 * 88 | 0) + 16 | 0;
  HEAP32[i17 >> 2] = HEAP32[i13 >> 2];
  HEAP32[i17 + 4 >> 2] = i14;
  i17 = i10 + 112 | 0;
  i14 = HEAP32[i17 + 4 >> 2] | 0;
  i13 = i11 + (i8 * 88 | 0) + 24 | 0;
  HEAP32[i13 >> 2] = HEAP32[i17 >> 2];
  HEAP32[i13 + 4 >> 2] = i14;
  HEAP32[i11 + (i8 * 88 | 0) + 84 >> 2] = i9;
  HEAPF32[i11 + (i8 * 88 | 0) + 76 >> 2] = d16;
  HEAPF32[i11 + (i8 * 88 | 0) + 80 >> 2] = d15;
  HEAP32[i11 + (i8 * 88 | 0) + 72 >> 2] = HEAP32[i10 + 120 >> 2];
  i13 = 0;
  do {
   i14 = i10 + (i13 * 20 | 0) + 64 | 0;
   if ((HEAP8[i6] | 0) == 0) {
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 16 >> 2] = 0.0;
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 20 >> 2] = 0.0;
   } else {
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 16 >> 2] = +HEAPF32[i7 >> 2] * +HEAPF32[i10 + (i13 * 20 | 0) + 72 >> 2];
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 20 >> 2] = +HEAPF32[i7 >> 2] * +HEAPF32[i10 + (i13 * 20 | 0) + 76 >> 2];
   }
   i20 = i12 + (i8 * 152 | 0) + (i13 * 36 | 0) | 0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 24 >> 2] = 0.0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 28 >> 2] = 0.0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 32 >> 2] = 0.0;
   i22 = i11 + (i8 * 88 | 0) + (i13 << 3) | 0;
   HEAP32[i20 + 0 >> 2] = 0;
   HEAP32[i20 + 4 >> 2] = 0;
   HEAP32[i20 + 8 >> 2] = 0;
   HEAP32[i20 + 12 >> 2] = 0;
   i20 = i14;
   i21 = HEAP32[i20 + 4 >> 2] | 0;
   HEAP32[i22 >> 2] = HEAP32[i20 >> 2];
   HEAP32[i22 + 4 >> 2] = i21;
   i13 = i13 + 1 | 0;
  } while ((i13 | 0) != (i9 | 0));
  i8 = i8 + 1 | 0;
  if ((i8 | 0) >= (HEAP32[i4 >> 2] | 0)) {
   i2 = 12;
   break;
  }
  i9 = HEAP32[i5 >> 2] | 0;
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6504, 6520, 71, 6568);
 } else if ((i2 | 0) == 12) {
  STACKTOP = i1;
  return;
 }
}
function __Z25b2CollidePolygonAndCircleP10b2ManifoldPK14b2PolygonShapeRK11b2TransformPK13b2CircleShapeS6_(i1, i4, i11, i9, i10) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i11 = i11 | 0;
 i9 = i9 | 0;
 i10 = i10 | 0;
 var i2 = 0, i3 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i12 = 0, d13 = 0.0, d14 = 0.0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0;
 i3 = STACKTOP;
 i5 = i1 + 60 | 0;
 HEAP32[i5 >> 2] = 0;
 i2 = i9 + 12 | 0;
 d20 = +HEAPF32[i10 + 12 >> 2];
 d7 = +HEAPF32[i2 >> 2];
 d6 = +HEAPF32[i10 + 8 >> 2];
 d21 = +HEAPF32[i9 + 16 >> 2];
 d8 = +HEAPF32[i10 >> 2] + (d20 * d7 - d6 * d21) - +HEAPF32[i11 >> 2];
 d21 = d7 * d6 + d20 * d21 + +HEAPF32[i10 + 4 >> 2] - +HEAPF32[i11 + 4 >> 2];
 d20 = +HEAPF32[i11 + 12 >> 2];
 d6 = +HEAPF32[i11 + 8 >> 2];
 d7 = d8 * d20 + d21 * d6;
 d6 = d20 * d21 - d8 * d6;
 d8 = +HEAPF32[i4 + 8 >> 2] + +HEAPF32[i9 + 8 >> 2];
 i12 = HEAP32[i4 + 148 >> 2] | 0;
 do {
  if ((i12 | 0) > 0) {
   i10 = 0;
   i9 = 0;
   d13 = -3.4028234663852886e+38;
   while (1) {
    d14 = (d7 - +HEAPF32[i4 + (i10 << 3) + 20 >> 2]) * +HEAPF32[i4 + (i10 << 3) + 84 >> 2] + (d6 - +HEAPF32[i4 + (i10 << 3) + 24 >> 2]) * +HEAPF32[i4 + (i10 << 3) + 88 >> 2];
    if (d14 > d8) {
     i10 = 19;
     break;
    }
    i11 = d14 > d13;
    d13 = i11 ? d14 : d13;
    i9 = i11 ? i10 : i9;
    i10 = i10 + 1 | 0;
    if ((i10 | 0) >= (i12 | 0)) {
     i10 = 4;
     break;
    }
   }
   if ((i10 | 0) == 4) {
    i22 = d13 < 1.1920928955078125e-7;
    break;
   } else if ((i10 | 0) == 19) {
    STACKTOP = i3;
    return;
   }
  } else {
   i9 = 0;
   i22 = 1;
  }
 } while (0);
 i15 = i9 + 1 | 0;
 i11 = i4 + (i9 << 3) + 20 | 0;
 i10 = HEAP32[i11 >> 2] | 0;
 i11 = HEAP32[i11 + 4 >> 2] | 0;
 d14 = (HEAP32[tempDoublePtr >> 2] = i10, +HEAPF32[tempDoublePtr >> 2]);
 d13 = (HEAP32[tempDoublePtr >> 2] = i11, +HEAPF32[tempDoublePtr >> 2]);
 i12 = i4 + (((i15 | 0) < (i12 | 0) ? i15 : 0) << 3) + 20 | 0;
 i15 = HEAP32[i12 >> 2] | 0;
 i12 = HEAP32[i12 + 4 >> 2] | 0;
 d21 = (HEAP32[tempDoublePtr >> 2] = i15, +HEAPF32[tempDoublePtr >> 2]);
 d18 = (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]);
 if (i22) {
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i22 = i4 + (i9 << 3) + 84 | 0;
  i15 = HEAP32[i22 + 4 >> 2] | 0;
  i12 = i1 + 40 | 0;
  HEAP32[i12 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i12 + 4 >> 2] = i15;
  d20 = +((d14 + d21) * .5);
  d21 = +((d13 + d18) * .5);
  i12 = i1 + 48 | 0;
  HEAPF32[i12 >> 2] = d20;
  HEAPF32[i12 + 4 >> 2] = d21;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 d16 = d7 - d14;
 d20 = d6 - d13;
 d19 = d7 - d21;
 d17 = d6 - d18;
 if (d16 * (d21 - d14) + d20 * (d18 - d13) <= 0.0) {
  if (d16 * d16 + d20 * d20 > d8 * d8) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i4 = i1 + 40 | 0;
  d21 = +d16;
  d6 = +d20;
  i22 = i4;
  HEAPF32[i22 >> 2] = d21;
  HEAPF32[i22 + 4 >> 2] = d6;
  d6 = +Math_sqrt(+(d16 * d16 + d20 * d20));
  if (!(d6 < 1.1920928955078125e-7)) {
   d21 = 1.0 / d6;
   HEAPF32[i4 >> 2] = d16 * d21;
   HEAPF32[i1 + 44 >> 2] = d20 * d21;
  }
  i12 = i1 + 48 | 0;
  HEAP32[i12 >> 2] = i10;
  HEAP32[i12 + 4 >> 2] = i11;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 if (!(d19 * (d14 - d21) + d17 * (d13 - d18) <= 0.0)) {
  d14 = (d14 + d21) * .5;
  d13 = (d13 + d18) * .5;
  i10 = i4 + (i9 << 3) + 84 | 0;
  if ((d7 - d14) * +HEAPF32[i10 >> 2] + (d6 - d13) * +HEAPF32[i4 + (i9 << 3) + 88 >> 2] > d8) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i22 = i10;
  i15 = HEAP32[i22 + 4 >> 2] | 0;
  i12 = i1 + 40 | 0;
  HEAP32[i12 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i12 + 4 >> 2] = i15;
  d20 = +d14;
  d21 = +d13;
  i12 = i1 + 48 | 0;
  HEAPF32[i12 >> 2] = d20;
  HEAPF32[i12 + 4 >> 2] = d21;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 if (d19 * d19 + d17 * d17 > d8 * d8) {
  STACKTOP = i3;
  return;
 }
 HEAP32[i5 >> 2] = 1;
 HEAP32[i1 + 56 >> 2] = 1;
 i4 = i1 + 40 | 0;
 d21 = +d19;
 d6 = +d17;
 i22 = i4;
 HEAPF32[i22 >> 2] = d21;
 HEAPF32[i22 + 4 >> 2] = d6;
 d6 = +Math_sqrt(+(d19 * d19 + d17 * d17));
 if (!(d6 < 1.1920928955078125e-7)) {
  d21 = 1.0 / d6;
  HEAPF32[i4 >> 2] = d19 * d21;
  HEAPF32[i1 + 44 >> 2] = d17 * d21;
 }
 i22 = i1 + 48 | 0;
 HEAP32[i22 >> 2] = i15;
 HEAP32[i22 + 4 >> 2] = i12;
 i12 = i2;
 i15 = HEAP32[i12 + 4 >> 2] | 0;
 i22 = i1;
 HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i22 + 4 >> 2] = i15;
 HEAP32[i1 + 16 >> 2] = 0;
 STACKTOP = i3;
 return;
}
function __ZN15b2WorldManifold10InitializeEPK10b2ManifoldRK11b2TransformfS5_f(i1, i5, i7, d4, i8, d3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i7 = i7 | 0;
 d4 = +d4;
 i8 = i8 | 0;
 d3 = +d3;
 var i2 = 0, i6 = 0, d9 = 0.0, d10 = 0.0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0;
 i2 = STACKTOP;
 i6 = i5 + 60 | 0;
 if ((HEAP32[i6 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i11 = HEAP32[i5 + 56 >> 2] | 0;
 if ((i11 | 0) == 2) {
  i13 = i8 + 12 | 0;
  d17 = +HEAPF32[i13 >> 2];
  d18 = +HEAPF32[i5 + 40 >> 2];
  i16 = i8 + 8 | 0;
  d19 = +HEAPF32[i16 >> 2];
  d15 = +HEAPF32[i5 + 44 >> 2];
  d14 = d17 * d18 - d19 * d15;
  d15 = d18 * d19 + d17 * d15;
  d17 = +d14;
  d19 = +d15;
  i12 = i1;
  HEAPF32[i12 >> 2] = d17;
  HEAPF32[i12 + 4 >> 2] = d19;
  d19 = +HEAPF32[i13 >> 2];
  d17 = +HEAPF32[i5 + 48 >> 2];
  d18 = +HEAPF32[i16 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i8 >> 2] + (d19 * d17 - d18 * d10);
  d10 = d17 * d18 + d19 * d10 + +HEAPF32[i8 + 4 >> 2];
  if ((HEAP32[i6 >> 2] | 0) > 0) {
   i8 = i7 + 12 | 0;
   i11 = i7 + 8 | 0;
   i12 = i7 + 4 | 0;
   i13 = i1 + 4 | 0;
   i16 = 0;
   do {
    d18 = +HEAPF32[i8 >> 2];
    d22 = +HEAPF32[i5 + (i16 * 20 | 0) >> 2];
    d21 = +HEAPF32[i11 >> 2];
    d17 = +HEAPF32[i5 + (i16 * 20 | 0) + 4 >> 2];
    d19 = +HEAPF32[i7 >> 2] + (d18 * d22 - d21 * d17);
    d17 = d22 * d21 + d18 * d17 + +HEAPF32[i12 >> 2];
    d18 = d3 - (d14 * (d19 - d9) + (d17 - d10) * d15);
    d19 = +((d19 - d14 * d4 + (d19 + d14 * d18)) * .5);
    d14 = +((d17 - d15 * d4 + (d17 + d15 * d18)) * .5);
    i20 = i1 + (i16 << 3) + 8 | 0;
    HEAPF32[i20 >> 2] = d19;
    HEAPF32[i20 + 4 >> 2] = d14;
    i16 = i16 + 1 | 0;
    d14 = +HEAPF32[i1 >> 2];
    d15 = +HEAPF32[i13 >> 2];
   } while ((i16 | 0) < (HEAP32[i6 >> 2] | 0));
  }
  d21 = +-d14;
  d22 = +-d15;
  i20 = i1;
  HEAPF32[i20 >> 2] = d21;
  HEAPF32[i20 + 4 >> 2] = d22;
  STACKTOP = i2;
  return;
 } else if ((i11 | 0) == 1) {
  i16 = i7 + 12 | 0;
  d19 = +HEAPF32[i16 >> 2];
  d21 = +HEAPF32[i5 + 40 >> 2];
  i20 = i7 + 8 | 0;
  d22 = +HEAPF32[i20 >> 2];
  d15 = +HEAPF32[i5 + 44 >> 2];
  d14 = d19 * d21 - d22 * d15;
  d15 = d21 * d22 + d19 * d15;
  d19 = +d14;
  d22 = +d15;
  i13 = i1;
  HEAPF32[i13 >> 2] = d19;
  HEAPF32[i13 + 4 >> 2] = d22;
  d22 = +HEAPF32[i16 >> 2];
  d19 = +HEAPF32[i5 + 48 >> 2];
  d21 = +HEAPF32[i20 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i7 >> 2] + (d22 * d19 - d21 * d10);
  d10 = d19 * d21 + d22 * d10 + +HEAPF32[i7 + 4 >> 2];
  if ((HEAP32[i6 >> 2] | 0) <= 0) {
   STACKTOP = i2;
   return;
  }
  i12 = i8 + 12 | 0;
  i11 = i8 + 8 | 0;
  i7 = i8 + 4 | 0;
  i13 = i1 + 4 | 0;
  i16 = 0;
  while (1) {
   d22 = +HEAPF32[i12 >> 2];
   d17 = +HEAPF32[i5 + (i16 * 20 | 0) >> 2];
   d18 = +HEAPF32[i11 >> 2];
   d19 = +HEAPF32[i5 + (i16 * 20 | 0) + 4 >> 2];
   d21 = +HEAPF32[i8 >> 2] + (d22 * d17 - d18 * d19);
   d19 = d17 * d18 + d22 * d19 + +HEAPF32[i7 >> 2];
   d22 = d4 - (d14 * (d21 - d9) + (d19 - d10) * d15);
   d21 = +((d21 - d14 * d3 + (d21 + d14 * d22)) * .5);
   d22 = +((d19 - d15 * d3 + (d19 + d15 * d22)) * .5);
   i20 = i1 + (i16 << 3) + 8 | 0;
   HEAPF32[i20 >> 2] = d21;
   HEAPF32[i20 + 4 >> 2] = d22;
   i16 = i16 + 1 | 0;
   if ((i16 | 0) >= (HEAP32[i6 >> 2] | 0)) {
    break;
   }
   d14 = +HEAPF32[i1 >> 2];
   d15 = +HEAPF32[i13 >> 2];
  }
  STACKTOP = i2;
  return;
 } else if ((i11 | 0) == 0) {
  HEAPF32[i1 >> 2] = 1.0;
  i6 = i1 + 4 | 0;
  HEAPF32[i6 >> 2] = 0.0;
  d21 = +HEAPF32[i7 + 12 >> 2];
  d22 = +HEAPF32[i5 + 48 >> 2];
  d19 = +HEAPF32[i7 + 8 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i7 >> 2] + (d21 * d22 - d19 * d10);
  d10 = d22 * d19 + d21 * d10 + +HEAPF32[i7 + 4 >> 2];
  d21 = +HEAPF32[i8 + 12 >> 2];
  d19 = +HEAPF32[i5 >> 2];
  d22 = +HEAPF32[i8 + 8 >> 2];
  d15 = +HEAPF32[i5 + 4 >> 2];
  d14 = +HEAPF32[i8 >> 2] + (d21 * d19 - d22 * d15);
  d15 = d19 * d22 + d21 * d15 + +HEAPF32[i8 + 4 >> 2];
  d21 = d9 - d14;
  d22 = d10 - d15;
  if (d21 * d21 + d22 * d22 > 1.4210854715202004e-14) {
   d19 = d14 - d9;
   d17 = d15 - d10;
   d22 = +d19;
   d18 = +d17;
   i20 = i1;
   HEAPF32[i20 >> 2] = d22;
   HEAPF32[i20 + 4 >> 2] = d18;
   d18 = +Math_sqrt(+(d19 * d19 + d17 * d17));
   if (!(d18 < 1.1920928955078125e-7)) {
    d22 = 1.0 / d18;
    d19 = d19 * d22;
    HEAPF32[i1 >> 2] = d19;
    d17 = d17 * d22;
    HEAPF32[i6 >> 2] = d17;
   }
  } else {
   d19 = 1.0;
   d17 = 0.0;
  }
  d21 = +((d9 + d19 * d4 + (d14 - d19 * d3)) * .5);
  d22 = +((d10 + d17 * d4 + (d15 - d17 * d3)) * .5);
  i20 = i1 + 8 | 0;
  HEAPF32[i20 >> 2] = d21;
  HEAPF32[i20 + 4 >> 2] = d22;
  STACKTOP = i2;
  return;
 } else {
  STACKTOP = i2;
  return;
 }
}
function _main(i3, i2) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, i8 = 0, i9 = 0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 240 | 0;
 i5 = i1;
 i12 = i1 + 224 | 0;
 i4 = i1 + 168 | 0;
 i9 = i1 + 160 | 0;
 i8 = i1 + 152 | 0;
 L1 : do {
  if ((i3 | 0) > 1) {
   i14 = HEAP8[HEAP32[i2 + 4 >> 2] | 0] | 0;
   switch (i14 | 0) {
   case 49:
    {
     HEAP32[2] = 5;
     HEAP32[4] = 35;
     i15 = 35;
     i14 = 5;
     break L1;
    }
   case 50:
    {
     HEAP32[2] = 32;
     HEAP32[4] = 161;
     i15 = 161;
     i14 = 32;
     break L1;
    }
   case 51:
    {
     i13 = 5;
     break L1;
    }
   case 52:
    {
     HEAP32[2] = 320;
     HEAP32[4] = 2331;
     i15 = 2331;
     i14 = 320;
     break L1;
    }
   case 53:
    {
     HEAP32[2] = 640;
     HEAP32[4] = 5661;
     i15 = 5661;
     i14 = 640;
     break L1;
    }
   case 48:
    {
     i20 = 0;
     STACKTOP = i1;
     return i20 | 0;
    }
   default:
    {
     HEAP32[i5 >> 2] = i14 + -48;
     _printf(80, i5 | 0) | 0;
     i20 = -1;
     STACKTOP = i1;
     return i20 | 0;
    }
   }
  } else {
   i13 = 5;
  }
 } while (0);
 if ((i13 | 0) == 5) {
  HEAP32[2] = 64;
  HEAP32[4] = 333;
  i15 = 333;
  i14 = 64;
 }
 i13 = i15 + i14 | 0;
 HEAP32[4] = i13;
 HEAP32[2] = 0;
 HEAP32[8] = __Znaj(i13 >>> 0 > 1073741823 ? -1 : i13 << 2) | 0;
 HEAPF32[i12 >> 2] = 0.0;
 HEAPF32[i12 + 4 >> 2] = -10.0;
 i15 = __Znwj(103028) | 0;
 __ZN7b2WorldC2ERK6b2Vec2(i15, i12);
 HEAP32[6] = i15;
 __ZN7b2World16SetAllowSleepingEb(i15, 0);
 HEAP32[i5 + 44 >> 2] = 0;
 i15 = i5 + 4 | 0;
 i14 = i5 + 36 | 0;
 HEAP32[i15 + 0 >> 2] = 0;
 HEAP32[i15 + 4 >> 2] = 0;
 HEAP32[i15 + 8 >> 2] = 0;
 HEAP32[i15 + 12 >> 2] = 0;
 HEAP32[i15 + 16 >> 2] = 0;
 HEAP32[i15 + 20 >> 2] = 0;
 HEAP32[i15 + 24 >> 2] = 0;
 HEAP32[i15 + 28 >> 2] = 0;
 HEAP8[i14] = 1;
 HEAP8[i5 + 37 | 0] = 1;
 HEAP8[i5 + 38 | 0] = 0;
 HEAP8[i5 + 39 | 0] = 0;
 HEAP32[i5 >> 2] = 0;
 HEAP8[i5 + 40 | 0] = 1;
 HEAPF32[i5 + 48 >> 2] = 1.0;
 i14 = __ZN7b2World10CreateBodyEPK9b2BodyDef(HEAP32[6] | 0, i5) | 0;
 HEAP32[i4 >> 2] = 240;
 HEAP32[i4 + 4 >> 2] = 1;
 HEAPF32[i4 + 8 >> 2] = .009999999776482582;
 i15 = i4 + 28 | 0;
 HEAP32[i15 + 0 >> 2] = 0;
 HEAP32[i15 + 4 >> 2] = 0;
 HEAP32[i15 + 8 >> 2] = 0;
 HEAP32[i15 + 12 >> 2] = 0;
 HEAP16[i15 + 16 >> 1] = 0;
 HEAPF32[i9 >> 2] = -40.0;
 HEAPF32[i9 + 4 >> 2] = 0.0;
 HEAPF32[i8 >> 2] = 40.0;
 HEAPF32[i8 + 4 >> 2] = 0.0;
 __ZN11b2EdgeShape3SetERK6b2Vec2S2_(i4, i9, i8);
 __ZN6b2Body13CreateFixtureEPK7b2Shapef(i14, i4, 0.0) | 0;
 HEAP32[i5 >> 2] = 504;
 HEAP32[i5 + 4 >> 2] = 2;
 HEAPF32[i5 + 8 >> 2] = .009999999776482582;
 HEAP32[i5 + 148 >> 2] = 0;
 HEAPF32[i5 + 12 >> 2] = 0.0;
 HEAPF32[i5 + 16 >> 2] = 0.0;
 __ZN14b2PolygonShape8SetAsBoxEff(i5, .5, .5);
 i14 = i4 + 44 | 0;
 i15 = i4 + 4 | 0;
 i8 = i4 + 36 | 0;
 i17 = i4 + 37 | 0;
 i18 = i4 + 38 | 0;
 i19 = i4 + 39 | 0;
 i20 = i4 + 40 | 0;
 i13 = i4 + 48 | 0;
 i12 = i4 + 4 | 0;
 d11 = -7.0;
 d10 = .75;
 i9 = 0;
 while (1) {
  d7 = d11;
  d6 = d10;
  i16 = i9;
  while (1) {
   HEAP32[i14 >> 2] = 0;
   HEAP32[i15 + 0 >> 2] = 0;
   HEAP32[i15 + 4 >> 2] = 0;
   HEAP32[i15 + 8 >> 2] = 0;
   HEAP32[i15 + 12 >> 2] = 0;
   HEAP32[i15 + 16 >> 2] = 0;
   HEAP32[i15 + 20 >> 2] = 0;
   HEAP32[i15 + 24 >> 2] = 0;
   HEAP32[i15 + 28 >> 2] = 0;
   HEAP8[i8] = 1;
   HEAP8[i17] = 1;
   HEAP8[i18] = 0;
   HEAP8[i19] = 0;
   HEAP8[i20] = 1;
   HEAPF32[i13 >> 2] = 1.0;
   HEAP32[i4 >> 2] = 2;
   d23 = +d7;
   d22 = +d6;
   i21 = i12;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d22;
   i21 = __ZN7b2World10CreateBodyEPK9b2BodyDef(HEAP32[6] | 0, i4) | 0;
   __ZN6b2Body13CreateFixtureEPK7b2Shapef(i21, i5, 5.0) | 0;
   HEAP32[14] = i21;
   i16 = i16 + 1 | 0;
   if ((i16 | 0) >= 40) {
    break;
   } else {
    d7 = d7 + 1.125;
    d6 = d6 + 0.0;
   }
  }
  i9 = i9 + 1 | 0;
  if ((i9 | 0) >= 40) {
   break;
  } else {
   d11 = d11 + .5625;
   d10 = d10 + 1.0;
  }
 }
 if ((HEAP32[2] | 0) > 0) {
  i4 = 0;
  do {
   __ZN7b2World4StepEfii(HEAP32[6] | 0, .01666666753590107, 3, 3);
   i4 = i4 + 1 | 0;
  } while ((i4 | 0) < (HEAP32[2] | 0));
 }
 if ((i3 | 0) > 2) {
  i21 = (HEAP8[HEAP32[i2 + 8 >> 2] | 0] | 0) + -48 | 0;
  HEAP32[18] = i21;
  if ((i21 | 0) != 0) {
   _puts(208) | 0;
   _emscripten_set_main_loop(2, 60, 1);
   i21 = 0;
   STACKTOP = i1;
   return i21 | 0;
  }
 } else {
  HEAP32[18] = 0;
 }
 while (1) {
  __Z4iterv();
  if ((HEAP32[16] | 0) > (HEAP32[4] | 0)) {
   i2 = 0;
   break;
  }
 }
 STACKTOP = i1;
 return i2 | 0;
}
function __ZN9b2Simplex9ReadCacheEPK14b2SimplexCachePK15b2DistanceProxyRK11b2TransformS5_S8_(i2, i11, i10, i4, i3, i5) {
 i2 = i2 | 0;
 i11 = i11 | 0;
 i10 = i10 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i6 = 0, i7 = 0, d8 = 0.0, i9 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, d24 = 0.0, d25 = 0.0, i26 = 0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0;
 i1 = STACKTOP;
 i13 = HEAP16[i11 + 4 >> 1] | 0;
 if (!((i13 & 65535) < 4)) {
  ___assert_fail(2872, 2672, 102, 2896);
 }
 i12 = i13 & 65535;
 i6 = i2 + 108 | 0;
 HEAP32[i6 >> 2] = i12;
 L4 : do {
  if (!(i13 << 16 >> 16 == 0)) {
   i17 = i10 + 20 | 0;
   i21 = i10 + 16 | 0;
   i13 = i3 + 20 | 0;
   i14 = i3 + 16 | 0;
   i15 = i4 + 12 | 0;
   i16 = i4 + 8 | 0;
   i12 = i4 + 4 | 0;
   i18 = i5 + 12 | 0;
   i19 = i5 + 8 | 0;
   i20 = i5 + 4 | 0;
   i22 = 0;
   while (1) {
    i26 = HEAPU8[i11 + i22 + 6 | 0] | 0;
    HEAP32[i2 + (i22 * 36 | 0) + 28 >> 2] = i26;
    i23 = HEAPU8[i11 + i22 + 9 | 0] | 0;
    HEAP32[i2 + (i22 * 36 | 0) + 32 >> 2] = i23;
    if ((HEAP32[i17 >> 2] | 0) <= (i26 | 0)) {
     i9 = 6;
     break;
    }
    i26 = (HEAP32[i21 >> 2] | 0) + (i26 << 3) | 0;
    d25 = +HEAPF32[i26 >> 2];
    d24 = +HEAPF32[i26 + 4 >> 2];
    if ((HEAP32[i13 >> 2] | 0) <= (i23 | 0)) {
     i9 = 8;
     break;
    }
    i23 = (HEAP32[i14 >> 2] | 0) + (i23 << 3) | 0;
    d29 = +HEAPF32[i23 >> 2];
    d31 = +HEAPF32[i23 + 4 >> 2];
    d32 = +HEAPF32[i15 >> 2];
    d30 = +HEAPF32[i16 >> 2];
    d27 = +HEAPF32[i4 >> 2] + (d25 * d32 - d24 * d30);
    d28 = +d27;
    d30 = +(d24 * d32 + d25 * d30 + +HEAPF32[i12 >> 2]);
    i23 = i2 + (i22 * 36 | 0) | 0;
    HEAPF32[i23 >> 2] = d28;
    HEAPF32[i23 + 4 >> 2] = d30;
    d30 = +HEAPF32[i18 >> 2];
    d25 = +HEAPF32[i19 >> 2];
    d24 = +HEAPF32[i5 >> 2] + (d29 * d30 - d31 * d25);
    d28 = +d24;
    d25 = +(d31 * d30 + d29 * d25 + +HEAPF32[i20 >> 2]);
    i23 = i2 + (i22 * 36 | 0) + 8 | 0;
    HEAPF32[i23 >> 2] = d28;
    HEAPF32[i23 + 4 >> 2] = d25;
    d24 = +(d24 - d27);
    d25 = +(+HEAPF32[i2 + (i22 * 36 | 0) + 12 >> 2] - +HEAPF32[i2 + (i22 * 36 | 0) + 4 >> 2]);
    i23 = i2 + (i22 * 36 | 0) + 16 | 0;
    HEAPF32[i23 >> 2] = d24;
    HEAPF32[i23 + 4 >> 2] = d25;
    HEAPF32[i2 + (i22 * 36 | 0) + 24 >> 2] = 0.0;
    i22 = i22 + 1 | 0;
    i23 = HEAP32[i6 >> 2] | 0;
    if ((i22 | 0) >= (i23 | 0)) {
     i7 = i23;
     break L4;
    }
   }
   if ((i9 | 0) == 6) {
    ___assert_fail(2776, 2808, 103, 2840);
   } else if ((i9 | 0) == 8) {
    ___assert_fail(2776, 2808, 103, 2840);
   }
  } else {
   i7 = i12;
  }
 } while (0);
 do {
  if ((i7 | 0) > 1) {
   d24 = +HEAPF32[i11 >> 2];
   if ((i7 | 0) == 2) {
    d32 = +HEAPF32[i2 + 16 >> 2] - +HEAPF32[i2 + 52 >> 2];
    d8 = +HEAPF32[i2 + 20 >> 2] - +HEAPF32[i2 + 56 >> 2];
    d8 = +Math_sqrt(+(d32 * d32 + d8 * d8));
   } else if ((i7 | 0) == 3) {
    d8 = +HEAPF32[i2 + 16 >> 2];
    d32 = +HEAPF32[i2 + 20 >> 2];
    d8 = (+HEAPF32[i2 + 52 >> 2] - d8) * (+HEAPF32[i2 + 92 >> 2] - d32) - (+HEAPF32[i2 + 56 >> 2] - d32) * (+HEAPF32[i2 + 88 >> 2] - d8);
   } else {
    ___assert_fail(2712, 2672, 259, 2736);
   }
   if (!(d8 < d24 * .5) ? !(d24 * 2.0 < d8 | d8 < 1.1920928955078125e-7) : 0) {
    i9 = 18;
    break;
   }
   HEAP32[i6 >> 2] = 0;
  } else {
   i9 = 18;
  }
 } while (0);
 if ((i9 | 0) == 18 ? (i7 | 0) != 0 : 0) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i2 + 28 >> 2] = 0;
 HEAP32[i2 + 32 >> 2] = 0;
 if ((HEAP32[i10 + 20 >> 2] | 0) <= 0) {
  ___assert_fail(2776, 2808, 103, 2840);
 }
 i26 = HEAP32[i10 + 16 >> 2] | 0;
 d8 = +HEAPF32[i26 >> 2];
 d24 = +HEAPF32[i26 + 4 >> 2];
 if ((HEAP32[i3 + 20 >> 2] | 0) <= 0) {
  ___assert_fail(2776, 2808, 103, 2840);
 }
 i26 = HEAP32[i3 + 16 >> 2] | 0;
 d27 = +HEAPF32[i26 >> 2];
 d25 = +HEAPF32[i26 + 4 >> 2];
 d30 = +HEAPF32[i4 + 12 >> 2];
 d32 = +HEAPF32[i4 + 8 >> 2];
 d31 = +HEAPF32[i4 >> 2] + (d8 * d30 - d24 * d32);
 d32 = d24 * d30 + d8 * d32 + +HEAPF32[i4 + 4 >> 2];
 d30 = +d31;
 d28 = +d32;
 i26 = i2;
 HEAPF32[i26 >> 2] = d30;
 HEAPF32[i26 + 4 >> 2] = d28;
 d28 = +HEAPF32[i5 + 12 >> 2];
 d30 = +HEAPF32[i5 + 8 >> 2];
 d29 = +HEAPF32[i5 >> 2] + (d27 * d28 - d25 * d30);
 d30 = d25 * d28 + d27 * d30 + +HEAPF32[i5 + 4 >> 2];
 d27 = +d29;
 d28 = +d30;
 i26 = i2 + 8 | 0;
 HEAPF32[i26 >> 2] = d27;
 HEAPF32[i26 + 4 >> 2] = d28;
 d31 = +(d29 - d31);
 d32 = +(d30 - d32);
 i26 = i2 + 16 | 0;
 HEAPF32[i26 >> 2] = d31;
 HEAPF32[i26 + 4 >> 2] = d32;
 HEAP32[i6 >> 2] = 1;
 STACKTOP = i1;
 return;
}
function __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i6, i7, i5, i4, i1) {
 i6 = i6 | 0;
 i7 = i7 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i9 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0;
 i8 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0;
 do {
  if (i9) {
   if (i8) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    i8 = 1;
    break;
   }
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    i8 = 2;
   } else {
    i8 = 1;
   }
  } else {
   if (i8) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0) {
     HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
     HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
     HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
     HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
     i8 = 2;
    } else {
     i8 = 1;
    }
   } else {
    i8 = 0;
   }
  }
 } while (0);
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i5) | 0)) {
  i9 = i8;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
 HEAP32[i4 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i4 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i4 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0)) {
  i9 = i8 + 1 | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0)) {
  i9 = i8 + 2 | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
 HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 i9 = i8 + 3 | 0;
 STACKTOP = i2;
 return i9 | 0;
}
function __ZN15b2ContactSolver27SolveTOIPositionConstraintsEii(i9, i2, i5) {
 i9 = i9 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 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, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, d34 = 0.0, d35 = 0.0, d36 = 0.0, i37 = 0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, d42 = 0.0, d43 = 0.0, d44 = 0.0, d45 = 0.0, i46 = 0, d47 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i8 = i1 + 40 | 0;
 i3 = i1 + 24 | 0;
 i4 = i1;
 i6 = i9 + 48 | 0;
 if ((HEAP32[i6 >> 2] | 0) <= 0) {
  d45 = 0.0;
  i37 = d45 >= -.007499999832361937;
  STACKTOP = i1;
  return i37 | 0;
 }
 i7 = i9 + 36 | 0;
 i14 = i9 + 24 | 0;
 i9 = i8 + 8 | 0;
 i15 = i8 + 12 | 0;
 i10 = i3 + 8 | 0;
 i11 = i3 + 12 | 0;
 i12 = i4 + 8 | 0;
 i13 = i4 + 16 | 0;
 i16 = 0;
 d34 = 0.0;
 do {
  i37 = HEAP32[i7 >> 2] | 0;
  i19 = i37 + (i16 * 88 | 0) | 0;
  i17 = HEAP32[i37 + (i16 * 88 | 0) + 32 >> 2] | 0;
  i18 = HEAP32[i37 + (i16 * 88 | 0) + 36 >> 2] | 0;
  i20 = i37 + (i16 * 88 | 0) + 48 | 0;
  d21 = +HEAPF32[i20 >> 2];
  d22 = +HEAPF32[i20 + 4 >> 2];
  i20 = i37 + (i16 * 88 | 0) + 56 | 0;
  d23 = +HEAPF32[i20 >> 2];
  d24 = +HEAPF32[i20 + 4 >> 2];
  i20 = HEAP32[i37 + (i16 * 88 | 0) + 84 >> 2] | 0;
  if ((i17 | 0) == (i2 | 0) | (i17 | 0) == (i5 | 0)) {
   d26 = +HEAPF32[i37 + (i16 * 88 | 0) + 64 >> 2];
   d27 = +HEAPF32[i37 + (i16 * 88 | 0) + 40 >> 2];
  } else {
   d26 = 0.0;
   d27 = 0.0;
  }
  d25 = +HEAPF32[i37 + (i16 * 88 | 0) + 44 >> 2];
  d28 = +HEAPF32[i37 + (i16 * 88 | 0) + 68 >> 2];
  i37 = HEAP32[i14 >> 2] | 0;
  i46 = i37 + (i17 * 12 | 0) | 0;
  d33 = +HEAPF32[i46 >> 2];
  d35 = +HEAPF32[i46 + 4 >> 2];
  d29 = +HEAPF32[i37 + (i17 * 12 | 0) + 8 >> 2];
  i46 = i37 + (i18 * 12 | 0) | 0;
  d32 = +HEAPF32[i46 >> 2];
  d36 = +HEAPF32[i46 + 4 >> 2];
  d31 = +HEAPF32[i37 + (i18 * 12 | 0) + 8 >> 2];
  if ((i20 | 0) > 0) {
   d30 = d27 + d25;
   i37 = 0;
   do {
    d38 = +Math_sin(+d29);
    HEAPF32[i9 >> 2] = d38;
    d44 = +Math_cos(+d29);
    HEAPF32[i15 >> 2] = d44;
    d43 = +Math_sin(+d31);
    HEAPF32[i10 >> 2] = d43;
    d41 = +Math_cos(+d31);
    HEAPF32[i11 >> 2] = d41;
    d40 = +(d33 - (d21 * d44 - d22 * d38));
    d38 = +(d35 - (d22 * d44 + d21 * d38));
    i46 = i8;
    HEAPF32[i46 >> 2] = d40;
    HEAPF32[i46 + 4 >> 2] = d38;
    d38 = +(d32 - (d23 * d41 - d24 * d43));
    d43 = +(d36 - (d24 * d41 + d23 * d43));
    i46 = i3;
    HEAPF32[i46 >> 2] = d38;
    HEAPF32[i46 + 4 >> 2] = d43;
    __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i4, i19, i8, i3, i37);
    i46 = i4;
    d43 = +HEAPF32[i46 >> 2];
    d38 = +HEAPF32[i46 + 4 >> 2];
    i46 = i12;
    d41 = +HEAPF32[i46 >> 2];
    d40 = +HEAPF32[i46 + 4 >> 2];
    d44 = +HEAPF32[i13 >> 2];
    d39 = d41 - d33;
    d42 = d40 - d35;
    d41 = d41 - d32;
    d40 = d40 - d36;
    d34 = d34 < d44 ? d34 : d44;
    d44 = (d44 + .004999999888241291) * .75;
    d44 = d44 < 0.0 ? d44 : 0.0;
    d45 = d38 * d39 - d43 * d42;
    d47 = d38 * d41 - d43 * d40;
    d45 = d47 * d28 * d47 + (d30 + d45 * d26 * d45);
    if (d45 > 0.0) {
     d44 = -(d44 < -.20000000298023224 ? -.20000000298023224 : d44) / d45;
    } else {
     d44 = 0.0;
    }
    d47 = d43 * d44;
    d45 = d38 * d44;
    d33 = d33 - d27 * d47;
    d35 = d35 - d27 * d45;
    d29 = d29 - d26 * (d39 * d45 - d42 * d47);
    d32 = d32 + d25 * d47;
    d36 = d36 + d25 * d45;
    d31 = d31 + d28 * (d41 * d45 - d40 * d47);
    i37 = i37 + 1 | 0;
   } while ((i37 | 0) != (i20 | 0));
   i37 = HEAP32[i14 >> 2] | 0;
  }
  d47 = +d33;
  d45 = +d35;
  i46 = i37 + (i17 * 12 | 0) | 0;
  HEAPF32[i46 >> 2] = d47;
  HEAPF32[i46 + 4 >> 2] = d45;
  i46 = HEAP32[i14 >> 2] | 0;
  HEAPF32[i46 + (i17 * 12 | 0) + 8 >> 2] = d29;
  d45 = +d32;
  d47 = +d36;
  i46 = i46 + (i18 * 12 | 0) | 0;
  HEAPF32[i46 >> 2] = d45;
  HEAPF32[i46 + 4 >> 2] = d47;
  HEAPF32[(HEAP32[i14 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2] = d31;
  i16 = i16 + 1 | 0;
 } while ((i16 | 0) < (HEAP32[i6 >> 2] | 0));
 i46 = d34 >= -.007499999832361937;
 STACKTOP = i1;
 return i46 | 0;
}
function __ZN15b2ContactSolver24SolvePositionConstraintsEv(i7) {
 i7 = i7 | 0;
 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, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, i26 = 0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, d34 = 0.0, i35 = 0, d36 = 0.0, d37 = 0.0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, d42 = 0.0, d43 = 0.0, i44 = 0, d45 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i4 = i1 + 40 | 0;
 i5 = i1 + 24 | 0;
 i3 = i1;
 i2 = i7 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  d43 = 0.0;
  i35 = d43 >= -.014999999664723873;
  STACKTOP = i1;
  return i35 | 0;
 }
 i6 = i7 + 36 | 0;
 i9 = i7 + 24 | 0;
 i13 = i4 + 8 | 0;
 i7 = i4 + 12 | 0;
 i8 = i5 + 8 | 0;
 i12 = i5 + 12 | 0;
 i10 = i3 + 8 | 0;
 i11 = i3 + 16 | 0;
 i35 = HEAP32[i9 >> 2] | 0;
 i15 = 0;
 d32 = 0.0;
 do {
  i21 = HEAP32[i6 >> 2] | 0;
  i26 = i21 + (i15 * 88 | 0) | 0;
  i16 = HEAP32[i21 + (i15 * 88 | 0) + 32 >> 2] | 0;
  i14 = HEAP32[i21 + (i15 * 88 | 0) + 36 >> 2] | 0;
  i44 = i21 + (i15 * 88 | 0) + 48 | 0;
  d22 = +HEAPF32[i44 >> 2];
  d23 = +HEAPF32[i44 + 4 >> 2];
  d25 = +HEAPF32[i21 + (i15 * 88 | 0) + 40 >> 2];
  d18 = +HEAPF32[i21 + (i15 * 88 | 0) + 64 >> 2];
  i44 = i21 + (i15 * 88 | 0) + 56 | 0;
  d24 = +HEAPF32[i44 >> 2];
  d19 = +HEAPF32[i44 + 4 >> 2];
  d17 = +HEAPF32[i21 + (i15 * 88 | 0) + 44 >> 2];
  d20 = +HEAPF32[i21 + (i15 * 88 | 0) + 68 >> 2];
  i21 = HEAP32[i21 + (i15 * 88 | 0) + 84 >> 2] | 0;
  i44 = i35 + (i16 * 12 | 0) | 0;
  d28 = +HEAPF32[i44 >> 2];
  d33 = +HEAPF32[i44 + 4 >> 2];
  d29 = +HEAPF32[i35 + (i16 * 12 | 0) + 8 >> 2];
  i44 = i35 + (i14 * 12 | 0) | 0;
  d30 = +HEAPF32[i44 >> 2];
  d34 = +HEAPF32[i44 + 4 >> 2];
  d31 = +HEAPF32[i35 + (i14 * 12 | 0) + 8 >> 2];
  if ((i21 | 0) > 0) {
   d27 = d25 + d17;
   i35 = 0;
   do {
    d41 = +Math_sin(+d29);
    HEAPF32[i13 >> 2] = d41;
    d42 = +Math_cos(+d29);
    HEAPF32[i7 >> 2] = d42;
    d39 = +Math_sin(+d31);
    HEAPF32[i8 >> 2] = d39;
    d38 = +Math_cos(+d31);
    HEAPF32[i12 >> 2] = d38;
    d40 = +(d28 - (d22 * d42 - d23 * d41));
    d41 = +(d33 - (d23 * d42 + d22 * d41));
    i44 = i4;
    HEAPF32[i44 >> 2] = d40;
    HEAPF32[i44 + 4 >> 2] = d41;
    d41 = +(d30 - (d24 * d38 - d19 * d39));
    d39 = +(d34 - (d19 * d38 + d24 * d39));
    i44 = i5;
    HEAPF32[i44 >> 2] = d41;
    HEAPF32[i44 + 4 >> 2] = d39;
    __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i3, i26, i4, i5, i35);
    i44 = i3;
    d39 = +HEAPF32[i44 >> 2];
    d41 = +HEAPF32[i44 + 4 >> 2];
    i44 = i10;
    d38 = +HEAPF32[i44 >> 2];
    d40 = +HEAPF32[i44 + 4 >> 2];
    d42 = +HEAPF32[i11 >> 2];
    d36 = d38 - d28;
    d37 = d40 - d33;
    d38 = d38 - d30;
    d40 = d40 - d34;
    d32 = d32 < d42 ? d32 : d42;
    d42 = (d42 + .004999999888241291) * .20000000298023224;
    d43 = d42 < 0.0 ? d42 : 0.0;
    d42 = d41 * d36 - d39 * d37;
    d45 = d41 * d38 - d39 * d40;
    d42 = d45 * d20 * d45 + (d27 + d42 * d18 * d42);
    if (d42 > 0.0) {
     d42 = -(d43 < -.20000000298023224 ? -.20000000298023224 : d43) / d42;
    } else {
     d42 = 0.0;
    }
    d45 = d39 * d42;
    d43 = d41 * d42;
    d28 = d28 - d25 * d45;
    d33 = d33 - d25 * d43;
    d29 = d29 - d18 * (d36 * d43 - d37 * d45);
    d30 = d30 + d17 * d45;
    d34 = d34 + d17 * d43;
    d31 = d31 + d20 * (d38 * d43 - d40 * d45);
    i35 = i35 + 1 | 0;
   } while ((i35 | 0) != (i21 | 0));
   i35 = HEAP32[i9 >> 2] | 0;
  }
  d45 = +d28;
  d43 = +d33;
  i35 = i35 + (i16 * 12 | 0) | 0;
  HEAPF32[i35 >> 2] = d45;
  HEAPF32[i35 + 4 >> 2] = d43;
  i35 = HEAP32[i9 >> 2] | 0;
  HEAPF32[i35 + (i16 * 12 | 0) + 8 >> 2] = d29;
  d43 = +d30;
  d45 = +d34;
  i35 = i35 + (i14 * 12 | 0) | 0;
  HEAPF32[i35 >> 2] = d43;
  HEAPF32[i35 + 4 >> 2] = d45;
  i35 = HEAP32[i9 >> 2] | 0;
  HEAPF32[i35 + (i14 * 12 | 0) + 8 >> 2] = d31;
  i15 = i15 + 1 | 0;
 } while ((i15 | 0) < (HEAP32[i2 >> 2] | 0));
 i44 = d32 >= -.014999999664723873;
 STACKTOP = i1;
 return i44 | 0;
}
function __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i1, i7, i6, i22, i5) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i6 = i6 | 0;
 i22 = i22 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d23 = 0.0, d24 = 0.0;
 i4 = STACKTOP;
 i2 = i1 + 60 | 0;
 HEAP32[i2 >> 2] = 0;
 i3 = i22 + 12 | 0;
 d9 = +HEAPF32[i5 + 12 >> 2];
 d23 = +HEAPF32[i3 >> 2];
 d17 = +HEAPF32[i5 + 8 >> 2];
 d18 = +HEAPF32[i22 + 16 >> 2];
 d21 = +HEAPF32[i5 >> 2] + (d9 * d23 - d17 * d18) - +HEAPF32[i6 >> 2];
 d18 = d23 * d17 + d9 * d18 + +HEAPF32[i5 + 4 >> 2] - +HEAPF32[i6 + 4 >> 2];
 d9 = +HEAPF32[i6 + 12 >> 2];
 d17 = +HEAPF32[i6 + 8 >> 2];
 d23 = d21 * d9 + d18 * d17;
 d17 = d9 * d18 - d21 * d17;
 i6 = i7 + 12 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 i6 = HEAP32[i6 + 4 >> 2] | 0;
 d21 = (HEAP32[tempDoublePtr >> 2] = i5, +HEAPF32[tempDoublePtr >> 2]);
 d18 = (HEAP32[tempDoublePtr >> 2] = i6, +HEAPF32[tempDoublePtr >> 2]);
 i15 = i7 + 20 | 0;
 i14 = HEAP32[i15 >> 2] | 0;
 i15 = HEAP32[i15 + 4 >> 2] | 0;
 d9 = (HEAP32[tempDoublePtr >> 2] = i14, +HEAPF32[tempDoublePtr >> 2]);
 d10 = (HEAP32[tempDoublePtr >> 2] = i15, +HEAPF32[tempDoublePtr >> 2]);
 d8 = d9 - d21;
 d16 = d10 - d18;
 d19 = d8 * (d9 - d23) + d16 * (d10 - d17);
 d13 = d23 - d21;
 d12 = d17 - d18;
 d20 = d13 * d8 + d12 * d16;
 d11 = +HEAPF32[i7 + 8 >> 2] + +HEAPF32[i22 + 8 >> 2];
 if (d20 <= 0.0) {
  if (d13 * d13 + d12 * d12 > d11 * d11) {
   STACKTOP = i4;
   return;
  }
  if ((HEAP8[i7 + 44 | 0] | 0) != 0 ? (i22 = i7 + 28 | 0, d24 = +HEAPF32[i22 >> 2], (d21 - d23) * (d21 - d24) + (d18 - d17) * (d18 - +HEAPF32[i22 + 4 >> 2]) > 0.0) : 0) {
   STACKTOP = i4;
   return;
  }
  HEAP32[i2 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 0;
  HEAPF32[i1 + 40 >> 2] = 0.0;
  HEAPF32[i1 + 44 >> 2] = 0.0;
  i14 = i1 + 48 | 0;
  HEAP32[i14 >> 2] = i5;
  HEAP32[i14 + 4 >> 2] = i6;
  i14 = i1 + 16 | 0;
  HEAP32[i14 >> 2] = 0;
  HEAP8[i14] = 0;
  HEAP8[i14 + 1 | 0] = 0;
  HEAP8[i14 + 2 | 0] = 0;
  HEAP8[i14 + 3 | 0] = 0;
  i14 = i3;
  i15 = HEAP32[i14 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  STACKTOP = i4;
  return;
 }
 if (d19 <= 0.0) {
  d8 = d23 - d9;
  d12 = d17 - d10;
  if (d8 * d8 + d12 * d12 > d11 * d11) {
   STACKTOP = i4;
   return;
  }
  if ((HEAP8[i7 + 45 | 0] | 0) != 0 ? (i22 = i7 + 36 | 0, d24 = +HEAPF32[i22 >> 2], d8 * (d24 - d9) + d12 * (+HEAPF32[i22 + 4 >> 2] - d10) > 0.0) : 0) {
   STACKTOP = i4;
   return;
  }
  HEAP32[i2 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 0;
  HEAPF32[i1 + 40 >> 2] = 0.0;
  HEAPF32[i1 + 44 >> 2] = 0.0;
  i22 = i1 + 48 | 0;
  HEAP32[i22 >> 2] = i14;
  HEAP32[i22 + 4 >> 2] = i15;
  i14 = i1 + 16 | 0;
  HEAP32[i14 >> 2] = 0;
  HEAP8[i14] = 1;
  HEAP8[i14 + 1 | 0] = 0;
  HEAP8[i14 + 2 | 0] = 0;
  HEAP8[i14 + 3 | 0] = 0;
  i14 = i3;
  i15 = HEAP32[i14 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  STACKTOP = i4;
  return;
 }
 d24 = d8 * d8 + d16 * d16;
 if (!(d24 > 0.0)) {
  ___assert_fail(5560, 5576, 127, 5616);
 }
 d24 = 1.0 / d24;
 d23 = d23 - (d21 * d19 + d9 * d20) * d24;
 d24 = d17 - (d18 * d19 + d10 * d20) * d24;
 if (d23 * d23 + d24 * d24 > d11 * d11) {
  STACKTOP = i4;
  return;
 }
 d9 = -d16;
 if (d8 * d12 + d13 * d9 < 0.0) {
  d8 = -d8;
 } else {
  d16 = d9;
 }
 d9 = +Math_sqrt(+(d8 * d8 + d16 * d16));
 if (!(d9 < 1.1920928955078125e-7)) {
  d24 = 1.0 / d9;
  d16 = d16 * d24;
  d8 = d8 * d24;
 }
 HEAP32[i2 >> 2] = 1;
 HEAP32[i1 + 56 >> 2] = 1;
 d23 = +d16;
 d24 = +d8;
 i14 = i1 + 40 | 0;
 HEAPF32[i14 >> 2] = d23;
 HEAPF32[i14 + 4 >> 2] = d24;
 i14 = i1 + 48 | 0;
 HEAP32[i14 >> 2] = i5;
 HEAP32[i14 + 4 >> 2] = i6;
 i14 = i1 + 16 | 0;
 HEAP32[i14 >> 2] = 0;
 HEAP8[i14] = 0;
 HEAP8[i14 + 1 | 0] = 0;
 HEAP8[i14 + 2 | 0] = 1;
 HEAP8[i14 + 3 | 0] = 0;
 i14 = i3;
 i15 = HEAP32[i14 + 4 >> 2] | 0;
 i22 = i1;
 HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
 HEAP32[i22 + 4 >> 2] = i15;
 STACKTOP = i4;
 return;
}
function __ZN6b2BodyC2EPK9b2BodyDefP7b2World(i1, i2, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, d13 = 0.0;
 i3 = STACKTOP;
 i9 = i2 + 4 | 0;
 d13 = +HEAPF32[i9 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1496, 1520, 27, 1552);
 }
 d13 = +HEAPF32[i2 + 8 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1496, 1520, 27, 1552);
 }
 i6 = i2 + 16 | 0;
 d13 = +HEAPF32[i6 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1560, 1520, 28, 1552);
 }
 d13 = +HEAPF32[i2 + 20 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1560, 1520, 28, 1552);
 }
 i7 = i2 + 12 | 0;
 d13 = +HEAPF32[i7 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1592, 1520, 29, 1552);
 }
 i8 = i2 + 24 | 0;
 d13 = +HEAPF32[i8 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1616, 1520, 30, 1552);
 }
 i4 = i2 + 32 | 0;
 d13 = +HEAPF32[i4 >> 2];
 if (!(d13 >= 0.0) | d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf ^ 1) {
  ___assert_fail(1648, 1520, 31, 1552);
 }
 i10 = i2 + 28 | 0;
 d13 = +HEAPF32[i10 >> 2];
 if (!(d13 >= 0.0) | d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf ^ 1) {
  ___assert_fail(1712, 1520, 32, 1552);
 }
 i11 = i1 + 4 | 0;
 i12 = (HEAP8[i2 + 39 | 0] | 0) == 0 ? 0 : 8;
 HEAP16[i11 >> 1] = i12;
 if ((HEAP8[i2 + 38 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 16) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 36 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 4) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 37 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 2) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 40 | 0] | 0) != 0) {
  HEAP16[i11 >> 1] = i12 & 65535 | 32;
 }
 HEAP32[i1 + 88 >> 2] = i5;
 i11 = i9;
 i12 = HEAP32[i11 >> 2] | 0;
 i11 = HEAP32[i11 + 4 >> 2] | 0;
 i9 = i1 + 12 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 d13 = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 20 >> 2] = +Math_sin(+d13);
 HEAPF32[i1 + 24 >> 2] = +Math_cos(+d13);
 HEAPF32[i1 + 28 >> 2] = 0.0;
 HEAPF32[i1 + 32 >> 2] = 0.0;
 i9 = i1 + 36 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 i9 = i1 + 44 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 HEAPF32[i1 + 52 >> 2] = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 56 >> 2] = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 60 >> 2] = 0.0;
 HEAP32[i1 + 108 >> 2] = 0;
 HEAP32[i1 + 112 >> 2] = 0;
 HEAP32[i1 + 92 >> 2] = 0;
 HEAP32[i1 + 96 >> 2] = 0;
 i9 = i6;
 i11 = HEAP32[i9 + 4 >> 2] | 0;
 i12 = i1 + 64 | 0;
 HEAP32[i12 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i12 + 4 >> 2] = i11;
 HEAPF32[i1 + 72 >> 2] = +HEAPF32[i8 >> 2];
 HEAPF32[i1 + 132 >> 2] = +HEAPF32[i10 >> 2];
 HEAPF32[i1 + 136 >> 2] = +HEAPF32[i4 >> 2];
 HEAPF32[i1 + 140 >> 2] = +HEAPF32[i2 + 48 >> 2];
 HEAPF32[i1 + 76 >> 2] = 0.0;
 HEAPF32[i1 + 80 >> 2] = 0.0;
 HEAPF32[i1 + 84 >> 2] = 0.0;
 HEAPF32[i1 + 144 >> 2] = 0.0;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i1 >> 2] = i12;
 i4 = i1 + 116 | 0;
 if ((i12 | 0) == 2) {
  HEAPF32[i4 >> 2] = 1.0;
  HEAPF32[i1 + 120 >> 2] = 1.0;
  i11 = i1 + 124 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i1 + 128 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i2 + 44 | 0;
  i11 = HEAP32[i11 >> 2] | 0;
  i12 = i1 + 148 | 0;
  HEAP32[i12 >> 2] = i11;
  i12 = i1 + 100 | 0;
  HEAP32[i12 >> 2] = 0;
  i12 = i1 + 104 | 0;
  HEAP32[i12 >> 2] = 0;
  STACKTOP = i3;
  return;
 } else {
  HEAPF32[i4 >> 2] = 0.0;
  HEAPF32[i1 + 120 >> 2] = 0.0;
  i11 = i1 + 124 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i1 + 128 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i2 + 44 | 0;
  i11 = HEAP32[i11 >> 2] | 0;
  i12 = i1 + 148 | 0;
  HEAP32[i12 >> 2] = i11;
  i12 = i1 + 100 | 0;
  HEAP32[i12 >> 2] = 0;
  i12 = i1 + 104 | 0;
  HEAP32[i12 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
}
function __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i2, i1, i13, i12, i15) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 i13 = i13 | 0;
 i12 = i12 | 0;
 i15 = i15 | 0;
 var i3 = 0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i14 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, i19 = 0, i20 = 0;
 i3 = STACKTOP;
 if ((HEAP32[i1 + 84 >> 2] | 0) <= 0) {
  ___assert_fail(6752, 6520, 617, 6776);
 }
 i14 = HEAP32[i1 + 72 >> 2] | 0;
 if ((i14 | 0) == 1) {
  i19 = i13 + 12 | 0;
  d5 = +HEAPF32[i19 >> 2];
  d6 = +HEAPF32[i1 + 16 >> 2];
  i14 = i13 + 8 | 0;
  d7 = +HEAPF32[i14 >> 2];
  d9 = +HEAPF32[i1 + 20 >> 2];
  d4 = d5 * d6 - d7 * d9;
  d9 = d6 * d7 + d5 * d9;
  d5 = +d4;
  d7 = +d9;
  i20 = i2;
  HEAPF32[i20 >> 2] = d5;
  HEAPF32[i20 + 4 >> 2] = d7;
  d7 = +HEAPF32[i19 >> 2];
  d5 = +HEAPF32[i1 + 24 >> 2];
  d6 = +HEAPF32[i14 >> 2];
  d8 = +HEAPF32[i1 + 28 >> 2];
  d16 = +HEAPF32[i12 + 12 >> 2];
  d18 = +HEAPF32[i1 + (i15 << 3) >> 2];
  d17 = +HEAPF32[i12 + 8 >> 2];
  d11 = +HEAPF32[i1 + (i15 << 3) + 4 >> 2];
  d10 = +HEAPF32[i12 >> 2] + (d16 * d18 - d17 * d11);
  d11 = d18 * d17 + d16 * d11 + +HEAPF32[i12 + 4 >> 2];
  HEAPF32[i2 + 16 >> 2] = d4 * (d10 - (+HEAPF32[i13 >> 2] + (d7 * d5 - d6 * d8))) + (d11 - (d5 * d6 + d7 * d8 + +HEAPF32[i13 + 4 >> 2])) * d9 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  d10 = +d10;
  d11 = +d11;
  i15 = i2 + 8 | 0;
  HEAPF32[i15 >> 2] = d10;
  HEAPF32[i15 + 4 >> 2] = d11;
  STACKTOP = i3;
  return;
 } else if ((i14 | 0) == 2) {
  i19 = i12 + 12 | 0;
  d7 = +HEAPF32[i19 >> 2];
  d8 = +HEAPF32[i1 + 16 >> 2];
  i20 = i12 + 8 | 0;
  d9 = +HEAPF32[i20 >> 2];
  d18 = +HEAPF32[i1 + 20 >> 2];
  d17 = d7 * d8 - d9 * d18;
  d18 = d8 * d9 + d7 * d18;
  d7 = +d17;
  d9 = +d18;
  i14 = i2;
  HEAPF32[i14 >> 2] = d7;
  HEAPF32[i14 + 4 >> 2] = d9;
  d9 = +HEAPF32[i19 >> 2];
  d7 = +HEAPF32[i1 + 24 >> 2];
  d8 = +HEAPF32[i20 >> 2];
  d10 = +HEAPF32[i1 + 28 >> 2];
  d6 = +HEAPF32[i13 + 12 >> 2];
  d4 = +HEAPF32[i1 + (i15 << 3) >> 2];
  d5 = +HEAPF32[i13 + 8 >> 2];
  d16 = +HEAPF32[i1 + (i15 << 3) + 4 >> 2];
  d11 = +HEAPF32[i13 >> 2] + (d6 * d4 - d5 * d16);
  d16 = d4 * d5 + d6 * d16 + +HEAPF32[i13 + 4 >> 2];
  HEAPF32[i2 + 16 >> 2] = d17 * (d11 - (+HEAPF32[i12 >> 2] + (d9 * d7 - d8 * d10))) + (d16 - (d7 * d8 + d9 * d10 + +HEAPF32[i12 + 4 >> 2])) * d18 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  d11 = +d11;
  d16 = +d16;
  i20 = i2 + 8 | 0;
  HEAPF32[i20 >> 2] = d11;
  HEAPF32[i20 + 4 >> 2] = d16;
  d17 = +-d17;
  d18 = +-d18;
  i20 = i2;
  HEAPF32[i20 >> 2] = d17;
  HEAPF32[i20 + 4 >> 2] = d18;
  STACKTOP = i3;
  return;
 } else if ((i14 | 0) == 0) {
  d7 = +HEAPF32[i13 + 12 >> 2];
  d8 = +HEAPF32[i1 + 24 >> 2];
  d18 = +HEAPF32[i13 + 8 >> 2];
  d6 = +HEAPF32[i1 + 28 >> 2];
  d4 = +HEAPF32[i13 >> 2] + (d7 * d8 - d18 * d6);
  d6 = d8 * d18 + d7 * d6 + +HEAPF32[i13 + 4 >> 2];
  d7 = +HEAPF32[i12 + 12 >> 2];
  d18 = +HEAPF32[i1 >> 2];
  d8 = +HEAPF32[i12 + 8 >> 2];
  d9 = +HEAPF32[i1 + 4 >> 2];
  d5 = +HEAPF32[i12 >> 2] + (d7 * d18 - d8 * d9);
  d9 = d18 * d8 + d7 * d9 + +HEAPF32[i12 + 4 >> 2];
  d7 = d5 - d4;
  d8 = d9 - d6;
  d18 = +d7;
  d10 = +d8;
  i20 = i2;
  HEAPF32[i20 >> 2] = d18;
  HEAPF32[i20 + 4 >> 2] = d10;
  d10 = +Math_sqrt(+(d7 * d7 + d8 * d8));
  if (d10 < 1.1920928955078125e-7) {
   d10 = d7;
   d11 = d8;
  } else {
   d11 = 1.0 / d10;
   d10 = d7 * d11;
   HEAPF32[i2 >> 2] = d10;
   d11 = d8 * d11;
   HEAPF32[i2 + 4 >> 2] = d11;
  }
  d17 = +((d4 + d5) * .5);
  d18 = +((d6 + d9) * .5);
  i20 = i2 + 8 | 0;
  HEAPF32[i20 >> 2] = d17;
  HEAPF32[i20 + 4 >> 2] = d18;
  HEAPF32[i2 + 16 >> 2] = d7 * d10 + d8 * d11 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  STACKTOP = i3;
  return;
 } else {
  STACKTOP = i3;
  return;
 }
}
function __ZNSt3__118__insertion_sort_3IRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i1, i2) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i6 = i4 + 12 | 0;
 i3 = i4;
 i7 = i5 + 24 | 0;
 i8 = i5 + 12 | 0;
 i10 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i5) | 0;
 i9 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i8) | 0;
 do {
  if (i10) {
   if (i9) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    break;
   }
   HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i8) | 0) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   }
  } else {
   if (i9) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i5) | 0) {
     HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
     HEAP32[i5 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
     HEAP32[i5 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
     HEAP32[i5 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
     HEAP32[i8 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i8 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i8 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    }
   }
  }
 } while (0);
 i6 = i5 + 36 | 0;
 if ((i6 | 0) == (i1 | 0)) {
  STACKTOP = i4;
  return;
 }
 while (1) {
  if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i7) | 0) {
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   i8 = i6;
   while (1) {
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    if ((i7 | 0) == (i5 | 0)) {
     break;
    }
    i8 = i7 + -12 | 0;
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i3, i8) | 0) {
     i10 = i7;
     i7 = i8;
     i8 = i10;
    } else {
     break;
    }
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
  }
  i7 = i6 + 12 | 0;
  if ((i7 | 0) == (i1 | 0)) {
   break;
  } else {
   i10 = i6;
   i6 = i7;
   i7 = i10;
  }
 }
 STACKTOP = i4;
 return;
}
function __ZNK20b2SeparationFunction8EvaluateEiif(i10, i12, i11, d9) {
 i10 = i10 | 0;
 i12 = i12 | 0;
 i11 = i11 | 0;
 d9 = +d9;
 var d1 = 0.0, d2 = 0.0, d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, i7 = 0, d8 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0;
 i7 = STACKTOP;
 d14 = 1.0 - d9;
 d3 = d14 * +HEAPF32[i10 + 32 >> 2] + +HEAPF32[i10 + 36 >> 2] * d9;
 d4 = +Math_sin(+d3);
 d3 = +Math_cos(+d3);
 d5 = +HEAPF32[i10 + 8 >> 2];
 d6 = +HEAPF32[i10 + 12 >> 2];
 d2 = d14 * +HEAPF32[i10 + 16 >> 2] + +HEAPF32[i10 + 24 >> 2] * d9 - (d3 * d5 - d4 * d6);
 d6 = d14 * +HEAPF32[i10 + 20 >> 2] + +HEAPF32[i10 + 28 >> 2] * d9 - (d4 * d5 + d3 * d6);
 d5 = d14 * +HEAPF32[i10 + 68 >> 2] + +HEAPF32[i10 + 72 >> 2] * d9;
 d1 = +Math_sin(+d5);
 d5 = +Math_cos(+d5);
 d15 = +HEAPF32[i10 + 44 >> 2];
 d16 = +HEAPF32[i10 + 48 >> 2];
 d8 = d14 * +HEAPF32[i10 + 52 >> 2] + +HEAPF32[i10 + 60 >> 2] * d9 - (d5 * d15 - d1 * d16);
 d9 = d14 * +HEAPF32[i10 + 56 >> 2] + +HEAPF32[i10 + 64 >> 2] * d9 - (d1 * d15 + d5 * d16);
 i17 = HEAP32[i10 + 80 >> 2] | 0;
 if ((i17 | 0) == 0) {
  d14 = +HEAPF32[i10 + 92 >> 2];
  d13 = +HEAPF32[i10 + 96 >> 2];
  i17 = HEAP32[i10 >> 2] | 0;
  if (!((i12 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i17 + 20 >> 2] | 0) <= (i12 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i17 + 16 >> 2] | 0) + (i12 << 3) | 0;
  d15 = +HEAPF32[i17 >> 2];
  d16 = +HEAPF32[i17 + 4 >> 2];
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if (!((i11 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d19 = +HEAPF32[i17 >> 2];
  d18 = +HEAPF32[i17 + 4 >> 2];
  d16 = d14 * (d8 + (d5 * d19 - d1 * d18) - (d2 + (d3 * d15 - d4 * d16))) + d13 * (d9 + (d1 * d19 + d5 * d18) - (d6 + (d4 * d15 + d3 * d16)));
  STACKTOP = i7;
  return +d16;
 } else if ((i17 | 0) == 1) {
  d14 = +HEAPF32[i10 + 92 >> 2];
  d13 = +HEAPF32[i10 + 96 >> 2];
  d16 = +HEAPF32[i10 + 84 >> 2];
  d15 = +HEAPF32[i10 + 88 >> 2];
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if (!((i11 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d18 = +HEAPF32[i17 >> 2];
  d19 = +HEAPF32[i17 + 4 >> 2];
  d19 = (d3 * d14 - d4 * d13) * (d8 + (d5 * d18 - d1 * d19) - (d2 + (d3 * d16 - d4 * d15))) + (d4 * d14 + d3 * d13) * (d9 + (d1 * d18 + d5 * d19) - (d6 + (d4 * d16 + d3 * d15)));
  STACKTOP = i7;
  return +d19;
 } else if ((i17 | 0) == 2) {
  d16 = +HEAPF32[i10 + 92 >> 2];
  d15 = +HEAPF32[i10 + 96 >> 2];
  d14 = +HEAPF32[i10 + 84 >> 2];
  d13 = +HEAPF32[i10 + 88 >> 2];
  i10 = HEAP32[i10 >> 2] | 0;
  if (!((i12 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i12 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i12 << 3) | 0;
  d18 = +HEAPF32[i17 >> 2];
  d19 = +HEAPF32[i17 + 4 >> 2];
  d19 = (d5 * d16 - d1 * d15) * (d2 + (d3 * d18 - d4 * d19) - (d8 + (d5 * d14 - d1 * d13))) + (d1 * d16 + d5 * d15) * (d6 + (d4 * d18 + d3 * d19) - (d9 + (d1 * d14 + d5 * d13)));
  STACKTOP = i7;
  return +d19;
 } else {
  ___assert_fail(3616, 3560, 242, 3624);
 }
 return 0.0;
}
function __ZN6b2Body13ResetMassDataEv(i2) {
 i2 = i2 | 0;
 var d1 = 0.0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i10 = i3;
 i8 = i2 + 116 | 0;
 i9 = i2 + 120 | 0;
 i4 = i2 + 124 | 0;
 i5 = i2 + 128 | 0;
 i6 = i2 + 28 | 0;
 HEAPF32[i6 >> 2] = 0.0;
 HEAPF32[i2 + 32 >> 2] = 0.0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 i11 = HEAP32[i2 >> 2] | 0;
 if ((i11 | 0) == 2) {
  i17 = 3784;
  d16 = +HEAPF32[i17 >> 2];
  d18 = +HEAPF32[i17 + 4 >> 2];
  i17 = HEAP32[i2 + 100 >> 2] | 0;
  if ((i17 | 0) != 0) {
   i11 = i10 + 4 | 0;
   i12 = i10 + 8 | 0;
   i13 = i10 + 12 | 0;
   d14 = 0.0;
   d15 = 0.0;
   do {
    d19 = +HEAPF32[i17 >> 2];
    if (!(d19 == 0.0)) {
     i20 = HEAP32[i17 + 12 >> 2] | 0;
     FUNCTION_TABLE_viid[HEAP32[(HEAP32[i20 >> 2] | 0) + 28 >> 2] & 3](i20, i10, d19);
     d14 = +HEAPF32[i10 >> 2];
     d15 = d14 + +HEAPF32[i8 >> 2];
     HEAPF32[i8 >> 2] = d15;
     d16 = d16 + d14 * +HEAPF32[i11 >> 2];
     d18 = d18 + d14 * +HEAPF32[i12 >> 2];
     d14 = +HEAPF32[i13 >> 2] + +HEAPF32[i4 >> 2];
     HEAPF32[i4 >> 2] = d14;
    }
    i17 = HEAP32[i17 + 4 >> 2] | 0;
   } while ((i17 | 0) != 0);
   if (d15 > 0.0) {
    d19 = 1.0 / d15;
    HEAPF32[i9 >> 2] = d19;
    d16 = d16 * d19;
    d18 = d18 * d19;
   } else {
    i7 = 11;
   }
  } else {
   d14 = 0.0;
   i7 = 11;
  }
  if ((i7 | 0) == 11) {
   HEAPF32[i8 >> 2] = 1.0;
   HEAPF32[i9 >> 2] = 1.0;
   d15 = 1.0;
  }
  do {
   if (d14 > 0.0 ? (HEAP16[i2 + 4 >> 1] & 16) == 0 : 0) {
    d14 = d14 - (d18 * d18 + d16 * d16) * d15;
    HEAPF32[i4 >> 2] = d14;
    if (d14 > 0.0) {
     d1 = 1.0 / d14;
     break;
    } else {
     ___assert_fail(1872, 1520, 319, 1856);
    }
   } else {
    i7 = 17;
   }
  } while (0);
  if ((i7 | 0) == 17) {
   HEAPF32[i4 >> 2] = 0.0;
   d1 = 0.0;
  }
  HEAPF32[i5 >> 2] = d1;
  i20 = i2 + 44 | 0;
  i17 = i20;
  d19 = +HEAPF32[i17 >> 2];
  d14 = +HEAPF32[i17 + 4 >> 2];
  d21 = +d16;
  d1 = +d18;
  i17 = i6;
  HEAPF32[i17 >> 2] = d21;
  HEAPF32[i17 + 4 >> 2] = d1;
  d1 = +HEAPF32[i2 + 24 >> 2];
  d21 = +HEAPF32[i2 + 20 >> 2];
  d15 = +HEAPF32[i2 + 12 >> 2] + (d1 * d16 - d21 * d18);
  d16 = d16 * d21 + d1 * d18 + +HEAPF32[i2 + 16 >> 2];
  d1 = +d15;
  d18 = +d16;
  HEAPF32[i20 >> 2] = d1;
  HEAPF32[i20 + 4 >> 2] = d18;
  i20 = i2 + 36 | 0;
  HEAPF32[i20 >> 2] = d1;
  HEAPF32[i20 + 4 >> 2] = d18;
  d18 = +HEAPF32[i2 + 72 >> 2];
  i20 = i2 + 64 | 0;
  HEAPF32[i20 >> 2] = +HEAPF32[i20 >> 2] - d18 * (d16 - d14);
  i20 = i2 + 68 | 0;
  HEAPF32[i20 >> 2] = d18 * (d15 - d19) + +HEAPF32[i20 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i11 | 0) == 1 | (i11 | 0) == 0) {
  i17 = i2 + 12 | 0;
  i13 = HEAP32[i17 >> 2] | 0;
  i17 = HEAP32[i17 + 4 >> 2] | 0;
  i20 = i2 + 36 | 0;
  HEAP32[i20 >> 2] = i13;
  HEAP32[i20 + 4 >> 2] = i17;
  i20 = i2 + 44 | 0;
  HEAP32[i20 >> 2] = i13;
  HEAP32[i20 + 4 >> 2] = i17;
  HEAPF32[i2 + 52 >> 2] = +HEAPF32[i2 + 56 >> 2];
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(1824, 1520, 284, 1856);
 }
}
function __ZN9b2Contact6UpdateEP17b2ContactListener(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 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;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i2 = i3;
 i10 = i1 + 64 | 0;
 i6 = i2 + 0 | 0;
 i7 = i10 + 0 | 0;
 i5 = i6 + 64 | 0;
 do {
  HEAP32[i6 >> 2] = HEAP32[i7 >> 2];
  i6 = i6 + 4 | 0;
  i7 = i7 + 4 | 0;
 } while ((i6 | 0) < (i5 | 0));
 i6 = i1 + 4 | 0;
 i11 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i11 | 4;
 i11 = i11 >>> 1;
 i14 = HEAP32[i1 + 48 >> 2] | 0;
 i15 = HEAP32[i1 + 52 >> 2] | 0;
 i5 = (HEAP8[i15 + 38 | 0] | HEAP8[i14 + 38 | 0]) << 24 >> 24 != 0;
 i8 = HEAP32[i14 + 8 >> 2] | 0;
 i7 = HEAP32[i15 + 8 >> 2] | 0;
 i12 = i8 + 12 | 0;
 i13 = i7 + 12 | 0;
 if (!i5) {
  FUNCTION_TABLE_viiii[HEAP32[HEAP32[i1 >> 2] >> 2] & 15](i1, i10, i12, i13);
  i12 = i1 + 124 | 0;
  i10 = (HEAP32[i12 >> 2] | 0) > 0;
  L4 : do {
   if (i10) {
    i19 = HEAP32[i2 + 60 >> 2] | 0;
    if ((i19 | 0) > 0) {
     i18 = 0;
    } else {
     i9 = 0;
     while (1) {
      HEAPF32[i1 + (i9 * 20 | 0) + 72 >> 2] = 0.0;
      HEAPF32[i1 + (i9 * 20 | 0) + 76 >> 2] = 0.0;
      i9 = i9 + 1 | 0;
      if ((i9 | 0) >= (HEAP32[i12 >> 2] | 0)) {
       break L4;
      }
     }
    }
    do {
     i16 = i1 + (i18 * 20 | 0) + 72 | 0;
     HEAPF32[i16 >> 2] = 0.0;
     i15 = i1 + (i18 * 20 | 0) + 76 | 0;
     HEAPF32[i15 >> 2] = 0.0;
     i14 = HEAP32[i1 + (i18 * 20 | 0) + 80 >> 2] | 0;
     i17 = 0;
     while (1) {
      i13 = i17 + 1 | 0;
      if ((HEAP32[i2 + (i17 * 20 | 0) + 16 >> 2] | 0) == (i14 | 0)) {
       i9 = 7;
       break;
      }
      if ((i13 | 0) < (i19 | 0)) {
       i17 = i13;
      } else {
       break;
      }
     }
     if ((i9 | 0) == 7) {
      i9 = 0;
      HEAPF32[i16 >> 2] = +HEAPF32[i2 + (i17 * 20 | 0) + 8 >> 2];
      HEAPF32[i15 >> 2] = +HEAPF32[i2 + (i17 * 20 | 0) + 12 >> 2];
     }
     i18 = i18 + 1 | 0;
    } while ((i18 | 0) < (HEAP32[i12 >> 2] | 0));
   }
  } while (0);
  i9 = i11 & 1;
  if (i10 ^ (i9 | 0) != 0) {
   i11 = i8 + 4 | 0;
   i12 = HEAPU16[i11 >> 1] | 0;
   if ((i12 & 2 | 0) == 0) {
    HEAP16[i11 >> 1] = i12 | 2;
    HEAPF32[i8 + 144 >> 2] = 0.0;
   }
   i8 = i7 + 4 | 0;
   i11 = HEAPU16[i8 >> 1] | 0;
   if ((i11 & 2 | 0) == 0) {
    HEAP16[i8 >> 1] = i11 | 2;
    HEAPF32[i7 + 144 >> 2] = 0.0;
   }
  }
 } else {
  i10 = __Z13b2TestOverlapPK7b2ShapeiS1_iRK11b2TransformS4_(HEAP32[i14 + 12 >> 2] | 0, HEAP32[i1 + 56 >> 2] | 0, HEAP32[i15 + 12 >> 2] | 0, HEAP32[i1 + 60 >> 2] | 0, i12, i13) | 0;
  HEAP32[i1 + 124 >> 2] = 0;
  i9 = i11 & 1;
 }
 i7 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i10 ? i7 | 2 : i7 & -3;
 i8 = (i9 | 0) == 0;
 i6 = i10 ^ 1;
 i7 = (i4 | 0) == 0;
 if (!(i8 ^ 1 | i6 | i7)) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] & 15](i4, i1);
 }
 if (!(i8 | i10 | i7)) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] & 15](i4, i1);
 }
 if (i5 | i6 | i7) {
  STACKTOP = i3;
  return;
 }
 FUNCTION_TABLE_viii[HEAP32[(HEAP32[i4 >> 2] | 0) + 16 >> 2] & 3](i4, i1, i2);
 STACKTOP = i3;
 return;
}
function __ZN13b2DynamicTree10RemoveLeafEi(i1, i12) {
 i1 = i1 | 0;
 i12 = i12 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i13 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 >> 2] | 0) == (i12 | 0)) {
  HEAP32[i1 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i3 = i1 + 4 | 0;
 i5 = HEAP32[i3 >> 2] | 0;
 i6 = HEAP32[i5 + (i12 * 36 | 0) + 20 >> 2] | 0;
 i4 = i5 + (i6 * 36 | 0) + 20 | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 i13 = HEAP32[i5 + (i6 * 36 | 0) + 24 >> 2] | 0;
 if ((i13 | 0) == (i12 | 0)) {
  i13 = HEAP32[i5 + (i6 * 36 | 0) + 28 >> 2] | 0;
 }
 if ((i7 | 0) == -1) {
  HEAP32[i1 >> 2] = i13;
  HEAP32[i5 + (i13 * 36 | 0) + 20 >> 2] = -1;
  if (!((i6 | 0) > -1)) {
   ___assert_fail(3e3, 2944, 97, 3040);
  }
  if ((HEAP32[i1 + 12 >> 2] | 0) <= (i6 | 0)) {
   ___assert_fail(3e3, 2944, 97, 3040);
  }
  i3 = i1 + 8 | 0;
  if ((HEAP32[i3 >> 2] | 0) <= 0) {
   ___assert_fail(3056, 2944, 98, 3040);
  }
  i13 = i1 + 16 | 0;
  HEAP32[i4 >> 2] = HEAP32[i13 >> 2];
  HEAP32[i5 + (i6 * 36 | 0) + 32 >> 2] = -1;
  HEAP32[i13 >> 2] = i6;
  HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + -1;
  STACKTOP = i2;
  return;
 }
 i12 = i5 + (i7 * 36 | 0) + 24 | 0;
 if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
  HEAP32[i12 >> 2] = i13;
 } else {
  HEAP32[i5 + (i7 * 36 | 0) + 28 >> 2] = i13;
 }
 HEAP32[i5 + (i13 * 36 | 0) + 20 >> 2] = i7;
 if (!((i6 | 0) > -1)) {
  ___assert_fail(3e3, 2944, 97, 3040);
 }
 if ((HEAP32[i1 + 12 >> 2] | 0) <= (i6 | 0)) {
  ___assert_fail(3e3, 2944, 97, 3040);
 }
 i12 = i1 + 8 | 0;
 if ((HEAP32[i12 >> 2] | 0) <= 0) {
  ___assert_fail(3056, 2944, 98, 3040);
 }
 i13 = i1 + 16 | 0;
 HEAP32[i4 >> 2] = HEAP32[i13 >> 2];
 HEAP32[i5 + (i6 * 36 | 0) + 32 >> 2] = -1;
 HEAP32[i13 >> 2] = i6;
 HEAP32[i12 >> 2] = (HEAP32[i12 >> 2] | 0) + -1;
 do {
  i4 = __ZN13b2DynamicTree7BalanceEi(i1, i7) | 0;
  i7 = HEAP32[i3 >> 2] | 0;
  i6 = HEAP32[i7 + (i4 * 36 | 0) + 24 >> 2] | 0;
  i5 = HEAP32[i7 + (i4 * 36 | 0) + 28 >> 2] | 0;
  d10 = +HEAPF32[i7 + (i6 * 36 | 0) >> 2];
  d11 = +HEAPF32[i7 + (i5 * 36 | 0) >> 2];
  d9 = +HEAPF32[i7 + (i6 * 36 | 0) + 4 >> 2];
  d8 = +HEAPF32[i7 + (i5 * 36 | 0) + 4 >> 2];
  d10 = +(d10 < d11 ? d10 : d11);
  d11 = +(d9 < d8 ? d9 : d8);
  i13 = i7 + (i4 * 36 | 0) | 0;
  HEAPF32[i13 >> 2] = d10;
  HEAPF32[i13 + 4 >> 2] = d11;
  d11 = +HEAPF32[i7 + (i6 * 36 | 0) + 8 >> 2];
  d10 = +HEAPF32[i7 + (i5 * 36 | 0) + 8 >> 2];
  d9 = +HEAPF32[i7 + (i6 * 36 | 0) + 12 >> 2];
  d8 = +HEAPF32[i7 + (i5 * 36 | 0) + 12 >> 2];
  d10 = +(d11 > d10 ? d11 : d10);
  d11 = +(d9 > d8 ? d9 : d8);
  i7 = i7 + (i4 * 36 | 0) + 8 | 0;
  HEAPF32[i7 >> 2] = d10;
  HEAPF32[i7 + 4 >> 2] = d11;
  i7 = HEAP32[i3 >> 2] | 0;
  i6 = HEAP32[i7 + (i6 * 36 | 0) + 32 >> 2] | 0;
  i5 = HEAP32[i7 + (i5 * 36 | 0) + 32 >> 2] | 0;
  HEAP32[i7 + (i4 * 36 | 0) + 32 >> 2] = ((i6 | 0) > (i5 | 0) ? i6 : i5) + 1;
  i7 = HEAP32[i7 + (i4 * 36 | 0) + 20 >> 2] | 0;
 } while (!((i7 | 0) == -1));
 STACKTOP = i2;
 return;
}
function __ZN9b2Simplex6Solve3Ev(i7) {
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0;
 i1 = STACKTOP;
 i2 = i7 + 16 | 0;
 d17 = +HEAPF32[i2 >> 2];
 d15 = +HEAPF32[i2 + 4 >> 2];
 i2 = i7 + 36 | 0;
 i3 = i7 + 52 | 0;
 d14 = +HEAPF32[i3 >> 2];
 d16 = +HEAPF32[i3 + 4 >> 2];
 i3 = i7 + 72 | 0;
 i22 = i7 + 88 | 0;
 d18 = +HEAPF32[i22 >> 2];
 d11 = +HEAPF32[i22 + 4 >> 2];
 d20 = d14 - d17;
 d10 = d16 - d15;
 d9 = d17 * d20 + d15 * d10;
 d8 = d14 * d20 + d16 * d10;
 d4 = d18 - d17;
 d19 = d11 - d15;
 d6 = d17 * d4 + d15 * d19;
 d5 = d18 * d4 + d11 * d19;
 d21 = d18 - d14;
 d12 = d11 - d16;
 d13 = d14 * d21 + d16 * d12;
 d12 = d18 * d21 + d11 * d12;
 d4 = d20 * d19 - d10 * d4;
 d10 = (d14 * d11 - d16 * d18) * d4;
 d11 = (d15 * d18 - d17 * d11) * d4;
 d4 = (d17 * d16 - d15 * d14) * d4;
 if (!(!(d9 >= -0.0) | !(d6 >= -0.0))) {
  HEAPF32[i7 + 24 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  STACKTOP = i1;
  return;
 }
 if (!(!(d9 < -0.0) | !(d8 > 0.0) | !(d4 <= 0.0))) {
  d21 = 1.0 / (d8 - d9);
  HEAPF32[i7 + 24 >> 2] = d8 * d21;
  HEAPF32[i7 + 60 >> 2] = -(d9 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  STACKTOP = i1;
  return;
 }
 if (!(!(d6 < -0.0) | !(d5 > 0.0) | !(d11 <= 0.0))) {
  d21 = 1.0 / (d5 - d6);
  HEAPF32[i7 + 24 >> 2] = d5 * d21;
  HEAPF32[i7 + 96 >> 2] = -(d6 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  i7 = i2 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(!(d8 <= 0.0) | !(d13 >= -0.0))) {
  HEAPF32[i7 + 60 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  i7 = i7 + 0 | 0;
  i3 = i2 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(!(d5 <= 0.0) | !(d12 <= 0.0))) {
  HEAPF32[i7 + 96 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  i7 = i7 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(d13 < -0.0) | !(d12 > 0.0) | !(d10 <= 0.0)) {
  d21 = 1.0 / (d4 + (d10 + d11));
  HEAPF32[i7 + 24 >> 2] = d10 * d21;
  HEAPF32[i7 + 60 >> 2] = d11 * d21;
  HEAPF32[i7 + 96 >> 2] = d4 * d21;
  HEAP32[i7 + 108 >> 2] = 3;
  STACKTOP = i1;
  return;
 } else {
  d21 = 1.0 / (d12 - d13);
  HEAPF32[i7 + 60 >> 2] = d12 * d21;
  HEAPF32[i7 + 96 >> 2] = -(d13 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  i7 = i7 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
}
function __ZN16b2ContactManager7CollideEv(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0;
 i2 = STACKTOP;
 i8 = HEAP32[i3 + 60 >> 2] | 0;
 if ((i8 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i7 = i3 + 12 | 0;
 i6 = i3 + 4 | 0;
 i5 = i3 + 72 | 0;
 i4 = i3 + 68 | 0;
 L4 : while (1) {
  i12 = HEAP32[i8 + 48 >> 2] | 0;
  i10 = HEAP32[i8 + 52 >> 2] | 0;
  i11 = HEAP32[i8 + 56 >> 2] | 0;
  i9 = HEAP32[i8 + 60 >> 2] | 0;
  i15 = HEAP32[i12 + 8 >> 2] | 0;
  i13 = HEAP32[i10 + 8 >> 2] | 0;
  i16 = i8 + 4 | 0;
  do {
   if ((HEAP32[i16 >> 2] & 8 | 0) == 0) {
    i1 = 11;
   } else {
    if (!(__ZNK6b2Body13ShouldCollideEPKS_(i13, i15) | 0)) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    }
    i14 = HEAP32[i4 >> 2] | 0;
    if ((i14 | 0) != 0 ? !(FUNCTION_TABLE_iiii[HEAP32[(HEAP32[i14 >> 2] | 0) + 8 >> 2] & 7](i14, i12, i10) | 0) : 0) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    }
    HEAP32[i16 >> 2] = HEAP32[i16 >> 2] & -9;
    i1 = 11;
   }
  } while (0);
  do {
   if ((i1 | 0) == 11) {
    i1 = 0;
    if ((HEAP16[i15 + 4 >> 1] & 2) == 0) {
     i14 = 0;
    } else {
     i14 = (HEAP32[i15 >> 2] | 0) != 0;
    }
    if ((HEAP16[i13 + 4 >> 1] & 2) == 0) {
     i13 = 0;
    } else {
     i13 = (HEAP32[i13 >> 2] | 0) != 0;
    }
    if (!(i14 | i13)) {
     i8 = HEAP32[i8 + 12 >> 2] | 0;
     break;
    }
    i11 = HEAP32[(HEAP32[i12 + 24 >> 2] | 0) + (i11 * 28 | 0) + 24 >> 2] | 0;
    i9 = HEAP32[(HEAP32[i10 + 24 >> 2] | 0) + (i9 * 28 | 0) + 24 >> 2] | 0;
    if (!((i11 | 0) > -1)) {
     i1 = 19;
     break L4;
    }
    i10 = HEAP32[i7 >> 2] | 0;
    if ((i10 | 0) <= (i11 | 0)) {
     i1 = 19;
     break L4;
    }
    i12 = HEAP32[i6 >> 2] | 0;
    if (!((i9 | 0) > -1 & (i10 | 0) > (i9 | 0))) {
     i1 = 21;
     break L4;
    }
    if (+HEAPF32[i12 + (i9 * 36 | 0) >> 2] - +HEAPF32[i12 + (i11 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i12 + (i9 * 36 | 0) + 4 >> 2] - +HEAPF32[i12 + (i11 * 36 | 0) + 12 >> 2] > 0.0 | +HEAPF32[i12 + (i11 * 36 | 0) >> 2] - +HEAPF32[i12 + (i9 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i12 + (i11 * 36 | 0) + 4 >> 2] - +HEAPF32[i12 + (i9 * 36 | 0) + 12 >> 2] > 0.0) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    } else {
     __ZN9b2Contact6UpdateEP17b2ContactListener(i8, HEAP32[i5 >> 2] | 0);
     i8 = HEAP32[i8 + 12 >> 2] | 0;
     break;
    }
   }
  } while (0);
  if ((i8 | 0) == 0) {
   i1 = 25;
   break;
  }
 }
 if ((i1 | 0) == 19) {
  ___assert_fail(1904, 1952, 159, 2008);
 } else if ((i1 | 0) == 21) {
  ___assert_fail(1904, 1952, 159, 2008);
 } else if ((i1 | 0) == 25) {
  STACKTOP = i2;
  return;
 }
}
function __ZN16b2ContactManager7AddPairEPvS0_(i1, i5, i6) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i5 + 16 >> 2] | 0;
 i3 = HEAP32[i6 + 16 >> 2] | 0;
 i5 = HEAP32[i5 + 20 >> 2] | 0;
 i6 = HEAP32[i6 + 20 >> 2] | 0;
 i8 = HEAP32[i4 + 8 >> 2] | 0;
 i7 = HEAP32[i3 + 8 >> 2] | 0;
 if ((i8 | 0) == (i7 | 0)) {
  STACKTOP = i2;
  return;
 }
 i10 = HEAP32[i7 + 112 >> 2] | 0;
 L4 : do {
  if ((i10 | 0) != 0) {
   while (1) {
    if ((HEAP32[i10 >> 2] | 0) == (i8 | 0)) {
     i9 = HEAP32[i10 + 4 >> 2] | 0;
     i12 = HEAP32[i9 + 48 >> 2] | 0;
     i13 = HEAP32[i9 + 52 >> 2] | 0;
     i11 = HEAP32[i9 + 56 >> 2] | 0;
     i9 = HEAP32[i9 + 60 >> 2] | 0;
     if ((i12 | 0) == (i4 | 0) & (i13 | 0) == (i3 | 0) & (i11 | 0) == (i5 | 0) & (i9 | 0) == (i6 | 0)) {
      i9 = 22;
      break;
     }
     if ((i12 | 0) == (i3 | 0) & (i13 | 0) == (i4 | 0) & (i11 | 0) == (i6 | 0) & (i9 | 0) == (i5 | 0)) {
      i9 = 22;
      break;
     }
    }
    i10 = HEAP32[i10 + 12 >> 2] | 0;
    if ((i10 | 0) == 0) {
     break L4;
    }
   }
   if ((i9 | 0) == 22) {
    STACKTOP = i2;
    return;
   }
  }
 } while (0);
 if (!(__ZNK6b2Body13ShouldCollideEPKS_(i7, i8) | 0)) {
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[i1 + 68 >> 2] | 0;
 if ((i7 | 0) != 0 ? !(FUNCTION_TABLE_iiii[HEAP32[(HEAP32[i7 >> 2] | 0) + 8 >> 2] & 7](i7, i4, i3) | 0) : 0) {
  STACKTOP = i2;
  return;
 }
 i5 = __ZN9b2Contact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i4, i5, i3, i6, HEAP32[i1 + 76 >> 2] | 0) | 0;
 if ((i5 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i4 = HEAP32[(HEAP32[i5 + 48 >> 2] | 0) + 8 >> 2] | 0;
 i3 = HEAP32[(HEAP32[i5 + 52 >> 2] | 0) + 8 >> 2] | 0;
 HEAP32[i5 + 8 >> 2] = 0;
 i7 = i1 + 60 | 0;
 HEAP32[i5 + 12 >> 2] = HEAP32[i7 >> 2];
 i6 = HEAP32[i7 >> 2] | 0;
 if ((i6 | 0) != 0) {
  HEAP32[i6 + 8 >> 2] = i5;
 }
 HEAP32[i7 >> 2] = i5;
 i8 = i5 + 16 | 0;
 HEAP32[i5 + 20 >> 2] = i5;
 HEAP32[i8 >> 2] = i3;
 HEAP32[i5 + 24 >> 2] = 0;
 i6 = i4 + 112 | 0;
 HEAP32[i5 + 28 >> 2] = HEAP32[i6 >> 2];
 i7 = HEAP32[i6 >> 2] | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 8 >> 2] = i8;
 }
 HEAP32[i6 >> 2] = i8;
 i6 = i5 + 32 | 0;
 HEAP32[i5 + 36 >> 2] = i5;
 HEAP32[i6 >> 2] = i4;
 HEAP32[i5 + 40 >> 2] = 0;
 i7 = i3 + 112 | 0;
 HEAP32[i5 + 44 >> 2] = HEAP32[i7 >> 2];
 i5 = HEAP32[i7 >> 2] | 0;
 if ((i5 | 0) != 0) {
  HEAP32[i5 + 8 >> 2] = i6;
 }
 HEAP32[i7 >> 2] = i6;
 i5 = i4 + 4 | 0;
 i6 = HEAPU16[i5 >> 1] | 0;
 if ((i6 & 2 | 0) == 0) {
  HEAP16[i5 >> 1] = i6 | 2;
  HEAPF32[i4 + 144 >> 2] = 0.0;
 }
 i4 = i3 + 4 | 0;
 i5 = HEAPU16[i4 >> 1] | 0;
 if ((i5 & 2 | 0) == 0) {
  HEAP16[i4 >> 1] = i5 | 2;
  HEAPF32[i3 + 144 >> 2] = 0.0;
 }
 i13 = i1 + 64 | 0;
 HEAP32[i13 >> 2] = (HEAP32[i13 >> 2] | 0) + 1;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhase11UpdatePairsI16b2ContactManagerEEvPT_(i5, i2) {
 i5 = i5 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i6 = i3;
 i1 = i5 + 52 | 0;
 HEAP32[i1 >> 2] = 0;
 i4 = i5 + 40 | 0;
 i12 = HEAP32[i4 >> 2] | 0;
 do {
  if ((i12 | 0) > 0) {
   i9 = i5 + 32 | 0;
   i11 = i5 + 56 | 0;
   i8 = i5 + 12 | 0;
   i10 = i5 + 4 | 0;
   i13 = 0;
   while (1) {
    i14 = HEAP32[(HEAP32[i9 >> 2] | 0) + (i13 << 2) >> 2] | 0;
    HEAP32[i11 >> 2] = i14;
    if (!((i14 | 0) == -1)) {
     if (!((i14 | 0) > -1)) {
      i8 = 6;
      break;
     }
     if ((HEAP32[i8 >> 2] | 0) <= (i14 | 0)) {
      i8 = 6;
      break;
     }
     __ZNK13b2DynamicTree5QueryI12b2BroadPhaseEEvPT_RK6b2AABB(i5, i5, (HEAP32[i10 >> 2] | 0) + (i14 * 36 | 0) | 0);
     i12 = HEAP32[i4 >> 2] | 0;
    }
    i13 = i13 + 1 | 0;
    if ((i13 | 0) >= (i12 | 0)) {
     i8 = 9;
     break;
    }
   }
   if ((i8 | 0) == 6) {
    ___assert_fail(1904, 1952, 159, 2008);
   } else if ((i8 | 0) == 9) {
    i7 = HEAP32[i1 >> 2] | 0;
    break;
   }
  } else {
   i7 = 0;
  }
 } while (0);
 HEAP32[i4 >> 2] = 0;
 i4 = i5 + 44 | 0;
 i14 = HEAP32[i4 >> 2] | 0;
 HEAP32[i6 >> 2] = 3;
 __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i14, i14 + (i7 * 12 | 0) | 0, i6);
 if ((HEAP32[i1 >> 2] | 0) <= 0) {
  STACKTOP = i3;
  return;
 }
 i6 = i5 + 12 | 0;
 i7 = i5 + 4 | 0;
 i9 = 0;
 L18 : while (1) {
  i8 = HEAP32[i4 >> 2] | 0;
  i5 = i8 + (i9 * 12 | 0) | 0;
  i10 = HEAP32[i5 >> 2] | 0;
  if (!((i10 | 0) > -1)) {
   i8 = 14;
   break;
  }
  i12 = HEAP32[i6 >> 2] | 0;
  if ((i12 | 0) <= (i10 | 0)) {
   i8 = 14;
   break;
  }
  i11 = HEAP32[i7 >> 2] | 0;
  i8 = i8 + (i9 * 12 | 0) + 4 | 0;
  i13 = HEAP32[i8 >> 2] | 0;
  if (!((i13 | 0) > -1 & (i12 | 0) > (i13 | 0))) {
   i8 = 16;
   break;
  }
  __ZN16b2ContactManager7AddPairEPvS0_(i2, HEAP32[i11 + (i10 * 36 | 0) + 16 >> 2] | 0, HEAP32[i11 + (i13 * 36 | 0) + 16 >> 2] | 0);
  i10 = HEAP32[i1 >> 2] | 0;
  while (1) {
   i9 = i9 + 1 | 0;
   if ((i9 | 0) >= (i10 | 0)) {
    i8 = 21;
    break L18;
   }
   i11 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i11 + (i9 * 12 | 0) >> 2] | 0) != (HEAP32[i5 >> 2] | 0)) {
    continue L18;
   }
   if ((HEAP32[i11 + (i9 * 12 | 0) + 4 >> 2] | 0) != (HEAP32[i8 >> 2] | 0)) {
    continue L18;
   }
  }
 }
 if ((i8 | 0) == 14) {
  ___assert_fail(1904, 1952, 153, 1992);
 } else if ((i8 | 0) == 16) {
  ___assert_fail(1904, 1952, 153, 1992);
 } else if ((i8 | 0) == 21) {
  STACKTOP = i3;
  return;
 }
}
function __ZNK13b2DynamicTree5QueryI12b2BroadPhaseEEvPT_RK6b2AABB(i9, i4, i7) {
 i9 = i9 | 0;
 i4 = i4 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1040 | 0;
 i3 = i2;
 i1 = i3 + 4 | 0;
 HEAP32[i3 >> 2] = i1;
 i5 = i3 + 1028 | 0;
 HEAP32[i5 >> 2] = 0;
 i6 = i3 + 1032 | 0;
 HEAP32[i6 >> 2] = 256;
 i14 = HEAP32[i3 >> 2] | 0;
 HEAP32[i14 + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i9 >> 2];
 i15 = HEAP32[i5 >> 2] | 0;
 i16 = i15 + 1 | 0;
 HEAP32[i5 >> 2] = i16;
 L1 : do {
  if ((i15 | 0) > -1) {
   i9 = i9 + 4 | 0;
   i11 = i7 + 4 | 0;
   i12 = i7 + 8 | 0;
   i10 = i7 + 12 | 0;
   while (1) {
    i16 = i16 + -1 | 0;
    HEAP32[i5 >> 2] = i16;
    i13 = HEAP32[i14 + (i16 << 2) >> 2] | 0;
    do {
     if (!((i13 | 0) == -1) ? (i8 = HEAP32[i9 >> 2] | 0, !(+HEAPF32[i7 >> 2] - +HEAPF32[i8 + (i13 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i11 >> 2] - +HEAPF32[i8 + (i13 * 36 | 0) + 12 >> 2] > 0.0 | +HEAPF32[i8 + (i13 * 36 | 0) >> 2] - +HEAPF32[i12 >> 2] > 0.0 | +HEAPF32[i8 + (i13 * 36 | 0) + 4 >> 2] - +HEAPF32[i10 >> 2] > 0.0)) : 0) {
      i15 = i8 + (i13 * 36 | 0) + 24 | 0;
      if ((HEAP32[i15 >> 2] | 0) == -1) {
       if (!(__ZN12b2BroadPhase13QueryCallbackEi(i4, i13) | 0)) {
        break L1;
       }
       i16 = HEAP32[i5 >> 2] | 0;
       break;
      }
      if ((i16 | 0) == (HEAP32[i6 >> 2] | 0) ? (HEAP32[i6 >> 2] = i16 << 1, i16 = __Z7b2Alloci(i16 << 3) | 0, HEAP32[i3 >> 2] = i16, _memcpy(i16 | 0, i14 | 0, HEAP32[i5 >> 2] << 2 | 0) | 0, (i14 | 0) != (i1 | 0)) : 0) {
       __Z6b2FreePv(i14);
      }
      i14 = HEAP32[i3 >> 2] | 0;
      HEAP32[i14 + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i15 >> 2];
      i15 = (HEAP32[i5 >> 2] | 0) + 1 | 0;
      HEAP32[i5 >> 2] = i15;
      i13 = i8 + (i13 * 36 | 0) + 28 | 0;
      if ((i15 | 0) == (HEAP32[i6 >> 2] | 0) ? (HEAP32[i6 >> 2] = i15 << 1, i16 = __Z7b2Alloci(i15 << 3) | 0, HEAP32[i3 >> 2] = i16, _memcpy(i16 | 0, i14 | 0, HEAP32[i5 >> 2] << 2 | 0) | 0, (i14 | 0) != (i1 | 0)) : 0) {
       __Z6b2FreePv(i14);
      }
      HEAP32[(HEAP32[i3 >> 2] | 0) + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i13 >> 2];
      i16 = (HEAP32[i5 >> 2] | 0) + 1 | 0;
      HEAP32[i5 >> 2] = i16;
     }
    } while (0);
    if ((i16 | 0) <= 0) {
     break L1;
    }
    i14 = HEAP32[i3 >> 2] | 0;
   }
  }
 } while (0);
 i4 = HEAP32[i3 >> 2] | 0;
 if ((i4 | 0) == (i1 | 0)) {
  STACKTOP = i2;
  return;
 }
 __Z6b2FreePv(i4);
 HEAP32[i3 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN15b2ContactSolver9WarmStartEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, d10 = 0.0, d11 = 0.0, d12 = 0.0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, i24 = 0, d25 = 0.0, d26 = 0.0, d27 = 0.0;
 i1 = STACKTOP;
 i2 = i4 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 40 | 0;
 i5 = i4 + 28 | 0;
 i22 = HEAP32[i5 >> 2] | 0;
 i8 = 0;
 do {
  i9 = HEAP32[i3 >> 2] | 0;
  i7 = HEAP32[i9 + (i8 * 152 | 0) + 112 >> 2] | 0;
  i6 = HEAP32[i9 + (i8 * 152 | 0) + 116 >> 2] | 0;
  d10 = +HEAPF32[i9 + (i8 * 152 | 0) + 120 >> 2];
  d14 = +HEAPF32[i9 + (i8 * 152 | 0) + 128 >> 2];
  d12 = +HEAPF32[i9 + (i8 * 152 | 0) + 124 >> 2];
  d11 = +HEAPF32[i9 + (i8 * 152 | 0) + 132 >> 2];
  i13 = HEAP32[i9 + (i8 * 152 | 0) + 144 >> 2] | 0;
  i4 = i22 + (i7 * 12 | 0) | 0;
  i24 = i4;
  d17 = +HEAPF32[i24 >> 2];
  d19 = +HEAPF32[i24 + 4 >> 2];
  d20 = +HEAPF32[i22 + (i7 * 12 | 0) + 8 >> 2];
  i24 = i22 + (i6 * 12 | 0) | 0;
  d21 = +HEAPF32[i24 >> 2];
  d23 = +HEAPF32[i24 + 4 >> 2];
  d18 = +HEAPF32[i22 + (i6 * 12 | 0) + 8 >> 2];
  i22 = i9 + (i8 * 152 | 0) + 72 | 0;
  d15 = +HEAPF32[i22 >> 2];
  d16 = +HEAPF32[i22 + 4 >> 2];
  if ((i13 | 0) > 0) {
   i22 = 0;
   do {
    d27 = +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 16 >> 2];
    d25 = +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 20 >> 2];
    d26 = d15 * d27 + d16 * d25;
    d25 = d16 * d27 - d15 * d25;
    d20 = d20 - d14 * (+HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) >> 2] * d25 - +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 4 >> 2] * d26);
    d17 = d17 - d10 * d26;
    d19 = d19 - d10 * d25;
    d18 = d18 + d11 * (d25 * +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 8 >> 2] - d26 * +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 12 >> 2]);
    d21 = d21 + d12 * d26;
    d23 = d23 + d12 * d25;
    i22 = i22 + 1 | 0;
   } while ((i22 | 0) != (i13 | 0));
  }
  d27 = +d17;
  d26 = +d19;
  i22 = i4;
  HEAPF32[i22 >> 2] = d27;
  HEAPF32[i22 + 4 >> 2] = d26;
  i22 = HEAP32[i5 >> 2] | 0;
  HEAPF32[i22 + (i7 * 12 | 0) + 8 >> 2] = d20;
  d26 = +d21;
  d27 = +d23;
  i22 = i22 + (i6 * 12 | 0) | 0;
  HEAPF32[i22 >> 2] = d26;
  HEAPF32[i22 + 4 >> 2] = d27;
  i22 = HEAP32[i5 >> 2] | 0;
  HEAPF32[i22 + (i6 * 12 | 0) + 8 >> 2] = d18;
  i8 = i8 + 1 | 0;
 } while ((i8 | 0) < (HEAP32[i2 >> 2] | 0));
 STACKTOP = i1;
 return;
}
function __ZNK14b2PolygonShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi(i1, i5, i8, i7, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 var i2 = 0, d3 = 0.0, i6 = 0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, i14 = 0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0;
 i4 = STACKTOP;
 d10 = +HEAPF32[i7 >> 2];
 d9 = +HEAPF32[i8 >> 2] - d10;
 d18 = +HEAPF32[i7 + 4 >> 2];
 d11 = +HEAPF32[i8 + 4 >> 2] - d18;
 i6 = i7 + 12 | 0;
 d17 = +HEAPF32[i6 >> 2];
 i7 = i7 + 8 | 0;
 d19 = +HEAPF32[i7 >> 2];
 d12 = d9 * d17 + d11 * d19;
 d9 = d17 * d11 - d9 * d19;
 d10 = +HEAPF32[i8 + 8 >> 2] - d10;
 d18 = +HEAPF32[i8 + 12 >> 2] - d18;
 d11 = d17 * d10 + d19 * d18 - d12;
 d10 = d17 * d18 - d19 * d10 - d9;
 i8 = i8 + 16 | 0;
 i14 = HEAP32[i1 + 148 >> 2] | 0;
 do {
  if ((i14 | 0) > 0) {
   i16 = 0;
   i15 = -1;
   d13 = 0.0;
   d17 = +HEAPF32[i8 >> 2];
   L3 : while (1) {
    d20 = +HEAPF32[i1 + (i16 << 3) + 84 >> 2];
    d19 = +HEAPF32[i1 + (i16 << 3) + 88 >> 2];
    d18 = (+HEAPF32[i1 + (i16 << 3) + 20 >> 2] - d12) * d20 + (+HEAPF32[i1 + (i16 << 3) + 24 >> 2] - d9) * d19;
    d19 = d11 * d20 + d10 * d19;
    do {
     if (d19 == 0.0) {
      if (d18 < 0.0) {
       i1 = 0;
       i14 = 18;
       break L3;
      }
     } else {
      if (d19 < 0.0 ? d18 < d13 * d19 : 0) {
       i15 = i16;
       d13 = d18 / d19;
       break;
      }
      if (d19 > 0.0 ? d18 < d17 * d19 : 0) {
       d17 = d18 / d19;
      }
     }
    } while (0);
    i16 = i16 + 1 | 0;
    if (d17 < d13) {
     i1 = 0;
     i14 = 18;
     break;
    }
    if ((i16 | 0) >= (i14 | 0)) {
     i14 = 13;
     break;
    }
   }
   if ((i14 | 0) == 13) {
    if (d13 >= 0.0) {
     i2 = i15;
     d3 = d13;
     break;
    }
    ___assert_fail(376, 328, 249, 424);
   } else if ((i14 | 0) == 18) {
    STACKTOP = i4;
    return i1 | 0;
   }
  } else {
   i2 = -1;
   d3 = 0.0;
  }
 } while (0);
 if (!(d3 <= +HEAPF32[i8 >> 2])) {
  ___assert_fail(376, 328, 249, 424);
 }
 if (!((i2 | 0) > -1)) {
  i16 = 0;
  STACKTOP = i4;
  return i16 | 0;
 }
 HEAPF32[i5 + 8 >> 2] = d3;
 d18 = +HEAPF32[i6 >> 2];
 d13 = +HEAPF32[i1 + (i2 << 3) + 84 >> 2];
 d17 = +HEAPF32[i7 >> 2];
 d20 = +HEAPF32[i1 + (i2 << 3) + 88 >> 2];
 d19 = +(d18 * d13 - d17 * d20);
 d20 = +(d13 * d17 + d18 * d20);
 i16 = i5;
 HEAPF32[i16 >> 2] = d19;
 HEAPF32[i16 + 4 >> 2] = d20;
 i16 = 1;
 STACKTOP = i4;
 return i16 | 0;
}
function __ZN7b2World4StepEfii(i1, d9, i11, i12) {
 i1 = i1 | 0;
 d9 = +d9;
 i11 = i11 | 0;
 i12 = i12 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i13 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i4 + 27 | 0;
 i5 = i4;
 i8 = i4 + 26 | 0;
 i10 = i4 + 25 | 0;
 i7 = i4 + 24 | 0;
 __ZN7b2TimerC2Ev(i3);
 i2 = i1 + 102868 | 0;
 i13 = HEAP32[i2 >> 2] | 0;
 if ((i13 & 1 | 0) != 0) {
  __ZN16b2ContactManager15FindNewContactsEv(i1 + 102872 | 0);
  i13 = HEAP32[i2 >> 2] & -2;
  HEAP32[i2 >> 2] = i13;
 }
 HEAP32[i2 >> 2] = i13 | 2;
 HEAPF32[i5 >> 2] = d9;
 HEAP32[i5 + 12 >> 2] = i11;
 HEAP32[i5 + 16 >> 2] = i12;
 if (d9 > 0.0) {
  HEAPF32[i5 + 4 >> 2] = 1.0 / d9;
 } else {
  HEAPF32[i5 + 4 >> 2] = 0.0;
 }
 i11 = i1 + 102988 | 0;
 HEAPF32[i5 + 8 >> 2] = +HEAPF32[i11 >> 2] * d9;
 HEAP8[i5 + 20 | 0] = HEAP8[i1 + 102992 | 0] | 0;
 __ZN7b2TimerC2Ev(i8);
 __ZN16b2ContactManager7CollideEv(i1 + 102872 | 0);
 HEAPF32[i1 + 103e3 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i8);
 if ((HEAP8[i1 + 102995 | 0] | 0) != 0 ? +HEAPF32[i5 >> 2] > 0.0 : 0) {
  __ZN7b2TimerC2Ev(i10);
  __ZN7b2World5SolveERK10b2TimeStep(i1, i5);
  HEAPF32[i1 + 103004 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i10);
 }
 if ((HEAP8[i1 + 102993 | 0] | 0) != 0) {
  d9 = +HEAPF32[i5 >> 2];
  if (d9 > 0.0) {
   __ZN7b2TimerC2Ev(i7);
   __ZN7b2World8SolveTOIERK10b2TimeStep(i1, i5);
   HEAPF32[i1 + 103024 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i7);
   i6 = 12;
  }
 } else {
  i6 = 12;
 }
 if ((i6 | 0) == 12) {
  d9 = +HEAPF32[i5 >> 2];
 }
 if (d9 > 0.0) {
  HEAPF32[i11 >> 2] = +HEAPF32[i5 + 4 >> 2];
 }
 i5 = HEAP32[i2 >> 2] | 0;
 if ((i5 & 4 | 0) == 0) {
  i13 = i5 & -3;
  HEAP32[i2 >> 2] = i13;
  d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
  i13 = i1 + 102996 | 0;
  HEAPF32[i13 >> 2] = d9;
  STACKTOP = i4;
  return;
 }
 i6 = HEAP32[i1 + 102952 >> 2] | 0;
 if ((i6 | 0) == 0) {
  i13 = i5 & -3;
  HEAP32[i2 >> 2] = i13;
  d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
  i13 = i1 + 102996 | 0;
  HEAPF32[i13 >> 2] = d9;
  STACKTOP = i4;
  return;
 }
 do {
  HEAPF32[i6 + 76 >> 2] = 0.0;
  HEAPF32[i6 + 80 >> 2] = 0.0;
  HEAPF32[i6 + 84 >> 2] = 0.0;
  i6 = HEAP32[i6 + 96 >> 2] | 0;
 } while ((i6 | 0) != 0);
 i13 = i5 & -3;
 HEAP32[i2 >> 2] = i13;
 d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
 i13 = i1 + 102996 | 0;
 HEAPF32[i13 >> 2] = d9;
 STACKTOP = i4;
 return;
}
function __ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i1, i5, i6, i3, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0;
 i2 = STACKTOP;
 i7 = HEAP32[i5 + 148 >> 2] | 0;
 d17 = +HEAPF32[i4 + 12 >> 2];
 d19 = +HEAPF32[i3 + 12 >> 2];
 d18 = +HEAPF32[i4 + 8 >> 2];
 d16 = +HEAPF32[i3 + 16 >> 2];
 d15 = +HEAPF32[i6 + 12 >> 2];
 d10 = +HEAPF32[i5 + 12 >> 2];
 d8 = +HEAPF32[i6 + 8 >> 2];
 d9 = +HEAPF32[i5 + 16 >> 2];
 d11 = +HEAPF32[i4 >> 2] + (d17 * d19 - d18 * d16) - (+HEAPF32[i6 >> 2] + (d15 * d10 - d8 * d9));
 d9 = d19 * d18 + d17 * d16 + +HEAPF32[i4 + 4 >> 2] - (d10 * d8 + d15 * d9 + +HEAPF32[i6 + 4 >> 2]);
 d10 = d15 * d11 + d8 * d9;
 d8 = d15 * d9 - d11 * d8;
 if ((i7 | 0) > 0) {
  i14 = 0;
  i13 = 0;
  d9 = -3.4028234663852886e+38;
  while (1) {
   d11 = d10 * +HEAPF32[i5 + (i13 << 3) + 84 >> 2] + d8 * +HEAPF32[i5 + (i13 << 3) + 88 >> 2];
   i12 = d11 > d9;
   i14 = i12 ? i13 : i14;
   i13 = i13 + 1 | 0;
   if ((i13 | 0) == (i7 | 0)) {
    break;
   } else {
    d9 = i12 ? d11 : d9;
   }
  }
 } else {
  i14 = 0;
 }
 d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i14, i3, i4);
 i12 = ((i14 | 0) > 0 ? i14 : i7) + -1 | 0;
 d8 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i12, i3, i4);
 i13 = i14 + 1 | 0;
 i13 = (i13 | 0) < (i7 | 0) ? i13 : 0;
 d10 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
 if (d8 > d9 & d8 > d10) {
  while (1) {
   i13 = ((i12 | 0) > 0 ? i12 : i7) + -1 | 0;
   d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
   if (d9 > d8) {
    i12 = i13;
    d8 = d9;
   } else {
    break;
   }
  }
  HEAP32[i1 >> 2] = i12;
  STACKTOP = i2;
  return +d8;
 }
 if (d10 > d9) {
  i12 = i13;
  d8 = d10;
 } else {
  d19 = d9;
  HEAP32[i1 >> 2] = i14;
  STACKTOP = i2;
  return +d19;
 }
 while (1) {
  i13 = i12 + 1 | 0;
  i13 = (i13 | 0) < (i7 | 0) ? i13 : 0;
  d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
  if (d9 > d8) {
   i12 = i13;
   d8 = d9;
  } else {
   break;
  }
 }
 HEAP32[i1 >> 2] = i12;
 STACKTOP = i2;
 return +d8;
}
function __ZN9b2Fixture11SynchronizeEP12b2BroadPhaseRK11b2TransformS4_(i10, i8, i7, i2) {
 i10 = i10 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i9 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, i27 = 0;
 i9 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i5 = i9 + 24 | 0;
 i6 = i9 + 8 | 0;
 i3 = i9;
 i4 = i10 + 28 | 0;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i9;
  return;
 }
 i1 = i10 + 24 | 0;
 i18 = i10 + 12 | 0;
 i19 = i5 + 4 | 0;
 i20 = i6 + 4 | 0;
 i13 = i5 + 8 | 0;
 i14 = i6 + 8 | 0;
 i15 = i5 + 12 | 0;
 i16 = i6 + 12 | 0;
 i11 = i2 + 4 | 0;
 i22 = i7 + 4 | 0;
 i12 = i3 + 4 | 0;
 i21 = 0;
 do {
  i10 = HEAP32[i1 >> 2] | 0;
  i27 = HEAP32[i18 >> 2] | 0;
  i17 = i10 + (i21 * 28 | 0) + 20 | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i27 >> 2] | 0) + 24 >> 2] & 15](i27, i5, i7, HEAP32[i17 >> 2] | 0);
  i27 = HEAP32[i18 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i27 >> 2] | 0) + 24 >> 2] & 15](i27, i6, i2, HEAP32[i17 >> 2] | 0);
  i17 = i10 + (i21 * 28 | 0) | 0;
  d25 = +HEAPF32[i5 >> 2];
  d26 = +HEAPF32[i6 >> 2];
  d24 = +HEAPF32[i19 >> 2];
  d23 = +HEAPF32[i20 >> 2];
  d25 = +(d25 < d26 ? d25 : d26);
  d26 = +(d24 < d23 ? d24 : d23);
  i27 = i17;
  HEAPF32[i27 >> 2] = d25;
  HEAPF32[i27 + 4 >> 2] = d26;
  d25 = +HEAPF32[i13 >> 2];
  d26 = +HEAPF32[i14 >> 2];
  d23 = +HEAPF32[i15 >> 2];
  d24 = +HEAPF32[i16 >> 2];
  d25 = +(d25 > d26 ? d25 : d26);
  d26 = +(d23 > d24 ? d23 : d24);
  i27 = i10 + (i21 * 28 | 0) + 8 | 0;
  HEAPF32[i27 >> 2] = d25;
  HEAPF32[i27 + 4 >> 2] = d26;
  d26 = +HEAPF32[i11 >> 2] - +HEAPF32[i22 >> 2];
  HEAPF32[i3 >> 2] = +HEAPF32[i2 >> 2] - +HEAPF32[i7 >> 2];
  HEAPF32[i12 >> 2] = d26;
  __ZN12b2BroadPhase9MoveProxyEiRK6b2AABBRK6b2Vec2(i8, HEAP32[i10 + (i21 * 28 | 0) + 24 >> 2] | 0, i17, i3);
  i21 = i21 + 1 | 0;
 } while ((i21 | 0) < (HEAP32[i4 >> 2] | 0));
 STACKTOP = i9;
 return;
}
function __ZN12b2EPCollider24ComputePolygonSeparationEv(i2, i9) {
 i2 = i2 | 0;
 i9 = i9 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, i8 = 0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0;
 i15 = STACKTOP;
 HEAP32[i2 >> 2] = 0;
 i3 = i2 + 4 | 0;
 HEAP32[i3 >> 2] = -1;
 i4 = i2 + 8 | 0;
 HEAPF32[i4 >> 2] = -3.4028234663852886e+38;
 d7 = +HEAPF32[i9 + 216 >> 2];
 d6 = +HEAPF32[i9 + 212 >> 2];
 i5 = HEAP32[i9 + 128 >> 2] | 0;
 if ((i5 | 0) <= 0) {
  STACKTOP = i15;
  return;
 }
 d17 = +HEAPF32[i9 + 164 >> 2];
 d18 = +HEAPF32[i9 + 168 >> 2];
 d11 = +HEAPF32[i9 + 172 >> 2];
 d10 = +HEAPF32[i9 + 176 >> 2];
 d16 = +HEAPF32[i9 + 244 >> 2];
 i12 = i9 + 228 | 0;
 i13 = i9 + 232 | 0;
 i14 = i9 + 236 | 0;
 i1 = i9 + 240 | 0;
 d19 = -3.4028234663852886e+38;
 i20 = 0;
 while (1) {
  d23 = +HEAPF32[i9 + (i20 << 3) + 64 >> 2];
  d21 = -d23;
  d22 = -+HEAPF32[i9 + (i20 << 3) + 68 >> 2];
  d26 = +HEAPF32[i9 + (i20 << 3) >> 2];
  d25 = +HEAPF32[i9 + (i20 << 3) + 4 >> 2];
  d24 = (d26 - d17) * d21 + (d25 - d18) * d22;
  d25 = (d26 - d11) * d21 + (d25 - d10) * d22;
  d24 = d24 < d25 ? d24 : d25;
  if (d24 > d16) {
   break;
  }
  if (!(d7 * d23 + d6 * d22 >= 0.0)) {
   if (!((d21 - +HEAPF32[i12 >> 2]) * d6 + (d22 - +HEAPF32[i13 >> 2]) * d7 < -.03490658849477768) & d24 > d19) {
    i8 = 8;
   }
  } else {
   if (!((d21 - +HEAPF32[i14 >> 2]) * d6 + (d22 - +HEAPF32[i1 >> 2]) * d7 < -.03490658849477768) & d24 > d19) {
    i8 = 8;
   }
  }
  if ((i8 | 0) == 8) {
   i8 = 0;
   HEAP32[i2 >> 2] = 2;
   HEAP32[i3 >> 2] = i20;
   HEAPF32[i4 >> 2] = d24;
   d19 = d24;
  }
  i20 = i20 + 1 | 0;
  if ((i20 | 0) >= (i5 | 0)) {
   i8 = 10;
   break;
  }
 }
 if ((i8 | 0) == 10) {
  STACKTOP = i15;
  return;
 }
 HEAP32[i2 >> 2] = 2;
 HEAP32[i3 >> 2] = i20;
 HEAPF32[i4 >> 2] = d24;
 STACKTOP = i15;
 return;
}
function __ZNK11b2EdgeShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi(i17, i1, i2, i18, i3) {
 i17 = i17 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 i18 = i18 | 0;
 i3 = i3 | 0;
 var d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0;
 i3 = STACKTOP;
 d6 = +HEAPF32[i18 >> 2];
 d7 = +HEAPF32[i2 >> 2] - d6;
 d9 = +HEAPF32[i18 + 4 >> 2];
 d4 = +HEAPF32[i2 + 4 >> 2] - d9;
 d11 = +HEAPF32[i18 + 12 >> 2];
 d5 = +HEAPF32[i18 + 8 >> 2];
 d8 = d7 * d11 + d4 * d5;
 d7 = d11 * d4 - d7 * d5;
 d6 = +HEAPF32[i2 + 8 >> 2] - d6;
 d9 = +HEAPF32[i2 + 12 >> 2] - d9;
 d4 = d11 * d6 + d5 * d9 - d8;
 d6 = d11 * d9 - d5 * d6 - d7;
 i18 = i17 + 12 | 0;
 d5 = +HEAPF32[i18 >> 2];
 d9 = +HEAPF32[i18 + 4 >> 2];
 i18 = i17 + 20 | 0;
 d11 = +HEAPF32[i18 >> 2];
 d11 = d11 - d5;
 d12 = +HEAPF32[i18 + 4 >> 2] - d9;
 d15 = -d11;
 d10 = d11 * d11 + d12 * d12;
 d13 = +Math_sqrt(+d10);
 if (d13 < 1.1920928955078125e-7) {
  d13 = d12;
 } else {
  d16 = 1.0 / d13;
  d13 = d12 * d16;
  d15 = d16 * d15;
 }
 d14 = (d9 - d7) * d15 + (d5 - d8) * d13;
 d16 = d6 * d15 + d4 * d13;
 if (d16 == 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 d16 = d14 / d16;
 if (d16 < 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 if (+HEAPF32[i2 + 16 >> 2] < d16 | d10 == 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 d12 = (d11 * (d8 + d4 * d16 - d5) + d12 * (d7 + d6 * d16 - d9)) / d10;
 if (d12 < 0.0 | d12 > 1.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 HEAPF32[i1 + 8 >> 2] = d16;
 if (d14 > 0.0) {
  d14 = +-d13;
  d16 = +-d15;
  i18 = i1;
  HEAPF32[i18 >> 2] = d14;
  HEAPF32[i18 + 4 >> 2] = d16;
  i18 = 1;
  STACKTOP = i3;
  return i18 | 0;
 } else {
  d14 = +d13;
  d16 = +d15;
  i18 = i1;
  HEAPF32[i18 >> 2] = d14;
  HEAPF32[i18 + 4 >> 2] = d16;
  i18 = 1;
  STACKTOP = i3;
  return i18 | 0;
 }
 return 0;
}
function ___dynamic_cast(i7, i6, i11, i5) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i11 = i11 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i2 = i1;
 i3 = HEAP32[i7 >> 2] | 0;
 i4 = i7 + (HEAP32[i3 + -8 >> 2] | 0) | 0;
 i3 = HEAP32[i3 + -4 >> 2] | 0;
 HEAP32[i2 >> 2] = i11;
 HEAP32[i2 + 4 >> 2] = i7;
 HEAP32[i2 + 8 >> 2] = i6;
 HEAP32[i2 + 12 >> 2] = i5;
 i9 = i2 + 16 | 0;
 i10 = i2 + 20 | 0;
 i6 = i2 + 24 | 0;
 i8 = i2 + 28 | 0;
 i5 = i2 + 32 | 0;
 i7 = i2 + 40 | 0;
 i12 = (i3 | 0) == (i11 | 0);
 i13 = i9 + 0 | 0;
 i11 = i13 + 36 | 0;
 do {
  HEAP32[i13 >> 2] = 0;
  i13 = i13 + 4 | 0;
 } while ((i13 | 0) < (i11 | 0));
 HEAP16[i9 + 36 >> 1] = 0;
 HEAP8[i9 + 38 | 0] = 0;
 if (i12) {
  HEAP32[i2 + 48 >> 2] = 1;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i3 >> 2] | 0) + 20 >> 2] & 3](i3, i2, i4, i4, 1, 0);
  i13 = (HEAP32[i6 >> 2] | 0) == 1 ? i4 : 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[i3 >> 2] | 0) + 24 >> 2] & 3](i3, i2, i4, 1, 0);
 i2 = HEAP32[i2 + 36 >> 2] | 0;
 if ((i2 | 0) == 0) {
  if ((HEAP32[i7 >> 2] | 0) != 1) {
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
  if ((HEAP32[i8 >> 2] | 0) != 1) {
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
  i13 = (HEAP32[i5 >> 2] | 0) == 1 ? HEAP32[i10 >> 2] | 0 : 0;
  STACKTOP = i1;
  return i13 | 0;
 } else if ((i2 | 0) == 1) {
  if ((HEAP32[i6 >> 2] | 0) != 1) {
   if ((HEAP32[i7 >> 2] | 0) != 0) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
   if ((HEAP32[i8 >> 2] | 0) != 1) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
   if ((HEAP32[i5 >> 2] | 0) != 1) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
  i13 = HEAP32[i9 >> 2] | 0;
  STACKTOP = i1;
  return i13 | 0;
 } else {
  i13 = 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 return 0;
}
function __ZNK14b2PolygonShape11ComputeMassEP10b2MassDataf(i4, i1, d2) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 d2 = +d2;
 var i3 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, d13 = 0.0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0;
 i3 = STACKTOP;
 i5 = HEAP32[i4 + 148 >> 2] | 0;
 if ((i5 | 0) > 2) {
  d7 = 0.0;
  d6 = 0.0;
  i12 = 0;
 } else {
  ___assert_fail(432, 328, 306, 456);
 }
 do {
  d6 = d6 + +HEAPF32[i4 + (i12 << 3) + 20 >> 2];
  d7 = d7 + +HEAPF32[i4 + (i12 << 3) + 24 >> 2];
  i12 = i12 + 1 | 0;
 } while ((i12 | 0) < (i5 | 0));
 d11 = 1.0 / +(i5 | 0);
 d6 = d6 * d11;
 d11 = d7 * d11;
 i16 = i4 + 20 | 0;
 i19 = i4 + 24 | 0;
 d9 = 0.0;
 d10 = 0.0;
 d7 = 0.0;
 d8 = 0.0;
 i17 = 0;
 do {
  d18 = +HEAPF32[i4 + (i17 << 3) + 20 >> 2] - d6;
  d13 = +HEAPF32[i4 + (i17 << 3) + 24 >> 2] - d11;
  i17 = i17 + 1 | 0;
  i12 = (i17 | 0) < (i5 | 0);
  if (i12) {
   i14 = i4 + (i17 << 3) + 20 | 0;
   i15 = i4 + (i17 << 3) + 24 | 0;
  } else {
   i14 = i16;
   i15 = i19;
  }
  d21 = +HEAPF32[i14 >> 2] - d6;
  d20 = +HEAPF32[i15 >> 2] - d11;
  d22 = d18 * d20 - d13 * d21;
  d23 = d22 * .5;
  d8 = d8 + d23;
  d23 = d23 * .3333333432674408;
  d9 = d9 + (d18 + d21) * d23;
  d10 = d10 + (d13 + d20) * d23;
  d7 = d7 + d22 * .0833333358168602 * (d21 * d21 + (d18 * d18 + d18 * d21) + (d20 * d20 + (d13 * d13 + d13 * d20)));
 } while (i12);
 d13 = d8 * d2;
 HEAPF32[i1 >> 2] = d13;
 if (d8 > 1.1920928955078125e-7) {
  d23 = 1.0 / d8;
  d22 = d9 * d23;
  d23 = d10 * d23;
  d20 = d6 + d22;
  d21 = d11 + d23;
  d11 = +d20;
  d18 = +d21;
  i19 = i1 + 4 | 0;
  HEAPF32[i19 >> 2] = d11;
  HEAPF32[i19 + 4 >> 2] = d18;
  HEAPF32[i1 + 12 >> 2] = d7 * d2 + d13 * (d20 * d20 + d21 * d21 - (d22 * d22 + d23 * d23));
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(472, 328, 352, 456);
 }
}
function __ZN16b2ContactManager7DestroyEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 i5 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 8 >> 2] | 0;
 i4 = HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 8 >> 2] | 0;
 i6 = HEAP32[i1 + 72 >> 2] | 0;
 if ((i6 | 0) != 0 ? (HEAP32[i2 + 4 >> 2] & 2 | 0) != 0 : 0) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] & 15](i6, i2);
 }
 i7 = i2 + 8 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i6 = i2 + 12 | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 12 >> 2] = HEAP32[i6 >> 2];
 }
 i8 = HEAP32[i6 >> 2] | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 8 >> 2] = HEAP32[i7 >> 2];
 }
 i7 = i1 + 60 | 0;
 if ((HEAP32[i7 >> 2] | 0) == (i2 | 0)) {
  HEAP32[i7 >> 2] = HEAP32[i6 >> 2];
 }
 i7 = i2 + 24 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i6 = i2 + 28 | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 12 >> 2] = HEAP32[i6 >> 2];
 }
 i8 = HEAP32[i6 >> 2] | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 8 >> 2] = HEAP32[i7 >> 2];
 }
 i5 = i5 + 112 | 0;
 if ((i2 + 16 | 0) == (HEAP32[i5 >> 2] | 0)) {
  HEAP32[i5 >> 2] = HEAP32[i6 >> 2];
 }
 i6 = i2 + 40 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 i5 = i2 + 44 | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 12 >> 2] = HEAP32[i5 >> 2];
 }
 i7 = HEAP32[i5 >> 2] | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 8 >> 2] = HEAP32[i6 >> 2];
 }
 i4 = i4 + 112 | 0;
 if ((i2 + 32 | 0) != (HEAP32[i4 >> 2] | 0)) {
  i8 = i1 + 76 | 0;
  i8 = HEAP32[i8 >> 2] | 0;
  __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i2, i8);
  i8 = i1 + 64 | 0;
  i7 = HEAP32[i8 >> 2] | 0;
  i7 = i7 + -1 | 0;
  HEAP32[i8 >> 2] = i7;
  STACKTOP = i3;
  return;
 }
 HEAP32[i4 >> 2] = HEAP32[i5 >> 2];
 i8 = i1 + 76 | 0;
 i8 = HEAP32[i8 >> 2] | 0;
 __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i2, i8);
 i8 = i1 + 64 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 i7 = i7 + -1 | 0;
 HEAP32[i8 >> 2] = i7;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib(i6, i3, i4, i8, i7) {
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 if ((i6 | 0) == (HEAP32[i3 + 8 >> 2] | 0)) {
  if ((HEAP32[i3 + 4 >> 2] | 0) != (i4 | 0)) {
   STACKTOP = i1;
   return;
  }
  i2 = i3 + 28 | 0;
  if ((HEAP32[i2 >> 2] | 0) == 1) {
   STACKTOP = i1;
   return;
  }
  HEAP32[i2 >> 2] = i8;
  STACKTOP = i1;
  return;
 }
 if ((i6 | 0) != (HEAP32[i3 >> 2] | 0)) {
  i9 = HEAP32[i6 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[i9 >> 2] | 0) + 24 >> 2] & 3](i9, i3, i4, i8, i7);
  STACKTOP = i1;
  return;
 }
 if ((HEAP32[i3 + 16 >> 2] | 0) != (i4 | 0) ? (i5 = i3 + 20 | 0, (HEAP32[i5 >> 2] | 0) != (i4 | 0)) : 0) {
  HEAP32[i3 + 32 >> 2] = i8;
  i8 = i3 + 44 | 0;
  if ((HEAP32[i8 >> 2] | 0) == 4) {
   STACKTOP = i1;
   return;
  }
  i9 = i3 + 52 | 0;
  HEAP8[i9] = 0;
  i10 = i3 + 53 | 0;
  HEAP8[i10] = 0;
  i6 = HEAP32[i6 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i6 >> 2] | 0) + 20 >> 2] & 3](i6, i3, i4, i4, 1, i7);
  if ((HEAP8[i10] | 0) != 0) {
   if ((HEAP8[i9] | 0) == 0) {
    i6 = 1;
    i2 = 13;
   }
  } else {
   i6 = 0;
   i2 = 13;
  }
  do {
   if ((i2 | 0) == 13) {
    HEAP32[i5 >> 2] = i4;
    i10 = i3 + 40 | 0;
    HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + 1;
    if ((HEAP32[i3 + 36 >> 2] | 0) == 1 ? (HEAP32[i3 + 24 >> 2] | 0) == 2 : 0) {
     HEAP8[i3 + 54 | 0] = 1;
     if (i6) {
      break;
     }
    } else {
     i2 = 16;
    }
    if ((i2 | 0) == 16 ? i6 : 0) {
     break;
    }
    HEAP32[i8 >> 2] = 4;
    STACKTOP = i1;
    return;
   }
  } while (0);
  HEAP32[i8 >> 2] = 3;
  STACKTOP = i1;
  return;
 }
 if ((i8 | 0) != 1) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i3 + 32 >> 2] = 1;
 STACKTOP = i1;
 return;
}
function __ZN16b2BlockAllocator8AllocateEi(i4, i2) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 if ((i2 | 0) == 0) {
  i9 = 0;
  STACKTOP = i1;
  return i9 | 0;
 }
 if ((i2 | 0) <= 0) {
  ___assert_fail(1376, 1312, 104, 1392);
 }
 if ((i2 | 0) > 640) {
  i9 = __Z7b2Alloci(i2) | 0;
  STACKTOP = i1;
  return i9 | 0;
 }
 i9 = HEAP8[632 + i2 | 0] | 0;
 i5 = i9 & 255;
 if (!((i9 & 255) < 14)) {
  ___assert_fail(1408, 1312, 112, 1392);
 }
 i2 = i4 + (i5 << 2) + 12 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 if ((i3 | 0) != 0) {
  HEAP32[i2 >> 2] = HEAP32[i3 >> 2];
  i9 = i3;
  STACKTOP = i1;
  return i9 | 0;
 }
 i3 = i4 + 4 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i7 = i4 + 8 | 0;
 if ((i6 | 0) == (HEAP32[i7 >> 2] | 0)) {
  i9 = HEAP32[i4 >> 2] | 0;
  i6 = i6 + 128 | 0;
  HEAP32[i7 >> 2] = i6;
  i6 = __Z7b2Alloci(i6 << 3) | 0;
  HEAP32[i4 >> 2] = i6;
  _memcpy(i6 | 0, i9 | 0, HEAP32[i3 >> 2] << 3 | 0) | 0;
  _memset((HEAP32[i4 >> 2] | 0) + (HEAP32[i3 >> 2] << 3) | 0, 0, 1024) | 0;
  __Z6b2FreePv(i9);
  i6 = HEAP32[i3 >> 2] | 0;
 }
 i9 = HEAP32[i4 >> 2] | 0;
 i7 = __Z7b2Alloci(16384) | 0;
 i4 = i9 + (i6 << 3) + 4 | 0;
 HEAP32[i4 >> 2] = i7;
 i5 = HEAP32[576 + (i5 << 2) >> 2] | 0;
 HEAP32[i9 + (i6 << 3) >> 2] = i5;
 i6 = 16384 / (i5 | 0) | 0;
 if ((Math_imul(i6, i5) | 0) >= 16385) {
  ___assert_fail(1448, 1312, 140, 1392);
 }
 i6 = i6 + -1 | 0;
 if ((i6 | 0) > 0) {
  i9 = 0;
  while (1) {
   i8 = i9 + 1 | 0;
   HEAP32[i7 + (Math_imul(i9, i5) | 0) >> 2] = i7 + (Math_imul(i8, i5) | 0);
   i7 = HEAP32[i4 >> 2] | 0;
   if ((i8 | 0) == (i6 | 0)) {
    break;
   } else {
    i9 = i8;
   }
  }
 }
 HEAP32[i7 + (Math_imul(i6, i5) | 0) >> 2] = 0;
 HEAP32[i2 >> 2] = HEAP32[HEAP32[i4 >> 2] >> 2];
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 i9 = HEAP32[i4 >> 2] | 0;
 STACKTOP = i1;
 return i9 | 0;
}
function __ZN9b2Contact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i4, i5, i1, i3, i6) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i2 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 if ((HEAP8[4200] | 0) == 0) {
  HEAP32[1002] = 3;
  HEAP32[4012 >> 2] = 3;
  HEAP8[4016 | 0] = 1;
  HEAP32[4104 >> 2] = 4;
  HEAP32[4108 >> 2] = 4;
  HEAP8[4112 | 0] = 1;
  HEAP32[4032 >> 2] = 4;
  HEAP32[4036 >> 2] = 4;
  HEAP8[4040 | 0] = 0;
  HEAP32[4128 >> 2] = 5;
  HEAP32[4132 >> 2] = 5;
  HEAP8[4136 | 0] = 1;
  HEAP32[4056 >> 2] = 6;
  HEAP32[4060 >> 2] = 6;
  HEAP8[4064 | 0] = 1;
  HEAP32[4020 >> 2] = 6;
  HEAP32[4024 >> 2] = 6;
  HEAP8[4028 | 0] = 0;
  HEAP32[4080 >> 2] = 7;
  HEAP32[4084 >> 2] = 7;
  HEAP8[4088 | 0] = 1;
  HEAP32[4116 >> 2] = 7;
  HEAP32[4120 >> 2] = 7;
  HEAP8[4124 | 0] = 0;
  HEAP32[4152 >> 2] = 8;
  HEAP32[4156 >> 2] = 8;
  HEAP8[4160 | 0] = 1;
  HEAP32[4044 >> 2] = 8;
  HEAP32[4048 >> 2] = 8;
  HEAP8[4052 | 0] = 0;
  HEAP32[4176 >> 2] = 9;
  HEAP32[4180 >> 2] = 9;
  HEAP8[4184 | 0] = 1;
  HEAP32[4140 >> 2] = 9;
  HEAP32[4144 >> 2] = 9;
  HEAP8[4148 | 0] = 0;
  HEAP8[4200] = 1;
 }
 i7 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 4 >> 2] | 0;
 i8 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 4 >> 2] | 0;
 if (!(i7 >>> 0 < 4)) {
  ___assert_fail(4208, 4256, 80, 4344);
 }
 if (!(i8 >>> 0 < 4)) {
  ___assert_fail(4296, 4256, 81, 4344);
 }
 i9 = HEAP32[4008 + (i7 * 48 | 0) + (i8 * 12 | 0) >> 2] | 0;
 if ((i9 | 0) == 0) {
  i9 = 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 if ((HEAP8[4008 + (i7 * 48 | 0) + (i8 * 12 | 0) + 8 | 0] | 0) == 0) {
  i9 = FUNCTION_TABLE_iiiiii[i9 & 15](i1, i3, i4, i5, i6) | 0;
  STACKTOP = i2;
  return i9 | 0;
 } else {
  i9 = FUNCTION_TABLE_iiiiii[i9 & 15](i4, i5, i1, i3, i6) | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 return 0;
}
function __ZN13b2DynamicTree9MoveProxyEiRK6b2AABBRK6b2Vec2(i1, i2, i13, i9) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i13 = i13 | 0;
 i9 = i9 | 0;
 var i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0;
 i4 = STACKTOP;
 if (!((i2 | 0) > -1)) {
  ___assert_fail(3072, 2944, 135, 3152);
 }
 if ((HEAP32[i1 + 12 >> 2] | 0) <= (i2 | 0)) {
  ___assert_fail(3072, 2944, 135, 3152);
 }
 i3 = i1 + 4 | 0;
 i12 = HEAP32[i3 >> 2] | 0;
 if (!((HEAP32[i12 + (i2 * 36 | 0) + 24 >> 2] | 0) == -1)) {
  ___assert_fail(3120, 2944, 137, 3152);
 }
 if (((+HEAPF32[i12 + (i2 * 36 | 0) >> 2] <= +HEAPF32[i13 >> 2] ? +HEAPF32[i12 + (i2 * 36 | 0) + 4 >> 2] <= +HEAPF32[i13 + 4 >> 2] : 0) ? +HEAPF32[i13 + 8 >> 2] <= +HEAPF32[i12 + (i2 * 36 | 0) + 8 >> 2] : 0) ? +HEAPF32[i13 + 12 >> 2] <= +HEAPF32[i12 + (i2 * 36 | 0) + 12 >> 2] : 0) {
  i13 = 0;
  STACKTOP = i4;
  return i13 | 0;
 }
 __ZN13b2DynamicTree10RemoveLeafEi(i1, i2);
 i12 = i13;
 d6 = +HEAPF32[i12 >> 2];
 d8 = +HEAPF32[i12 + 4 >> 2];
 i13 = i13 + 8 | 0;
 d10 = +HEAPF32[i13 >> 2];
 d6 = d6 + -.10000000149011612;
 d8 = d8 + -.10000000149011612;
 d10 = d10 + .10000000149011612;
 d5 = +HEAPF32[i13 + 4 >> 2] + .10000000149011612;
 d11 = +HEAPF32[i9 >> 2] * 2.0;
 d7 = +HEAPF32[i9 + 4 >> 2] * 2.0;
 if (d11 < 0.0) {
  d6 = d6 + d11;
 } else {
  d10 = d11 + d10;
 }
 if (d7 < 0.0) {
  d8 = d8 + d7;
 } else {
  d5 = d7 + d5;
 }
 i13 = HEAP32[i3 >> 2] | 0;
 d7 = +d6;
 d11 = +d8;
 i12 = i13 + (i2 * 36 | 0) | 0;
 HEAPF32[i12 >> 2] = d7;
 HEAPF32[i12 + 4 >> 2] = d11;
 d10 = +d10;
 d11 = +d5;
 i13 = i13 + (i2 * 36 | 0) + 8 | 0;
 HEAPF32[i13 >> 2] = d10;
 HEAPF32[i13 + 4 >> 2] = d11;
 __ZN13b2DynamicTree10InsertLeafEi(i1, i2);
 i13 = 1;
 STACKTOP = i4;
 return i13 | 0;
}
function __ZNK9b2Simplex16GetWitnessPointsEP6b2Vec2S1_(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i9 = 0, i10 = 0, d11 = 0.0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 108 >> 2] | 0;
 if ((i3 | 0) == 2) {
  i9 = i1 + 24 | 0;
  d7 = +HEAPF32[i9 >> 2];
  i3 = i1 + 60 | 0;
  d8 = +HEAPF32[i3 >> 2];
  d6 = +(d7 * +HEAPF32[i1 >> 2] + d8 * +HEAPF32[i1 + 36 >> 2]);
  d8 = +(d7 * +HEAPF32[i1 + 4 >> 2] + d8 * +HEAPF32[i1 + 40 >> 2]);
  HEAPF32[i4 >> 2] = d6;
  HEAPF32[i4 + 4 >> 2] = d8;
  d8 = +HEAPF32[i9 >> 2];
  d6 = +HEAPF32[i3 >> 2];
  d7 = +(d8 * +HEAPF32[i1 + 8 >> 2] + d6 * +HEAPF32[i1 + 44 >> 2]);
  d6 = +(d8 * +HEAPF32[i1 + 12 >> 2] + d6 * +HEAPF32[i1 + 48 >> 2]);
  HEAPF32[i5 >> 2] = d7;
  HEAPF32[i5 + 4 >> 2] = d6;
  STACKTOP = i2;
  return;
 } else if ((i3 | 0) == 1) {
  i10 = i1;
  i9 = HEAP32[i10 + 4 >> 2] | 0;
  i3 = i4;
  HEAP32[i3 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i3 + 4 >> 2] = i9;
  i3 = i1 + 8 | 0;
  i4 = HEAP32[i3 + 4 >> 2] | 0;
  i9 = i5;
  HEAP32[i9 >> 2] = HEAP32[i3 >> 2];
  HEAP32[i9 + 4 >> 2] = i4;
  STACKTOP = i2;
  return;
 } else if ((i3 | 0) == 0) {
  ___assert_fail(2712, 2672, 217, 2752);
 } else if ((i3 | 0) == 3) {
  d11 = +HEAPF32[i1 + 24 >> 2];
  d6 = +HEAPF32[i1 + 60 >> 2];
  d8 = +HEAPF32[i1 + 96 >> 2];
  d7 = +(d11 * +HEAPF32[i1 >> 2] + d6 * +HEAPF32[i1 + 36 >> 2] + d8 * +HEAPF32[i1 + 72 >> 2]);
  d8 = +(d11 * +HEAPF32[i1 + 4 >> 2] + d6 * +HEAPF32[i1 + 40 >> 2] + d8 * +HEAPF32[i1 + 76 >> 2]);
  i10 = i4;
  HEAPF32[i10 >> 2] = d7;
  HEAPF32[i10 + 4 >> 2] = d8;
  i10 = i5;
  HEAPF32[i10 >> 2] = d7;
  HEAPF32[i10 + 4 >> 2] = d8;
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(2712, 2672, 236, 2752);
 }
}
function __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i4, i3, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 if (!((i1 | 0) > -1)) {
  ___assert_fail(6832, 6792, 89, 6872);
 }
 i5 = i4 + 16 | 0;
 if (((HEAP32[i5 >> 2] | 0) + -1 | 0) <= (i1 | 0)) {
  ___assert_fail(6832, 6792, 89, 6872);
 }
 HEAP32[i3 + 4 >> 2] = 1;
 HEAPF32[i3 + 8 >> 2] = +HEAPF32[i4 + 8 >> 2];
 i6 = i4 + 12 | 0;
 i7 = (HEAP32[i6 >> 2] | 0) + (i1 << 3) | 0;
 i8 = HEAP32[i7 + 4 >> 2] | 0;
 i9 = i3 + 12 | 0;
 HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i9 + 4 >> 2] = i8;
 i9 = (HEAP32[i6 >> 2] | 0) + (i1 + 1 << 3) | 0;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i3 + 20 | 0;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 i7 = i3 + 28 | 0;
 if ((i1 | 0) > 0) {
  i10 = (HEAP32[i6 >> 2] | 0) + (i1 + -1 << 3) | 0;
  i8 = HEAP32[i10 + 4 >> 2] | 0;
  i9 = i7;
  HEAP32[i9 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i9 + 4 >> 2] = i8;
  HEAP8[i3 + 44 | 0] = 1;
 } else {
  i8 = i4 + 20 | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 44 | 0] = HEAP8[i4 + 36 | 0] | 0;
 }
 i7 = i3 + 36 | 0;
 if (((HEAP32[i5 >> 2] | 0) + -2 | 0) > (i1 | 0)) {
  i8 = (HEAP32[i6 >> 2] | 0) + (i1 + 2 << 3) | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 45 | 0] = 1;
  STACKTOP = i2;
  return;
 } else {
  i8 = i4 + 28 | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 45 | 0] = HEAP8[i4 + 37 | 0] | 0;
  STACKTOP = i2;
  return;
 }
}
function __ZN15b2DistanceProxy3SetEPK7b2Shapei(i3, i1, i5) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 4 >> 2] | 0;
 if ((i4 | 0) == 1) {
  HEAP32[i3 + 16 >> 2] = i1 + 12;
  HEAP32[i3 + 20 >> 2] = 2;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 3) {
  if (!((i5 | 0) > -1)) {
   ___assert_fail(2632, 2672, 53, 2704);
  }
  i4 = i1 + 16 | 0;
  if ((HEAP32[i4 >> 2] | 0) <= (i5 | 0)) {
   ___assert_fail(2632, 2672, 53, 2704);
  }
  i7 = i1 + 12 | 0;
  i9 = (HEAP32[i7 >> 2] | 0) + (i5 << 3) | 0;
  i8 = HEAP32[i9 + 4 >> 2] | 0;
  i6 = i3;
  HEAP32[i6 >> 2] = HEAP32[i9 >> 2];
  HEAP32[i6 + 4 >> 2] = i8;
  i6 = i5 + 1 | 0;
  i5 = i3 + 8 | 0;
  i7 = HEAP32[i7 >> 2] | 0;
  if ((i6 | 0) < (HEAP32[i4 >> 2] | 0)) {
   i7 = i7 + (i6 << 3) | 0;
   i8 = HEAP32[i7 + 4 >> 2] | 0;
   i9 = i5;
   HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i9 + 4 >> 2] = i8;
  } else {
   i8 = HEAP32[i7 + 4 >> 2] | 0;
   i9 = i5;
   HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i9 + 4 >> 2] = i8;
  }
  HEAP32[i3 + 16 >> 2] = i3;
  HEAP32[i3 + 20 >> 2] = 2;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 2) {
  HEAP32[i3 + 16 >> 2] = i1 + 20;
  HEAP32[i3 + 20 >> 2] = HEAP32[i1 + 148 >> 2];
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 0) {
  HEAP32[i3 + 16 >> 2] = i1 + 12;
  HEAP32[i3 + 20 >> 2] = 1;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(2712, 2672, 81, 2704);
 }
}
function __ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i2, i7, i4, i5, i6) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var d1 = 0.0, d3 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, i18 = 0, i19 = 0, i20 = 0;
 i12 = STACKTOP;
 i13 = HEAP32[i5 + 148 >> 2] | 0;
 if (!((i4 | 0) > -1)) {
  ___assert_fail(5640, 5688, 32, 5752);
 }
 if ((HEAP32[i2 + 148 >> 2] | 0) <= (i4 | 0)) {
  ___assert_fail(5640, 5688, 32, 5752);
 }
 d11 = +HEAPF32[i7 + 12 >> 2];
 d9 = +HEAPF32[i2 + (i4 << 3) + 84 >> 2];
 d1 = +HEAPF32[i7 + 8 >> 2];
 d3 = +HEAPF32[i2 + (i4 << 3) + 88 >> 2];
 d8 = d11 * d9 - d1 * d3;
 d3 = d9 * d1 + d11 * d3;
 d9 = +HEAPF32[i6 + 12 >> 2];
 d10 = +HEAPF32[i6 + 8 >> 2];
 d16 = d9 * d8 + d10 * d3;
 d14 = d9 * d3 - d8 * d10;
 if ((i13 | 0) > 0) {
  i19 = 0;
  i20 = 0;
  d15 = 3.4028234663852886e+38;
  while (1) {
   d17 = d16 * +HEAPF32[i5 + (i19 << 3) + 20 >> 2] + d14 * +HEAPF32[i5 + (i19 << 3) + 24 >> 2];
   i18 = d17 < d15;
   i20 = i18 ? i19 : i20;
   i19 = i19 + 1 | 0;
   if ((i19 | 0) == (i13 | 0)) {
    break;
   } else {
    d15 = i18 ? d17 : d15;
   }
  }
 } else {
  i20 = 0;
 }
 d16 = +HEAPF32[i2 + (i4 << 3) + 20 >> 2];
 d17 = +HEAPF32[i2 + (i4 << 3) + 24 >> 2];
 d14 = +HEAPF32[i5 + (i20 << 3) + 20 >> 2];
 d15 = +HEAPF32[i5 + (i20 << 3) + 24 >> 2];
 STACKTOP = i12;
 return +(d8 * (+HEAPF32[i6 >> 2] + (d9 * d14 - d10 * d15) - (+HEAPF32[i7 >> 2] + (d11 * d16 - d1 * d17))) + d3 * (d14 * d10 + d9 * d15 + +HEAPF32[i6 + 4 >> 2] - (d16 * d1 + d11 * d17 + +HEAPF32[i7 + 4 >> 2])));
}
function __Z4iterv() {
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i2 = i1;
 i3 = i1 + 32 | 0;
 i4 = HEAP32[16] | 0;
 if ((i4 | 0) >= (HEAP32[4] | 0)) {
  HEAP32[16] = i4 + 1;
  __Z7measurePl(i3, HEAP32[8] | 0);
  d7 = +HEAPF32[i3 + 4 >> 2];
  d6 = +(HEAP32[10] | 0) / 1.0e6 * 1.0e3;
  d5 = +(HEAP32[12] | 0) / 1.0e6 * 1.0e3;
  HEAPF64[tempDoublePtr >> 3] = +HEAPF32[i3 >> 2];
  HEAP32[i2 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 8 | 0;
  HEAPF64[tempDoublePtr >> 3] = d7;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 16 | 0;
  HEAPF64[tempDoublePtr >> 3] = d6;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 24 | 0;
  HEAPF64[tempDoublePtr >> 3] = d5;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  _printf(96, i2 | 0) | 0;
  _emscripten_run_script(152);
  if ((HEAP32[18] | 0) == 0) {
   STACKTOP = i1;
   return;
  }
  _emscripten_cancel_main_loop();
  STACKTOP = i1;
  return;
 }
 i3 = _clock() | 0;
 __ZN7b2World4StepEfii(HEAP32[6] | 0, .01666666753590107, 3, 3);
 i3 = (_clock() | 0) - i3 | 0;
 i2 = HEAP32[16] | 0;
 HEAP32[(HEAP32[8] | 0) + (i2 << 2) >> 2] = i3;
 if ((i3 | 0) < (HEAP32[10] | 0)) {
  HEAP32[10] = i3;
 }
 if ((i3 | 0) > (HEAP32[12] | 0)) {
  HEAP32[12] = i3;
 }
 HEAP32[16] = i2 + 1;
 STACKTOP = i1;
 return;
}
function __ZN13b2DynamicTree12AllocateNodeEv(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i2 = i5 + 16 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 if ((i3 | 0) == -1) {
  i4 = i5 + 8 | 0;
  i6 = HEAP32[i4 >> 2] | 0;
  i3 = i5 + 12 | 0;
  if ((i6 | 0) != (HEAP32[i3 >> 2] | 0)) {
   ___assert_fail(2912, 2944, 61, 2984);
  }
  i5 = i5 + 4 | 0;
  i7 = HEAP32[i5 >> 2] | 0;
  HEAP32[i3 >> 2] = i6 << 1;
  i6 = __Z7b2Alloci(i6 * 72 | 0) | 0;
  HEAP32[i5 >> 2] = i6;
  _memcpy(i6 | 0, i7 | 0, (HEAP32[i4 >> 2] | 0) * 36 | 0) | 0;
  __Z6b2FreePv(i7);
  i6 = HEAP32[i4 >> 2] | 0;
  i7 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
  i5 = HEAP32[i5 >> 2] | 0;
  if ((i6 | 0) < (i7 | 0)) {
   i7 = i6;
   while (1) {
    i6 = i7 + 1 | 0;
    HEAP32[i5 + (i7 * 36 | 0) + 20 >> 2] = i6;
    HEAP32[i5 + (i7 * 36 | 0) + 32 >> 2] = -1;
    i7 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
    if ((i6 | 0) < (i7 | 0)) {
     i7 = i6;
    } else {
     break;
    }
   }
  }
  HEAP32[i5 + (i7 * 36 | 0) + 20 >> 2] = -1;
  HEAP32[i5 + (((HEAP32[i3 >> 2] | 0) + -1 | 0) * 36 | 0) + 32 >> 2] = -1;
  i3 = HEAP32[i4 >> 2] | 0;
  HEAP32[i2 >> 2] = i3;
 } else {
  i4 = i5 + 8 | 0;
  i5 = HEAP32[i5 + 4 >> 2] | 0;
 }
 i7 = i5 + (i3 * 36 | 0) + 20 | 0;
 HEAP32[i2 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i7 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 24 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 28 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 32 >> 2] = 0;
 HEAP32[i5 + (i3 * 36 | 0) + 16 >> 2] = 0;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i1;
 return i3 | 0;
}
function __ZN9b2Fixture6CreateEP16b2BlockAllocatorP6b2BodyPK12b2FixtureDef(i1, i5, i4, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0, i6 = 0, i7 = 0, d8 = 0.0;
 i2 = STACKTOP;
 HEAP32[i1 + 40 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAPF32[i1 + 16 >> 2] = +HEAPF32[i3 + 8 >> 2];
 HEAPF32[i1 + 20 >> 2] = +HEAPF32[i3 + 12 >> 2];
 HEAP32[i1 + 8 >> 2] = i4;
 HEAP32[i1 + 4 >> 2] = 0;
 i4 = i1 + 32 | 0;
 i6 = i3 + 22 | 0;
 HEAP16[i4 + 0 >> 1] = HEAP16[i6 + 0 >> 1] | 0;
 HEAP16[i4 + 2 >> 1] = HEAP16[i6 + 2 >> 1] | 0;
 HEAP16[i4 + 4 >> 1] = HEAP16[i6 + 4 >> 1] | 0;
 HEAP8[i1 + 38 | 0] = HEAP8[i3 + 20 | 0] | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 i4 = FUNCTION_TABLE_iii[HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] & 3](i4, i5) | 0;
 HEAP32[i1 + 12 >> 2] = i4;
 i4 = FUNCTION_TABLE_ii[HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] & 3](i4) | 0;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i5, i4 * 28 | 0) | 0;
 i5 = i1 + 24 | 0;
 HEAP32[i5 >> 2] = i6;
 if ((i4 | 0) > 0) {
  i7 = 0;
 } else {
  i7 = i1 + 28 | 0;
  HEAP32[i7 >> 2] = 0;
  i7 = i3 + 16 | 0;
  d8 = +HEAPF32[i7 >> 2];
  HEAPF32[i1 >> 2] = d8;
  STACKTOP = i2;
  return;
 }
 do {
  HEAP32[i6 + (i7 * 28 | 0) + 16 >> 2] = 0;
  i6 = HEAP32[i5 >> 2] | 0;
  HEAP32[i6 + (i7 * 28 | 0) + 24 >> 2] = -1;
  i7 = i7 + 1 | 0;
 } while ((i7 | 0) != (i4 | 0));
 i7 = i1 + 28 | 0;
 HEAP32[i7 >> 2] = 0;
 i7 = i3 + 16 | 0;
 d8 = +HEAPF32[i7 >> 2];
 HEAPF32[i1 >> 2] = d8;
 STACKTOP = i2;
 return;
}
function __Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i4, i1, i5, d9, i2) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 d9 = +d9;
 i2 = i2 | 0;
 var i3 = 0, i6 = 0, d7 = 0.0, i8 = 0, i10 = 0, d11 = 0.0, d12 = 0.0, i13 = 0;
 i3 = STACKTOP;
 d12 = +HEAPF32[i5 >> 2];
 d11 = +HEAPF32[i5 + 4 >> 2];
 i5 = i1 + 4 | 0;
 d7 = d12 * +HEAPF32[i1 >> 2] + d11 * +HEAPF32[i5 >> 2] - d9;
 i6 = i1 + 12 | 0;
 i8 = i1 + 16 | 0;
 d9 = d12 * +HEAPF32[i6 >> 2] + d11 * +HEAPF32[i8 >> 2] - d9;
 if (!(d7 <= 0.0)) {
  i10 = 0;
 } else {
  HEAP32[i4 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
  i10 = 1;
 }
 if (d9 <= 0.0) {
  i13 = i10 + 1 | 0;
  i10 = i4 + (i10 * 12 | 0) | 0;
  HEAP32[i10 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i10 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i10 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  i10 = i13;
 }
 if (!(d7 * d9 < 0.0)) {
  i13 = i10;
  STACKTOP = i3;
  return i13 | 0;
 }
 d9 = d7 / (d7 - d9);
 d11 = +HEAPF32[i1 >> 2];
 d12 = +HEAPF32[i5 >> 2];
 d11 = +(d11 + d9 * (+HEAPF32[i6 >> 2] - d11));
 d12 = +(d12 + d9 * (+HEAPF32[i8 >> 2] - d12));
 i13 = i4 + (i10 * 12 | 0) | 0;
 HEAPF32[i13 >> 2] = d11;
 HEAPF32[i13 + 4 >> 2] = d12;
 i13 = i4 + (i10 * 12 | 0) + 8 | 0;
 HEAP8[i13] = i2;
 HEAP8[i13 + 1 | 0] = HEAP8[i1 + 9 | 0] | 0;
 HEAP8[i13 + 2 | 0] = 0;
 HEAP8[i13 + 3 | 0] = 1;
 i13 = i10 + 1 | 0;
 STACKTOP = i3;
 return i13 | 0;
}
function __Z16b2CollideCirclesP10b2ManifoldPK13b2CircleShapeRK11b2TransformS3_S6_(i1, i7, i8, i6, i9) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i8 = i8 | 0;
 i6 = i6 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0;
 i2 = STACKTOP;
 i4 = i1 + 60 | 0;
 HEAP32[i4 >> 2] = 0;
 i3 = i7 + 12 | 0;
 d10 = +HEAPF32[i8 + 12 >> 2];
 d14 = +HEAPF32[i3 >> 2];
 d13 = +HEAPF32[i8 + 8 >> 2];
 d11 = +HEAPF32[i7 + 16 >> 2];
 i5 = i6 + 12 | 0;
 d16 = +HEAPF32[i9 + 12 >> 2];
 d18 = +HEAPF32[i5 >> 2];
 d17 = +HEAPF32[i9 + 8 >> 2];
 d15 = +HEAPF32[i6 + 16 >> 2];
 d12 = +HEAPF32[i9 >> 2] + (d16 * d18 - d17 * d15) - (+HEAPF32[i8 >> 2] + (d10 * d14 - d13 * d11));
 d11 = d18 * d17 + d16 * d15 + +HEAPF32[i9 + 4 >> 2] - (d14 * d13 + d10 * d11 + +HEAPF32[i8 + 4 >> 2]);
 d10 = +HEAPF32[i7 + 8 >> 2] + +HEAPF32[i6 + 8 >> 2];
 if (d12 * d12 + d11 * d11 > d10 * d10) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i1 + 56 >> 2] = 0;
 i9 = i3;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i1 + 48 | 0;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 HEAPF32[i1 + 40 >> 2] = 0.0;
 HEAPF32[i1 + 44 >> 2] = 0.0;
 HEAP32[i4 >> 2] = 1;
 i7 = i5;
 i8 = HEAP32[i7 + 4 >> 2] | 0;
 i9 = i1;
 HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i9 + 4 >> 2] = i8;
 HEAP32[i1 + 16 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZNK14b2PolygonShape11ComputeAABBEP6b2AABBRK11b2Transformi(i1, i2, i7, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i7 = i7 | 0;
 i3 = i3 | 0;
 var d4 = 0.0, d5 = 0.0, d6 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0;
 i3 = STACKTOP;
 d4 = +HEAPF32[i7 + 12 >> 2];
 d15 = +HEAPF32[i1 + 20 >> 2];
 d5 = +HEAPF32[i7 + 8 >> 2];
 d12 = +HEAPF32[i1 + 24 >> 2];
 d6 = +HEAPF32[i7 >> 2];
 d9 = d6 + (d4 * d15 - d5 * d12);
 d8 = +HEAPF32[i7 + 4 >> 2];
 d12 = d15 * d5 + d4 * d12 + d8;
 i7 = HEAP32[i1 + 148 >> 2] | 0;
 if ((i7 | 0) > 1) {
  d10 = d9;
  d11 = d12;
  i13 = 1;
  do {
   d16 = +HEAPF32[i1 + (i13 << 3) + 20 >> 2];
   d14 = +HEAPF32[i1 + (i13 << 3) + 24 >> 2];
   d15 = d6 + (d4 * d16 - d5 * d14);
   d14 = d16 * d5 + d4 * d14 + d8;
   d10 = d10 < d15 ? d10 : d15;
   d11 = d11 < d14 ? d11 : d14;
   d9 = d9 > d15 ? d9 : d15;
   d12 = d12 > d14 ? d12 : d14;
   i13 = i13 + 1 | 0;
  } while ((i13 | 0) < (i7 | 0));
 } else {
  d11 = d12;
  d10 = d9;
 }
 d16 = +HEAPF32[i1 + 8 >> 2];
 d14 = +(d10 - d16);
 d15 = +(d11 - d16);
 i13 = i2;
 HEAPF32[i13 >> 2] = d14;
 HEAPF32[i13 + 4 >> 2] = d15;
 d15 = +(d9 + d16);
 d16 = +(d12 + d16);
 i13 = i2 + 8 | 0;
 HEAPF32[i13 >> 2] = d15;
 HEAPF32[i13 + 4 >> 2] = d16;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib(i5, i1, i4, i6, i3, i7) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i7 = i7 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i5 | 0) != (HEAP32[i1 + 8 >> 2] | 0)) {
  i5 = HEAP32[i5 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i5 >> 2] | 0) + 20 >> 2] & 3](i5, i1, i4, i6, i3, i7);
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 53 | 0] = 1;
 if ((HEAP32[i1 + 4 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 52 | 0] = 1;
 i5 = i1 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i1 + 24 >> 2] = i3;
  HEAP32[i1 + 36 >> 2] = 1;
  if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i3 | 0) == 1)) {
   STACKTOP = i2;
   return;
  }
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 if ((i6 | 0) != (i4 | 0)) {
  i7 = i1 + 36 | 0;
  HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + 1;
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 i4 = i1 + 24 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 2) {
  HEAP32[i4 >> 2] = i3;
 } else {
  i3 = i5;
 }
 if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i3 | 0) == 1)) {
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 54 | 0] = 1;
 STACKTOP = i2;
 return;
}
function __ZN6b2Body13CreateFixtureEPK12b2FixtureDef(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i3 = STACKTOP;
 i2 = i1 + 88 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((HEAP32[i4 + 102868 >> 2] & 2 | 0) != 0) {
  ___assert_fail(1776, 1520, 153, 1808);
 }
 i6 = __ZN16b2BlockAllocator8AllocateEi(i4, 44) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
 } else {
  __ZN9b2FixtureC2Ev(i6);
 }
 __ZN9b2Fixture6CreateEP16b2BlockAllocatorP6b2BodyPK12b2FixtureDef(i6, i4, i1, i5);
 if (!((HEAP16[i1 + 4 >> 1] & 32) == 0)) {
  __ZN9b2Fixture13CreateProxiesEP12b2BroadPhaseRK11b2Transform(i6, (HEAP32[i2 >> 2] | 0) + 102872 | 0, i1 + 12 | 0);
 }
 i5 = i1 + 100 | 0;
 HEAP32[i6 + 4 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i5 >> 2] = i6;
 i5 = i1 + 104 | 0;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
 HEAP32[i6 + 8 >> 2] = i1;
 if (!(+HEAPF32[i6 >> 2] > 0.0)) {
  i5 = HEAP32[i2 >> 2] | 0;
  i5 = i5 + 102868 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i4 = i4 | 1;
  HEAP32[i5 >> 2] = i4;
  STACKTOP = i3;
  return i6 | 0;
 }
 __ZN6b2Body13ResetMassDataEv(i1);
 i5 = HEAP32[i2 >> 2] | 0;
 i5 = i5 + 102868 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 i4 = i4 | 1;
 HEAP32[i5 >> 2] = i4;
 STACKTOP = i3;
 return i6 | 0;
}
function __Z13b2TestOverlapPK7b2ShapeiS1_iRK11b2TransformS4_(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i8 = STACKTOP;
 STACKTOP = STACKTOP + 128 | 0;
 i9 = i8 + 36 | 0;
 i10 = i8 + 24 | 0;
 i7 = i8;
 HEAP32[i9 + 16 >> 2] = 0;
 HEAP32[i9 + 20 >> 2] = 0;
 HEAPF32[i9 + 24 >> 2] = 0.0;
 HEAP32[i9 + 44 >> 2] = 0;
 HEAP32[i9 + 48 >> 2] = 0;
 HEAPF32[i9 + 52 >> 2] = 0.0;
 __ZN15b2DistanceProxy3SetEPK7b2Shapei(i9, i6, i5);
 __ZN15b2DistanceProxy3SetEPK7b2Shapei(i9 + 28 | 0, i4, i3);
 i6 = i9 + 56 | 0;
 HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
 HEAP32[i6 + 12 >> 2] = HEAP32[i2 + 12 >> 2];
 i6 = i9 + 72 | 0;
 HEAP32[i6 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
 HEAP32[i6 + 12 >> 2] = HEAP32[i1 + 12 >> 2];
 HEAP8[i9 + 88 | 0] = 1;
 HEAP16[i10 + 4 >> 1] = 0;
 __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i7, i10, i9);
 STACKTOP = i8;
 return +HEAPF32[i7 + 16 >> 2] < 11920928955078125.0e-22 | 0;
}
function __ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib(i6, i1, i4, i5, i2, i3) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i3 = STACKTOP;
 if ((HEAP32[i1 + 8 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 53 | 0] = 1;
 if ((HEAP32[i1 + 4 >> 2] | 0) != (i5 | 0)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 52 | 0] = 1;
 i5 = i1 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i1 + 24 >> 2] = i2;
  HEAP32[i1 + 36 >> 2] = 1;
  if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i2 | 0) == 1)) {
   STACKTOP = i3;
   return;
  }
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i3;
  return;
 }
 if ((i6 | 0) != (i4 | 0)) {
  i6 = i1 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i3;
  return;
 }
 i4 = i1 + 24 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 2) {
  HEAP32[i4 >> 2] = i2;
 } else {
  i2 = i5;
 }
 if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i2 | 0) == 1)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 54 | 0] = 1;
 STACKTOP = i3;
 return;
}
function __ZNK11b2EdgeShape5CloneEP16b2BlockAllocator(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 48) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  HEAP32[i3 >> 2] = 240;
  HEAP32[i3 + 4 >> 2] = 1;
  HEAPF32[i3 + 8 >> 2] = .009999999776482582;
  i4 = i3 + 28 | 0;
  HEAP32[i4 + 0 >> 2] = 0;
  HEAP32[i4 + 4 >> 2] = 0;
  HEAP32[i4 + 8 >> 2] = 0;
  HEAP32[i4 + 12 >> 2] = 0;
  HEAP16[i4 + 16 >> 1] = 0;
 }
 i6 = i1 + 4 | 0;
 i5 = HEAP32[i6 + 4 >> 2] | 0;
 i4 = i3 + 4 | 0;
 HEAP32[i4 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i4 + 4 >> 2] = i5;
 i4 = i3 + 12 | 0;
 i1 = i1 + 12 | 0;
 HEAP32[i4 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
 HEAP32[i4 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
 HEAP32[i4 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
 HEAP32[i4 + 12 >> 2] = HEAP32[i1 + 12 >> 2];
 HEAP32[i4 + 16 >> 2] = HEAP32[i1 + 16 >> 2];
 HEAP32[i4 + 20 >> 2] = HEAP32[i1 + 20 >> 2];
 HEAP32[i4 + 24 >> 2] = HEAP32[i1 + 24 >> 2];
 HEAP32[i4 + 28 >> 2] = HEAP32[i1 + 28 >> 2];
 HEAP16[i4 + 32 >> 1] = HEAP16[i1 + 32 >> 1] | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function __ZN7b2WorldC2ERK6b2Vec2(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 __ZN16b2BlockAllocatorC2Ev(i1);
 __ZN16b2StackAllocatorC2Ev(i1 + 68 | 0);
 __ZN16b2ContactManagerC2Ev(i1 + 102872 | 0);
 i6 = i1 + 102968 | 0;
 HEAP32[i1 + 102980 >> 2] = 0;
 HEAP32[i1 + 102984 >> 2] = 0;
 i4 = i1 + 102952 | 0;
 i5 = i1 + 102992 | 0;
 HEAP32[i4 + 0 >> 2] = 0;
 HEAP32[i4 + 4 >> 2] = 0;
 HEAP32[i4 + 8 >> 2] = 0;
 HEAP32[i4 + 12 >> 2] = 0;
 HEAP8[i5] = 1;
 HEAP8[i1 + 102993 | 0] = 1;
 HEAP8[i1 + 102994 | 0] = 0;
 HEAP8[i1 + 102995 | 0] = 1;
 HEAP8[i1 + 102976 | 0] = 1;
 i5 = i2;
 i4 = HEAP32[i5 + 4 >> 2] | 0;
 i2 = i6;
 HEAP32[i2 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i2 + 4 >> 2] = i4;
 HEAP32[i1 + 102868 >> 2] = 4;
 HEAPF32[i1 + 102988 >> 2] = 0.0;
 HEAP32[i1 + 102948 >> 2] = i1;
 i2 = i1 + 102996 | 0;
 HEAP32[i2 + 0 >> 2] = 0;
 HEAP32[i2 + 4 >> 2] = 0;
 HEAP32[i2 + 8 >> 2] = 0;
 HEAP32[i2 + 12 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 24 >> 2] = 0;
 HEAP32[i2 + 28 >> 2] = 0;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib(i6, i3, i4, i1, i2) {
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i3 + 8 >> 2] | 0) == (i6 | 0)) {
  if ((HEAP32[i3 + 4 >> 2] | 0) != (i4 | 0)) {
   STACKTOP = i2;
   return;
  }
  i3 = i3 + 28 | 0;
  if ((HEAP32[i3 >> 2] | 0) == 1) {
   STACKTOP = i2;
   return;
  }
  HEAP32[i3 >> 2] = i1;
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i3 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i3 + 16 >> 2] | 0) != (i4 | 0) ? (i5 = i3 + 20 | 0, (HEAP32[i5 >> 2] | 0) != (i4 | 0)) : 0) {
  HEAP32[i3 + 32 >> 2] = i1;
  HEAP32[i5 >> 2] = i4;
  i6 = i3 + 40 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  if ((HEAP32[i3 + 36 >> 2] | 0) == 1 ? (HEAP32[i3 + 24 >> 2] | 0) == 2 : 0) {
   HEAP8[i3 + 54 | 0] = 1;
  }
  HEAP32[i3 + 44 >> 2] = 4;
  STACKTOP = i2;
  return;
 }
 if ((i1 | 0) != 1) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i3 + 32 >> 2] = 1;
 STACKTOP = i2;
 return;
}
function __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 if ((HEAP8[4200] | 0) == 0) {
  ___assert_fail(4352, 4256, 103, 4376);
 }
 i4 = HEAP32[i1 + 48 >> 2] | 0;
 if ((HEAP32[i1 + 124 >> 2] | 0) > 0) {
  i7 = HEAP32[i4 + 8 >> 2] | 0;
  i6 = i7 + 4 | 0;
  i5 = HEAPU16[i6 >> 1] | 0;
  if ((i5 & 2 | 0) == 0) {
   HEAP16[i6 >> 1] = i5 | 2;
   HEAPF32[i7 + 144 >> 2] = 0.0;
  }
  i7 = HEAP32[i1 + 52 >> 2] | 0;
  i6 = HEAP32[i7 + 8 >> 2] | 0;
  i5 = i6 + 4 | 0;
  i8 = HEAPU16[i5 >> 1] | 0;
  if ((i8 & 2 | 0) == 0) {
   HEAP16[i5 >> 1] = i8 | 2;
   HEAPF32[i6 + 144 >> 2] = 0.0;
  }
 } else {
  i7 = HEAP32[i1 + 52 >> 2] | 0;
 }
 i4 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 4 >> 2] | 0;
 i5 = HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 4 >> 2] | 0;
 if ((i4 | 0) > -1 & (i5 | 0) < 4) {
  FUNCTION_TABLE_vii[HEAP32[4008 + (i4 * 48 | 0) + (i5 * 12 | 0) + 4 >> 2] & 15](i1, i2);
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(4384, 4256, 114, 4376);
 }
}
function __ZN9b2Fixture13CreateProxiesEP12b2BroadPhaseRK11b2Transform(i5, i4, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i2 = STACKTOP;
 i3 = i5 + 28 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 0) {
  ___assert_fail(2088, 2112, 124, 2144);
 }
 i6 = i5 + 12 | 0;
 i8 = HEAP32[i6 >> 2] | 0;
 i8 = FUNCTION_TABLE_ii[HEAP32[(HEAP32[i8 >> 2] | 0) + 12 >> 2] & 3](i8) | 0;
 HEAP32[i3 >> 2] = i8;
 if ((i8 | 0) <= 0) {
  STACKTOP = i2;
  return;
 }
 i7 = i5 + 24 | 0;
 i8 = 0;
 do {
  i9 = HEAP32[i7 >> 2] | 0;
  i10 = i9 + (i8 * 28 | 0) | 0;
  i11 = HEAP32[i6 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i11 >> 2] | 0) + 24 >> 2] & 15](i11, i10, i1, i8);
  HEAP32[i9 + (i8 * 28 | 0) + 24 >> 2] = __ZN12b2BroadPhase11CreateProxyERK6b2AABBPv(i4, i10, i10) | 0;
  HEAP32[i9 + (i8 * 28 | 0) + 16 >> 2] = i5;
  HEAP32[i9 + (i8 * 28 | 0) + 20 >> 2] = i8;
  i8 = i8 + 1 | 0;
 } while ((i8 | 0) < (HEAP32[i3 >> 2] | 0));
 STACKTOP = i2;
 return;
}
function __ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv(i1, i5, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i3 = i2;
 if ((i1 | 0) == (i5 | 0)) {
  i7 = 1;
  STACKTOP = i2;
  return i7 | 0;
 }
 if ((i5 | 0) == 0) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 i5 = ___dynamic_cast(i5, 6952, 7008, 0) | 0;
 if ((i5 | 0) == 0) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 i7 = i3 + 0 | 0;
 i6 = i7 + 56 | 0;
 do {
  HEAP32[i7 >> 2] = 0;
  i7 = i7 + 4 | 0;
 } while ((i7 | 0) < (i6 | 0));
 HEAP32[i3 >> 2] = i5;
 HEAP32[i3 + 8 >> 2] = i1;
 HEAP32[i3 + 12 >> 2] = -1;
 HEAP32[i3 + 48 >> 2] = 1;
 FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i5 >> 2] | 0) + 28 >> 2] & 15](i5, i3, HEAP32[i4 >> 2] | 0, 1);
 if ((HEAP32[i3 + 24 >> 2] | 0) != 1) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 HEAP32[i4 >> 2] = HEAP32[i3 + 16 >> 2];
 i7 = 1;
 STACKTOP = i2;
 return i7 | 0;
}
function __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i1, i4, i3, i2, i5, i6) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i7 = 0, i8 = 0;
 i7 = STACKTOP;
 i8 = i1 + 40 | 0;
 HEAP32[i8 >> 2] = i4;
 HEAP32[i1 + 44 >> 2] = i3;
 HEAP32[i1 + 48 >> 2] = i2;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 36 >> 2] = 0;
 HEAP32[i1 + 32 >> 2] = 0;
 HEAP32[i1 >> 2] = i5;
 HEAP32[i1 + 4 >> 2] = i6;
 HEAP32[i1 + 8 >> 2] = __ZN16b2StackAllocator8AllocateEi(i5, i4 << 2) | 0;
 HEAP32[i1 + 12 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, i3 << 2) | 0;
 HEAP32[i1 + 16 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, i2 << 2) | 0;
 HEAP32[i1 + 24 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, (HEAP32[i8 >> 2] | 0) * 12 | 0) | 0;
 HEAP32[i1 + 20 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, (HEAP32[i8 >> 2] | 0) * 12 | 0) | 0;
 STACKTOP = i7;
 return;
}
function __ZNK11b2EdgeShape11ComputeAABBEP6b2AABBRK11b2Transformi(i8, i1, i10, i2) {
 i8 = i8 | 0;
 i1 = i1 | 0;
 i10 = i10 | 0;
 i2 = i2 | 0;
 var d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d9 = 0.0, d11 = 0.0, d12 = 0.0;
 i2 = STACKTOP;
 d7 = +HEAPF32[i10 + 12 >> 2];
 d9 = +HEAPF32[i8 + 12 >> 2];
 d11 = +HEAPF32[i10 + 8 >> 2];
 d3 = +HEAPF32[i8 + 16 >> 2];
 d6 = +HEAPF32[i10 >> 2];
 d5 = d6 + (d7 * d9 - d11 * d3);
 d12 = +HEAPF32[i10 + 4 >> 2];
 d3 = d9 * d11 + d7 * d3 + d12;
 d9 = +HEAPF32[i8 + 20 >> 2];
 d4 = +HEAPF32[i8 + 24 >> 2];
 d6 = d6 + (d7 * d9 - d11 * d4);
 d4 = d12 + (d11 * d9 + d7 * d4);
 d7 = +HEAPF32[i8 + 8 >> 2];
 d9 = +((d5 < d6 ? d5 : d6) - d7);
 d12 = +((d3 < d4 ? d3 : d4) - d7);
 i10 = i1;
 HEAPF32[i10 >> 2] = d9;
 HEAPF32[i10 + 4 >> 2] = d12;
 d5 = +(d7 + (d5 > d6 ? d5 : d6));
 d12 = +(d7 + (d3 > d4 ? d3 : d4));
 i10 = i1 + 8 | 0;
 HEAPF32[i10 >> 2] = d5;
 HEAPF32[i10 + 4 >> 2] = d12;
 STACKTOP = i2;
 return;
}
function __ZNK14b2PolygonShape9TestPointERK11b2TransformRK6b2Vec2(i2, i3, i6) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, d4 = 0.0, d5 = 0.0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0;
 i1 = STACKTOP;
 d8 = +HEAPF32[i6 >> 2] - +HEAPF32[i3 >> 2];
 d9 = +HEAPF32[i6 + 4 >> 2] - +HEAPF32[i3 + 4 >> 2];
 d10 = +HEAPF32[i3 + 12 >> 2];
 d5 = +HEAPF32[i3 + 8 >> 2];
 d4 = d8 * d10 + d9 * d5;
 d5 = d10 * d9 - d8 * d5;
 i3 = HEAP32[i2 + 148 >> 2] | 0;
 if ((i3 | 0) > 0) {
  i6 = 0;
 } else {
  i7 = 1;
  STACKTOP = i1;
  return i7 | 0;
 }
 while (1) {
  i7 = i6 + 1 | 0;
  if ((d4 - +HEAPF32[i2 + (i6 << 3) + 20 >> 2]) * +HEAPF32[i2 + (i6 << 3) + 84 >> 2] + (d5 - +HEAPF32[i2 + (i6 << 3) + 24 >> 2]) * +HEAPF32[i2 + (i6 << 3) + 88 >> 2] > 0.0) {
   i3 = 0;
   i2 = 4;
   break;
  }
  if ((i7 | 0) < (i3 | 0)) {
   i6 = i7;
  } else {
   i3 = 1;
   i2 = 4;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  STACKTOP = i1;
  return i3 | 0;
 }
 return 0;
}
function __ZN16b2StackAllocator8AllocateEi(i4, i5) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i3 = i4 + 102796 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 if ((i6 | 0) >= 32) {
  ___assert_fail(3896, 3808, 38, 3936);
 }
 i1 = i4 + (i6 * 12 | 0) + 102412 | 0;
 HEAP32[i4 + (i6 * 12 | 0) + 102416 >> 2] = i5;
 i7 = i4 + 102400 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 + i5 | 0) > 102400) {
  HEAP32[i1 >> 2] = __Z7b2Alloci(i5) | 0;
  HEAP8[i4 + (i6 * 12 | 0) + 102420 | 0] = 1;
 } else {
  HEAP32[i1 >> 2] = i4 + i8;
  HEAP8[i4 + (i6 * 12 | 0) + 102420 | 0] = 0;
  HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + i5;
 }
 i6 = i4 + 102404 | 0;
 i5 = (HEAP32[i6 >> 2] | 0) + i5 | 0;
 HEAP32[i6 >> 2] = i5;
 i4 = i4 + 102408 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = (i6 | 0) > (i5 | 0) ? i6 : i5;
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 STACKTOP = i2;
 return HEAP32[i1 >> 2] | 0;
}
function __ZN12b2BroadPhase13QueryCallbackEi(i5, i1) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i4 = i5 + 56 | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 if ((i7 | 0) == (i1 | 0)) {
  STACKTOP = i2;
  return 1;
 }
 i3 = i5 + 52 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i8 = i5 + 48 | 0;
 i5 = i5 + 44 | 0;
 if ((i6 | 0) == (HEAP32[i8 >> 2] | 0)) {
  i7 = HEAP32[i5 >> 2] | 0;
  HEAP32[i8 >> 2] = i6 << 1;
  i6 = __Z7b2Alloci(i6 * 24 | 0) | 0;
  HEAP32[i5 >> 2] = i6;
  _memcpy(i6 | 0, i7 | 0, (HEAP32[i3 >> 2] | 0) * 12 | 0) | 0;
  __Z6b2FreePv(i7);
  i7 = HEAP32[i4 >> 2] | 0;
  i6 = HEAP32[i3 >> 2] | 0;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 + (i6 * 12 | 0) >> 2] = (i7 | 0) > (i1 | 0) ? i1 : i7;
 i4 = HEAP32[i4 >> 2] | 0;
 HEAP32[i5 + ((HEAP32[i3 >> 2] | 0) * 12 | 0) + 4 >> 2] = (i4 | 0) < (i1 | 0) ? i1 : i4;
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 STACKTOP = i2;
 return 1;
}
function __ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi(i5, i4, i3, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i6 = 0;
 i2 = STACKTOP;
 if ((i5 | 0) != (HEAP32[i4 + 8 >> 2] | 0)) {
  i6 = HEAP32[i5 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i6 >> 2] | 0) + 28 >> 2] & 15](i6, i4, i3, i1);
  STACKTOP = i2;
  return;
 }
 i5 = i4 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i3;
  HEAP32[i4 + 24 >> 2] = i1;
  HEAP32[i4 + 36 >> 2] = 1;
  STACKTOP = i2;
  return;
 }
 if ((i6 | 0) != (i3 | 0)) {
  i6 = i4 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP32[i4 + 24 >> 2] = 2;
  HEAP8[i4 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 i3 = i4 + 24 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 2) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i3 >> 2] = i1;
 STACKTOP = i2;
 return;
}
function __ZN6b2Body19SynchronizeFixturesEv(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 d8 = +HEAPF32[i5 + 52 >> 2];
 d9 = +Math_sin(+d8);
 HEAPF32[i3 + 8 >> 2] = d9;
 d8 = +Math_cos(+d8);
 HEAPF32[i3 + 12 >> 2] = d8;
 d10 = +HEAPF32[i5 + 28 >> 2];
 d6 = +HEAPF32[i5 + 32 >> 2];
 d7 = +(+HEAPF32[i5 + 36 >> 2] - (d8 * d10 - d9 * d6));
 d6 = +(+HEAPF32[i5 + 40 >> 2] - (d10 * d9 + d8 * d6));
 i2 = i3;
 HEAPF32[i2 >> 2] = d7;
 HEAPF32[i2 + 4 >> 2] = d6;
 i2 = (HEAP32[i5 + 88 >> 2] | 0) + 102872 | 0;
 i4 = HEAP32[i5 + 100 >> 2] | 0;
 if ((i4 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 i5 = i5 + 12 | 0;
 do {
  __ZN9b2Fixture11SynchronizeEP12b2BroadPhaseRK11b2TransformS4_(i4, i2, i3, i5);
  i4 = HEAP32[i4 + 4 >> 2] | 0;
 } while ((i4 | 0) != 0);
 STACKTOP = i1;
 return;
}
function __ZN13b2DynamicTreeC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i4 = STACKTOP;
 HEAP32[i1 >> 2] = -1;
 i3 = i1 + 12 | 0;
 HEAP32[i3 >> 2] = 16;
 HEAP32[i1 + 8 >> 2] = 0;
 i6 = __Z7b2Alloci(576) | 0;
 i2 = i1 + 4 | 0;
 HEAP32[i2 >> 2] = i6;
 _memset(i6 | 0, 0, (HEAP32[i3 >> 2] | 0) * 36 | 0) | 0;
 i6 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
 i2 = HEAP32[i2 >> 2] | 0;
 if ((i6 | 0) > 0) {
  i6 = 0;
  while (1) {
   i5 = i6 + 1 | 0;
   HEAP32[i2 + (i6 * 36 | 0) + 20 >> 2] = i5;
   HEAP32[i2 + (i6 * 36 | 0) + 32 >> 2] = -1;
   i6 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
   if ((i5 | 0) < (i6 | 0)) {
    i6 = i5;
   } else {
    break;
   }
  }
 }
 HEAP32[i2 + (i6 * 36 | 0) + 20 >> 2] = -1;
 HEAP32[i2 + (((HEAP32[i3 >> 2] | 0) + -1 | 0) * 36 | 0) + 32 >> 2] = -1;
 HEAP32[i1 + 16 >> 2] = 0;
 HEAP32[i1 + 20 >> 2] = 0;
 HEAP32[i1 + 24 >> 2] = 0;
 STACKTOP = i4;
 return;
}
function __Z7measurePl(i1, i9) {
 i1 = i1 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, i7 = 0, d8 = 0.0, i10 = 0, d11 = 0.0;
 i2 = STACKTOP;
 i3 = HEAP32[4] | 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + ((4 * i3 | 0) + 15 & -16) | 0;
 i7 = (i3 | 0) > 0;
 if (i7) {
  i10 = 0;
  d6 = 0.0;
  do {
   d8 = +(HEAP32[i9 + (i10 << 2) >> 2] | 0) / 1.0e6 * 1.0e3;
   HEAPF32[i4 + (i10 << 2) >> 2] = d8;
   d6 = d6 + d8;
   i10 = i10 + 1 | 0;
  } while ((i10 | 0) < (i3 | 0));
  d5 = +(i3 | 0);
  d6 = d6 / d5;
  HEAPF32[i1 >> 2] = d6;
  if (i7) {
   i7 = 0;
   d8 = 0.0;
   do {
    d11 = +HEAPF32[i4 + (i7 << 2) >> 2] - d6;
    d8 = d8 + d11 * d11;
    i7 = i7 + 1 | 0;
   } while ((i7 | 0) < (i3 | 0));
  } else {
   d8 = 0.0;
  }
 } else {
  d5 = +(i3 | 0);
  HEAPF32[i1 >> 2] = 0.0 / d5;
  d8 = 0.0;
 }
 HEAPF32[i1 + 4 >> 2] = +Math_sqrt(+(d8 / d5));
 STACKTOP = i2;
 return;
}
function __ZN13b2DynamicTree11CreateProxyERK6b2AABBPv(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0, i6 = 0, d7 = 0.0, d8 = 0.0, i9 = 0;
 i5 = STACKTOP;
 i4 = __ZN13b2DynamicTree12AllocateNodeEv(i1) | 0;
 i6 = i1 + 4 | 0;
 d7 = +(+HEAPF32[i3 >> 2] + -.10000000149011612);
 d8 = +(+HEAPF32[i3 + 4 >> 2] + -.10000000149011612);
 i9 = (HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) | 0;
 HEAPF32[i9 >> 2] = d7;
 HEAPF32[i9 + 4 >> 2] = d8;
 d8 = +(+HEAPF32[i3 + 8 >> 2] + .10000000149011612);
 d7 = +(+HEAPF32[i3 + 12 >> 2] + .10000000149011612);
 i3 = (HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 8 | 0;
 HEAPF32[i3 >> 2] = d8;
 HEAPF32[i3 + 4 >> 2] = d7;
 HEAP32[(HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 16 >> 2] = i2;
 HEAP32[(HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 32 >> 2] = 0;
 __ZN13b2DynamicTree10InsertLeafEi(i1, i4);
 STACKTOP = i5;
 return i4 | 0;
}
function __ZN16b2BlockAllocatorC2Ev(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i4 = i3 + 8 | 0;
 HEAP32[i4 >> 2] = 128;
 HEAP32[i3 + 4 >> 2] = 0;
 i5 = __Z7b2Alloci(1024) | 0;
 HEAP32[i3 >> 2] = i5;
 _memset(i5 | 0, 0, HEAP32[i4 >> 2] << 3 | 0) | 0;
 i4 = i3 + 12 | 0;
 i3 = i4 + 56 | 0;
 do {
  HEAP32[i4 >> 2] = 0;
  i4 = i4 + 4 | 0;
 } while ((i4 | 0) < (i3 | 0));
 if ((HEAP8[1280] | 0) == 0) {
  i3 = 1;
  i4 = 0;
 } else {
  STACKTOP = i2;
  return;
 }
 do {
  if ((i4 | 0) >= 14) {
   i1 = 3;
   break;
  }
  if ((i3 | 0) > (HEAP32[576 + (i4 << 2) >> 2] | 0)) {
   i4 = i4 + 1 | 0;
   HEAP8[632 + i3 | 0] = i4;
  } else {
   HEAP8[632 + i3 | 0] = i4;
  }
  i3 = i3 + 1 | 0;
 } while ((i3 | 0) < 641);
 if ((i1 | 0) == 3) {
  ___assert_fail(1288, 1312, 73, 1352);
 }
 HEAP8[1280] = 1;
 STACKTOP = i2;
 return;
}
function __ZN24b2ChainAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i6 = i5;
 i7 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0;
 HEAP32[i6 >> 2] = 240;
 HEAP32[i6 + 4 >> 2] = 1;
 HEAPF32[i6 + 8 >> 2] = .009999999776482582;
 i8 = i6 + 28 | 0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 HEAP16[i8 + 16 >> 1] = 0;
 __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i7, i6, HEAP32[i2 + 56 >> 2] | 0);
 __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i4, i6, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN23b2ChainAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i6 = i5;
 i7 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0;
 HEAP32[i6 >> 2] = 240;
 HEAP32[i6 + 4 >> 2] = 1;
 HEAPF32[i6 + 8 >> 2] = .009999999776482582;
 i8 = i6 + 28 | 0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 HEAP16[i8 + 16 >> 1] = 0;
 __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i7, i6, HEAP32[i2 + 56 >> 2] | 0);
 __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i4, i6, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN15b2ContactSolver13StoreImpulsesEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 i2 = HEAP32[i4 + 48 >> 2] | 0;
 if ((i2 | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = HEAP32[i4 + 40 >> 2] | 0;
 i4 = HEAP32[i4 + 44 >> 2] | 0;
 i5 = 0;
 do {
  i6 = HEAP32[i4 + (HEAP32[i3 + (i5 * 152 | 0) + 148 >> 2] << 2) >> 2] | 0;
  i7 = HEAP32[i3 + (i5 * 152 | 0) + 144 >> 2] | 0;
  if ((i7 | 0) > 0) {
   i8 = 0;
   do {
    HEAPF32[i6 + (i8 * 20 | 0) + 72 >> 2] = +HEAPF32[i3 + (i5 * 152 | 0) + (i8 * 36 | 0) + 16 >> 2];
    HEAPF32[i6 + (i8 * 20 | 0) + 76 >> 2] = +HEAPF32[i3 + (i5 * 152 | 0) + (i8 * 36 | 0) + 20 >> 2];
    i8 = i8 + 1 | 0;
   } while ((i8 | 0) < (i7 | 0));
  }
  i5 = i5 + 1 | 0;
 } while ((i5 | 0) < (i2 | 0));
 STACKTOP = i1;
 return;
}
function __ZN16b2StackAllocator4FreeEPv(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i3 = STACKTOP;
 i2 = i1 + 102796 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((i4 | 0) <= 0) {
  ___assert_fail(3952, 3808, 63, 3976);
 }
 i6 = i4 + -1 | 0;
 if ((HEAP32[i1 + (i6 * 12 | 0) + 102412 >> 2] | 0) != (i5 | 0)) {
  ___assert_fail(3984, 3808, 65, 3976);
 }
 if ((HEAP8[i1 + (i6 * 12 | 0) + 102420 | 0] | 0) == 0) {
  i5 = i1 + (i6 * 12 | 0) + 102416 | 0;
  i6 = i1 + 102400 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) - (HEAP32[i5 >> 2] | 0);
 } else {
  __Z6b2FreePv(i5);
  i5 = i1 + (i6 * 12 | 0) + 102416 | 0;
  i4 = HEAP32[i2 >> 2] | 0;
 }
 i6 = i1 + 102404 | 0;
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) - (HEAP32[i5 >> 2] | 0);
 HEAP32[i2 >> 2] = i4 + -1;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi(i5, i4, i3, i2) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i6 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i4 + 8 >> 2] | 0) != (i5 | 0)) {
  STACKTOP = i1;
  return;
 }
 i5 = i4 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i3;
  HEAP32[i4 + 24 >> 2] = i2;
  HEAP32[i4 + 36 >> 2] = 1;
  STACKTOP = i1;
  return;
 }
 if ((i6 | 0) != (i3 | 0)) {
  i6 = i4 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP32[i4 + 24 >> 2] = 2;
  HEAP8[i4 + 54 | 0] = 1;
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 24 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 2) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i3 >> 2] = i2;
 STACKTOP = i1;
 return;
}
function __ZN12b2BroadPhase11CreateProxyERK6b2AABBPv(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i5 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i3 = __ZN13b2DynamicTree11CreateProxyERK6b2AABBPv(i2, i4, i3) | 0;
 i4 = i2 + 28 | 0;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 i4 = i2 + 40 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 i6 = i2 + 36 | 0;
 i2 = i2 + 32 | 0;
 if ((i5 | 0) == (HEAP32[i6 >> 2] | 0)) {
  i7 = HEAP32[i2 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 << 1;
  i5 = __Z7b2Alloci(i5 << 3) | 0;
  HEAP32[i2 >> 2] = i5;
  _memcpy(i5 | 0, i7 | 0, HEAP32[i4 >> 2] << 2 | 0) | 0;
  __Z6b2FreePv(i7);
  i5 = HEAP32[i4 >> 2] | 0;
 }
 HEAP32[(HEAP32[i2 >> 2] | 0) + (i5 << 2) >> 2] = i3;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i1;
 return i3 | 0;
}
function __ZN9b2ContactC2EP9b2FixtureiS1_i(i1, i4, i6, i3, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i2 = 0, i7 = 0, d8 = 0.0, d9 = 0.0;
 i2 = STACKTOP;
 HEAP32[i1 >> 2] = 4440;
 HEAP32[i1 + 4 >> 2] = 4;
 HEAP32[i1 + 48 >> 2] = i4;
 HEAP32[i1 + 52 >> 2] = i3;
 HEAP32[i1 + 56 >> 2] = i6;
 HEAP32[i1 + 60 >> 2] = i5;
 HEAP32[i1 + 124 >> 2] = 0;
 HEAP32[i1 + 128 >> 2] = 0;
 i5 = i4 + 16 | 0;
 i6 = i1 + 8 | 0;
 i7 = i6 + 40 | 0;
 do {
  HEAP32[i6 >> 2] = 0;
  i6 = i6 + 4 | 0;
 } while ((i6 | 0) < (i7 | 0));
 HEAPF32[i1 + 136 >> 2] = +Math_sqrt(+(+HEAPF32[i5 >> 2] * +HEAPF32[i3 + 16 >> 2]));
 d8 = +HEAPF32[i4 + 20 >> 2];
 d9 = +HEAPF32[i3 + 20 >> 2];
 HEAPF32[i1 + 140 >> 2] = d8 > d9 ? d8 : d9;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhase9MoveProxyEiRK6b2AABBRK6b2Vec2(i3, i1, i5, i4) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 if (!(__ZN13b2DynamicTree9MoveProxyEiRK6b2AABBRK6b2Vec2(i3, i1, i5, i4) | 0)) {
  STACKTOP = i2;
  return;
 }
 i4 = i3 + 40 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 i6 = i3 + 36 | 0;
 i3 = i3 + 32 | 0;
 if ((i5 | 0) == (HEAP32[i6 >> 2] | 0)) {
  i7 = HEAP32[i3 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 << 1;
  i5 = __Z7b2Alloci(i5 << 3) | 0;
  HEAP32[i3 >> 2] = i5;
  _memcpy(i5 | 0, i7 | 0, HEAP32[i4 >> 2] << 2 | 0) | 0;
  __Z6b2FreePv(i7);
  i5 = HEAP32[i4 >> 2] | 0;
 }
 HEAP32[(HEAP32[i3 >> 2] | 0) + (i5 << 2) >> 2] = i1;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i2;
 return;
}
function __ZN24b2ChainAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i6, 144) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i6, i1, i3, i4, i5);
 HEAP32[i6 >> 2] = 6032;
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 3) {
  ___assert_fail(6048, 6096, 43, 6152);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  STACKTOP = i2;
  return i6 | 0;
 } else {
  ___assert_fail(6184, 6096, 44, 6152);
 }
 return 0;
}
function __ZN23b2ChainAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i6, 144) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i6, i1, i3, i4, i5);
 HEAP32[i6 >> 2] = 5784;
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 3) {
  ___assert_fail(5800, 5848, 43, 5904);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return i6 | 0;
 } else {
  ___assert_fail(5928, 5848, 44, 5904);
 }
 return 0;
}
function __ZN25b2PolygonAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4984;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 2) {
  ___assert_fail(5e3, 5048, 41, 5104);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(5136, 5048, 42, 5104);
 }
 return 0;
}
function __ZN23b2EdgeAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4736;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 1) {
  ___assert_fail(4752, 4800, 41, 4856);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(4880, 4800, 42, 4856);
 }
 return 0;
}
function __ZN22b2EdgeAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4488;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 1) {
  ___assert_fail(4504, 4552, 41, 4608);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(4632, 4552, 42, 4608);
 }
 return 0;
}
function __ZN14b2PolygonShape8SetAsBoxEff(i1, d3, d2) {
 i1 = i1 | 0;
 d3 = +d3;
 d2 = +d2;
 var d4 = 0.0, d5 = 0.0;
 HEAP32[i1 + 148 >> 2] = 4;
 d4 = -d3;
 d5 = -d2;
 HEAPF32[i1 + 20 >> 2] = d4;
 HEAPF32[i1 + 24 >> 2] = d5;
 HEAPF32[i1 + 28 >> 2] = d3;
 HEAPF32[i1 + 32 >> 2] = d5;
 HEAPF32[i1 + 36 >> 2] = d3;
 HEAPF32[i1 + 40 >> 2] = d2;
 HEAPF32[i1 + 44 >> 2] = d4;
 HEAPF32[i1 + 48 >> 2] = d2;
 HEAPF32[i1 + 84 >> 2] = 0.0;
 HEAPF32[i1 + 88 >> 2] = -1.0;
 HEAPF32[i1 + 92 >> 2] = 1.0;
 HEAPF32[i1 + 96 >> 2] = 0.0;
 HEAPF32[i1 + 100 >> 2] = 0.0;
 HEAPF32[i1 + 104 >> 2] = 1.0;
 HEAPF32[i1 + 108 >> 2] = -1.0;
 HEAPF32[i1 + 112 >> 2] = 0.0;
 HEAPF32[i1 + 12 >> 2] = 0.0;
 HEAPF32[i1 + 16 >> 2] = 0.0;
 return;
}
function __ZN16b2PolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 5240;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 2) {
  ___assert_fail(5256, 5304, 44, 5352);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(5376, 5304, 45, 5352);
 }
 return 0;
}
function __ZN15b2CircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 6288;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 0) {
  ___assert_fail(6304, 6352, 44, 6400);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(6416, 6352, 45, 6400);
 }
 return 0;
}
function __ZN7b2World10CreateBodyEPK9b2BodyDef(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 + 102868 >> 2] & 2 | 0) != 0) {
  ___assert_fail(2160, 2184, 109, 2216);
 }
 i3 = __ZN16b2BlockAllocator8AllocateEi(i1, 152) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  __ZN6b2BodyC2EPK9b2BodyDefP7b2World(i3, i4, i1);
 }
 HEAP32[i3 + 92 >> 2] = 0;
 i4 = i1 + 102952 | 0;
 HEAP32[i3 + 96 >> 2] = HEAP32[i4 >> 2];
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) != 0) {
  HEAP32[i5 + 92 >> 2] = i3;
 }
 HEAP32[i4 >> 2] = i3;
 i5 = i1 + 102960 | 0;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
 STACKTOP = i2;
 return i3 | 0;
}
function __ZNK6b2Body13ShouldCollideEPKS_(i4, i2) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i4 >> 2] | 0) != 2 ? (HEAP32[i2 >> 2] | 0) != 2 : 0) {
  i2 = 0;
 } else {
  i3 = 3;
 }
 L3 : do {
  if ((i3 | 0) == 3) {
   i3 = HEAP32[i4 + 108 >> 2] | 0;
   if ((i3 | 0) == 0) {
    i2 = 1;
   } else {
    while (1) {
     if ((HEAP32[i3 >> 2] | 0) == (i2 | 0) ? (HEAP8[(HEAP32[i3 + 4 >> 2] | 0) + 61 | 0] | 0) == 0 : 0) {
      i2 = 0;
      break L3;
     }
     i3 = HEAP32[i3 + 12 >> 2] | 0;
     if ((i3 | 0) == 0) {
      i2 = 1;
      break;
     }
    }
   }
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function __ZNK14b2PolygonShape5CloneEP16b2BlockAllocator(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 152) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  HEAP32[i3 >> 2] = 504;
  HEAP32[i3 + 4 >> 2] = 2;
  HEAPF32[i3 + 8 >> 2] = .009999999776482582;
  HEAP32[i3 + 148 >> 2] = 0;
  HEAPF32[i3 + 12 >> 2] = 0.0;
  HEAPF32[i3 + 16 >> 2] = 0.0;
 }
 i6 = i1 + 4 | 0;
 i5 = HEAP32[i6 + 4 >> 2] | 0;
 i4 = i3 + 4 | 0;
 HEAP32[i4 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i4 + 4 >> 2] = i5;
 _memcpy(i3 + 12 | 0, i1 + 12 | 0, 140) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _memcpy(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0;
 i4 = i3 | 0;
 if ((i3 & 3) == (i2 & 3)) {
  while (i3 & 3) {
   if ((i1 | 0) == 0) return i4 | 0;
   HEAP8[i3] = HEAP8[i2] | 0;
   i3 = i3 + 1 | 0;
   i2 = i2 + 1 | 0;
   i1 = i1 - 1 | 0;
  }
  while ((i1 | 0) >= 4) {
   HEAP32[i3 >> 2] = HEAP32[i2 >> 2];
   i3 = i3 + 4 | 0;
   i2 = i2 + 4 | 0;
   i1 = i1 - 4 | 0;
  }
 }
 while ((i1 | 0) > 0) {
  HEAP8[i3] = HEAP8[i2] | 0;
  i3 = i3 + 1 | 0;
  i2 = i2 + 1 | 0;
  i1 = i1 - 1 | 0;
 }
 return i4 | 0;
}
function __ZN7b2World16SetAllowSleepingEb(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = i2 + 102976 | 0;
 if ((i4 & 1 | 0) == (HEAPU8[i3] | 0 | 0)) {
  STACKTOP = i1;
  return;
 }
 HEAP8[i3] = i4 & 1;
 if (i4) {
  STACKTOP = i1;
  return;
 }
 i2 = HEAP32[i2 + 102952 >> 2] | 0;
 if ((i2 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 do {
  i3 = i2 + 4 | 0;
  i4 = HEAPU16[i3 >> 1] | 0;
  if ((i4 & 2 | 0) == 0) {
   HEAP16[i3 >> 1] = i4 | 2;
   HEAPF32[i2 + 144 >> 2] = 0.0;
  }
  i2 = HEAP32[i2 + 96 >> 2] | 0;
 } while ((i2 | 0) != 0);
 STACKTOP = i1;
 return;
}
function __ZN16b2BlockAllocator4FreeEPvi(i3, i1, i4) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i4 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 if ((i4 | 0) <= 0) {
  ___assert_fail(1376, 1312, 164, 1488);
 }
 if ((i4 | 0) > 640) {
  __Z6b2FreePv(i1);
  STACKTOP = i2;
  return;
 }
 i4 = HEAP8[632 + i4 | 0] | 0;
 if (!((i4 & 255) < 14)) {
  ___assert_fail(1408, 1312, 173, 1488);
 }
 i4 = i3 + ((i4 & 255) << 2) + 12 | 0;
 HEAP32[i1 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i4 >> 2] = i1;
 STACKTOP = i2;
 return;
}
function __ZN15b2ContactFilter13ShouldCollideEP9b2FixtureS1_(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 i3 = STACKTOP;
 i4 = HEAP16[i2 + 36 >> 1] | 0;
 if (!(i4 << 16 >> 16 != (HEAP16[i1 + 36 >> 1] | 0) | i4 << 16 >> 16 == 0)) {
  i4 = i4 << 16 >> 16 > 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 if ((HEAP16[i1 + 32 >> 1] & HEAP16[i2 + 34 >> 1]) << 16 >> 16 == 0) {
  i4 = 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 i4 = (HEAP16[i1 + 34 >> 1] & HEAP16[i2 + 32 >> 1]) << 16 >> 16 != 0;
 STACKTOP = i3;
 return i4 | 0;
}
function _memset(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = i1 + i3 | 0;
 if ((i3 | 0) >= 20) {
  i4 = i4 & 255;
  i7 = i1 & 3;
  i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24;
  i5 = i2 & ~3;
  if (i7) {
   i7 = i1 + 4 - i7 | 0;
   while ((i1 | 0) < (i7 | 0)) {
    HEAP8[i1] = i4;
    i1 = i1 + 1 | 0;
   }
  }
  while ((i1 | 0) < (i5 | 0)) {
   HEAP32[i1 >> 2] = i6;
   i1 = i1 + 4 | 0;
  }
 }
 while ((i1 | 0) < (i2 | 0)) {
  HEAP8[i1] = i4;
  i1 = i1 + 1 | 0;
 }
 return i1 - i3 | 0;
}
function __ZN6b2Body13CreateFixtureEPK7b2Shapef(i1, i3, d2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 d2 = +d2;
 var i4 = 0, i5 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i5 = i4;
 HEAP16[i5 + 22 >> 1] = 1;
 HEAP16[i5 + 24 >> 1] = -1;
 HEAP16[i5 + 26 >> 1] = 0;
 HEAP32[i5 + 4 >> 2] = 0;
 HEAPF32[i5 + 8 >> 2] = .20000000298023224;
 HEAPF32[i5 + 12 >> 2] = 0.0;
 HEAP8[i5 + 20 | 0] = 0;
 HEAP32[i5 >> 2] = i3;
 HEAPF32[i5 + 16 >> 2] = d2;
 i3 = __ZN6b2Body13CreateFixtureEPK12b2FixtureDef(i1, i5) | 0;
 STACKTOP = i4;
 return i3 | 0;
}
function __Znwj(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i2 = (i2 | 0) == 0 ? 1 : i2;
 while (1) {
  i3 = _malloc(i2) | 0;
  if ((i3 | 0) != 0) {
   i2 = 6;
   break;
  }
  i3 = HEAP32[1914] | 0;
  HEAP32[1914] = i3 + 0;
  if ((i3 | 0) == 0) {
   i2 = 5;
   break;
  }
  FUNCTION_TABLE_v[i3 & 3]();
 }
 if ((i2 | 0) == 5) {
  i3 = ___cxa_allocate_exception(4) | 0;
  HEAP32[i3 >> 2] = 7672;
  ___cxa_throw(i3 | 0, 7720, 30);
 } else if ((i2 | 0) == 6) {
  STACKTOP = i1;
  return i3 | 0;
 }
 return 0;
}
function __ZN8b2IslandD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 20 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 24 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 16 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 12 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 8 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function __ZN16b2BlockAllocatorD2Ev(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0;
 i1 = STACKTOP;
 i3 = i2 + 4 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((HEAP32[i3 >> 2] | 0) > 0) {
  i5 = 0;
 } else {
  i5 = i4;
  __Z6b2FreePv(i5);
  STACKTOP = i1;
  return;
 }
 do {
  __Z6b2FreePv(HEAP32[i4 + (i5 << 3) + 4 >> 2] | 0);
  i5 = i5 + 1 | 0;
  i4 = HEAP32[i2 >> 2] | 0;
 } while ((i5 | 0) < (HEAP32[i3 >> 2] | 0));
 __Z6b2FreePv(i4);
 STACKTOP = i1;
 return;
}
function copyTempDouble(i1) {
 i1 = i1 | 0;
 HEAP8[tempDoublePtr] = HEAP8[i1];
 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
 HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0];
 HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0];
 HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0];
 HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0];
}
function __ZNK11b2EdgeShape11ComputeMassEP10b2MassDataf(i2, i1, d3) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 d3 = +d3;
 var i4 = 0, d5 = 0.0;
 i4 = STACKTOP;
 HEAPF32[i1 >> 2] = 0.0;
 d5 = +((+HEAPF32[i2 + 12 >> 2] + +HEAPF32[i2 + 20 >> 2]) * .5);
 d3 = +((+HEAPF32[i2 + 16 >> 2] + +HEAPF32[i2 + 24 >> 2]) * .5);
 i2 = i1 + 4 | 0;
 HEAPF32[i2 >> 2] = d5;
 HEAPF32[i2 + 4 >> 2] = d3;
 HEAPF32[i1 + 12 >> 2] = 0.0;
 STACKTOP = i4;
 return;
}
function __ZN11b2EdgeShape3SetERK6b2Vec2S2_(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0;
 i5 = i3;
 i3 = HEAP32[i5 + 4 >> 2] | 0;
 i4 = i1 + 12 | 0;
 HEAP32[i4 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i4 + 4 >> 2] = i3;
 i4 = i2;
 i2 = HEAP32[i4 + 4 >> 2] | 0;
 i3 = i1 + 20 | 0;
 HEAP32[i3 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i3 + 4 >> 2] = i2;
 HEAP8[i1 + 44 | 0] = 0;
 HEAP8[i1 + 45 | 0] = 0;
 return;
}
function __ZN25b2PolygonAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z25b2CollidePolygonAndCircleP10b2ManifoldPK14b2PolygonShapeRK11b2TransformPK13b2CircleShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN22b2EdgeAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i5, i4, i3, i2, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i6 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 256 | 0;
 __ZN12b2EPCollider7CollideEP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS7_(i6, i5, i4, i3, i2, i1);
 STACKTOP = i6;
 return;
}
function __ZN16b2PolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z17b2CollidePolygonsP10b2ManifoldPK14b2PolygonShapeRK11b2TransformS3_S6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN15b2CircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z16b2CollideCirclesP10b2ManifoldPK13b2CircleShapeRK11b2TransformS3_S6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __Z14b2PairLessThanRK6b2PairS1_(i2, i5) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i2 >> 2] | 0;
 i3 = HEAP32[i5 >> 2] | 0;
 if ((i4 | 0) >= (i3 | 0)) {
  if ((i4 | 0) == (i3 | 0)) {
   i2 = (HEAP32[i2 + 4 >> 2] | 0) < (HEAP32[i5 + 4 >> 2] | 0);
  } else {
   i2 = 0;
  }
 } else {
  i2 = 1;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function __ZN9b2FixtureC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 HEAP16[i1 + 32 >> 1] = 1;
 HEAP16[i1 + 34 >> 1] = -1;
 HEAP16[i1 + 36 >> 1] = 0;
 HEAP32[i1 + 40 >> 2] = 0;
 HEAP32[i1 + 24 >> 2] = 0;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 0 >> 2] = 0;
 HEAP32[i1 + 4 >> 2] = 0;
 HEAP32[i1 + 8 >> 2] = 0;
 HEAP32[i1 + 12 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhaseC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN13b2DynamicTreeC2Ev(i1);
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 48 >> 2] = 16;
 HEAP32[i1 + 52 >> 2] = 0;
 HEAP32[i1 + 44 >> 2] = __Z7b2Alloci(192) | 0;
 HEAP32[i1 + 36 >> 2] = 16;
 HEAP32[i1 + 40 >> 2] = 0;
 HEAP32[i1 + 32 >> 2] = __Z7b2Alloci(64) | 0;
 STACKTOP = i2;
 return;
}
function __ZN16b2StackAllocatorD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 + 102400 >> 2] | 0) != 0) {
  ___assert_fail(3792, 3808, 32, 3848);
 }
 if ((HEAP32[i1 + 102796 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(3872, 3808, 33, 3848);
 }
}
function __ZN15b2ContactSolverD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = i1 + 32 | 0;
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i3 >> 2] | 0, HEAP32[i1 + 40 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i3 >> 2] | 0, HEAP32[i1 + 36 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function __ZN25b2PolygonAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN24b2ChainAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN23b2EdgeAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN23b2ChainAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN22b2EdgeAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN16b2ContactManagerC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN12b2BroadPhaseC2Ev(i1);
 HEAP32[i1 + 60 >> 2] = 0;
 HEAP32[i1 + 64 >> 2] = 0;
 HEAP32[i1 + 68 >> 2] = 1888;
 HEAP32[i1 + 72 >> 2] = 1896;
 HEAP32[i1 + 76 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN16b2PolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN15b2CircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function dynCall_viiiiii(i7, i6, i5, i4, i3, i2, i1) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiiiii[i7 & 3](i6 | 0, i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function copyTempFloat(i1) {
 i1 = i1 | 0;
 HEAP8[tempDoublePtr] = HEAP8[i1];
 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
}
function dynCall_iiiiii(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiiiii[i6 & 15](i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0) | 0;
}
function dynCall_viiiii(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiiii[i6 & 3](i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function __ZN16b2ContactManager15FindNewContactsEv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN12b2BroadPhase11UpdatePairsI16b2ContactManagerEEvPT_(i1, i1);
 STACKTOP = i2;
 return;
}
function __ZN16b2StackAllocatorC2Ev(i1) {
 i1 = i1 | 0;
 HEAP32[i1 + 102400 >> 2] = 0;
 HEAP32[i1 + 102404 >> 2] = 0;
 HEAP32[i1 + 102408 >> 2] = 0;
 HEAP32[i1 + 102796 >> 2] = 0;
 return;
}
function dynCall_viiii(i5, i4, i3, i2, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiii[i5 & 15](i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function dynCall_iiii(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiii[i4 & 7](i3 | 0, i2 | 0, i1 | 0) | 0;
}
function dynCall_viii(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viii[i4 & 3](i3 | 0, i2 | 0, i1 | 0);
}
function __ZNSt9bad_allocD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZNSt9exceptionD2Ev(i1 | 0);
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function stackAlloc(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + i1 | 0;
 STACKTOP = STACKTOP + 7 & -8;
 return i2 | 0;
}
function __ZN13b2DynamicTreeD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __Z6b2FreePv(HEAP32[i1 + 4 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function dynCall_viid(i4, i3, i2, d1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 d1 = +d1;
 FUNCTION_TABLE_viid[i4 & 3](i3 | 0, i2 | 0, +d1);
}
function __ZN17b2ContactListener9PostSolveEP9b2ContactPK16b2ContactImpulse(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return;
}
function __ZN10__cxxabiv120__si_class_type_infoD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN10__cxxabiv117__class_type_infoD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZNSt9bad_allocD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZNSt9exceptionD2Ev(i1 | 0);
 STACKTOP = i2;
 return;
}
function dynCall_iii(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iii[i3 & 3](i2 | 0, i1 | 0) | 0;
}
function b8(i1, i2, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 abort(8);
}
function __ZN25b2PolygonAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN17b2ContactListener8PreSolveEP9b2ContactPK10b2Manifold(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return;
}
function __ZN24b2ChainAndPolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN23b2EdgeAndPolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN23b2ChainAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZNK11b2EdgeShape9TestPointERK11b2TransformRK6b2Vec2(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return 0;
}
function __ZN22b2EdgeAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZdlPv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i1 | 0) != 0) {
  _free(i1);
 }
 STACKTOP = i2;
 return;
}
function b10(i1, i2, i3, i4, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 abort(10);
 return 0;
}
function _strlen(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = i1;
 while (HEAP8[i2] | 0) {
  i2 = i2 + 1 | 0;
 }
 return i2 - i1 | 0;
}
function __Z7b2Alloci(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _malloc(i1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function setThrew(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 if ((__THREW__ | 0) == 0) {
  __THREW__ = i1;
  threwValue = i2;
 }
}
function __ZN17b2ContactListenerD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN16b2PolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function dynCall_vii(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_vii[i3 & 15](i2 | 0, i1 | 0);
}
function __ZN15b2ContactFilterD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN15b2CircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN14b2PolygonShapeD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __Znaj(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = __Znwj(i1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function __ZN11b2EdgeShapeD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN9b2ContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function b1(i1, i2, i3, i4, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 abort(1);
}
function __Z6b2FreePv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _free(i1);
 STACKTOP = i2;
 return;
}
function ___clang_call_terminate(i1) {
 i1 = i1 | 0;
 ___cxa_begin_catch(i1 | 0) | 0;
 __ZSt9terminatev();
}
function __ZN17b2ContactListener12BeginContactEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 return;
}
function dynCall_ii(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_ii[i2 & 3](i1 | 0) | 0;
}
function __ZN17b2ContactListener10EndContactEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 return;
}
function b11(i1, i2, i3, i4) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 abort(11);
}
function dynCall_vi(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_vi[i2 & 31](i1 | 0);
}
function b0(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 abort(0);
 return 0;
}
function __ZNK10__cxxabiv116__shim_type_info5noop2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZNK10__cxxabiv116__shim_type_info5noop1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b5(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 abort(5);
}
function __ZNK14b2PolygonShape13GetChildCountEv(i1) {
 i1 = i1 | 0;
 return 1;
}
function __ZN10__cxxabiv116__shim_type_infoD2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b7(i1, i2, d3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 d3 = +d3;
 abort(7);
}
function __ZNK11b2EdgeShape13GetChildCountEv(i1) {
 i1 = i1 | 0;
 return 1;
}
function __ZNK7b2Timer15GetMillisecondsEv(i1) {
 i1 = i1 | 0;
 return 0.0;
}
function __ZN25b2PolygonAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN24b2ChainAndPolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b9(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(9);
 return 0;
}
function __ZN23b2EdgeAndPolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN23b2ChainAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN22b2EdgeAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function dynCall_v(i1) {
 i1 = i1 | 0;
 FUNCTION_TABLE_v[i1 & 3]();
}
function __ZNKSt9bad_alloc4whatEv(i1) {
 i1 = i1 | 0;
 return 7688;
}
function ___cxa_pure_virtual__wrapper() {
 ___cxa_pure_virtual();
}
function __ZN17b2ContactListenerD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN16b2PolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN15b2ContactFilterD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN15b2CircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN14b2PolygonShapeD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b3(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(3);
}
function runPostSets() {
 HEAP32[1932] = __ZTISt9exception;
}
function __ZN11b2EdgeShapeD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZNSt9type_infoD2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN7b2Timer5ResetEv(i1) {
 i1 = i1 | 0;
 return;
}
function stackRestore(i1) {
 i1 = i1 | 0;
 STACKTOP = i1;
}
function setTempRet9(i1) {
 i1 = i1 | 0;
 tempRet9 = i1;
}
function setTempRet8(i1) {
 i1 = i1 | 0;
 tempRet8 = i1;
}
function setTempRet7(i1) {
 i1 = i1 | 0;
 tempRet7 = i1;
}
function setTempRet6(i1) {
 i1 = i1 | 0;
 tempRet6 = i1;
}
function setTempRet5(i1) {
 i1 = i1 | 0;
 tempRet5 = i1;
}
function setTempRet4(i1) {
 i1 = i1 | 0;
 tempRet4 = i1;
}
function setTempRet3(i1) {
 i1 = i1 | 0;
 tempRet3 = i1;
}
function setTempRet2(i1) {
 i1 = i1 | 0;
 tempRet2 = i1;
}
function setTempRet1(i1) {
 i1 = i1 | 0;
 tempRet1 = i1;
}
function setTempRet0(i1) {
 i1 = i1 | 0;
 tempRet0 = i1;
}
function __ZN9b2ContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN7b2TimerC2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b4(i1) {
 i1 = i1 | 0;
 abort(4);
 return 0;
}
function stackSave() {
 return STACKTOP | 0;
}
function b2(i1) {
 i1 = i1 | 0;
 abort(2);
}
function b6() {
 abort(6);
}

// EMSCRIPTEN_END_FUNCS
  var FUNCTION_TABLE_iiii = [b0,__ZNK11b2EdgeShape9TestPointERK11b2TransformRK6b2Vec2,__ZNK14b2PolygonShape9TestPointERK11b2TransformRK6b2Vec2,__ZN15b2ContactFilter13ShouldCollideEP9b2FixtureS1_,__ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv,b0,b0,b0];
  var FUNCTION_TABLE_viiiii = [b1,__ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,__ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,b1];
  var FUNCTION_TABLE_vi = [b2,__ZN11b2EdgeShapeD1Ev,__ZN11b2EdgeShapeD0Ev,__ZN14b2PolygonShapeD1Ev,__ZN14b2PolygonShapeD0Ev,__ZN17b2ContactListenerD1Ev,__ZN17b2ContactListenerD0Ev,__ZN15b2ContactFilterD1Ev,__ZN15b2ContactFilterD0Ev,__ZN9b2ContactD1Ev,__ZN9b2ContactD0Ev,__ZN22b2EdgeAndCircleContactD1Ev,__ZN22b2EdgeAndCircleContactD0Ev,__ZN23b2EdgeAndPolygonContactD1Ev,__ZN23b2EdgeAndPolygonContactD0Ev,__ZN25b2PolygonAndCircleContactD1Ev,__ZN25b2PolygonAndCircleContactD0Ev,__ZN16b2PolygonContactD1Ev,__ZN16b2PolygonContactD0Ev,__ZN23b2ChainAndCircleContactD1Ev,__ZN23b2ChainAndCircleContactD0Ev,__ZN24b2ChainAndPolygonContactD1Ev,__ZN24b2ChainAndPolygonContactD0Ev,__ZN15b2CircleContactD1Ev,__ZN15b2CircleContactD0Ev,__ZN10__cxxabiv116__shim_type_infoD2Ev,__ZN10__cxxabiv117__class_type_infoD0Ev,__ZNK10__cxxabiv116__shim_type_info5noop1Ev,__ZNK10__cxxabiv116__shim_type_info5noop2Ev
  ,__ZN10__cxxabiv120__si_class_type_infoD0Ev,__ZNSt9bad_allocD2Ev,__ZNSt9bad_allocD0Ev];
  var FUNCTION_TABLE_vii = [b3,__ZN17b2ContactListener12BeginContactEP9b2Contact,__ZN17b2ContactListener10EndContactEP9b2Contact,__ZN15b2CircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN25b2PolygonAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN16b2PolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN22b2EdgeAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN23b2EdgeAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN23b2ChainAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN24b2ChainAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,b3,b3,b3,b3,b3,b3];
  var FUNCTION_TABLE_ii = [b4,__ZNK11b2EdgeShape13GetChildCountEv,__ZNK14b2PolygonShape13GetChildCountEv,__ZNKSt9bad_alloc4whatEv];
  var FUNCTION_TABLE_viii = [b5,__ZN17b2ContactListener8PreSolveEP9b2ContactPK10b2Manifold,__ZN17b2ContactListener9PostSolveEP9b2ContactPK16b2ContactImpulse,b5];
  var FUNCTION_TABLE_v = [b6,___cxa_pure_virtual__wrapper,__Z4iterv,b6];
  var FUNCTION_TABLE_viid = [b7,__ZNK11b2EdgeShape11ComputeMassEP10b2MassDataf,__ZNK14b2PolygonShape11ComputeMassEP10b2MassDataf,b7];
  var FUNCTION_TABLE_viiiiii = [b8,__ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,__ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,b8];
  var FUNCTION_TABLE_iii = [b9,__ZNK11b2EdgeShape5CloneEP16b2BlockAllocator,__ZNK14b2PolygonShape5CloneEP16b2BlockAllocator,__Z14b2PairLessThanRK6b2PairS1_];
  var FUNCTION_TABLE_iiiiii = [b10,__ZNK11b2EdgeShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi,__ZNK14b2PolygonShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi,__ZN15b2CircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN25b2PolygonAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN16b2PolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN22b2EdgeAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN23b2EdgeAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN23b2ChainAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN24b2ChainAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,b10,b10,b10,b10,b10,b10];
  var FUNCTION_TABLE_viiii = [b11,__ZNK11b2EdgeShape11ComputeAABBEP6b2AABBRK11b2Transformi,__ZNK14b2PolygonShape11ComputeAABBEP6b2AABBRK11b2Transformi,__ZN22b2EdgeAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN25b2PolygonAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN16b2PolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN23b2ChainAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN24b2ChainAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN15b2CircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,__ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,b11,b11,b11,b11];

  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, dynCall_iiii: dynCall_iiii, dynCall_viiiii: dynCall_viiiii, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_ii: dynCall_ii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_viid: dynCall_viid, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_iiiiii: dynCall_iiiiii, dynCall_viiii: dynCall_viiii };
}).toString(),
// EMSCRIPTEN_END_ASM
{ "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "min": Math_min, "invoke_iiii": invoke_iiii, "invoke_viiiii": invoke_viiiii, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_viid": invoke_viid, "invoke_viiiiii": invoke_viiiiii, "invoke_iii": invoke_iii, "invoke_iiiiii": invoke_iiiiii, "invoke_viiii": invoke_viiii, "___cxa_throw": ___cxa_throw, "_emscripten_run_script": _emscripten_run_script, "_cosf": _cosf, "_send": _send, "__ZSt9terminatev": __ZSt9terminatev, "__reallyNegative": __reallyNegative, "___cxa_is_number_type": ___cxa_is_number_type, "___assert_fail": ___assert_fail, "___cxa_allocate_exception": ___cxa_allocate_exception, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_fflush": _fflush, "_pwrite": _pwrite, "___setErrNo": ___setErrNo, "_sbrk": _sbrk, "___cxa_begin_catch": ___cxa_begin_catch, "_sinf": _sinf, "_fileno": _fileno, "___resumeException": ___resumeException, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_sysconf": _sysconf, "_clock": _clock, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_puts": _puts, "_mkport": _mkport, "_floorf": _floorf, "_sqrtf": _sqrtf, "_write": _write, "_emscripten_set_main_loop": _emscripten_set_main_loop, "___errno_location": ___errno_location, "__ZNSt9exceptionD2Ev": __ZNSt9exceptionD2Ev, "_printf": _printf, "___cxa_does_inherit": ___cxa_does_inherit, "__exit": __exit, "_fputc": _fputc, "_abort": _abort, "_fwrite": _fwrite, "_time": _time, "_fprintf": _fprintf, "_emscripten_cancel_main_loop": _emscripten_cancel_main_loop, "__formatString": __formatString, "_fputs": _fputs, "_exit": _exit, "___cxa_pure_virtual": ___cxa_pure_virtual, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "__ZTISt9exception": __ZTISt9exception }, buffer);
var _strlen = Module["_strlen"] = asm["_strlen"];
var _free = Module["_free"] = asm["_free"];
var _main = Module["_main"] = asm["_main"];
var _memset = Module["_memset"] = asm["_memset"];
var _malloc = Module["_malloc"] = asm["_malloc"];
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
var runPostSets = Module["runPostSets"] = asm["runPostSets"];
var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"];
var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
var dynCall_viid = Module["dynCall_viid"] = asm["dynCall_viid"];
var dynCall_viiiiii = Module["dynCall_viiiiii"] = asm["dynCall_viiiiii"];
var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
var dynCall_iiiiii = Module["dynCall_iiiiii"] = asm["dynCall_iiiiii"];
var dynCall_viiii = Module["dynCall_viiii"] = asm["dynCall_viiii"];

Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
Runtime.stackSave = function() { return asm['stackSave']() };
Runtime.stackRestore = function(top) { asm['stackRestore'](top) };


// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included
var i64Math = null;

// === Auto-generated postamble setup entry stuff ===

if (memoryInitializer) {
  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
    var data = Module['readBinary'](memoryInitializer);
    HEAPU8.set(data, STATIC_BASE);
  } else {
    addRunDependency('memory initializer');
    Browser.asyncLoad(memoryInitializer, function(data) {
      HEAPU8.set(data, STATIC_BASE);
      removeRunDependency('memory initializer');
    }, function(data) {
      throw 'could not load memory initializer ' + memoryInitializer;
    });
  }
}

function ExitStatus(status) {
  this.name = "ExitStatus";
  this.message = "Program terminated with exit(" + status + ")";
  this.status = status;
};
ExitStatus.prototype = new Error();
ExitStatus.prototype.constructor = ExitStatus;

var initialStackTop;
var preloadStartTime = null;
var calledMain = false;

dependenciesFulfilled = function runCaller() {
  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
  if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"]));
  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
}

Module['callMain'] = Module.callMain = function callMain(args) {
  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');

  args = args || [];

  ensureInitRuntime();

  var argc = args.length+1;
  function pad() {
    for (var i = 0; i < 4-1; i++) {
      argv.push(0);
    }
  }
  var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ];
  pad();
  for (var i = 0; i < argc-1; i = i + 1) {
    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));
    pad();
  }
  argv.push(0);
  argv = allocate(argv, 'i32', ALLOC_NORMAL);

  initialStackTop = STACKTOP;

  try {

    var ret = Module['_main'](argc, argv, 0);


    // if we're not running an evented main loop, it's time to exit
    if (!Module['noExitRuntime']) {
      exit(ret);
    }
  }
  catch(e) {
    if (e instanceof ExitStatus) {
      // exit() throws this once it's done to make sure execution
      // has been stopped completely
      return;
    } else if (e == 'SimulateInfiniteLoop') {
      // running an evented main loop, don't immediately exit
      Module['noExitRuntime'] = true;
      return;
    } else {
      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
      throw e;
    }
  } finally {
    calledMain = true;
  }
}




function run(args) {
  args = args || Module['arguments'];

  if (preloadStartTime === null) preloadStartTime = Date.now();

  if (runDependencies > 0) {
    Module.printErr('run() called, but dependencies remain, so not running');
    return;
  }

  preRun();

  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame

  function doRun() {
    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
    Module['calledRun'] = true;

    ensureInitRuntime();

    preMain();

    if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {
      Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms');
    }

    if (Module['_main'] && shouldRunNow) {
      Module['callMain'](args);
    }

    postRun();
  }

  if (Module['setStatus']) {
    Module['setStatus']('Running...');
    setTimeout(function() {
      setTimeout(function() {
        Module['setStatus']('');
      }, 1);
      if (!ABORT) doRun();
    }, 1);
  } else {
    doRun();
  }
}
Module['run'] = Module.run = run;

function exit(status) {
  ABORT = true;
  EXITSTATUS = status;
  STACKTOP = initialStackTop;

  // exit the runtime
  exitRuntime();

  // TODO We should handle this differently based on environment.
  // In the browser, the best we can do is throw an exception
  // to halt execution, but in node we could process.exit and
  // I'd imagine SM shell would have something equivalent.
  // This would let us set a proper exit status (which
  // would be great for checking test exit statuses).
  // https://github.com/kripken/emscripten/issues/1371

  // throw an exception to halt the current execution
  throw new ExitStatus(status);
}
Module['exit'] = Module.exit = exit;

function abort(text) {
  if (text) {
    Module.print(text);
    Module.printErr(text);
  }

  ABORT = true;
  EXITSTATUS = 1;

  var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';

  throw 'abort() at ' + stackTrace() + extra;
}
Module['abort'] = Module.abort = abort;

// {{PRE_RUN_ADDITIONS}}

if (Module['preInit']) {
  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
  while (Module['preInit'].length > 0) {
    Module['preInit'].pop()();
  }
}

// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;
if (Module['noInitialRun']) {
  shouldRunNow = false;
}


run([].concat(Module["arguments"]));
