var EXPECTED_OUTPUT =
  'stretch tree of depth 10\t check: -1\n' +
  '1448\t trees of depth 4\t check: -1448\n' +
  '362\t trees of depth 6\t check: -362\n' +
  '90\t trees of depth 8\t check: -90\n' +
  'long lived tree of depth 9\t check: -1\n';
var Module = {
  arguments: [1],
  print: function(x) {Module.printBuffer += x + '\n';},
  preRun: [function() {Module.printBuffer = ''}],
  postRun: [function() {
    assertEquals(EXPECTED_OUTPUT, Module.printBuffer);
  }],
};

var Module;
if (typeof Module === 'undefined') Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');
if (!Module.expectedDataFileDownloads) {
  Module.expectedDataFileDownloads = 0;
  Module.finishedDataFileDownloads = 0;
}
Module.expectedDataFileDownloads++;
(function() {

  function runWithFS() {

function assert(check, msg) {
  if (!check) throw msg + new Error().stack;
}
Module['FS_createDataFile']('/', 'binarytrees.lua', [45, 45, 32, 84, 104, 101, 32, 67, 111, 109, 112, 117, 116, 101, 114, 32, 76, 97, 110, 103, 117, 97, 103, 101, 32, 66, 101, 110, 99, 104, 109, 97, 114, 107, 115, 32, 71, 97, 109, 101, 10, 45, 45, 32, 104, 116, 116, 112, 58, 47, 47, 98, 101, 110, 99, 104, 109, 97, 114, 107, 115, 103, 97, 109, 101, 46, 97, 108, 105, 111, 116, 104, 46, 100, 101, 98, 105, 97, 110, 46, 111, 114, 103, 47, 10, 45, 45, 32, 99, 111, 110, 116, 114, 105, 98, 117, 116, 101, 100, 32, 98, 121, 32, 77, 105, 107, 101, 32, 80, 97, 108, 108, 10, 10, 108, 111, 99, 97, 108, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 105, 116, 101, 109, 44, 32, 100, 101, 112, 116, 104, 41, 10, 32, 32, 105, 102, 32, 100, 101, 112, 116, 104, 32, 62, 32, 48, 32, 116, 104, 101, 110, 10, 32, 32, 32, 32, 108, 111, 99, 97, 108, 32, 105, 32, 61, 32, 105, 116, 101, 109, 32, 43, 32, 105, 116, 101, 109, 10, 32, 32, 32, 32, 100, 101, 112, 116, 104, 32, 61, 32, 100, 101, 112, 116, 104, 32, 45, 32, 49, 10, 32, 32, 32, 32, 108, 111, 99, 97, 108, 32, 108, 101, 102, 116, 44, 32, 114, 105, 103, 104, 116, 32, 61, 32, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 105, 45, 49, 44, 32, 100, 101, 112, 116, 104, 41, 44, 32, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 105, 44, 32, 100, 101, 112, 116, 104, 41, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 123, 32, 105, 116, 101, 109, 44, 32, 108, 101, 102, 116, 44, 32, 114, 105, 103, 104, 116, 32, 125, 10, 32, 32, 101, 108, 115, 101, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 123, 32, 105, 116, 101, 109, 32, 125, 10, 32, 32, 101, 110, 100, 10, 101, 110, 100, 10, 10, 108, 111, 99, 97, 108, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 116, 114, 101, 101, 41, 10, 32, 32, 105, 102, 32, 116, 114, 101, 101, 91, 50, 93, 32, 116, 104, 101, 110, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 116, 114, 101, 101, 91, 49, 93, 32, 43, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 116, 114, 101, 101, 91, 50, 93, 41, 32, 45, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 116, 114, 101, 101, 91, 51, 93, 41, 10, 32, 32, 101, 108, 115, 101, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 116, 114, 101, 101, 91, 49, 93, 10, 32, 32, 101, 110, 100, 10, 101, 110, 100, 10, 10, 108, 111, 99, 97, 108, 32, 78, 32, 61, 32, 116, 111, 110, 117, 109, 98, 101, 114, 40, 97, 114, 103, 32, 97, 110, 100, 32, 97, 114, 103, 91, 49, 93, 41, 32, 111, 114, 32, 52, 10, 10, 105, 102, 32, 78, 32, 61, 61, 32, 48, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 48, 10, 101, 108, 115, 101, 105, 102, 32, 78, 32, 61, 61, 32, 49, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 57, 46, 53, 10, 101, 108, 115, 101, 105, 102, 32, 78, 32, 61, 61, 32, 50, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 49, 49, 46, 57, 57, 10, 101, 108, 115, 101, 105, 102, 32, 78, 32, 61, 61, 32, 51, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 49, 50, 46, 56, 53, 10, 101, 108, 115, 101, 105, 102, 32, 78, 32, 61, 61, 32, 52, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 49, 52, 46, 55, 50, 10, 101, 108, 115, 101, 105, 102, 32, 78, 32, 61, 61, 32, 53, 32, 116, 104, 101, 110, 10, 32, 32, 78, 32, 61, 32, 49, 53, 46, 56, 50, 10, 101, 110, 100, 10, 10, 108, 111, 99, 97, 108, 32, 109, 105, 110, 100, 101, 112, 116, 104, 32, 61, 32, 52, 10, 108, 111, 99, 97, 108, 32, 109, 97, 120, 100, 101, 112, 116, 104, 32, 61, 32, 109, 105, 110, 100, 101, 112, 116, 104, 32, 43, 32, 50, 10, 105, 102, 32, 109, 97, 120, 100, 101, 112, 116, 104, 32, 60, 32, 78, 32, 116, 104, 101, 110, 32, 109, 97, 120, 100, 101, 112, 116, 104, 32, 61, 32, 78, 32, 101, 110, 100, 10, 10, 100, 111, 10, 32, 32, 108, 111, 99, 97, 108, 32, 115, 116, 114, 101, 116, 99, 104, 100, 101, 112, 116, 104, 32, 61, 32, 109, 97, 120, 100, 101, 112, 116, 104, 32, 43, 32, 49, 10, 32, 32, 108, 111, 99, 97, 108, 32, 115, 116, 114, 101, 116, 99, 104, 116, 114, 101, 101, 32, 61, 32, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 48, 44, 32, 115, 116, 114, 101, 116, 99, 104, 100, 101, 112, 116, 104, 41, 10, 32, 32, 105, 111, 46, 119, 114, 105, 116, 101, 40, 115, 116, 114, 105, 110, 103, 46, 102, 111, 114, 109, 97, 116, 40, 34, 115, 116, 114, 101, 116, 99, 104, 32, 116, 114, 101, 101, 32, 111, 102, 32, 100, 101, 112, 116, 104, 32, 37, 100, 92, 116, 32, 99, 104, 101, 99, 107, 58, 32, 37, 100, 92, 110, 34, 44, 10, 32, 32, 32, 32, 115, 116, 114, 101, 116, 99, 104, 100, 101, 112, 116, 104, 44, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 115, 116, 114, 101, 116, 99, 104, 116, 114, 101, 101, 41, 41, 41, 10, 101, 110, 100, 10, 10, 108, 111, 99, 97, 108, 32, 108, 111, 110, 103, 108, 105, 118, 101, 100, 116, 114, 101, 101, 32, 61, 32, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 48, 44, 32, 109, 97, 120, 100, 101, 112, 116, 104, 41, 10, 10, 102, 111, 114, 32, 100, 101, 112, 116, 104, 61, 109, 105, 110, 100, 101, 112, 116, 104, 44, 109, 97, 120, 100, 101, 112, 116, 104, 44, 50, 32, 100, 111, 10, 32, 32, 108, 111, 99, 97, 108, 32, 105, 116, 101, 114, 97, 116, 105, 111, 110, 115, 32, 61, 32, 50, 32, 94, 32, 40, 109, 97, 120, 100, 101, 112, 116, 104, 32, 45, 32, 100, 101, 112, 116, 104, 32, 43, 32, 109, 105, 110, 100, 101, 112, 116, 104, 41, 10, 32, 32, 108, 111, 99, 97, 108, 32, 99, 104, 101, 99, 107, 32, 61, 32, 48, 10, 32, 32, 102, 111, 114, 32, 105, 61, 49, 44, 105, 116, 101, 114, 97, 116, 105, 111, 110, 115, 32, 100, 111, 10, 32, 32, 32, 32, 99, 104, 101, 99, 107, 32, 61, 32, 99, 104, 101, 99, 107, 32, 43, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 49, 44, 32, 100, 101, 112, 116, 104, 41, 41, 32, 43, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 66, 111, 116, 116, 111, 109, 85, 112, 84, 114, 101, 101, 40, 45, 49, 44, 32, 100, 101, 112, 116, 104, 41, 41, 10, 32, 32, 101, 110, 100, 10, 32, 32, 105, 111, 46, 119, 114, 105, 116, 101, 40, 115, 116, 114, 105, 110, 103, 46, 102, 111, 114, 109, 97, 116, 40, 34, 37, 100, 92, 116, 32, 116, 114, 101, 101, 115, 32, 111, 102, 32, 100, 101, 112, 116, 104, 32, 37, 100, 92, 116, 32, 99, 104, 101, 99, 107, 58, 32, 37, 100, 92, 110, 34, 44, 10, 32, 32, 32, 32, 105, 116, 101, 114, 97, 116, 105, 111, 110, 115, 42, 50, 44, 32, 100, 101, 112, 116, 104, 44, 32, 99, 104, 101, 99, 107, 41, 41, 10, 101, 110, 100, 10, 10, 105, 111, 46, 119, 114, 105, 116, 101, 40, 115, 116, 114, 105, 110, 103, 46, 102, 111, 114, 109, 97, 116, 40, 34, 108, 111, 110, 103, 32, 108, 105, 118, 101, 100, 32, 116, 114, 101, 101, 32, 111, 102, 32, 100, 101, 112, 116, 104, 32, 37, 100, 92, 116, 32, 99, 104, 101, 99, 107, 58, 32, 37, 100, 92, 110, 34, 44, 10, 32, 32, 109, 97, 120, 100, 101, 112, 116, 104, 44, 32, 73, 116, 101, 109, 67, 104, 101, 99, 107, 40, 108, 111, 110, 103, 108, 105, 118, 101, 100, 116, 114, 101, 101, 41, 41, 41, 10], true, true);

  }
  if (Module['calledRun']) {
    runWithFS();
  } else {
    if (!Module['preRun']) Module['preRun'] = [];
    Module["preRun"].push(runWithFS); // FS is not initialized yet, wait for it
  }

})();

// 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 ===





STATIC_BASE = 8;

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


/* memory initializer */ allocate([99,97,110,110,111,116,32,99,114,101,97,116,101,32,115,116,97,116,101,58,32,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,0,0,40,101,114,114,111,114,32,111,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,115,116,114,105,110,103,41,0,0,88,0,0,0,0,0,0,0,108,117,97,0,0,0,0,0,76,85,65,95,78,79,69,78,86,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,114,101,115,117,108,116,115,32,116,111,32,112,114,105,110,116,0,0,0,0,0,0,0,112,114,105,110,116,0,0,0,101,114,114,111,114,32,99,97,108,108,105,110,103,32,39,112,114,105,110,116,39,32,40,37,115,41,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,110,116,101,114,114,117,112,116,101,100,33,0,0,0,0,95,95,116,111,115,116,114,105,110,103,0,0,0,0,0,0,40,110,111,32,101,114,114,111,114,32,109,101,115,115,97,103,101,41,0,0,0,0,0,0,61,115,116,100,105,110,0,0,60,101,111,102,62,0,0,0,114,101,116,117,114,110,32,37,115,0,0,0,0,0,0,0,95,80,82,79,77,80,84,0,95,80,82,79,77,80,84,50,0,0,0,0,0,0,0,0,62,32,0,0,0,0,0,0,62,62,32,0,0,0,0,0,97,114,103,0,0,0,0,0,45,0,0,0,0,0,0,0,45,45,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,32,116,111,32,115,99,114,105,112,116,0,0,0,0,61,40,99,111,109,109,97,110,100,32,108,105,110,101,41,0,114,101,113,117,105,114,101,0,61,76,85,65,95,73,78,73,84,95,53,95,50,0,0,0,61,76,85,65,95,73,78,73,84,0,0,0,0,0,0,0,76,117,97,32,53,46,50,46,50,32,32,67,111,112,121,114,105,103,104,116,32,40,67,41,32,49,57,57,52,45,50,48,49,51,32,76,117,97,46,111,114,103,44,32,80,85,67,45,82,105,111,0,0,0,0,0,37,115,58,32,0,0,0,0,39,37,115,39,32,110,101,101,100,115,32,97,114,103,117,109,101,110,116,10,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,32,39,37,115,39,10,0,0,0,0,0,0,0,117,115,97,103,101,58,32,37,115,32,91,111,112,116,105,111,110,115,93,32,91,115,99,114,105,112,116,32,91,97,114,103,115,93,93,10,65,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,32,97,114,101,58,10,32,32,45,101,32,115,116,97,116,32,32,101,120,101,99,117,116,101,32,115,116,114,105,110,103,32,39,115,116,97,116,39,10,32,32,45,105,32,32,32,32,32,32,32,101,110,116,101,114,32,105,110,116,101,114,97,99,116,105,118,101,32,109,111,100,101,32,97,102,116,101,114,32,101,120,101,99,117,116,105,110,103,32,39,115,99,114,105,112,116,39,10,32,32,45,108,32,110,97,109,101,32,32,114,101,113,117,105,114,101,32,108,105,98,114,97,114,121,32,39,110,97,109,101,39,10,32,32,45,118,32,32,32,32,32,32,32,115,104,111,119,32,118,101,114,115,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,45,69,32,32,32,32,32,32,32,105,103,110,111,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,115,10,32,32,45,45,32,32,32,32,32,32,32,115,116,111,112,32,104,97,110,100,108,105,110,103,32,111,112,116,105,111,110,115,10,32,32,45,32,32,32,32,32,32,32,32,115,116,111,112,32,104,97,110,100,108,105,110,103,32,111,112,116,105,111,110,115,32,97,110,100,32,101,120,101,99,117,116,101,32,115,116,100,105,110,10,0,0,0,0,0,0,0,37,115,10,0,0,0,0,0,0,0,0,0,0,96,127,64,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,10,0,0,0,0,0,115,116,97,99,107,32,116,114,97,99,101,98,97,99,107,58,0,0,0,0,0,0,0,0,10,9,46,46,46,0,0,0,83,108,110,116,0,0,0,0,10,9,37,115,58,0,0,0,37,100,58,0,0,0,0,0,32,105,110,32,0,0,0,0,10,9,40,46,46,46,116,97,105,108,32,99,97,108,108,115,46,46,46,41,0,0,0,0,98,97,100,32,97,114,103,117,109,101,110,116,32,35,37,100,32,40,37,115,41,0,0,0,110,0,0,0,0,0,0,0,109,101,116,104,111,100,0,0,99,97,108,108,105,110,103,32,39,37,115,39,32,111,110,32,98,97,100,32,115,101,108,102,32,40,37,115,41,0,0,0,63,0,0,0,0,0,0,0,98,97,100,32,97,114,103,117,109,101,110,116,32,35,37,100,32,116,111,32,39,37,115,39,32,40,37,115,41,0,0,0,83,108,0,0,0,0,0,0,37,115,58,37,100,58,32,0,0,0,0,0,0,0,0,0,37,115,58,32,37,115,0,0,101,120,105,116,0,0,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,39,37,115,39,0,0,0,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,32,40,37,115,41,0,0,0,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,118,97,108,117,101,32,101,120,112,101,99,116,101,100,0,0,98,117,102,102,101,114,32,116,111,111,32,108,97,114,103,101,0,0,0,0,0,0,0,0,61,115,116,100,105,110,0,0,64,37,115,0,0,0,0,0,114,0,0,0,0,0,0,0,111,112,101,110,0,0,0,0,114,98,0,0,0,0,0,0,114,101,111,112,101,110,0,0,114,101,97,100,0,0,0,0,111,98,106,101,99,116,32,108,101,110,103,116,104,32,105,115,32,110,111,116,32,97,32,110,117,109,98,101,114,0,0,0,95,95,116,111,115,116,114,105,110,103,0,0,0,0,0,0,116,114,117,101,0,0,0,0,102,97,108,115,101,0,0,0,110,105,108,0,0,0,0,0,37,115,58,32,37,112,0,0,95,76,79,65,68,69,68,0,110,97,109,101,32,99,111,110,102,108,105,99,116,32,102,111,114,32,109,111,100,117,108,101,32,39,37,115,39,0,0,0,116,111,111,32,109,97,110,121,32,117,112,118,97,108,117,101,115,0,0,0,0,0,0,0,109,117,108,116,105,112,108,101,32,76,117,97,32,86,77,115,32,100,101,116,101,99,116,101,100,0,0,0,0,0,0,0,118,101,114,115,105,111,110,32,109,105,115,109,97,116,99,104,58,32,97,112,112,46,32,110,101,101,100,115,32,37,102,44,32,76,117,97,32,99,111,114,101,32,112,114,111,118,105,100,101,115,32,37,102,0,0,0,98,97,100,32,99,111,110,118,101,114,115,105,111,110,32,110,117,109,98,101,114,45,62,105,110,116,59,32,109,117,115,116,32,114,101,99,111,109,112,105,108,101,32,76,117,97,32,119,105,116,104,32,112,114,111,112,101,114,32,115,101,116,116,105,110,103,115,0,0,0,0,0,80,65,78,73,67,58,32,117,110,112,114,111,116,101,99,116,101,100,32,101,114,114,111,114,32,105,110,32,99,97,108,108,32,116,111,32,76,117,97,32,65,80,73,32,40,37,115,41,10,0,0,0,0,0,0,0,239,187,191,0,0,0,0,0,99,97,110,110,111,116,32,37,115,32,37,115,58,32,37,115,0,0,0,0,0,0,0,0,37,115,32,101,120,112,101,99,116,101,100,44,32,103,111,116,32,37,115,0,0,0,0,0,102,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,39,37,115,39,0,0,0,109,97,105,110,32,99,104,117,110,107,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,60,37,115,58,37,100,62,0,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,37,115,32,37,115,32,39,37,115,39,32,40,97,32,37,115,32,118,97,108,117,101,41,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,37,115,32,97,32,37,115,32,118,97,108,117,101,0,0,0,0,0,0,0,0,99,111,110,99,97,116,101,110,97,116,101,0,0,0,0,0,112,101,114,102,111,114,109,32,97,114,105,116,104,109,101,116,105,99,32,111,110,0,0,0,97,116,116,101,109,112,116,32,116,111,32,99,111,109,112,97,114,101,32,116,119,111,32,37,115,32,118,97,108,117,101,115,0,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,99,111,109,112,97,114,101,32,37,115,32,119,105,116,104,32,37,115,0,0,0,37,115,58,37,100,58,32,37,115,0,0,0,0,0,0,0,108,111,99,97,108,0,0,0,95,69,78,86,0,0,0,0,103,108,111,98,97,108,0,0,102,105,101,108,100,0,0,0,117,112,118,97,108,117,101,0,99,111,110,115,116,97,110,116,0,0,0,0,0,0,0,0,109,101,116,104,111,100,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,111,114,32,105,116,101,114,97,116,111,114,0,0,0,0,109,101,116,97,109,101,116,104,111,100,0,0,0,0,0,0,61,91,67,93,0,0,0,0,67,0,0,0,0,0,0,0,61,63,0,0,0,0,0,0,109,97,105,110,0,0,0,0,76,117,97,0,0,0,0,0,40,42,116,101,109,112,111,114,97,114,121,41,0,0,0,0,40,42,118,97,114,97,114,103,41,0,0,0,0,0,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,67,32,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,121,105,101,108,100,32,97,99,114,111,115,115,32,97,32,67,45,99,97,108,108,32,98,111,117,110,100,97,114,121,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,121,105,101,108,100,32,102,114,111,109,32,111,117,116,115,105,100,101,32,97,32,99,111,114,111,117,116,105,110,101,0,0,0,0,0,0,0,98,105,110,97,114,121,0,0,116,101,120,116,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,108,111,97,100,32,97,32,37,115,32,99,104,117,110,107,32,40,109,111,100,101,32,105,115,32,39,37,115,39,41,0,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,0,99,97,110,110,111,116,32,114,101,115,117,109,101,32,110,111,110,45,115,117,115,112,101,110,100,101,100,32,99,111,114,111,117,116,105,110,101,0,0,0,99,97,110,110,111,116,32,114,101,115,117,109,101,32,100,101,97,100,32,99,111,114,111,117,116,105,110,101,0,0,0,0,99,97,108,108,0,0,0,0,110,111,32,109,101,115,115,97,103,101,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,95,95,103,99,32,109,101,116,97,109,101,116,104,111,100,32,40,37,115,41,0,0,0,95,80,82,69,76,79,65,68,0,0,0,0,0,0,0,0,95,71,0,0,0,0,0,0,112,97,99,107,97,103,101,0,99,111,114,111,117,116,105,110,101,0,0,0,0,0,0,0,116,97,98,108,101,0,0,0,105,111,0,0,0,0,0,0,111,115,0,0,0,0,0,0,115,116,114,105,110,103,0,0,98,105,116,51,50,0,0,0,109,97,116,104,0,0,0,0,100,101,98,117,103,0,0,0,144,11,0,0,1,0,0,0,152,11,0,0,2,0,0,0,48,13,0,0,3,0,0,0,160,11,0,0,4,0,0,0,56,13,0,0,5,0,0,0,64,13,0,0,6,0,0,0,72,13,0,0,7,0,0,0,168,11,0,0,8,0,0,0,80,13,0,0,9,0,0,0,88,13,0,0,10,0,0,0,192,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,95,73,79,95,105,110,112,117,116,0,0,0,0,0,0,0,115,116,100,105,110,0,0,0,95,73,79,95,111,117,116,112,117,116,0,0,0,0,0,0,115,116,100,111,117,116,0,0,115,116,100,101,114,114,0,0,70,73,76,69,42,0,0,0,99,97,110,110,111,116,32,99,108,111,115,101,32,115,116,97,110,100,97,114,100,32,102,105,108,101,0,0,0,0,0,0,95,95,105,110,100,101,120,0,144,11,0,0,1,0,0,0,152,11,0,0,12,0,0,0,160,11,0,0,13,0,0,0,168,11,0,0,14,0,0,0,176,11,0,0,15,0,0,0,184,11,0,0,16,0,0,0,192,11,0,0,17,0,0,0,200,11,0,0,18,0,0,0,208,11,0,0,19,0,0,0,0,0,0,0,0,0,0,0,99,108,111,115,101,0,0,0,102,108,117,115,104,0,0,0,108,105,110,101,115,0,0,0,114,101,97,100,0,0,0,0,115,101,101,107,0,0,0,0,115,101,116,118,98,117,102,0,119,114,105,116,101,0,0,0,95,95,103,99,0,0,0,0,95,95,116,111,115,116,114,105,110,103,0,0,0,0,0,0,102,105,108,101,32,40,99,108,111,115,101,100,41,0,0,0,102,105,108,101,32,40,37,112,41,0,0,0,0,0,0,0,37,46,49,52,103,0,0,0,97,116,116,101,109,112,116,32,116,111,32,117,115,101,32,97,32,99,108,111,115,101,100,32,102,105,108,101,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,72,12,0,0,80,12,0,0,88,12,0,0,0,0,0,0,110,111,0,0,0,0,0,0,102,117,108,108,0,0,0,0,108,105,110,101,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,128,12,0,0,136,12,0,0,144,12,0,0,0,0,0,0,115,101,116,0,0,0,0,0,99,117,114,0,0,0,0,0,101,110,100,0,0,0,0,0,110,111,116,32,97,110,32,105,110,116,101,103,101,114,32,105,110,32,112,114,111,112,101,114,32,114,97,110,103,101,0,0,116,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,0,0,105,110,118,97,108,105,100,32,102,111,114,109,97,116,0,0,37,108,102,0,0,0,0,0,116,111,111,32,109,97,110,121,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,0,102,105,108,101,32,105,115,32,97,108,114,101,97,100,121,32,99,108,111,115,101,100,0,0,37,115,0,0,0,0,0,0,105,110,112,117,116,0,0,0,111,112,101,110,0,0,0,0,111,117,116,112,117,116,0,0,112,111,112,101,110,0,0,0,116,109,112,102,105,108,101,0,116,121,112,101,0,0,0,0,115,116,97,110,100,97,114,100,32,37,115,32,102,105,108,101,32,105,115,32,99,108,111,115,101,100,0,0,0,0,0,0,99,108,111,115,101,100,32,102,105,108,101,0,0,0,0,0,102,105,108,101,0,0,0,0,114,0,0,0,0,0,0,0,39,112,111,112,101,110,39,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,0,119,0,0,0,0,0,0,0,99,97,110,110,111,116,32,111,112,101,110,32,102,105,108,101,32,39,37,115,39,32,40,37,115,41,0,0,0,0,0,0,114,119,97,0,0,0,0,0,105,110,118,97,108,105,100,32,109,111,100,101,0,0,0,0,240,14,0,0,20,0,0,0,248,14,0,0,21,0,0,0,0,15,0,0,22,0,0,0,8,15,0,0,23,0,0,0,16,15,0,0,24,0,0,0,24,15,0,0,25,0,0,0,32,15,0,0,26,0,0,0,40,15,0,0,27,0,0,0,48,15,0,0,28,0,0,0,56,15,0,0,29,0,0,0,64,15,0,0,30,0,0,0,72,15,0,0,31,0,0,0,80,15,0,0,32,0,0,0,88,15,0,0,33,0,0,0,96,15,0,0,34,0,0,0,104,15,0,0,35,0,0,0,112,15,0,0,36,0,0,0,120,15,0,0,37,0,0,0,128,15,0,0,38,0,0,0,136,15,0,0,39,0,0,0,144,15,0,0,40,0,0,0,152,15,0,0,41,0,0,0,160,15,0,0,42,0,0,0,176,15,0,0,43,0,0,0,184,15,0,0,44,0,0,0,192,15,0,0,45,0,0,0,200,15,0,0,46,0,0,0,208,15,0,0,47,0,0,0,0,0,0,0,0,0,0,0,112,105,0,0,0,0,0,0,104,117,103,101,0,0,0,0,97,98,115,0,0,0,0,0,97,99,111,115,0,0,0,0,97,115,105,110,0,0,0,0,97,116,97,110,50,0,0,0,97,116,97,110,0,0,0,0,99,101,105,108,0,0,0,0,99,111,115,104,0,0,0,0,99,111,115,0,0,0,0,0,100,101,103,0,0,0,0,0,101,120,112,0,0,0,0,0,102,108,111,111,114,0,0,0,102,109,111,100,0,0,0,0,102,114,101,120,112,0,0,0,108,100,101,120,112,0,0,0,108,111,103,49,48,0,0,0,108,111,103,0,0,0,0,0,109,97,120,0,0,0,0,0,109,105,110,0,0,0,0,0,109,111,100,102,0,0,0,0,112,111,119,0,0,0,0,0,114,97,100,0,0,0,0,0,114,97,110,100,111,109,0,0,114,97,110,100,111,109,115,101,101,100,0,0,0,0,0,0,115,105,110,104,0,0,0,0,115,105,110,0,0,0,0,0,115,113,114,116,0,0,0,0,116,97,110,104,0,0,0,0,116,97,110,0,0,0,0,0,105,110,116,101,114,118,97,108,32,105,115,32,101,109,112,116,121,0,0,0,0,0,0,0,119,114,111,110,103,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,37,115,32,40,108,105,109,105,116,32,105,115,32,37,100,41,0,0,0,0,0,0,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,101,114,114,111,114,58,32,98,108,111,99,107,32,116,111,111,32,98,105,103,0,0,95,67,76,73,66,83,0,0,95,95,103,99,0,0,0,0,16,20,0,0,48,0,0,0,24,20,0,0,49,0,0,0,40,20,0,0,50,0,0,0,0,0,0,0,0,0,0,0,108,111,97,100,101,114,115,0,115,101,97,114,99,104,101,114,115,0,0,0,0,0,0,0,112,97,116,104,0,0,0,0,76,85,65,95,80,65,84,72,95,53,95,50,0,0,0,0,76,85,65,95,80,65,84,72,0,0,0,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,108,117,97,47,53,46,50,47,63,46,108,117,97,59,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,108,117,97,47,53,46,50,47,63,47,105,110,105,116,46,108,117,97,59,47,117,115,114,47,108,111,99,97,108,47,108,105,98,47,108,117,97,47,53,46,50,47,63,46,108,117,97,59,47,117,115,114,47,108,111,99,97,108,47,108,105,98,47,108,117,97,47,53,46,50,47,63,47,105,110,105,116,46,108,117,97,59,46,47,63,46,108,117,97,0,0,0,0,0,0,0,99,112,97,116,104,0,0,0,76,85,65,95,67,80,65,84,72,95,53,95,50,0,0,0,76,85,65,95,67,80,65,84,72,0,0,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,108,105,98,47,108,117,97,47,53,46,50,47,63,46,115,111,59,47,117,115,114,47,108,111,99,97,108,47,108,105,98,47,108,117,97,47,53,46,50,47,108,111,97,100,97,108,108,46,115,111,59,46,47,63,46,115,111,0,0,0,0,47,10,59,10,63,10,33,10,45,10,0,0,0,0,0,0,99,111,110,102,105,103,0,0,95,76,79,65,68,69,68,0,108,111,97,100,101,100,0,0,95,80,82,69,76,79,65,68,0,0,0,0,0,0,0,0,112,114,101,108,111,97,100,0,32,18,0,0,51,0,0,0,40,18,0,0,52,0,0,0,0,0,0,0,0,0,0,0,109,111,100,117,108,101,0,0,114,101,113,117,105,114,101,0,39,112,97,99,107,97,103,101,46,115,101,97,114,99,104,101,114,115,39,32,109,117,115,116,32,98,101,32,97,32,116,97,98,108,101,0,0,0,0,0,109,111,100,117,108,101,32,39,37,115,39,32,110,111,116,32,102,111,117,110,100,58,37,115,0,0,0,0,0,0,0,0,95,78,65,77,69,0,0,0,102,0,0,0,0,0,0,0,39,109,111,100,117,108,101,39,32,110,111,116,32,99,97,108,108,101,100,32,102,114,111,109,32,97,32,76,117,97,32,102,117,110,99,116,105,111,110,0,95,77,0,0,0,0,0,0,95,80,65,67,75,65,71,69,0,0,0,0,0,0,0,0,59,59,0,0,0,0,0,0,59,1,59,0,0,0,0,0,1,0,0,0,0,0,0,0,76,85,65,95,78,79,69,78,86,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,10,9,110,111,32,109,111,100,117,108,101,32,39,37,115,39,32,105,110,32,102,105,108,101,32,39,37,115,39,0,0,0,101,114,114,111,114,32,108,111,97,100,105,110,103,32,109,111,100,117,108,101,32,39,37,115,39,32,102,114,111,109,32,102,105,108,101,32,39,37,115,39,58,10,9,37,115,0,0,0,46,0,0,0,0,0,0,0,95,0,0,0,0,0,0,0,108,117,97,111,112,101,110,95,37,115,0,0,0,0,0,0,100,121,110,97,109,105,99,32,108,105,98,114,97,114,105,101,115,32,110,111,116,32,101,110,97,98,108,101,100,59,32,99,104,101,99,107,32,121,111,117,114,32,76,117,97,32,105,110,115,116,97,108,108,97,116,105,111,110,0,0,0,0,0,0,39,112,97,99,107,97,103,101,46,37,115,39,32,109,117,115,116,32,98,101,32,97,32,115,116,114,105,110,103,0,0,0,63,0,0,0,0,0,0,0,10,9,110,111,32,102,105,108,101,32,39,37,115,39,0,0,114,0,0,0,0,0,0,0,10,9,110,111,32,102,105,101,108,100,32,112,97,99,107,97,103,101,46,112,114,101,108,111,97,100,91,39,37,115,39,93,0,0,0,0,0,0,0,0,108,111,97,100,108,105,98,0,115,101,97,114,99,104,112,97,116,104,0,0,0,0,0,0,115,101,101,97,108,108,0,0,95,95,105,110,100,101,120,0,97,98,115,101,110,116,0,0,105,110,105,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,110,78,0,0,0,0,0,0,120,88,0,0,0,0,0,0,40,110,117,108,108,41,0,0,37,112,0,0,0,0,0,0,37,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,39,37,37,37,99,39,32,116,111,32,39,108,117,97,95,112,117,115,104,102,115,116,114,105,110,103,39,0,0,0,0,0,0,46,46,46,0,0,0,0,0,91,115,116,114,105,110,103,32,34,0,0,0,0,0,0,0,34,93,0,0,0,0,0,0,96,113,65,84,80,80,92,108,60,16,60,84,108,124,124,124,124,124,124,96,96,96,104,34,188,188,188,132,228,84,84,16,98,98,4,98,20,81,80,23,88,22,0,0,53,0,0,0,96,22,0,0,54,0,0,0,104,22,0,0,55,0,0,0,120,22,0,0,56,0,0,0,128,22,0,0,57,0,0,0,136,22,0,0,58,0,0,0,144,22,0,0,59,0,0,0,152,22,0,0,60,0,0,0,160,22,0,0,61,0,0,0,176,22,0,0,62,0,0,0,184,22,0,0,63,0,0,0,0,0,0,0,0,0,0,0,99,108,111,99,107,0,0,0,100,97,116,101,0,0,0,0,100,105,102,102,116,105,109,101,0,0,0,0,0,0,0,0,101,120,101,99,117,116,101,0,101,120,105,116,0,0,0,0,103,101,116,101,110,118,0,0,114,101,109,111,118,101,0,0,114,101,110,97,109,101,0,0,115,101,116,108,111,99,97,108,101,0,0,0,0,0,0,0,116,105,109,101,0,0,0,0,116,109,112,110,97,109,101,0,117,110,97,98,108,101,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,117,110,105,113,117,101,32,102,105,108,101,110,97,109,101,0,0,0,0,115,101,99,0,0,0,0,0,109,105,110,0,0,0,0,0,104,111,117,114,0,0,0,0,100,97,121,0,0,0,0,0,109,111,110,116,104,0,0,0,121,101,97,114,0,0,0,0,105,115,100,115,116,0,0,0,102,105,101,108,100,32,39,37,115,39,32,109,105,115,115,105,110,103,32,105,110,32,100,97,116,101,32,116,97,98,108,101,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,128,23,0,0,136,23,0,0,144,23,0,0,152,23,0,0,168,23,0,0,176,22,0,0,0,0,0,0,0,0,0,0,97,108,108,0,0,0,0,0,99,111,108,108,97,116,101,0,99,116,121,112,101,0,0,0,109,111,110,101,116,97,114,121,0,0,0,0,0,0,0,0,110,117,109,101,114,105,99,0,37,99,0,0,0,0,0,0,42,116,0,0,0,0,0,0,119,100,97,121,0,0,0,0,121,100,97,121,0,0,0,0,97,65,98,66,99,100,72,73,106,109,77,112,83,85,119,87,120,88,121,89,122,37,0,0,105,110,118,97,108,105,100,32,99,111,110,118,101,114,115,105,111,110,32,115,112,101,99,105,102,105,101,114,32,39,37,37,37,115,39,0,0,0,0,0,60,37,115,62,32,97,116,32,108,105,110,101,32,37,100,32,110,111,116,32,105,110,115,105,100,101,32,97,32,108,111,111,112,0,0,0,0,0,0,0,110,111,32,118,105,115,105,98,108,101,32,108,97,98,101,108,32,39,37,115,39,32,102,111,114,32,60,103,111,116,111,62,32,97,116,32,108,105,110,101,32,37,100,0,0,0,0,0,60,103,111,116,111,32,37,115,62,32,97,116,32,108,105,110,101,32,37,100,32,106,117,109,112,115,32,105,110,116,111,32,116,104,101,32,115,99,111,112,101,32,111,102,32,108,111,99,97,108,32,39,37,115,39,0,98,114,101,97,107,0,0,0,108,97,98,101,108,115,47,103,111,116,111,115,0,0,0,0,37,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,67,32,108,101,118,101,108,115,0,0,0,0,0,0,0,0,6,6,6,6,7,7,7,7,7,7,10,9,5,4,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,0,0,99,97,110,110,111,116,32,117,115,101,32,39,46,46,46,39,32,111,117,116,115,105,100,101,32,97,32,118,97,114,97,114,103,32,102,117,110,99,116,105,111,110,0,0,0,0,0,0,115,101,108,102,0,0,0,0,60,110,97,109,101,62,32,111,114,32,39,46,46,46,39,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,108,111,99,97,108,32,118,97,114,105,97,98,108,101,115,0,102,117,110,99,116,105,111,110,115,0,0,0,0,0,0,0,105,116,101,109,115,32,105,110,32,97,32,99,111,110,115,116,114,117,99,116,111,114,0,0,109,97,105,110,32,102,117,110,99,116,105,111,110,0,0,0,102,117,110,99,116,105,111,110,32,97,116,32,108,105,110,101,32,37,100,0,0,0,0,0,116,111,111,32,109,97,110,121,32,37,115,32,40,108,105,109,105,116,32,105,115,32,37,100,41,32,105,110,32,37,115,0,102,117,110,99,116,105,111,110,32,97,114,103,117,109,101,110,116,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,117,110,101,120,112,101,99,116,101,100,32,115,121,109,98,111,108,0,0,0,0,0,0,0,108,97,98,101,108,32,39,37,115,39,32,97,108,114,101,97,100,121,32,100,101,102,105,110,101,100,32,111,110,32,108,105,110,101,32,37,100,0,0,0,39,61,39,32,111,114,32,39,105,110,39,32,101,120,112,101,99,116,101,100,0,0,0,0,40,102,111,114,32,103,101,110,101,114,97,116,111,114,41,0,40,102,111,114,32,115,116,97,116,101,41,0,0,0,0,0,40,102,111,114,32,99,111,110,116,114,111,108,41,0,0,0,40,102,111,114,32,105,110,100,101,120,41,0,0,0,0,0,40,102,111,114,32,108,105,109,105,116,41,0,0,0,0,0,40,102,111,114,32,115,116,101,112,41,0,0,0,0,0,0,37,115,32,101,120,112,101,99,116,101,100,32,40,116,111,32,99,108,111,115,101,32,37,115,32,97,116,32,108,105,110,101,32,37,100,41,0,0,0,0,117,112,118,97,108,117,101,115,0,0,0,0,0,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,0,0,0,0,0,0,0,144,27,0,0,64,0,0,0,152,27,0,0,65,0,0,0,160,27,0,0,66,0,0,0,168,27,0,0,67,0,0,0,176,27,0,0,68,0,0,0,184,27,0,0,69,0,0,0,192,27,0,0,70,0,0,0,200,27,0,0,71,0,0,0,208,27,0,0,72,0,0,0,216,27,0,0,73,0,0,0,224,27,0,0,74,0,0,0,232,27,0,0,75,0,0,0,240,27,0,0,76,0,0,0,248,27,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,95,105,110,100,101,120,0,98,121,116,101,0,0,0,0,99,104,97,114,0,0,0,0,100,117,109,112,0,0,0,0,102,105,110,100,0,0,0,0,102,111,114,109,97,116,0,0,103,109,97,116,99,104,0,0,103,115,117,98,0,0,0,0,108,101,110,0,0,0,0,0,108,111,119,101,114,0,0,0,109,97,116,99,104,0,0,0,114,101,112,0,0,0,0,0,114,101,118,101,114,115,101,0,115,117,98,0,0,0,0,0,117,112,112,101,114,0,0,0,114,101,115,117,108,116,105,110,103,32,115,116,114,105,110,103,32,116,111,111,32,108,97,114,103,101,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,99,97,112,116,117,114,101,115,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,97,112,116,117,114,101,32,105,110,100,101,120,0,0,0,117,110,102,105,110,105,115,104,101,100,32,99,97,112,116,117,114,101,0,0,0,0,0,0,112,97,116,116,101,114,110,32,116,111,111,32,99,111,109,112,108,101,120,0,0,0,0,0,109,105,115,115,105,110,103,32,39,91,39,32,97,102,116,101,114,32,39,37,37,102,39,32,105,110,32,112,97,116,116,101,114,110,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,97,112,116,117,114,101,32,105,110,100,101,120,32,37,37,37,100,0,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,112,97,116,116,101,114,110,32,40,101,110,100,115,32,119,105,116,104,32,39,37,37,39,41,0,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,112,97,116,116,101,114,110,32,40,109,105,115,115,105,110,103,32,39,93,39,41,0,109,97,108,102,111,114,109,101,100,32,112,97,116,116,101,114,110,32,40,109,105,115,115,105,110,103,32,97,114,103,117,109,101,110,116,115,32,116,111,32,39,37,37,98,39,41,0,0,105,110,118,97,108,105,100,32,112,97,116,116,101,114,110,32,99,97,112,116,117,114,101,0,94,36,42,43,63,46,40,91,37,45,0,0,0,0,0,0,115,116,114,105,110,103,47,102,117,110,99,116,105,111,110,47,116,97,98,108,101,32,101,120,112,101,99,116,101,100,0,0,105,110,118,97,108,105,100,32,114,101,112,108,97,99,101,109,101,110,116,32,118,97,108,117,101,32,40,97,32,37,115,41,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,117,115,101,32,111,102,32,39,37,99,39,32,105,110,32,114,101,112,108,97,99,101,109,101,110,116,32,115,116,114,105,110,103,0,0,0,0,0,0,0,110,111,32,118,97,108,117,101,0,0,0,0,0,0,0,0,110,111,116,32,97,32,110,117,109,98,101,114,32,105,110,32,112,114,111,112,101,114,32,114,97,110,103,101,0,0,0,0,110,111,116,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,105,110,32,112,114,111,112,101,114,32,114,97,110,103,101,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,39,37,37,37,99,39,32,116,111,32,39,102,111,114,109,97,116,39,0,0,0,0,0,0,0,92,37,100,0,0,0,0,0,92,37,48,51,100,0,0,0,45,43,32,35,48,0,0,0,105,110,118,97,108,105,100,32,102,111,114,109,97,116,32,40,114,101,112,101,97,116,101,100,32,102,108,97,103,115,41,0,105,110,118,97,108,105,100,32,102,111,114,109,97,116,32,40,119,105,100,116,104,32,111,114,32,112,114,101,99,105,115,105,111,110,32,116,111,111,32,108,111,110,103,41,0,0,0,0,117,110,97,98,108,101,32,116,111,32,100,117,109,112,32,103,105,118,101,110,32,102,117,110,99,116,105,111,110,0,0,0,118,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,115,116,114,105,110,103,32,115,108,105,99,101,32,116,111,111,32,108,111,110,103,0,0,0,116,97,98,108,101,32,105,110,100,101,120,32,105,115,32,110,105,108,0,0,0,0,0,0,116,97,98,108,101,32,105,110,100,101,120,32,105,115,32,78,97,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,98,108,101,32,111,118,101,114,102,108,111,119,0,0,105,110,118,97,108,105,100,32,107,101,121,32,116,111,32,39,110,101,120,116,39,0,0,0,224,31,0,0,78,0,0,0,232,31,0,0,79,0,0,0,240,31,0,0,80,0,0,0,248,31,0,0,81,0,0,0,216,31,0,0,82,0,0,0,0,32,0,0,83,0,0,0,8,32,0,0,84,0,0,0,0,0,0,0,0,0,0,0,117,110,112,97,99,107,0,0,99,111,110,99,97,116,0,0,109,97,120,110,0,0,0,0,105,110,115,101,114,116,0,0,112,97,99,107,0,0,0,0,114,101,109,111,118,101,0,0,115,111,114,116,0,0,0,0,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,114,100,101,114,32,102,117,110,99,116,105,111,110,32,102,111,114,32,115,111,114,116,105,110,103,0,0,0,0,0,0,112,111,115,105,116,105,111,110,32,111,117,116,32,111,102,32,98,111,117,110,100,115,0,0,116,111,111,32,109,97,110,121,32,114,101,115,117,108,116,115,32,116,111,32,117,110,112,97,99,107,0,0,0,0,0,0,110,0,0,0,0,0,0,0,119,114,111,110,103,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,116,111,32,39,105,110,115,101,114,116,39,0,0,0,105,110,118,97,108,105,100,32,118,97,108,117,101,32,40,37,115,41,32,97,116,32,105,110,100,101,120,32,37,100,32,105,110,32,116,97,98,108,101,32,102,111,114,32,39,99,111,110,99,97,116,39,0,0,0,0,110,111,32,118,97,108,117,101,0,0,0,0,0,0,0,0,110,105,108,0,0,0,0,0,98,111,111,108,101,97,110,0,117,115,101,114,100,97,116,97,0,0,0,0,0,0,0,0,110,117,109,98,101,114,0,0,115,116,114,105,110,103,0,0,116,97,98,108,101,0,0,0,102,117,110,99,116,105,111,110,0,0,0,0,0,0,0,0,116,104,114,101,97,100,0,0,112,114,111,116,111,0,0,0,117,112,118,97,108,0,0,0,224,32,0,0,240,32,0,0,248,32,0,0,0,33,0,0,16,33,0,0,24,33,0,0,32,33,0,0,40,33,0,0,0,33,0,0,56,33,0,0,64,33,0,0,72,33,0,0,200,33,0,0,208,33,0,0,224,33,0,0,232,33,0,0,240,33,0,0,248,33,0,0,0,34,0,0,8,34,0,0,16,34,0,0,24,34,0,0,32,34,0,0,40,34,0,0,48,34,0,0,56,34,0,0,64,34,0,0,72,34,0,0,88,34,0,0,0,0,0,0,95,95,105,110,100,101,120,0,95,95,110,101,119,105,110,100,101,120,0,0,0,0,0,0,95,95,103,99,0,0,0,0,95,95,109,111,100,101,0,0,95,95,108,101,110,0,0,0,95,95,101,113,0,0,0,0,95,95,97,100,100,0,0,0,95,95,115,117,98,0,0,0,95,95,109,117,108,0,0,0,95,95,100,105,118,0,0,0,95,95,109,111,100,0,0,0,95,95,112,111,119,0,0,0,95,95,117,110,109,0,0,0,95,95,108,116,0,0,0,0,95,95,108,101,0,0,0,0,95,95,99,111,110,99,97,116,0,0,0,0,0,0,0,0,95,95,99,97,108,108,0,0,98,105,110,97,114,121,32,115,116,114,105,110,103,0,0,0,25,147,13,10,26,10,0,0,116,114,117,110,99,97,116,101,100,0,0,0,0,0,0,0,37,115,58,32,37,115,32,112,114,101,99,111,109,112,105,108,101,100,32,99,104,117,110,107,0,0,0,0,0,0,0,0,99,111,114,114,117,112,116,101,100,0,0,0,0,0,0,0,110,111,116,32,97,0,0,0,118,101,114,115,105,111,110,32,109,105,115,109,97,116,99,104,32,105,110,0,0,0,0,0,105,110,99,111,109,112,97,116,105,98,108,101,0,0,0,0,37,46,49,52,103,0,0,0,105,110,100,101,120,0,0,0,108,111,111,112,32,105,110,32,103,101,116,116,97,98,108,101,0,0,0,0,0,0,0,0,108,111,111,112,32,105,110,32,115,101,116,116,97,98,108,101,0,0,0,0,0,0,0,0,115,116,114,105,110,103,32,108,101,110,103,116,104,32,111,118,101,114,102,108,111,119,0,0,103,101,116,32,108,101,110,103,116,104,32,111,102,0,0,0,39,102,111,114,39,32,105,110,105,116,105,97,108,32,118,97,108,117,101,32,109,117,115,116,32,98,101,32,97,32,110,117,109,98,101,114,0,0,0,0,39,102,111,114,39,32,108,105,109,105,116,32,109,117,115,116,32,98,101,32,97,32,110,117,109,98,101,114,0,0,0,0,39,102,111,114,39,32,115,116,101,112,32,109,117,115,116,32,98,101,32,97,32,110,117,109,98,101,114,0,0,0,0,0,95,71,0,0,0,0,0,0,152,36,0,0,85,0,0,0,160,36,0,0,86,0,0,0,176,36,0,0,87,0,0,0,184,36,0,0,88,0,0,0,192,36,0,0,89,0,0,0,208,36,0,0,90,0,0,0,216,36,0,0,91,0,0,0,232,36,0,0,92,0,0,0,240,36,0,0,92,0,0,0,0,37,0,0,93,0,0,0,8,37,0,0,94,0,0,0,16,37,0,0,95,0,0,0,24,37,0,0,96,0,0,0,32,37,0,0,97,0,0,0,48,37,0,0,98,0,0,0,56,37,0,0,99,0,0,0,64,37,0,0,100,0,0,0,72,37,0,0,101,0,0,0,80,37,0,0,102,0,0,0,96,37,0,0,103,0,0,0,112,37,0,0,104,0,0,0,128,37,0,0,105,0,0,0,136,37,0,0,106,0,0,0,0,0,0,0,0,0,0,0,76,117,97,32,53,46,50,0,95,86,69,82,83,73,79,78,0,0,0,0,0,0,0,0,97,115,115,101,114,116,0,0,99,111,108,108,101,99,116,103,97,114,98,97,103,101,0,0,100,111,102,105,108,101,0,0,101,114,114,111,114,0,0,0,103,101,116,109,101,116,97,116,97,98,108,101,0,0,0,0,105,112,97,105,114,115,0,0,108,111,97,100,102,105,108,101,0,0,0,0,0,0,0,0,108,111,97,100,0,0,0,0,108,111,97,100,115,116,114,105,110,103,0,0,0,0,0,0,110,101,120,116,0,0,0,0,112,97,105,114,115,0,0,0,112,99,97,108,108,0,0,0,112,114,105,110,116,0,0,0,114,97,119,101,113,117,97,108,0,0,0,0,0,0,0,0,114,97,119,108,101,110,0,0,114,97,119,103,101,116,0,0,114,97,119,115,101,116,0,0,115,101,108,101,99,116,0,0,115,101,116,109,101,116,97,116,97,98,108,101,0,0,0,0,116,111,110,117,109,98,101,114,0,0,0,0,0,0,0,0,116,111,115,116,114,105,110,103,0,0,0,0,0,0,0,0,116,121,112,101,0,0,0,0,120,112,99,97,108,108,0,0,118,97,108,117,101,32,101,120,112,101,99,116,101,100,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,98,97,115,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,0,32,12,10,13,9,11,0,0,110,105,108,32,111,114,32,116,97,98,108,101,32,101,120,112,101,99,116,101,100,0,0,0,95,95,109,101,116,97,116,97,98,108,101,0,0,0,0,0,99,97,110,110,111,116,32,99,104,97,110,103,101,32,97,32,112,114,111,116,101,99,116,101,100,32,109,101,116,97,116,97,98,108,101,0,0,0,0,0,105,110,100,101,120,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,116,97,98,108,101,32,111,114,32,115,116,114,105,110,103,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,39,116,111,115,116,114,105,110,103,39,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,115,116,114,105,110,103,32,116,111,32,39,112,114,105,110,116,39,0,0,0,0,0,0,95,95,112,97,105,114,115,0,98,116,0,0,0,0,0,0,61,40,108,111,97,100,41,0,116,111,111,32,109,97,110,121,32,110,101,115,116,101,100,32,102,117,110,99,116,105,111,110,115,0,0,0,0,0,0,0,114,101,97,100,101,114,32,102,117,110,99,116,105,111,110,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,115,116,114,105,110,103,0,0,0,0,95,95,105,112,97,105,114,115,0,0,0,0,0,0,0,0,40,39,0,0,48,39,0,0,56,39,0,0,64,39,0,0,72,39,0,0,80,39,0,0,96,39,0,0,112,39,0,0,128,39,0,0,144,39,0,0,160,39,0,0,0,0,0,0,115,116,111,112,0,0,0,0,114,101,115,116,97,114,116,0,99,111,108,108,101,99,116,0,99,111,117,110,116,0,0,0,115,116,101,112,0,0,0,0,115,101,116,112,97,117,115,101,0,0,0,0,0,0,0,0,115,101,116,115,116,101,112,109,117,108,0,0,0,0,0,0,115,101,116,109,97,106,111,114,105,110,99,0,0,0,0,0,105,115,114,117,110,110,105,110,103,0,0,0,0,0,0,0,103,101,110,101,114,97,116,105,111,110,97,108,0,0,0,0,105,110,99,114,101,109,101,110,116,97,108,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,37,115,0,0,0,0,0,0,97,115,115,101,114,116,105,111,110,32,102,97,105,108,101,100,33,0,0,0,0,0,0,0,104,40,0,0,107], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
/* memory initializer */ allocate([112,40,0,0,108,0,0,0,120,40,0,0,109,0,0,0,128,40,0,0,110,0,0,0,136,40,0,0,111,0,0,0,144,40,0,0,112,0,0,0,152,40,0,0,113,0,0,0,160,40,0,0,114,0,0,0,168,40,0,0,115,0,0,0,176,40,0,0,116,0,0,0,184,40,0,0,117,0,0,0,192,40,0,0,118,0,0,0,0,0,0,0,0,0,0,0,97,114,115,104,105,102,116,0,98,97,110,100,0,0,0,0,98,110,111,116,0,0,0,0,98,111,114,0,0,0,0,0,98,120,111,114,0,0,0,0,98,116,101,115,116,0,0,0,101,120,116,114,97,99,116,0,108,114,111,116,97,116,101,0,108,115,104,105,102,116,0,0,114,101,112,108,97,99,101,0,114,114,111,116,97,116,101,0,114,115,104,105,102,116,0,0,102,105,101,108,100,32,99,97,110,110,111,116,32,98,101,32,110,101,103,97,116,105,118,101,0,0,0,0,0,0,0,0,119,105,100,116,104,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,0,116,114,121,105,110,103,32,116,111,32,97,99,99,101,115,115,32,110,111,110,45,101,120,105,115,116,101,110,116,32,98,105,116,115,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,111,114,32,101,120,112,114,101,115,115,105,111,110,32,116,111,111,32,99,111,109,112,108,101,120,0,0,0,0,0,0,99,111,110,115,116,114,117,99,116,111,114,32,116,111,111,32,108,111,110,103,0,0,0,0,99,111,110,115,116,97,110,116,115,0,0,0,0,0,0,0,111,112,99,111,100,101,115,0,99,111,110,116,114,111,108,32,115,116,114,117,99,116,117,114,101,32,116,111,111,32,108,111,110,103,0,0,0,0,0,0,216,41,0,0,119,0,0,0,224,41,0,0,120,0,0,0,232,41,0,0,121,0,0,0,240,41,0,0,122,0,0,0,248,41,0,0,123,0,0,0,0,42,0,0,124,0,0,0,0,0,0,0,0,0,0,0,99,114,101,97,116,101,0,0,114,101,115,117,109,101,0,0,114,117,110,110,105,110,103,0,115,116,97,116,117,115,0,0,119,114,97,112,0,0,0,0,121,105,101,108,100,0,0,0,116,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,32,116,111,32,114,101,115,117,109,101,0,0,0,0,99,97,110,110,111,116,32,114,101,115,117,109,101,32,100,101,97,100,32,99,111,114,111,117,116,105,110,101,0,0,0,0,116,111,111,32,109,97,110,121,32,114,101,115,117,108,116,115,32,116,111,32,114,101,115,117,109,101,0,0,0,0,0,0,99,111,114,111,117,116,105,110,101,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,115,117,115,112,101,110,100,101,100,0,0,0,0,0,0,0,110,111,114,109,97,108,0,0,100,101,97,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,22,22,22,22,22,22,22,22,22,22,4,4,4,4,4,4,4,21,21,21,21,21,21,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,5,4,21,21,21,21,21,21,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,44,0,0,125,0,0,0,56,44,0,0,126,0,0,0,72,44,0,0,127,0,0,0,80,44,0,0,128,0,0,0,88,44,0,0,129,0,0,0,104,44,0,0,130,0,0,0,120,44,0,0,131,0,0,0,136,44,0,0,132,0,0,0,152,44,0,0,133,0,0,0,168,44,0,0,134,0,0,0,184,44,0,0,135,0,0,0,200,44,0,0,136,0,0,0,208,44,0,0,137,0,0,0,224,44,0,0,138,0,0,0,240,44,0,0,139,0,0,0,0,45,0,0,140,0,0,0,0,0,0,0,0,0,0,0,100,101,98,117,103,0,0,0,103,101,116,117,115,101,114,118,97,108,117,101,0,0,0,0,103,101,116,104,111,111,107,0,103,101,116,105,110,102,111,0,103,101,116,108,111,99,97,108,0,0,0,0,0,0,0,0,103,101,116,114,101,103,105,115,116,114,121,0,0,0,0,0,103,101,116,109,101,116,97,116,97,98,108,101,0,0,0,0,103,101,116,117,112,118,97,108,117,101,0,0,0,0,0,0,117,112,118,97,108,117,101,106,111,105,110,0,0,0,0,0,117,112,118,97,108,117,101,105,100,0,0,0,0,0,0,0,115,101,116,117,115,101,114,118,97,108,117,101,0,0,0,0,115,101,116,104,111,111,107,0,115,101,116,108,111,99,97,108,0,0,0,0,0,0,0,0,115,101,116,109,101,116,97,116,97,98,108,101,0,0,0,0,115,101,116,117,112,118,97,108,117,101,0,0,0,0,0,0,116,114,97,99,101,98,97,99,107,0,0,0,0,0,0,0,110,105,108,32,111,114,32,116,97,98,108,101,32,101,120,112,101,99,116,101,100,0,0,0,108,101,118,101,108,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,95,72,75,69,89,0,0,0,107,0,0,0,0,0,0,0,95,95,109,111,100,101,0,0,112,45,0,0,120,45,0,0,128,45,0,0,136,45,0,0,144,45,0,0,0,0,0,0,99,97,108,108,0,0,0,0,114,101,116,117,114,110,0,0,108,105,110,101,0,0,0,0,99,111,117,110,116,0,0,0,116,97,105,108,32,99,97,108,108,0,0,0,0,0,0,0,102,117,108,108,32,117,115,101,114,100,97,116,97,32,101,120,112,101,99,116,101,100,44,32,103,111,116,32,108,105,103,104,116,32,117,115,101,114,100,97,116,97,0,0,0,0,0,0,62,117,0,0,0,0,0,0,105,110,118,97,108,105,100,32,117,112,118,97,108,117,101,32,105,110,100,101,120,0,0,0,76,117,97,32,102,117,110,99,116,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,102,108,110,83,116,117,0,0,62,37,115,0,0,0,0,0,102,117,110,99,116,105,111,110,32,111,114,32,108,101,118,101,108,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,0,0,115,111,117,114,99,101,0,0,115,104,111,114,116,95,115,114,99,0,0,0,0,0,0,0,108,105,110,101,100,101,102,105,110,101,100,0,0,0,0,0,108,97,115,116,108,105,110,101,100,101,102,105,110,101,100,0,119,104,97,116,0,0,0,0,99,117,114,114,101,110,116,108,105,110,101,0,0,0,0,0,110,117,112,115,0,0,0,0,110,112,97,114,97,109,115,0,105,115,118,97,114,97,114,103,0,0,0,0,0,0,0,0,110,97,109,101,0,0,0,0,110,97,109,101,119,104,97,116,0,0,0,0,0,0,0,0,105,115,116,97,105,108,99,97,108,108,0,0,0,0,0,0,97,99,116,105,118,101,108,105,110,101,115,0,0,0,0,0,102,117,110,99,0,0,0,0,101,120,116,101,114,110,97,108,32,104,111,111,107,0,0,0,108,117,97,95,100,101,98,117,103,62,32,0,0,0,0,0,99,111,110,116,10,0,0,0,61,40,100,101,98,117,103,32,99,111,109,109,97,110,100,41,0,0,0,0,0,0,0,0,37,115,10,0,0,0,0,0,80,49,0,0,88,49,0,0,96,49,0,0,104,49,0,0,112,49,0,0,120,49,0,0,128,49,0,0,136,49,0,0,144,49,0,0,160,49,0,0,168,49,0,0,176,49,0,0,184,49,0,0,192,49,0,0,200,49,0,0,208,49,0,0,216,49,0,0,224,49,0,0,232,49,0,0,240,49,0,0,248,49,0,0,0,50,0,0,8,50,0,0,16,50,0,0,24,50,0,0,32,50,0,0,40,50,0,0,48,50,0,0,56,50,0,0,64,50,0,0,72,50,0,0,88,50,0,0,96,50,0,0,0,0,0,0,39,37,99,39,0,0,0,0,99,104,97,114,40,37,100,41,0,0,0,0,0,0,0,0,39,37,115,39,0,0,0,0,95,69,78,86,0,0,0,0,105,110,118,97,108,105,100,32,108,111,110,103,32,115,116,114,105,110,103,32,100,101,108,105,109,105,116,101,114,0,0,0,46,0,0,0,0,0,0,0,69,101,0,0,0,0,0,0,88,120,0,0,0,0,0,0,80,112,0,0,0,0,0,0,43,45,0,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,110,117,109,98,101,114,0,0,0,0,0,0,0,0,108,101,120,105,99,97,108,32,101,108,101,109,101,110,116,32,116,111,111,32,108,111,110,103,0,0,0,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,115,116,114,105,110,103,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,0,100,101,99,105,109,97,108,32,101,115,99,97,112,101,32,116,111,111,32,108,97,114,103,101,0,0,0,0,0,0,0,0,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,108,111,110,103,32,115,116,114,105,110,103,0,0,117,110,102,105,110,105,115,104,101,100,32,108,111,110,103,32,99,111,109,109,101,110,116,0,99,104,117,110,107,32,104,97,115,32,116,111,111,32,109,97,110,121,32,108,105,110,101,115,0,0,0,0,0,0,0,0,37,115,58,37,100,58,32,37,115,0,0,0,0,0,0,0,37,115,32,110,101,97,114,32,37,115,0,0,0,0,0,0,97,110,100,0,0,0,0,0,98,114,101,97,107,0,0,0,100,111,0,0,0,0,0,0,101,108,115,101,0,0,0,0,101,108,115,101,105,102,0,0,101,110,100,0,0,0,0,0,102,97,108,115,101,0,0,0,102,111,114,0,0,0,0,0,102,117,110,99,116,105,111,110,0,0,0,0,0,0,0,0,103,111,116,111,0,0,0,0,105,102,0,0,0,0,0,0,105,110,0,0,0,0,0,0,108,111,99,97,108,0,0,0,110,105,108,0,0,0,0,0,110,111,116,0,0,0,0,0,111,114,0,0,0,0,0,0,114,101,112,101,97,116,0,0,114,101,116,117,114,110,0,0,116,104,101,110,0,0,0,0,116,114,117,101,0,0,0,0,117,110,116,105,108,0,0,0,119,104,105,108,101,0,0,0,46,46,0,0,0,0,0,0,46,46,46,0,0,0,0,0,61,61,0,0,0,0,0,0,62,61,0,0,0,0,0,0,60,61,0,0,0,0,0,0,126,61,0,0,0,0,0,0,58,58,0,0,0,0,0,0,60,101,111,102,62,0,0,0,60,110,117,109,98,101,114,62,0,0,0,0,0,0,0,0,60,110,97,109,101,62,0,0,60,115,116,114,105,110,103,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,110,97,110,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE+10240);




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

}




  Module["_rand_r"] = _rand_r;

  var ___rand_seed=allocate([0x0273459b, 0, 0, 0], "i32", ALLOC_STATIC);
  Module["_rand"] = _rand;



  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 _lseek(fildes, offset, whence) {
      // off_t lseek(int fildes, off_t offset, int whence);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/lseek.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      try {
        return FS.llseek(stream, offset, whence);
      } 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 _fseek(stream, offset, whence) {
      // int fseek(FILE *stream, long offset, int whence);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fseek.html
      var fd = _fileno(stream);
      var ret = _lseek(fd, offset, whence);
      if (ret == -1) {
        return -1;
      }
      stream = FS.getStreamFromPtr(stream);
      stream.eof = false;
      return 0;
    }


  Module["_i64Subtract"] = _i64Subtract;


  Module["_i64Add"] = _i64Add;

  function _setlocale(category, locale) {
      if (!_setlocale.ret) _setlocale.ret = allocate([0], 'i8', ALLOC_NORMAL);
      return _setlocale.ret;
    }


  function _close(fildes) {
      // int close(int fildes);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/close.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      try {
        FS.close(stream);
        return 0;
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }

  function _fsync(fildes) {
      // int fsync(int fildes);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fsync.html
      var stream = FS.getStream(fildes);
      if (stream) {
        // We write directly to the file system, so there's nothing to do here.
        return 0;
      } else {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
    }function _fclose(stream) {
      // int fclose(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fclose.html
      var fd = _fileno(stream);
      _fsync(fd);
      return _close(fd);
    }





  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 _recv(fd, buf, len, flags) {
      var sock = SOCKFS.getSocket(fd);
      if (!sock) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      // TODO honor flags
      return _read(fd, buf, len);
    }

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


      try {
        var slab = HEAP8;
        return FS.read(stream, slab, buf, nbyte);
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }function _fread(ptr, size, nitems, stream) {
      // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html
      var bytesToRead = nitems * size;
      if (bytesToRead == 0) {
        return 0;
      }
      var bytesRead = 0;
      var streamObj = FS.getStreamFromPtr(stream);
      if (!streamObj) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return 0;
      }
      while (streamObj.ungotten.length && bytesToRead > 0) {
        HEAP8[((ptr++)|0)]=streamObj.ungotten.pop();
        bytesToRead--;
        bytesRead++;
      }
      var err = _read(streamObj.fd, ptr, bytesToRead);
      if (err == -1) {
        if (streamObj) streamObj.error = true;
        return 0;
      }
      bytesRead += err;
      if (bytesRead < bytesToRead) streamObj.eof = true;
      return Math.floor(bytesRead / size);
    }

  function _toupper(chr) {
      if (chr >= 97 && chr <= 122) {
        return chr - 97 + 65;
      } else {
        return chr;
      }
    }



  function _open(path, oflag, varargs) {
      // int open(const char *path, int oflag, ...);
      // http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
      var mode = HEAP32[((varargs)>>2)];
      path = Pointer_stringify(path);
      try {
        var stream = FS.open(path, oflag, mode);
        return stream.fd;
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }function _fopen(filename, mode) {
      // FILE *fopen(const char *restrict filename, const char *restrict mode);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fopen.html
      var flags;
      mode = Pointer_stringify(mode);
      if (mode[0] == 'r') {
        if (mode.indexOf('+') != -1) {
          flags = 2;
        } else {
          flags = 0;
        }
      } else if (mode[0] == 'w') {
        if (mode.indexOf('+') != -1) {
          flags = 2;
        } else {
          flags = 1;
        }
        flags |= 64;
        flags |= 512;
      } else if (mode[0] == 'a') {
        if (mode.indexOf('+') != -1) {
          flags = 2;
        } else {
          flags = 1;
        }
        flags |= 64;
        flags |= 1024;
      } else {
        ___setErrNo(ERRNO_CODES.EINVAL);
        return 0;
      }
      var fd = _open(filename, flags, allocate([0x1FF, 0, 0, 0], 'i32', ALLOC_STACK));  // All creation permissions.
      return fd === -1 ? 0 : FS.getPtrForStream(FS.getStream(fd));
    }

  var _emscripten_check_longjmp=true;



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

  var _log=Math_log;

  var _emscripten_postinvoke=true;


  function _putchar(c) {
      // int putchar(int c);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html
      return _fputc(c, HEAP32[((_stdout)>>2)]);
    }
  Module["_saveSetjmp"] = _saveSetjmp;

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

  function _system(command) {
      // int system(const char *command);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html
      // Can't call external programs.
      ___setErrNo(ERRNO_CODES.EAGAIN);
      return -1;
    }

  function _frexp(x, exp_addr) {
      var sig = 0, exp_ = 0;
      if (x !== 0) {
        var sign = 1;
        if (x < 0) {
          x = -x;
          sign = -1;
        }
        var raw_exp = Math.log(x)/Math.log(2);
        exp_ = Math.ceil(raw_exp);
        if (exp_ === raw_exp) exp_ += 1;
        sig = sign*x/Math.pow(2, exp_);
      }
      HEAP32[((exp_addr)>>2)]=exp_;
      return sig;
    }



  var _tzname=allocate(8, "i32*", ALLOC_STATIC);

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

  var _timezone=allocate(1, "i32*", ALLOC_STATIC);function _tzset() {
      // TODO: Use (malleable) environment variables instead of system settings.
      if (_tzset.called) return;
      _tzset.called = true;

      HEAP32[((_timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60;

      var winter = new Date(2000, 0, 1);
      var summer = new Date(2000, 6, 1);
      HEAP32[((_daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset());

      var winterName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | winter.toString().match(/\(([A-Z]+)\)/)[1];
      var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1];
      var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL);
      var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL);
      HEAP32[((_tzname)>>2)]=winterNamePtr;
      HEAP32[(((_tzname)+(4))>>2)]=summerNamePtr;
    }function _mktime(tmPtr) {
      _tzset();
      var year = HEAP32[(((tmPtr)+(20))>>2)];
      var timestamp = new Date(year >= 1900 ? year : year + 1900,
                               HEAP32[(((tmPtr)+(16))>>2)],
                               HEAP32[(((tmPtr)+(12))>>2)],
                               HEAP32[(((tmPtr)+(8))>>2)],
                               HEAP32[(((tmPtr)+(4))>>2)],
                               HEAP32[((tmPtr)>>2)],
                               0).getTime() / 1000;
      HEAP32[(((tmPtr)+(24))>>2)]=new Date(timestamp).getDay();
      var yday = Math.round((timestamp - (new Date(year, 0, 1)).getTime()) / (1000 * 60 * 60 * 24));
      HEAP32[(((tmPtr)+(28))>>2)]=yday;
      return timestamp;
    }

  function _isalpha(chr) {
      return (chr >= 97 && chr <= 122) ||
             (chr >= 65 && chr <= 90);
    }


  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 _tmpnam(s, dir, prefix) {
      // char *tmpnam(char *s);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpnam.html
      // NOTE: The dir and prefix arguments are for internal use only.
      var folder = FS.findObject(dir || '/tmp');
      if (!folder || !folder.isFolder) {
        dir = '/tmp';
        folder = FS.findObject(dir);
        if (!folder || !folder.isFolder) return 0;
      }
      var name = prefix || 'file';
      do {
        name += String.fromCharCode(65 + Math.floor(Math.random() * 25));
      } while (name in folder.contents);
      var result = dir + '/' + name;
      if (!_tmpnam.buffer) _tmpnam.buffer = _malloc(256);
      if (!s) s = _tmpnam.buffer;
      writeAsciiToMemory(result, s);
      return s;
    }

  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 _log10(x) {
      return Math.log(x) / Math.LN10;
    }

  function _isspace(chr) {
      return (chr == 32) || (chr >= 9 && chr <= 13);
    }


  var ___tm_current=allocate(44, "i8", ALLOC_STATIC);


  var ___tm_timezone=allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);function _localtime_r(time, tmPtr) {
      _tzset();
      var date = new Date(HEAP32[((time)>>2)]*1000);
      HEAP32[((tmPtr)>>2)]=date.getSeconds();
      HEAP32[(((tmPtr)+(4))>>2)]=date.getMinutes();
      HEAP32[(((tmPtr)+(8))>>2)]=date.getHours();
      HEAP32[(((tmPtr)+(12))>>2)]=date.getDate();
      HEAP32[(((tmPtr)+(16))>>2)]=date.getMonth();
      HEAP32[(((tmPtr)+(20))>>2)]=date.getFullYear()-1900;
      HEAP32[(((tmPtr)+(24))>>2)]=date.getDay();

      var start = new Date(date.getFullYear(), 0, 1);
      var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
      HEAP32[(((tmPtr)+(28))>>2)]=yday;
      HEAP32[(((tmPtr)+(36))>>2)]=start.getTimezoneOffset() * 60;

      var dst = Number(start.getTimezoneOffset() != date.getTimezoneOffset());
      HEAP32[(((tmPtr)+(32))>>2)]=dst;

      HEAP32[(((tmPtr)+(40))>>2)]=___tm_timezone;

      return tmPtr;
    }function _localtime(time) {
      return _localtime_r(time, ___tm_current);
    }

  function _srand(seed) {
      HEAP32[((___rand_seed)>>2)]=seed
    }

  var _emscripten_prep_setjmp=true;




  Module["_testSetjmp"] = _testSetjmp;function _longjmp(env, value) {
      asm['setThrew'](env, value || 1);
      throw 'longjmp';
    }function _emscripten_longjmp(env, value) {
      _longjmp(env, value);
    }

  var _ceil=Math_ceil;


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

  var _llvm_pow_f64=Math_pow;



  Module["_strlen"] = _strlen;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 _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 _sinh(x) {
      var p = Math.pow(Math.E, x);
      return (p - (1 / p)) / 2;
    }

  function _cosh(x) {
      var p = Math.pow(Math.E, x);
      return (p + (1 / p)) / 2;
    }function _tanh(x) {
      return _sinh(x) / _cosh(x);
    }

  function _signal(sig, func) {
      // TODO
      return 0;
    }



  function __getFloat(text) {
      return /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(text);
    }function __scanString(format, get, unget, varargs) {
      if (!__scanString.whiteSpace) {
        __scanString.whiteSpace = {};
        __scanString.whiteSpace[32] = 1;
        __scanString.whiteSpace[9] = 1;
        __scanString.whiteSpace[10] = 1;
        __scanString.whiteSpace[11] = 1;
        __scanString.whiteSpace[12] = 1;
        __scanString.whiteSpace[13] = 1;
      }
      // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.
      // TODO: Support all format specifiers.
      format = Pointer_stringify(format);
      var soFar = 0;
      if (format.indexOf('%n') >= 0) {
        // need to track soFar
        var _get = get;
        get = function get() {
          soFar++;
          return _get();
        }
        var _unget = unget;
        unget = function unget() {
          soFar--;
          return _unget();
        }
      }
      var formatIndex = 0;
      var argsi = 0;
      var fields = 0;
      var argIndex = 0;
      var next;

      mainLoop:
      for (var formatIndex = 0; formatIndex < format.length;) {
        if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {
          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
          argIndex += Runtime.getAlignSize('void*', null, true);
          HEAP32[((argPtr)>>2)]=soFar;
          formatIndex += 2;
          continue;
        }

        if (format[formatIndex] === '%') {
          var nextC = format.indexOf('c', formatIndex+1);
          if (nextC > 0) {
            var maxx = 1;
            if (nextC > formatIndex+1) {
              var sub = format.substring(formatIndex+1, nextC);
              maxx = parseInt(sub);
              if (maxx != sub) maxx = 0;
            }
            if (maxx) {
              var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
              argIndex += Runtime.getAlignSize('void*', null, true);
              fields++;
              for (var i = 0; i < maxx; i++) {
                next = get();
                HEAP8[((argPtr++)|0)]=next;
                if (next === 0) return i > 0 ? fields : fields-1; // we failed to read the full length of this field
              }
              formatIndex += nextC - formatIndex + 1;
              continue;
            }
          }
        }

        // handle %[...]
        if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) {
          var match = /\%([0-9]*)\[(\^)?(\]?[^\]]*)\]/.exec(format.substring(formatIndex));
          if (match) {
            var maxNumCharacters = parseInt(match[1]) || Infinity;
            var negateScanList = (match[2] === '^');
            var scanList = match[3];

            // expand "middle" dashs into character sets
            var middleDashMatch;
            while ((middleDashMatch = /([^\-])\-([^\-])/.exec(scanList))) {
              var rangeStartCharCode = middleDashMatch[1].charCodeAt(0);
              var rangeEndCharCode = middleDashMatch[2].charCodeAt(0);
              for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++));
              scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded);
            }

            var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
            argIndex += Runtime.getAlignSize('void*', null, true);
            fields++;

            for (var i = 0; i < maxNumCharacters; i++) {
              next = get();
              if (negateScanList) {
                if (scanList.indexOf(String.fromCharCode(next)) < 0) {
                  HEAP8[((argPtr++)|0)]=next;
                } else {
                  unget();
                  break;
                }
              } else {
                if (scanList.indexOf(String.fromCharCode(next)) >= 0) {
                  HEAP8[((argPtr++)|0)]=next;
                } else {
                  unget();
                  break;
                }
              }
            }

            // write out null-terminating character
            HEAP8[((argPtr++)|0)]=0;
            formatIndex += match[0].length;

            continue;
          }
        }
        // remove whitespace
        while (1) {
          next = get();
          if (next == 0) return fields;
          if (!(next in __scanString.whiteSpace)) break;
        }
        unget();

        if (format[formatIndex] === '%') {
          formatIndex++;
          var suppressAssignment = false;
          if (format[formatIndex] == '*') {
            suppressAssignment = true;
            formatIndex++;
          }
          var maxSpecifierStart = formatIndex;
          while (format[formatIndex].charCodeAt(0) >= 48 &&
                 format[formatIndex].charCodeAt(0) <= 57) {
            formatIndex++;
          }
          var max_;
          if (formatIndex != maxSpecifierStart) {
            max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);
          }
          var long_ = false;
          var half = false;
          var longLong = false;
          if (format[formatIndex] == 'l') {
            long_ = true;
            formatIndex++;
            if (format[formatIndex] == 'l') {
              longLong = true;
              formatIndex++;
            }
          } else if (format[formatIndex] == 'h') {
            half = true;
            formatIndex++;
          }
          var type = format[formatIndex];
          formatIndex++;
          var curr = 0;
          var buffer = [];
          // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later
          if (type == 'f' || type == 'e' || type == 'g' ||
              type == 'F' || type == 'E' || type == 'G') {
            next = get();
            while (next > 0 && (!(next in __scanString.whiteSpace)))  {
              buffer.push(String.fromCharCode(next));
              next = get();
            }
            var m = __getFloat(buffer.join(''));
            var last = m ? m[0].length : 0;
            for (var i = 0; i < buffer.length - last + 1; i++) {
              unget();
            }
            buffer.length = last;
          } else {
            next = get();
            var first = true;

            // Strip the optional 0x prefix for %x.
            if ((type == 'x' || type == 'X') && (next == 48)) {
              var peek = get();
              if (peek == 120 || peek == 88) {
                next = get();
              } else {
                unget();
              }
            }

            while ((curr < max_ || isNaN(max_)) && next > 0) {
              if (!(next in __scanString.whiteSpace) && // stop on whitespace
                  (type == 's' ||
                   ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||
                                                                     (first && next == 45))) ||
                   ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||
                                     next >= 97 && next <= 102 ||
                                     next >= 65 && next <= 70))) &&
                  (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up
                buffer.push(String.fromCharCode(next));
                next = get();
                curr++;
                first = false;
              } else {
                break;
              }
            }
            unget();
          }
          if (buffer.length === 0) return 0;  // Failure.
          if (suppressAssignment) continue;

          var text = buffer.join('');
          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
          argIndex += Runtime.getAlignSize('void*', null, true);
          switch (type) {
            case 'd': case 'u': case 'i':
              if (half) {
                HEAP16[((argPtr)>>1)]=parseInt(text, 10);
              } else if (longLong) {
                (tempI64 = [parseInt(text, 10)>>>0,(tempDouble=parseInt(text, 10),(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);
              } else {
                HEAP32[((argPtr)>>2)]=parseInt(text, 10);
              }
              break;
            case 'X':
            case 'x':
              HEAP32[((argPtr)>>2)]=parseInt(text, 16);
              break;
            case 'F':
            case 'f':
            case 'E':
            case 'e':
            case 'G':
            case 'g':
            case 'E':
              // fallthrough intended
              if (long_) {
                HEAPF64[((argPtr)>>3)]=parseFloat(text);
              } else {
                HEAPF32[((argPtr)>>2)]=parseFloat(text);
              }
              break;
            case 's':
              var array = intArrayFromString(text);
              for (var j = 0; j < array.length; j++) {
                HEAP8[(((argPtr)+(j))|0)]=array[j];
              }
              break;
          }
          fields++;
        } else if (format[formatIndex].charCodeAt(0) in __scanString.whiteSpace) {
          next = get();
          while (next in __scanString.whiteSpace) {
            if (next <= 0) break mainLoop;  // End of input.
            next = get();
          }
          unget(next);
          formatIndex++;
        } else {
          // Not a specifier.
          next = get();
          if (format[formatIndex].charCodeAt(0) !== next) {
            unget(next);
            break mainLoop;
          }
          formatIndex++;
        }
      }
      return fields;
    }

  function _fgetc(stream) {
      // int fgetc(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html
      var streamObj = FS.getStreamFromPtr(stream);
      if (!streamObj) return -1;
      if (streamObj.eof || streamObj.error) return -1;
      var ret = _fread(_fgetc.ret, 1, 1, stream);
      if (ret == 0) {
        return -1;
      } else if (ret == -1) {
        streamObj.error = true;
        return -1;
      } else {
        return HEAPU8[((_fgetc.ret)|0)];
      }
    }

  function _ungetc(c, stream) {
      // int ungetc(int c, FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html
      stream = FS.getStreamFromPtr(stream);
      if (!stream) {
        return -1;
      }
      if (c === -1) {
        // do nothing for EOF character
        return c;
      }
      c = unSign(c & 0xFF);
      stream.ungotten.push(c);
      stream.eof = false;
      return c;
    }function _fscanf(stream, format, varargs) {
      // int fscanf(FILE *restrict stream, const char *restrict format, ... );
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html
      var streamObj = FS.getStreamFromPtr(stream);
      if (!streamObj) {
        return -1;
      }
      var buffer = [];
      function get() {
        var c = _fgetc(stream);
        buffer.push(c);
        return c;
      };
      function unget() {
        _ungetc(buffer.pop(), stream);
      };
      return __scanString(format, get, unget, varargs);
    }

  var _emscripten_preinvoke=true;

  function _localeconv() {
      // %struct.timeval = type { char* decimal point, other stuff... }
      // var indexes = Runtime.calculateStructAlignment({ fields: ['i32', 'i32'] });
      var me = _localeconv;
      if (!me.ret) {
      // These are defaults from the "C" locale
        me.ret = allocate([
          allocate(intArrayFromString('.'), 'i8', ALLOC_NORMAL),0,0,0, // decimal_point
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // thousands_sep
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // grouping
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // int_curr_symbol
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // currency_symbol
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // mon_decimal_point
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // mon_thousands_sep
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // mon_grouping
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0, // positive_sign
          allocate(intArrayFromString(''), 'i8', ALLOC_NORMAL),0,0,0 // negative_sign
        ], 'i8*', ALLOC_NORMAL); // Allocate strings in lconv, still don't allocate chars
      }
      return me.ret;
    }


  function _unlink(path) {
      // int unlink(const char *path);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/unlink.html
      path = Pointer_stringify(path);
      try {
        FS.unlink(path);
        return 0;
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }

  function _rmdir(path) {
      // int rmdir(const char *path);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/rmdir.html
      path = Pointer_stringify(path);
      try {
        FS.rmdir(path);
        return 0;
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }function _remove(path) {
      // int remove(const char *path);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/remove.html
      var ret = _unlink(path);
      if (ret == -1) ret = _rmdir(path);
      return ret;
    }

  function _freopen(filename, mode, stream) {
      // FILE *freopen(const char *restrict filename, const char *restrict mode, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/freopen.html
      if (!filename) {
        var streamObj = FS.getStreamFromPtr(stream);
        if (!streamObj) {
          ___setErrNo(ERRNO_CODES.EBADF);
          return 0;
        }
        if (_freopen.buffer) _free(_freopen.buffer);
        filename = intArrayFromString(streamObj.path);
        filename = allocate(filename, 'i8', ALLOC_NORMAL);
      }
      _fclose(stream);
      return _fopen(filename, mode);
    }


  function _rename(old_path, new_path) {
      // int rename(const char *old, const char *new);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/rename.html
      old_path = Pointer_stringify(old_path);
      new_path = Pointer_stringify(new_path);
      try {
        FS.rename(old_path, new_path);
        return 0;
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }

  function _tmpfile() {
      // FILE *tmpfile(void);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpfile.html
      // TODO: Delete the created file on closing.
      if (_tmpfile.mode) {
        _tmpfile.mode = allocate(intArrayFromString('w+'), 'i8', ALLOC_NORMAL);
      }
      return _fopen(_tmpnam(0), _tmpfile.mode);
    }

  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 ___errno_location() {
      return ___errno_state;
    }


  Module["_memset"] = _memset;



  Module["_bitshift64Shl"] = _bitshift64Shl;

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



  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 origArg = currArg;
              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) {
                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else
                argText = reSign(currArg, 8 * argSize, 1).toString(10);
              } else if (next == 117) {
                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else
                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 (argSize == 8 && i64Math) {
                  if (origArg[1]) {
                    argText = (origArg[1]>>>0).toString(16);
                    var lower = (origArg[0]>>>0).toString(16);
                    while (lower.length < 8) lower = '0' + lower;
                    argText += lower;
                  } else {
                    argText = (origArg[0]>>>0).toString(16);
                  }
                } else
                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 _fgets(s, n, stream) {
      // char *fgets(char *restrict s, int n, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgets.html
      var streamObj = FS.getStreamFromPtr(stream);
      if (!streamObj) return 0;
      if (streamObj.error || streamObj.eof) return 0;
      var byte_;
      for (var i = 0; i < n - 1 && byte_ != 10; i++) {
        byte_ = _fgetc(stream);
        if (byte_ == -1) {
          if (streamObj.error || (streamObj.eof && i == 0)) return 0;
          else if (streamObj.eof) break;
        }
        HEAP8[(((s)+(i))|0)]=byte_;
      }
      HEAP8[(((s)+(i))|0)]=0;
      return s;
    }

  var _tan=Math_tan;

  function _ispunct(chr) {
      return (chr >= 33 && chr <= 47) ||
             (chr >= 58 && chr <= 64) ||
             (chr >= 91 && chr <= 96) ||
             (chr >= 123 && chr <= 126);
    }

  function _feof(stream) {
      // int feof(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/feof.html
      stream = FS.getStreamFromPtr(stream);
      return Number(stream && stream.eof);
    }


  Module["_tolower"] = _tolower;

  var _asin=Math_asin;

  function _clearerr(stream) {
      // void clearerr(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/clearerr.html
      stream = FS.getStreamFromPtr(stream);
      if (!stream) {
        return;
      }
      stream.eof = false;
      stream.error = false;
    }

  var _fabs=Math_abs;

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


  var _getc=_fgetc;

  function _modf(x, intpart) {
      HEAPF64[((intpart)>>3)]=Math.floor(x);
      return x - HEAPF64[((intpart)>>3)];
    }

  var _sqrt=Math_sqrt;

  function _isxdigit(chr) {
      return (chr >= 48 && chr <= 57) ||
             (chr >= 97 && chr <= 102) ||
             (chr >= 65 && chr <= 70);
    }

  function _ftell(stream) {
      // long ftell(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ftell.html
      stream = FS.getStreamFromPtr(stream);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      if (FS.isChrdev(stream.node.mode)) {
        ___setErrNo(ERRNO_CODES.ESPIPE);
        return -1;
      } else {
        return stream.position;
      }
    }


  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 _snprintf(s, n, format, varargs) {
      // int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      var result = __formatString(format, varargs);
      var limit = (n === undefined) ? result.length
                                    : Math.min(result.length, Math.max(n - 1, 0));
      if (s < 0) {
        s = -s;
        var buf = _malloc(limit+1);
        HEAP32[((s)>>2)]=buf;
        s = buf;
      }
      for (var i = 0; i < limit; i++) {
        HEAP8[(((s)+(i))|0)]=result[i];
      }
      if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;
      return result.length;
    }function _sprintf(s, format, varargs) {
      // int sprintf(char *restrict s, const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      return _snprintf(s, undefined, format, varargs);
    }

  var _emscripten_get_longjmp_result=true;

  var _sin=Math_sin;


  function _fmod(x, y) {
      return x % y;
    }var _fmodl=_fmod;



  var _atan=Math_atan;

  function _ferror(stream) {
      // int ferror(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ferror.html
      stream = FS.getStreamFromPtr(stream);
      return Number(stream && stream.error);
    }

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

  function _copysign(a, b) {
      return __reallyNegative(a) === __reallyNegative(b) ? a : -a;
    }


  function _gmtime_r(time, tmPtr) {
      var date = new Date(HEAP32[((time)>>2)]*1000);
      HEAP32[((tmPtr)>>2)]=date.getUTCSeconds();
      HEAP32[(((tmPtr)+(4))>>2)]=date.getUTCMinutes();
      HEAP32[(((tmPtr)+(8))>>2)]=date.getUTCHours();
      HEAP32[(((tmPtr)+(12))>>2)]=date.getUTCDate();
      HEAP32[(((tmPtr)+(16))>>2)]=date.getUTCMonth();
      HEAP32[(((tmPtr)+(20))>>2)]=date.getUTCFullYear()-1900;
      HEAP32[(((tmPtr)+(24))>>2)]=date.getUTCDay();
      HEAP32[(((tmPtr)+(36))>>2)]=0;
      HEAP32[(((tmPtr)+(32))>>2)]=0;
      var start = new Date(date); // define date using UTC, start from Jan 01 00:00:00 UTC
      start.setUTCDate(1);
      start.setUTCMonth(0);
      start.setUTCHours(0);
      start.setUTCMinutes(0);
      start.setUTCSeconds(0);
      start.setUTCMilliseconds(0);
      var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
      HEAP32[(((tmPtr)+(28))>>2)]=yday;
      HEAP32[(((tmPtr)+(40))>>2)]=___tm_timezone;

      return tmPtr;
    }function _gmtime(time) {
      return _gmtime_r(time, ___tm_current);
    }

  function _isgraph(chr) {
      return 0x20 < chr && chr < 0x7F;
    }



  function _strerror_r(errnum, strerrbuf, buflen) {
      if (errnum in ERRNO_MESSAGES) {
        if (ERRNO_MESSAGES[errnum].length > buflen - 1) {
          return ___setErrNo(ERRNO_CODES.ERANGE);
        } else {
          var msg = ERRNO_MESSAGES[errnum];
          writeAsciiToMemory(msg, strerrbuf);
          return 0;
        }
      } else {
        return ___setErrNo(ERRNO_CODES.EINVAL);
      }
    }function _strerror(errnum) {
      if (!_strerror.buffer) _strerror.buffer = _malloc(256);
      _strerror_r(errnum, _strerror.buffer, 256);
      return _strerror.buffer;
    }





  var _environ=allocate(1, "i32*", ALLOC_STATIC);var ___environ=_environ;function ___buildEnvironment(env) {
      // WARNING: Arbitrary limit!
      var MAX_ENV_VALUES = 64;
      var TOTAL_ENV_SIZE = 1024;

      // Statically allocate memory for the environment.
      var poolPtr;
      var envPtr;
      if (!___buildEnvironment.called) {
        ___buildEnvironment.called = true;
        // Set default values. Use string keys for Closure Compiler compatibility.
        ENV['USER'] = 'root';
        ENV['PATH'] = '/';
        ENV['PWD'] = '/';
        ENV['HOME'] = '/home/emscripten';
        ENV['LANG'] = 'en_US.UTF-8';
        ENV['_'] = './this.program';
        // Allocate memory.
        poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC);
        envPtr = allocate(MAX_ENV_VALUES * 4,
                          'i8*', ALLOC_STATIC);
        HEAP32[((envPtr)>>2)]=poolPtr;
        HEAP32[((_environ)>>2)]=envPtr;
      } else {
        envPtr = HEAP32[((_environ)>>2)];
        poolPtr = HEAP32[((envPtr)>>2)];
      }

      // Collect key=value lines.
      var strings = [];
      var totalSize = 0;
      for (var key in env) {
        if (typeof env[key] === 'string') {
          var line = key + '=' + env[key];
          strings.push(line);
          totalSize += line.length;
        }
      }
      if (totalSize > TOTAL_ENV_SIZE) {
        throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');
      }

      // Make new.
      var ptrSize = 4;
      for (var i = 0; i < strings.length; i++) {
        var line = strings[i];
        writeAsciiToMemory(line, poolPtr);
        HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr;
        poolPtr += line.length + 1;
      }
      HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0;
    }var ENV={};function _getenv(name) {
      // char *getenv(const char *name);
      // http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
      if (name === 0) return 0;
      name = Pointer_stringify(name);
      if (!ENV.hasOwnProperty(name)) return 0;

      if (_getenv.ret) _free(_getenv.ret);
      _getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL);
      return _getenv.ret;
    }

  var _emscripten_setjmp=true;

  var _cos=Math_cos;

  function _isalnum(chr) {
      return (chr >= 48 && chr <= 57) ||
             (chr >= 97 && chr <= 122) ||
             (chr >= 65 && chr <= 90);
    }

  var _BItoD=true;

  function _difftime(time1, time0) {
      return time1 - time0;
    }

  var _floor=Math_floor;

  function _iscntrl(chr) {
      return (0 <= chr && chr <= 0x1F) || chr === 0x7F;
    }

  var _atan2=Math_atan2;

  function _setvbuf(stream, buf, type, size) {
      // int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/setvbuf.html
      // TODO: Implement custom buffering.
      return 0;
    }

  var _exp=Math_exp;

  var _copysignl=_copysign;

  function _islower(chr) {
      return chr >= 97 && chr <= 122;
    }

  var _acos=Math_acos;

  function _isupper(chr) {
      return chr >= 65 && chr <= 90;
    }


  function __isLeapYear(year) {
        return year%4 === 0 && (year%100 !== 0 || year%400 === 0);
    }

  function __arraySum(array, index) {
      var sum = 0;
      for (var i = 0; i <= index; sum += array[i++]);
      return sum;
    }


  var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];

  var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) {
      var newDate = new Date(date.getTime());
      while(days > 0) {
        var leap = __isLeapYear(newDate.getFullYear());
        var currentMonth = newDate.getMonth();
        var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];

        if (days > daysInCurrentMonth-newDate.getDate()) {
          // we spill over to next month
          days -= (daysInCurrentMonth-newDate.getDate()+1);
          newDate.setDate(1);
          if (currentMonth < 11) {
            newDate.setMonth(currentMonth+1)
          } else {
            newDate.setMonth(0);
            newDate.setFullYear(newDate.getFullYear()+1);
          }
        } else {
          // we stay in current month
          newDate.setDate(newDate.getDate()+days);
          return newDate;
        }
      }

      return newDate;
    }function _strftime(s, maxsize, format, tm) {
      // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);
      // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html

      var date = {
        tm_sec: HEAP32[((tm)>>2)],
        tm_min: HEAP32[(((tm)+(4))>>2)],
        tm_hour: HEAP32[(((tm)+(8))>>2)],
        tm_mday: HEAP32[(((tm)+(12))>>2)],
        tm_mon: HEAP32[(((tm)+(16))>>2)],
        tm_year: HEAP32[(((tm)+(20))>>2)],
        tm_wday: HEAP32[(((tm)+(24))>>2)],
        tm_yday: HEAP32[(((tm)+(28))>>2)],
        tm_isdst: HEAP32[(((tm)+(32))>>2)]
      };

      var pattern = Pointer_stringify(format);

      // expand format
      var EXPANSION_RULES_1 = {
        '%c': '%a %b %d %H:%M:%S %Y',     // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug  3 14:02:01 2013
        '%D': '%m/%d/%y',                 // Equivalent to %m / %d / %y
        '%F': '%Y-%m-%d',                 // Equivalent to %Y - %m - %d
        '%h': '%b',                       // Equivalent to %b
        '%r': '%I:%M:%S %p',              // Replaced by the time in a.m. and p.m. notation
        '%R': '%H:%M',                    // Replaced by the time in 24-hour notation
        '%T': '%H:%M:%S',                 // Replaced by the time
        '%x': '%m/%d/%y',                 // Replaced by the locale's appropriate date representation
        '%X': '%H:%M:%S',                 // Replaced by the locale's appropriate date representation
      };
      for (var rule in EXPANSION_RULES_1) {
        pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);
      }

      var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
      var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

      function leadingSomething(value, digits, character) {
        var str = typeof value === 'number' ? value.toString() : (value || '');
        while (str.length < digits) {
          str = character[0]+str;
        }
        return str;
      };

      function leadingNulls(value, digits) {
        return leadingSomething(value, digits, '0');
      };

      function compareByDay(date1, date2) {
        function sgn(value) {
          return value < 0 ? -1 : (value > 0 ? 1 : 0);
        };

        var compare;
        if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) {
          if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) {
            compare = sgn(date1.getDate()-date2.getDate());
          }
        }
        return compare;
      };

      function getFirstWeekStartDate(janFourth) {
          switch (janFourth.getDay()) {
            case 0: // Sunday
              return new Date(janFourth.getFullYear()-1, 11, 29);
            case 1: // Monday
              return janFourth;
            case 2: // Tuesday
              return new Date(janFourth.getFullYear(), 0, 3);
            case 3: // Wednesday
              return new Date(janFourth.getFullYear(), 0, 2);
            case 4: // Thursday
              return new Date(janFourth.getFullYear(), 0, 1);
            case 5: // Friday
              return new Date(janFourth.getFullYear()-1, 11, 31);
            case 6: // Saturday
              return new Date(janFourth.getFullYear()-1, 11, 30);
          }
      };

      function getWeekBasedYear(date) {
          var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);

          var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
          var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4);

          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);

          if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
            // this date is after the start of the first week of this year
            if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
              return thisDate.getFullYear()+1;
            } else {
              return thisDate.getFullYear();
            }
          } else {
            return thisDate.getFullYear()-1;
          }
      };

      var EXPANSION_RULES_2 = {
        '%a': function(date) {
          return WEEKDAYS[date.tm_wday].substring(0,3);
        },
        '%A': function(date) {
          return WEEKDAYS[date.tm_wday];
        },
        '%b': function(date) {
          return MONTHS[date.tm_mon].substring(0,3);
        },
        '%B': function(date) {
          return MONTHS[date.tm_mon];
        },
        '%C': function(date) {
          var year = date.tm_year+1900;
          return leadingNulls(Math.floor(year/100),2);
        },
        '%d': function(date) {
          return leadingNulls(date.tm_mday, 2);
        },
        '%e': function(date) {
          return leadingSomething(date.tm_mday, 2, ' ');
        },
        '%g': function(date) {
          // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year.
          // In this system, weeks begin on a Monday and week 1 of the year is the week that includes
          // January 4th, which is also the week that includes the first Thursday of the year, and
          // is also the first week that contains at least four days in the year.
          // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of
          // the last week of the preceding year; thus, for Saturday 2nd January 1999,
          // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th,
          // or 31st is a Monday, it and any following days are part of week 1 of the following year.
          // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.

          return getWeekBasedYear(date).toString().substring(2);
        },
        '%G': function(date) {
          return getWeekBasedYear(date);
        },
        '%H': function(date) {
          return leadingNulls(date.tm_hour, 2);
        },
        '%I': function(date) {
          return leadingNulls(date.tm_hour < 13 ? date.tm_hour : date.tm_hour-12, 2);
        },
        '%j': function(date) {
          // Day of the year (001-366)
          return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3);
        },
        '%m': function(date) {
          return leadingNulls(date.tm_mon+1, 2);
        },
        '%M': function(date) {
          return leadingNulls(date.tm_min, 2);
        },
        '%n': function() {
          return '\n';
        },
        '%p': function(date) {
          if (date.tm_hour > 0 && date.tm_hour < 13) {
            return 'AM';
          } else {
            return 'PM';
          }
        },
        '%S': function(date) {
          return leadingNulls(date.tm_sec, 2);
        },
        '%t': function() {
          return '\t';
        },
        '%u': function(date) {
          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);
          return day.getDay() || 7;
        },
        '%U': function(date) {
          // Replaced by the week number of the year as a decimal number [00,53].
          // The first Sunday of January is the first day of week 1;
          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]
          var janFirst = new Date(date.tm_year+1900, 0, 1);
          var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay());
          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);

          // is target date after the first Sunday?
          if (compareByDay(firstSunday, endDate) < 0) {
            // calculate difference in days between first Sunday and endDate
            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;
            var firstSundayUntilEndJanuary = 31-firstSunday.getDate();
            var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();
            return leadingNulls(Math.ceil(days/7), 2);
          }

          return compareByDay(firstSunday, janFirst) === 0 ? '01': '00';
        },
        '%V': function(date) {
          // Replaced by the week number of the year (Monday as the first day of the week)
          // as a decimal number [01,53]. If the week containing 1 January has four
          // or more days in the new year, then it is considered week 1.
          // Otherwise, it is the last week of the previous year, and the next week is week 1.
          // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]
          var janFourthThisYear = new Date(date.tm_year+1900, 0, 4);
          var janFourthNextYear = new Date(date.tm_year+1901, 0, 4);

          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);

          var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);

          if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
            // if given date is before this years first week, then it belongs to the 53rd week of last year
            return '53';
          }

          if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
            // if given date is after next years first week, then it belongs to the 01th week of next year
            return '01';
          }

          // given date is in between CW 01..53 of this calendar year
          var daysDifference;
          if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) {
            // first CW of this year starts last year
            daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate()
          } else {
            // first CW of this year starts this year
            daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate();
          }
          return leadingNulls(Math.ceil(daysDifference/7), 2);
        },
        '%w': function(date) {
          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);
          return day.getDay();
        },
        '%W': function(date) {
          // Replaced by the week number of the year as a decimal number [00,53].
          // The first Monday of January is the first day of week 1;
          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]
          var janFirst = new Date(date.tm_year, 0, 1);
          var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1);
          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);

          // is target date after the first Monday?
          if (compareByDay(firstMonday, endDate) < 0) {
            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;
            var firstMondayUntilEndJanuary = 31-firstMonday.getDate();
            var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();
            return leadingNulls(Math.ceil(days/7), 2);
          }
          return compareByDay(firstMonday, janFirst) === 0 ? '01': '00';
        },
        '%y': function(date) {
          // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year]
          return (date.tm_year+1900).toString().substring(2);
        },
        '%Y': function(date) {
          // Replaced by the year as a decimal number (for example, 1997). [ tm_year]
          return date.tm_year+1900;
        },
        '%z': function(date) {
          // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ),
          // or by no characters if no timezone is determinable.
          // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich).
          // If tm_isdst is zero, the standard time offset is used.
          // If tm_isdst is greater than zero, the daylight savings time offset is used.
          // If tm_isdst is negative, no characters are returned.
          // FIXME: we cannot determine time zone (or can we?)
          return '';
        },
        '%Z': function(date) {
          // Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst]
          // FIXME: we cannot determine time zone (or can we?)
          return '';
        },
        '%%': function() {
          return '%';
        }
      };
      for (var rule in EXPANSION_RULES_2) {
        if (pattern.indexOf(rule) >= 0) {
          pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));
        }
      }

      var bytes = intArrayFromString(pattern, false);
      if (bytes.length > maxsize) {
        return 0;
      }

      writeArrayToMemory(bytes, s);
      return bytes.length-1;
    }



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() }
_fgetc.ret = allocate([0], "i8", ALLOC_STATIC);
___buildEnvironment(ENV);
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 ctlz_i8 = allocate([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_DYNAMIC);
 var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], "i8", ALLOC_DYNAMIC);

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_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_iiiii(index,a1,a2,a3,a4) {
  try {
    return Module["dynCall_iiiii"](index,a1,a2,a3,a4);
  } 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 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 = (function(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 cttz_i8=env.cttz_i8|0;
  var ctlz_i8=env.ctlz_i8|0;
  var ___rand_seed=env.___rand_seed|0;
  var _stderr=env._stderr|0;
  var _stdin=env._stdin|0;
  var _stdout=env._stdout|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_vi=env.invoke_vi;
  var invoke_vii=env.invoke_vii;
  var invoke_ii=env.invoke_ii;
  var invoke_iiiii=env.invoke_iiiii;
  var invoke_iii=env.invoke_iii;
  var _isalnum=env._isalnum;
  var _fabs=env._fabs;
  var _frexp=env._frexp;
  var _exp=env._exp;
  var _fread=env._fread;
  var __reallyNegative=env.__reallyNegative;
  var _longjmp=env._longjmp;
  var __addDays=env.__addDays;
  var _fsync=env._fsync;
  var _signal=env._signal;
  var _rename=env._rename;
  var _sbrk=env._sbrk;
  var _emscripten_memcpy_big=env._emscripten_memcpy_big;
  var _sinh=env._sinh;
  var _sysconf=env._sysconf;
  var _close=env._close;
  var _ferror=env._ferror;
  var _clock=env._clock;
  var _cos=env._cos;
  var _tanh=env._tanh;
  var _unlink=env._unlink;
  var _write=env._write;
  var __isLeapYear=env.__isLeapYear;
  var _ftell=env._ftell;
  var _isupper=env._isupper;
  var _gmtime_r=env._gmtime_r;
  var _islower=env._islower;
  var _tmpnam=env._tmpnam;
  var _tmpfile=env._tmpfile;
  var _send=env._send;
  var _abort=env._abort;
  var _setvbuf=env._setvbuf;
  var _atan2=env._atan2;
  var _setlocale=env._setlocale;
  var _isgraph=env._isgraph;
  var _modf=env._modf;
  var _strerror_r=env._strerror_r;
  var _fscanf=env._fscanf;
  var ___setErrNo=env.___setErrNo;
  var _isalpha=env._isalpha;
  var _srand=env._srand;
  var _mktime=env._mktime;
  var _putchar=env._putchar;
  var _gmtime=env._gmtime;
  var _localeconv=env._localeconv;
  var _sprintf=env._sprintf;
  var _localtime=env._localtime;
  var _read=env._read;
  var _fwrite=env._fwrite;
  var _time=env._time;
  var _fprintf=env._fprintf;
  var _exit=env._exit;
  var _freopen=env._freopen;
  var _llvm_pow_f64=env._llvm_pow_f64;
  var _fgetc=env._fgetc;
  var _fmod=env._fmod;
  var _lseek=env._lseek;
  var _rmdir=env._rmdir;
  var _asin=env._asin;
  var _floor=env._floor;
  var _pwrite=env._pwrite;
  var _localtime_r=env._localtime_r;
  var _tzset=env._tzset;
  var _open=env._open;
  var _remove=env._remove;
  var _snprintf=env._snprintf;
  var __scanString=env.__scanString;
  var _strftime=env._strftime;
  var _fseek=env._fseek;
  var _iscntrl=env._iscntrl;
  var _isxdigit=env._isxdigit;
  var _fclose=env._fclose;
  var _log=env._log;
  var _recv=env._recv;
  var _tan=env._tan;
  var _copysign=env._copysign;
  var __getFloat=env.__getFloat;
  var _fputc=env._fputc;
  var _ispunct=env._ispunct;
  var _ceil=env._ceil;
  var _isspace=env._isspace;
  var _fopen=env._fopen;
  var _sin=env._sin;
  var _acos=env._acos;
  var _cosh=env._cosh;
  var ___buildEnvironment=env.___buildEnvironment;
  var _difftime=env._difftime;
  var _ungetc=env._ungetc;
  var _system=env._system;
  var _fflush=env._fflush;
  var _log10=env._log10;
  var _fileno=env._fileno;
  var __exit=env.__exit;
  var __arraySum=env.__arraySum;
  var _fgets=env._fgets;
  var _atan=env._atan;
  var _pread=env._pread;
  var _mkport=env._mkport;
  var _toupper=env._toupper;
  var _feof=env._feof;
  var ___errno_location=env.___errno_location;
  var _clearerr=env._clearerr;
  var _getenv=env._getenv;
  var _strerror=env._strerror;
  var _emscripten_longjmp=env._emscripten_longjmp;
  var __formatString=env.__formatString;
  var _fputs=env._fputs;
  var _sqrt=env._sqrt;
  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[3228] | 0;
   i21 = i18 >>> i20;
   if ((i21 & 3 | 0) != 0) {
    i6 = (i21 & 1 ^ 1) + i20 | 0;
    i5 = i6 << 1;
    i3 = 12952 + (i5 << 2) | 0;
    i5 = 12952 + (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[12928 >> 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[3228] = 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[12920 >> 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 = 12952 + (i7 << 2) | 0;
     i7 = 12952 + (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[12928 >> 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[3228] = 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[12920 >> 2] | 0;
     if ((i6 | 0) != 0) {
      i5 = HEAP32[12932 >> 2] | 0;
      i8 = i6 >>> 3;
      i9 = i8 << 1;
      i6 = 12952 + (i9 << 2) | 0;
      i7 = HEAP32[3228] | 0;
      i8 = 1 << i8;
      if ((i7 & i8 | 0) != 0) {
       i7 = 12952 + (i9 + 2 << 2) | 0;
       i8 = HEAP32[i7 >> 2] | 0;
       if (i8 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i28 = i7;
        i27 = i8;
       }
      } else {
       HEAP32[3228] = i7 | i8;
       i28 = 12952 + (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[12920 >> 2] = i4;
     HEAP32[12932 >> 2] = i3;
     i32 = i2;
     STACKTOP = i1;
     return i32 | 0;
    }
    i18 = HEAP32[12916 >> 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[13216 + ((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[12928 >> 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 = 13216 + (i7 << 2) | 0;
       if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) {
        HEAP32[i6 >> 2] = i26;
        if ((i26 | 0) == 0) {
         HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i7);
         break;
        }
       } else {
        if (i5 >>> 0 < (HEAP32[12928 >> 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[12928 >> 2] | 0) >>> 0) {
        _abort();
       }
       HEAP32[i26 + 24 >> 2] = i5;
       i5 = HEAP32[i3 + 16 >> 2] | 0;
       do {
        if ((i5 | 0) != 0) {
         if (i5 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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[12920 >> 2] | 0;
      if ((i6 | 0) != 0) {
       i5 = HEAP32[12932 >> 2] | 0;
       i8 = i6 >>> 3;
       i9 = i8 << 1;
       i6 = 12952 + (i9 << 2) | 0;
       i7 = HEAP32[3228] | 0;
       i8 = 1 << i8;
       if ((i7 & i8 | 0) != 0) {
        i7 = 12952 + (i9 + 2 << 2) | 0;
        i8 = HEAP32[i7 >> 2] | 0;
        if (i8 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
         _abort();
        } else {
         i25 = i7;
         i24 = i8;
        }
       } else {
        HEAP32[3228] = i7 | i8;
        i25 = 12952 + (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[12920 >> 2] = i2;
      HEAP32[12932 >> 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[12916 >> 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[13216 + (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[13216 + ((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[12920 >> 2] | 0) - i12 | 0) >>> 0 : 0) {
      i4 = HEAP32[12928 >> 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 = 13216 + (i4 << 2) | 0;
        if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) {
         HEAP32[i5 >> 2] = i22;
         if ((i22 | 0) == 0) {
          HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i4);
          break;
         }
        } else {
         if (i3 >>> 0 < (HEAP32[12928 >> 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[12928 >> 2] | 0) >>> 0) {
         _abort();
        }
        HEAP32[i22 + 24 >> 2] = i3;
        i3 = HEAP32[i24 + 16 >> 2] | 0;
        do {
         if ((i3 | 0) != 0) {
          if (i3 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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 = 12952 + (i6 << 2) | 0;
         i5 = HEAP32[3228] | 0;
         i4 = 1 << i4;
         if ((i5 & i4 | 0) != 0) {
          i5 = 12952 + (i6 + 2 << 2) | 0;
          i4 = HEAP32[i5 >> 2] | 0;
          if (i4 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           i21 = i5;
           i20 = i4;
          }
         } else {
          HEAP32[3228] = i5 | i4;
          i21 = 12952 + (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 = 13216 + (i3 << 2) | 0;
        HEAP32[i24 + (i12 + 28) >> 2] = i3;
        HEAP32[i24 + (i12 + 20) >> 2] = 0;
        HEAP32[i24 + (i12 + 16) >> 2] = 0;
        i4 = HEAP32[12916 >> 2] | 0;
        i5 = 1 << i3;
        if ((i4 & i5 | 0) == 0) {
         HEAP32[12916 >> 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[12928 >> 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[12928 >> 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[12920 >> 2] | 0;
 if (!(i12 >>> 0 > i18 >>> 0)) {
  i3 = i18 - i12 | 0;
  i2 = HEAP32[12932 >> 2] | 0;
  if (i3 >>> 0 > 15) {
   HEAP32[12932 >> 2] = i2 + i12;
   HEAP32[12920 >> 2] = i3;
   HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1;
   HEAP32[i2 + i18 >> 2] = i3;
   HEAP32[i2 + 4 >> 2] = i12 | 3;
  } else {
   HEAP32[12920 >> 2] = 0;
   HEAP32[12932 >> 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[12924 >> 2] | 0;
 if (i12 >>> 0 < i18 >>> 0) {
  i31 = i18 - i12 | 0;
  HEAP32[12924 >> 2] = i31;
  i32 = HEAP32[12936 >> 2] | 0;
  HEAP32[12936 >> 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[3346] | 0) == 0) {
   i18 = _sysconf(30) | 0;
   if ((i18 + -1 & i18 | 0) == 0) {
    HEAP32[13392 >> 2] = i18;
    HEAP32[13388 >> 2] = i18;
    HEAP32[13396 >> 2] = -1;
    HEAP32[13400 >> 2] = -1;
    HEAP32[13404 >> 2] = 0;
    HEAP32[13356 >> 2] = 0;
    HEAP32[3346] = (_time(0) | 0) & -16 ^ 1431655768;
    break;
   } else {
    _abort();
   }
  }
 } while (0);
 i20 = i12 + 48 | 0;
 i25 = HEAP32[13392 >> 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[13352 >> 2] | 0;
 if ((i24 | 0) != 0 ? (i31 = HEAP32[13344 >> 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[13356 >> 2] & 4 | 0) == 0) {
   i26 = HEAP32[12936 >> 2] | 0;
   L271 : do {
    if ((i26 | 0) != 0) {
     i24 = 13360 | 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[12924 >> 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[13388 >> 2] | 0;
      i25 = i22 + -1 | 0;
      if ((i25 & i24 | 0) == 0) {
       i25 = i18;
      } else {
       i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0;
      }
      i24 = HEAP32[13344 >> 2] | 0;
      i26 = i24 + i25 | 0;
      if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) {
       i22 = HEAP32[13352 >> 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[13392 >> 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[13356 >> 2] = HEAP32[13356 >> 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[13344 >> 2] | 0) + i14 | 0;
  HEAP32[13344 >> 2] = i15;
  if (i15 >>> 0 > (HEAP32[13348 >> 2] | 0) >>> 0) {
   HEAP32[13348 >> 2] = i15;
  }
  i15 = HEAP32[12936 >> 2] | 0;
  L311 : do {
   if ((i15 | 0) != 0) {
    i21 = 13360 | 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[12924 >> 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[12936 >> 2] = i15 + i3;
     HEAP32[12924 >> 2] = i32;
     HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1;
     HEAP32[i15 + (i2 + 4) >> 2] = 40;
     HEAP32[12940 >> 2] = HEAP32[13400 >> 2];
     break;
    }
    if (i17 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
     HEAP32[12928 >> 2] = i17;
    }
    i19 = i17 + i14 | 0;
    i16 = 13360 | 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[12936 >> 2] | 0)) {
       if ((i15 | 0) == (HEAP32[12932 >> 2] | 0)) {
        i32 = (HEAP32[12920 >> 2] | 0) + i10 | 0;
        HEAP32[12920 >> 2] = i32;
        HEAP32[12932 >> 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[12928 >> 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[12928 >> 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 = 13216 + (i16 << 2) | 0;
           if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) {
            HEAP32[i18 >> 2] = i5;
            if ((i5 | 0) == 0) {
             HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i16);
             break;
            }
           } else {
            if (i9 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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[12928 >> 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[12928 >> 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 = 12952 + (i16 << 1 << 2) | 0;
          if ((i5 | 0) != (i18 | 0)) {
           if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
            _abort();
           }
           if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) {
            _abort();
           }
          }
          if ((i12 | 0) == (i5 | 0)) {
           HEAP32[3228] = HEAP32[3228] & ~(1 << i16);
           break;
          }
          if ((i12 | 0) != (i18 | 0)) {
           if (i12 >>> 0 < (HEAP32[12928 >> 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 = 12952 + (i10 << 2) | 0;
        i9 = HEAP32[3228] | 0;
        i5 = 1 << i5;
        if ((i9 & i5 | 0) != 0) {
         i9 = 12952 + (i10 + 2 << 2) | 0;
         i5 = HEAP32[i9 >> 2] | 0;
         if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          i3 = i9;
          i4 = i5;
         }
        } else {
         HEAP32[3228] = i9 | i5;
         i3 = 12952 + (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 = 13216 + (i3 << 2) | 0;
       HEAP32[i17 + (i8 + 28) >> 2] = i3;
       HEAP32[i17 + (i8 + 20) >> 2] = 0;
       HEAP32[i17 + (i8 + 16) >> 2] = 0;
       i9 = HEAP32[12916 >> 2] | 0;
       i5 = 1 << i3;
       if ((i9 & i5 | 0) == 0) {
        HEAP32[12916 >> 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;
       }
       L445 : 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 L445;
          } else {
           i3 = i3 << 1;
           i4 = i9;
          }
         }
         if (i5 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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[12924 >> 2] | 0) + i10 | 0;
       HEAP32[12924 >> 2] = i32;
       HEAP32[12936 >> 2] = i7;
       HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
      }
     } while (0);
     i32 = i17 + (i6 | 8) | 0;
     STACKTOP = i1;
     return i32 | 0;
    }
    i3 = 13360 | 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[12936 >> 2] = i17 + i4;
    HEAP32[12924 >> 2] = i32;
    HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[12940 >> 2] = HEAP32[13400 >> 2];
    HEAP32[i2 + 4 >> 2] = 27;
    HEAP32[i3 + 0 >> 2] = HEAP32[13360 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[13364 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[13368 >> 2];
    HEAP32[i3 + 12 >> 2] = HEAP32[13372 >> 2];
    HEAP32[13360 >> 2] = i17;
    HEAP32[13364 >> 2] = i14;
    HEAP32[13372 >> 2] = 0;
    HEAP32[13368 >> 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 = 12952 + (i4 << 2) | 0;
      i5 = HEAP32[3228] | 0;
      i3 = 1 << i3;
      if ((i5 & i3 | 0) != 0) {
       i4 = 12952 + (i4 + 2 << 2) | 0;
       i3 = HEAP32[i4 >> 2] | 0;
       if (i3 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i7 = i4;
        i8 = i3;
       }
      } else {
       HEAP32[3228] = i5 | i3;
       i7 = 12952 + (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 = 13216 + (i3 << 2) | 0;
     HEAP32[i15 + 28 >> 2] = i3;
     HEAP32[i15 + 20 >> 2] = 0;
     HEAP32[i15 + 16 >> 2] = 0;
     i4 = HEAP32[12916 >> 2] | 0;
     i5 = 1 << i3;
     if ((i4 & i5 | 0) == 0) {
      HEAP32[12916 >> 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[12928 >> 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[12928 >> 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[12928 >> 2] | 0;
    if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) {
     HEAP32[12928 >> 2] = i17;
    }
    HEAP32[13360 >> 2] = i17;
    HEAP32[13364 >> 2] = i14;
    HEAP32[13372 >> 2] = 0;
    HEAP32[12948 >> 2] = HEAP32[3346];
    HEAP32[12944 >> 2] = -1;
    i2 = 0;
    do {
     i32 = i2 << 1;
     i31 = 12952 + (i32 << 2) | 0;
     HEAP32[12952 + (i32 + 3 << 2) >> 2] = i31;
     HEAP32[12952 + (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[12936 >> 2] = i17 + i2;
    HEAP32[12924 >> 2] = i32;
    HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[12940 >> 2] = HEAP32[13400 >> 2];
   }
  } while (0);
  i2 = HEAP32[12924 >> 2] | 0;
  if (i2 >>> 0 > i12 >>> 0) {
   i31 = i2 - i12 | 0;
   HEAP32[12924 >> 2] = i31;
   i32 = HEAP32[12936 >> 2] | 0;
   HEAP32[12936 >> 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 _llex(i2, i3) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 var i1 = 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, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i12 = i1;
 i4 = i2 + 60 | 0;
 HEAP32[(HEAP32[i4 >> 2] | 0) + 4 >> 2] = 0;
 i5 = i2 + 56 | 0;
 L1 : while (1) {
  i13 = HEAP32[i2 >> 2] | 0;
  L3 : while (1) {
   switch (i13 | 0) {
   case 11:
   case 9:
   case 12:
   case 32:
    {
     break;
    }
   case 91:
    {
     i9 = 25;
     break L1;
    }
   case 62:
    {
     i9 = 45;
     break L1;
    }
   case 46:
    {
     i9 = 161;
     break L1;
    }
   case 13:
   case 10:
    {
     i9 = 4;
     break L3;
    }
   case 45:
    {
     break L3;
    }
   case 61:
    {
     i9 = 29;
     break L1;
    }
   case 39:
   case 34:
    {
     i9 = 69;
     break L1;
    }
   case 126:
    {
     i9 = 53;
     break L1;
    }
   case 60:
    {
     i9 = 37;
     break L1;
    }
   case 58:
    {
     i9 = 61;
     break L1;
    }
   case 57:
   case 56:
   case 55:
   case 54:
   case 53:
   case 52:
   case 51:
   case 50:
   case 49:
   case 48:
    {
     i20 = i13;
     break L1;
    }
   case -1:
    {
     i2 = 286;
     i9 = 306;
     break L1;
    }
   default:
    {
     i9 = 283;
     break L1;
    }
   }
   i13 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i13 >> 2] | 0;
   HEAP32[i13 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i13 = _luaZ_fill(i13) | 0;
   } else {
    i27 = i13 + 4 | 0;
    i13 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i13 + 1;
    i13 = HEAPU8[i13] | 0;
   }
   HEAP32[i2 >> 2] = i13;
  }
  if ((i9 | 0) == 4) {
   i9 = 0;
   _inclinenumber(i2);
   continue;
  }
  i13 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i13 = _luaZ_fill(i13) | 0;
  } else {
   i27 = i13 + 4 | 0;
   i13 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i13 + 1;
   i13 = HEAPU8[i13] | 0;
  }
  HEAP32[i2 >> 2] = i13;
  if ((i13 | 0) != 45) {
   i2 = 45;
   i9 = 306;
   break;
  }
  i13 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i13 = _luaZ_fill(i13) | 0;
  } else {
   i27 = i13 + 4 | 0;
   i13 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i13 + 1;
   i13 = HEAPU8[i13] | 0;
  }
  HEAP32[i2 >> 2] = i13;
  do {
   if ((i13 | 0) == 91) {
    i13 = _skip_sep(i2) | 0;
    HEAP32[(HEAP32[i4 >> 2] | 0) + 4 >> 2] = 0;
    if ((i13 | 0) > -1) {
     _read_long_string(i2, 0, i13);
     HEAP32[(HEAP32[i4 >> 2] | 0) + 4 >> 2] = 0;
     continue L1;
    } else {
     i13 = HEAP32[i2 >> 2] | 0;
     break;
    }
   }
  } while (0);
  while (1) {
   if ((i13 | 0) == -1 | (i13 | 0) == 13 | (i13 | 0) == 10) {
    continue L1;
   }
   i13 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i13 >> 2] | 0;
   HEAP32[i13 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i13 = _luaZ_fill(i13) | 0;
   } else {
    i27 = i13 + 4 | 0;
    i13 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i13 + 1;
    i13 = HEAPU8[i13] | 0;
   }
   HEAP32[i2 >> 2] = i13;
  }
 }
 if ((i9 | 0) == 25) {
  i9 = _skip_sep(i2) | 0;
  if ((i9 | 0) > -1) {
   _read_long_string(i2, i3, i9);
   i27 = 289;
   STACKTOP = i1;
   return i27 | 0;
  }
  if ((i9 | 0) == -1) {
   i27 = 91;
   STACKTOP = i1;
   return i27 | 0;
  } else {
   _lexerror(i2, 12272, 289);
  }
 } else if ((i9 | 0) == 29) {
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  if ((i3 | 0) != 61) {
   i27 = 61;
   STACKTOP = i1;
   return i27 | 0;
  }
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i27 = 281;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 37) {
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  if ((i3 | 0) != 61) {
   i27 = 60;
   STACKTOP = i1;
   return i27 | 0;
  }
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i27 = 283;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 45) {
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  if ((i3 | 0) != 61) {
   i27 = 62;
   STACKTOP = i1;
   return i27 | 0;
  }
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i27 = 282;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 53) {
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  if ((i3 | 0) != 61) {
   i27 = 126;
   STACKTOP = i1;
   return i27 | 0;
  }
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i27 = 284;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 61) {
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  if ((i3 | 0) != 58) {
   i27 = 58;
   STACKTOP = i1;
   return i27 | 0;
  }
  i3 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i27 = i3 + 4 | 0;
   i3 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i27 = 285;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 69) {
  i14 = HEAP32[i4 >> 2] | 0;
  i7 = i14 + 4 | 0;
  i15 = HEAP32[i7 >> 2] | 0;
  i8 = i14 + 8 | 0;
  i6 = HEAP32[i8 >> 2] | 0;
  do {
   if ((i15 + 1 | 0) >>> 0 > i6 >>> 0) {
    if (i6 >>> 0 > 2147483645) {
     _lexerror(i2, 12368, 0);
    }
    i16 = i6 << 1;
    i15 = HEAP32[i2 + 52 >> 2] | 0;
    if ((i16 | 0) == -2) {
     _luaM_toobig(i15);
    } else {
     i24 = _luaM_realloc_(i15, HEAP32[i14 >> 2] | 0, i6, i16) | 0;
     HEAP32[i14 >> 2] = i24;
     HEAP32[i8 >> 2] = i16;
     i23 = HEAP32[i7 >> 2] | 0;
     break;
    }
   } else {
    i23 = i15;
    i24 = HEAP32[i14 >> 2] | 0;
   }
  } while (0);
  i6 = i13 & 255;
  HEAP32[i7 >> 2] = i23 + 1;
  HEAP8[i24 + i23 | 0] = i6;
  i7 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i7 >> 2] | 0;
  HEAP32[i7 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i14 = _luaZ_fill(i7) | 0;
  } else {
   i27 = i7 + 4 | 0;
   i14 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i14 + 1;
   i14 = HEAPU8[i14] | 0;
  }
  HEAP32[i2 >> 2] = i14;
  L139 : do {
   if ((i14 | 0) != (i13 | 0)) {
    i7 = i2 + 52 | 0;
    L141 : while (1) {
     L143 : do {
      if ((i14 | 0) == 92) {
       i8 = HEAP32[i5 >> 2] | 0;
       i27 = HEAP32[i8 >> 2] | 0;
       HEAP32[i8 >> 2] = i27 + -1;
       if ((i27 | 0) == 0) {
        i8 = _luaZ_fill(i8) | 0;
       } else {
        i27 = i8 + 4 | 0;
        i8 = HEAP32[i27 >> 2] | 0;
        HEAP32[i27 >> 2] = i8 + 1;
        i8 = HEAPU8[i8] | 0;
       }
       HEAP32[i2 >> 2] = i8;
       switch (i8 | 0) {
       case 13:
       case 10:
        {
         _inclinenumber(i2);
         i8 = 10;
         break;
        }
       case 39:
       case 34:
       case 92:
        {
         i9 = 124;
         break;
        }
       case 122:
        {
         i8 = HEAP32[i5 >> 2] | 0;
         i27 = HEAP32[i8 >> 2] | 0;
         HEAP32[i8 >> 2] = i27 + -1;
         if ((i27 | 0) == 0) {
          i14 = _luaZ_fill(i8) | 0;
         } else {
          i27 = i8 + 4 | 0;
          i14 = HEAP32[i27 >> 2] | 0;
          HEAP32[i27 >> 2] = i14 + 1;
          i14 = HEAPU8[i14] | 0;
         }
         HEAP32[i2 >> 2] = i14;
         if ((HEAP8[i14 + 10913 | 0] & 8) == 0) {
          break L143;
         }
         while (1) {
          if ((i14 | 0) == 13 | (i14 | 0) == 10) {
           _inclinenumber(i2);
           i14 = HEAP32[i2 >> 2] | 0;
          } else {
           i8 = HEAP32[i5 >> 2] | 0;
           i27 = HEAP32[i8 >> 2] | 0;
           HEAP32[i8 >> 2] = i27 + -1;
           if ((i27 | 0) == 0) {
            i14 = _luaZ_fill(i8) | 0;
           } else {
            i27 = i8 + 4 | 0;
            i14 = HEAP32[i27 >> 2] | 0;
            HEAP32[i27 >> 2] = i14 + 1;
            i14 = HEAPU8[i14] | 0;
           }
           HEAP32[i2 >> 2] = i14;
          }
          if ((HEAP8[i14 + 10913 | 0] & 8) == 0) {
           break L143;
          }
         }
        }
       case 118:
        {
         i8 = 11;
         i9 = 124;
         break;
        }
       case 120:
        {
         HEAP32[i12 >> 2] = 120;
         i14 = 1;
         i8 = 0;
         while (1) {
          i9 = HEAP32[i5 >> 2] | 0;
          i27 = HEAP32[i9 >> 2] | 0;
          HEAP32[i9 >> 2] = i27 + -1;
          if ((i27 | 0) == 0) {
           i9 = _luaZ_fill(i9) | 0;
          } else {
           i27 = i9 + 4 | 0;
           i9 = HEAP32[i27 >> 2] | 0;
           HEAP32[i27 >> 2] = i9 + 1;
           i9 = HEAPU8[i9] | 0;
          }
          HEAP32[i2 >> 2] = i9;
          HEAP32[i12 + (i14 << 2) >> 2] = i9;
          if ((HEAP8[i9 + 10913 | 0] & 16) == 0) {
           i9 = 100;
           break L141;
          }
          i8 = (_luaO_hexavalue(i9) | 0) + (i8 << 4) | 0;
          i14 = i14 + 1 | 0;
          if ((i14 | 0) >= 3) {
           i9 = 124;
           break;
          }
         }
         break;
        }
       case -1:
        {
         i14 = -1;
         break L143;
        }
       case 98:
        {
         i8 = 8;
         i9 = 124;
         break;
        }
       case 102:
        {
         i8 = 12;
         i9 = 124;
         break;
        }
       case 110:
        {
         i8 = 10;
         i9 = 124;
         break;
        }
       case 114:
        {
         i8 = 13;
         i9 = 124;
         break;
        }
       case 116:
        {
         i8 = 9;
         i9 = 124;
         break;
        }
       case 97:
        {
         i8 = 7;
         i9 = 124;
         break;
        }
       default:
        {
         if ((HEAP8[i8 + 10913 | 0] & 2) == 0) {
          i9 = 116;
          break L141;
         } else {
          i15 = i8;
          i14 = 0;
          i8 = 0;
         }
         do {
          if ((HEAP8[i15 + 10913 | 0] & 2) == 0) {
           break;
          }
          HEAP32[i12 + (i14 << 2) >> 2] = i15;
          i8 = i15 + -48 + (i8 * 10 | 0) | 0;
          i15 = HEAP32[i5 >> 2] | 0;
          i27 = HEAP32[i15 >> 2] | 0;
          HEAP32[i15 >> 2] = i27 + -1;
          if ((i27 | 0) == 0) {
           i15 = _luaZ_fill(i15) | 0;
          } else {
           i27 = i15 + 4 | 0;
           i15 = HEAP32[i27 >> 2] | 0;
           HEAP32[i27 >> 2] = i15 + 1;
           i15 = HEAPU8[i15] | 0;
          }
          HEAP32[i2 >> 2] = i15;
          i14 = i14 + 1 | 0;
         } while ((i14 | 0) < 3);
         if ((i8 | 0) > 255) {
          i9 = 123;
          break L141;
         }
        }
       }
       if ((i9 | 0) == 124) {
        i9 = 0;
        i14 = HEAP32[i5 >> 2] | 0;
        i27 = HEAP32[i14 >> 2] | 0;
        HEAP32[i14 >> 2] = i27 + -1;
        if ((i27 | 0) == 0) {
         i14 = _luaZ_fill(i14) | 0;
        } else {
         i27 = i14 + 4 | 0;
         i14 = HEAP32[i27 >> 2] | 0;
         HEAP32[i27 >> 2] = i14 + 1;
         i14 = HEAPU8[i14] | 0;
        }
        HEAP32[i2 >> 2] = i14;
       }
       i15 = HEAP32[i4 >> 2] | 0;
       i14 = i15 + 4 | 0;
       i18 = HEAP32[i14 >> 2] | 0;
       i16 = i15 + 8 | 0;
       i17 = HEAP32[i16 >> 2] | 0;
       if ((i18 + 1 | 0) >>> 0 > i17 >>> 0) {
        if (i17 >>> 0 > 2147483645) {
         i9 = 131;
         break L141;
        }
        i18 = i17 << 1;
        i19 = HEAP32[i7 >> 2] | 0;
        if ((i18 | 0) == -2) {
         i9 = 133;
         break L141;
        }
        i27 = _luaM_realloc_(i19, HEAP32[i15 >> 2] | 0, i17, i18) | 0;
        HEAP32[i15 >> 2] = i27;
        HEAP32[i16 >> 2] = i18;
        i18 = HEAP32[i14 >> 2] | 0;
        i15 = i27;
       } else {
        i15 = HEAP32[i15 >> 2] | 0;
       }
       HEAP32[i14 >> 2] = i18 + 1;
       HEAP8[i15 + i18 | 0] = i8;
       i14 = HEAP32[i2 >> 2] | 0;
      } else if ((i14 | 0) == -1) {
       i9 = 82;
       break L141;
      } else if ((i14 | 0) == 13 | (i14 | 0) == 10) {
       i9 = 83;
       break L141;
      } else {
       i15 = HEAP32[i4 >> 2] | 0;
       i8 = i15 + 4 | 0;
       i18 = HEAP32[i8 >> 2] | 0;
       i17 = i15 + 8 | 0;
       i16 = HEAP32[i17 >> 2] | 0;
       if ((i18 + 1 | 0) >>> 0 > i16 >>> 0) {
        if (i16 >>> 0 > 2147483645) {
         i9 = 139;
         break L141;
        }
        i19 = i16 << 1;
        i18 = HEAP32[i7 >> 2] | 0;
        if ((i19 | 0) == -2) {
         i9 = 141;
         break L141;
        }
        i27 = _luaM_realloc_(i18, HEAP32[i15 >> 2] | 0, i16, i19) | 0;
        HEAP32[i15 >> 2] = i27;
        HEAP32[i17 >> 2] = i19;
        i18 = HEAP32[i8 >> 2] | 0;
        i15 = i27;
       } else {
        i15 = HEAP32[i15 >> 2] | 0;
       }
       HEAP32[i8 >> 2] = i18 + 1;
       HEAP8[i15 + i18 | 0] = i14;
       i8 = HEAP32[i5 >> 2] | 0;
       i27 = HEAP32[i8 >> 2] | 0;
       HEAP32[i8 >> 2] = i27 + -1;
       if ((i27 | 0) == 0) {
        i14 = _luaZ_fill(i8) | 0;
       } else {
        i27 = i8 + 4 | 0;
        i14 = HEAP32[i27 >> 2] | 0;
        HEAP32[i27 >> 2] = i14 + 1;
        i14 = HEAPU8[i14] | 0;
       }
       HEAP32[i2 >> 2] = i14;
      }
     } while (0);
     if ((i14 | 0) == (i13 | 0)) {
      break L139;
     }
    }
    if ((i9 | 0) == 82) {
     _lexerror(i2, 12400, 286);
    } else if ((i9 | 0) == 83) {
     _lexerror(i2, 12400, 289);
    } else if ((i9 | 0) == 100) {
     _escerror(i2, i12, i14 + 1 | 0, 12480);
    } else if ((i9 | 0) == 116) {
     _escerror(i2, i2, 1, 12424);
    } else if ((i9 | 0) == 123) {
     _escerror(i2, i12, i14, 12448);
    } else if ((i9 | 0) == 131) {
     _lexerror(i2, 12368, 0);
    } else if ((i9 | 0) == 133) {
     _luaM_toobig(i19);
    } else if ((i9 | 0) == 139) {
     _lexerror(i2, 12368, 0);
    } else if ((i9 | 0) == 141) {
     _luaM_toobig(i18);
    }
   }
  } while (0);
  i7 = HEAP32[i4 >> 2] | 0;
  i8 = i7 + 4 | 0;
  i13 = HEAP32[i8 >> 2] | 0;
  i12 = i7 + 8 | 0;
  i9 = HEAP32[i12 >> 2] | 0;
  do {
   if ((i13 + 1 | 0) >>> 0 > i9 >>> 0) {
    if (i9 >>> 0 > 2147483645) {
     _lexerror(i2, 12368, 0);
    }
    i14 = i9 << 1;
    i13 = HEAP32[i2 + 52 >> 2] | 0;
    if ((i14 | 0) == -2) {
     _luaM_toobig(i13);
    } else {
     i11 = _luaM_realloc_(i13, HEAP32[i7 >> 2] | 0, i9, i14) | 0;
     HEAP32[i7 >> 2] = i11;
     HEAP32[i12 >> 2] = i14;
     i10 = HEAP32[i8 >> 2] | 0;
     break;
    }
   } else {
    i10 = i13;
    i11 = HEAP32[i7 >> 2] | 0;
   }
  } while (0);
  HEAP32[i8 >> 2] = i10 + 1;
  HEAP8[i11 + i10 | 0] = i6;
  i5 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i5 >> 2] | 0;
  HEAP32[i5 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i5 = _luaZ_fill(i5) | 0;
  } else {
   i27 = i5 + 4 | 0;
   i5 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i5 + 1;
   i5 = HEAPU8[i5] | 0;
  }
  HEAP32[i2 >> 2] = i5;
  i5 = HEAP32[i4 >> 2] | 0;
  i4 = HEAP32[i2 + 52 >> 2] | 0;
  i5 = _luaS_newlstr(i4, (HEAP32[i5 >> 2] | 0) + 1 | 0, (HEAP32[i5 + 4 >> 2] | 0) + -2 | 0) | 0;
  i6 = i4 + 8 | 0;
  i7 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i7 + 16;
  HEAP32[i7 >> 2] = i5;
  HEAP32[i7 + 8 >> 2] = HEAPU8[i5 + 4 | 0] | 64;
  i7 = _luaH_set(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 4 >> 2] | 0, (HEAP32[i6 >> 2] | 0) + -16 | 0) | 0;
  i2 = i7 + 8 | 0;
  if ((HEAP32[i2 >> 2] | 0) == 0 ? (HEAP32[i7 >> 2] = 1, HEAP32[i2 >> 2] = 1, (HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) : 0) {
   _luaC_step(i4);
  }
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + -16;
  HEAP32[i3 >> 2] = i5;
  i27 = 289;
  STACKTOP = i1;
  return i27 | 0;
 } else if ((i9 | 0) == 161) {
  i10 = HEAP32[i4 >> 2] | 0;
  i9 = i10 + 4 | 0;
  i13 = HEAP32[i9 >> 2] | 0;
  i12 = i10 + 8 | 0;
  i11 = HEAP32[i12 >> 2] | 0;
  do {
   if ((i13 + 1 | 0) >>> 0 > i11 >>> 0) {
    if (i11 >>> 0 > 2147483645) {
     _lexerror(i2, 12368, 0);
    }
    i13 = i11 << 1;
    i20 = HEAP32[i2 + 52 >> 2] | 0;
    if ((i13 | 0) == -2) {
     _luaM_toobig(i20);
    } else {
     i25 = _luaM_realloc_(i20, HEAP32[i10 >> 2] | 0, i11, i13) | 0;
     HEAP32[i10 >> 2] = i25;
     HEAP32[i12 >> 2] = i13;
     i26 = HEAP32[i9 >> 2] | 0;
     break;
    }
   } else {
    i26 = i13;
    i25 = HEAP32[i10 >> 2] | 0;
   }
  } while (0);
  HEAP32[i9 >> 2] = i26 + 1;
  HEAP8[i25 + i26 | 0] = 46;
  i9 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i9 >> 2] | 0;
  HEAP32[i9 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i20 = _luaZ_fill(i9) | 0;
  } else {
   i27 = i9 + 4 | 0;
   i20 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i20 + 1;
   i20 = HEAPU8[i20] | 0;
  }
  HEAP32[i2 >> 2] = i20;
  if ((i20 | 0) != 0 ? (_memchr(12304, i20, 2) | 0) != 0 : 0) {
   i6 = HEAP32[i4 >> 2] | 0;
   i3 = i6 + 4 | 0;
   i9 = HEAP32[i3 >> 2] | 0;
   i8 = i6 + 8 | 0;
   i7 = HEAP32[i8 >> 2] | 0;
   do {
    if ((i9 + 1 | 0) >>> 0 > i7 >>> 0) {
     if (i7 >>> 0 > 2147483645) {
      _lexerror(i2, 12368, 0);
     }
     i9 = i7 << 1;
     i10 = HEAP32[i2 + 52 >> 2] | 0;
     if ((i9 | 0) == -2) {
      _luaM_toobig(i10);
     } else {
      i21 = _luaM_realloc_(i10, HEAP32[i6 >> 2] | 0, i7, i9) | 0;
      HEAP32[i6 >> 2] = i21;
      HEAP32[i8 >> 2] = i9;
      i22 = HEAP32[i3 >> 2] | 0;
      break;
     }
    } else {
     i22 = i9;
     i21 = HEAP32[i6 >> 2] | 0;
    }
   } while (0);
   HEAP32[i3 >> 2] = i22 + 1;
   HEAP8[i21 + i22 | 0] = i20;
   i3 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i3 >> 2] | 0;
   HEAP32[i3 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i3 = _luaZ_fill(i3) | 0;
   } else {
    i27 = i3 + 4 | 0;
    i3 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i3 + 1;
    i3 = HEAPU8[i3] | 0;
   }
   HEAP32[i2 >> 2] = i3;
   if ((i3 | 0) == 0) {
    i27 = 279;
    STACKTOP = i1;
    return i27 | 0;
   }
   if ((_memchr(12304, i3, 2) | 0) == 0) {
    i27 = 279;
    STACKTOP = i1;
    return i27 | 0;
   }
   i6 = HEAP32[i4 >> 2] | 0;
   i7 = i6 + 4 | 0;
   i9 = HEAP32[i7 >> 2] | 0;
   i8 = i6 + 8 | 0;
   i4 = HEAP32[i8 >> 2] | 0;
   do {
    if ((i9 + 1 | 0) >>> 0 > i4 >>> 0) {
     if (i4 >>> 0 > 2147483645) {
      _lexerror(i2, 12368, 0);
     }
     i10 = i4 << 1;
     i9 = HEAP32[i2 + 52 >> 2] | 0;
     if ((i10 | 0) == -2) {
      _luaM_toobig(i9);
     } else {
      i18 = _luaM_realloc_(i9, HEAP32[i6 >> 2] | 0, i4, i10) | 0;
      HEAP32[i6 >> 2] = i18;
      HEAP32[i8 >> 2] = i10;
      i19 = HEAP32[i7 >> 2] | 0;
      break;
     }
    } else {
     i19 = i9;
     i18 = HEAP32[i6 >> 2] | 0;
    }
   } while (0);
   HEAP32[i7 >> 2] = i19 + 1;
   HEAP8[i18 + i19 | 0] = i3;
   i3 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i3 >> 2] | 0;
   HEAP32[i3 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i3 = _luaZ_fill(i3) | 0;
   } else {
    i27 = i3 + 4 | 0;
    i3 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i3 + 1;
    i3 = HEAPU8[i3] | 0;
   }
   HEAP32[i2 >> 2] = i3;
   i27 = 280;
   STACKTOP = i1;
   return i27 | 0;
  }
  if ((HEAP8[i20 + 10913 | 0] & 2) == 0) {
   i27 = 46;
   STACKTOP = i1;
   return i27 | 0;
  }
 } else if ((i9 | 0) == 283) {
  if ((HEAP8[i13 + 10913 | 0] & 1) == 0) {
   i3 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i3 >> 2] | 0;
   HEAP32[i3 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i3 = _luaZ_fill(i3) | 0;
   } else {
    i27 = i3 + 4 | 0;
    i3 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i3 + 1;
    i3 = HEAPU8[i3] | 0;
   }
   HEAP32[i2 >> 2] = i3;
   i27 = i13;
   STACKTOP = i1;
   return i27 | 0;
  }
  i10 = i2 + 52 | 0;
  while (1) {
   i11 = HEAP32[i4 >> 2] | 0;
   i9 = i11 + 4 | 0;
   i12 = HEAP32[i9 >> 2] | 0;
   i19 = i11 + 8 | 0;
   i18 = HEAP32[i19 >> 2] | 0;
   if ((i12 + 1 | 0) >>> 0 > i18 >>> 0) {
    if (i18 >>> 0 > 2147483645) {
     i9 = 288;
     break;
    }
    i21 = i18 << 1;
    i12 = HEAP32[i10 >> 2] | 0;
    if ((i21 | 0) == -2) {
     i9 = 290;
     break;
    }
    i27 = _luaM_realloc_(i12, HEAP32[i11 >> 2] | 0, i18, i21) | 0;
    HEAP32[i11 >> 2] = i27;
    HEAP32[i19 >> 2] = i21;
    i12 = HEAP32[i9 >> 2] | 0;
    i11 = i27;
   } else {
    i11 = HEAP32[i11 >> 2] | 0;
   }
   HEAP32[i9 >> 2] = i12 + 1;
   HEAP8[i11 + i12 | 0] = i13;
   i9 = HEAP32[i5 >> 2] | 0;
   i27 = HEAP32[i9 >> 2] | 0;
   HEAP32[i9 >> 2] = i27 + -1;
   if ((i27 | 0) == 0) {
    i13 = _luaZ_fill(i9) | 0;
   } else {
    i27 = i9 + 4 | 0;
    i13 = HEAP32[i27 >> 2] | 0;
    HEAP32[i27 >> 2] = i13 + 1;
    i13 = HEAPU8[i13] | 0;
   }
   HEAP32[i2 >> 2] = i13;
   if ((HEAP8[i13 + 10913 | 0] & 3) == 0) {
    i9 = 296;
    break;
   }
  }
  if ((i9 | 0) == 288) {
   _lexerror(i2, 12368, 0);
  } else if ((i9 | 0) == 290) {
   _luaM_toobig(i12);
  } else if ((i9 | 0) == 296) {
   i6 = HEAP32[i4 >> 2] | 0;
   i4 = HEAP32[i10 >> 2] | 0;
   i6 = _luaS_newlstr(i4, HEAP32[i6 >> 2] | 0, HEAP32[i6 + 4 >> 2] | 0) | 0;
   i7 = i4 + 8 | 0;
   i8 = HEAP32[i7 >> 2] | 0;
   HEAP32[i7 >> 2] = i8 + 16;
   HEAP32[i8 >> 2] = i6;
   i5 = i6 + 4 | 0;
   HEAP32[i8 + 8 >> 2] = HEAPU8[i5] | 64;
   i8 = _luaH_set(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 4 >> 2] | 0, (HEAP32[i7 >> 2] | 0) + -16 | 0) | 0;
   i2 = i8 + 8 | 0;
   if ((HEAP32[i2 >> 2] | 0) == 0 ? (HEAP32[i8 >> 2] = 1, HEAP32[i2 >> 2] = 1, (HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) : 0) {
    _luaC_step(i4);
   }
   HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + -16;
   HEAP32[i3 >> 2] = i6;
   if ((HEAP8[i5] | 0) != 4) {
    i27 = 288;
    STACKTOP = i1;
    return i27 | 0;
   }
   i2 = HEAP8[i6 + 6 | 0] | 0;
   if (i2 << 24 >> 24 == 0) {
    i27 = 288;
    STACKTOP = i1;
    return i27 | 0;
   }
   i27 = i2 & 255 | 256;
   STACKTOP = i1;
   return i27 | 0;
  }
 } else if ((i9 | 0) == 306) {
  STACKTOP = i1;
  return i2 | 0;
 }
 i9 = HEAP32[i4 >> 2] | 0;
 i12 = i9 + 4 | 0;
 i13 = HEAP32[i12 >> 2] | 0;
 i11 = i9 + 8 | 0;
 i10 = HEAP32[i11 >> 2] | 0;
 do {
  if ((i13 + 1 | 0) >>> 0 > i10 >>> 0) {
   if (i10 >>> 0 > 2147483645) {
    _lexerror(i2, 12368, 0);
   }
   i18 = i10 << 1;
   i13 = HEAP32[i2 + 52 >> 2] | 0;
   if ((i18 | 0) == -2) {
    _luaM_toobig(i13);
   } else {
    i16 = _luaM_realloc_(i13, HEAP32[i9 >> 2] | 0, i10, i18) | 0;
    HEAP32[i9 >> 2] = i16;
    HEAP32[i11 >> 2] = i18;
    i17 = HEAP32[i12 >> 2] | 0;
    break;
   }
  } else {
   i17 = i13;
   i16 = HEAP32[i9 >> 2] | 0;
  }
 } while (0);
 HEAP32[i12 >> 2] = i17 + 1;
 HEAP8[i16 + i17 | 0] = i20;
 i9 = HEAP32[i5 >> 2] | 0;
 i27 = HEAP32[i9 >> 2] | 0;
 HEAP32[i9 >> 2] = i27 + -1;
 if ((i27 | 0) == 0) {
  i9 = _luaZ_fill(i9) | 0;
 } else {
  i27 = i9 + 4 | 0;
  i9 = HEAP32[i27 >> 2] | 0;
  HEAP32[i27 >> 2] = i9 + 1;
  i9 = HEAPU8[i9] | 0;
 }
 HEAP32[i2 >> 2] = i9;
 if ((i20 | 0) == 48) {
  if ((i9 | 0) != 0) {
   if ((_memchr(12320, i9, 3) | 0) == 0) {
    i15 = i9;
    i9 = 12312;
   } else {
    i10 = HEAP32[i4 >> 2] | 0;
    i13 = i10 + 4 | 0;
    i16 = HEAP32[i13 >> 2] | 0;
    i11 = i10 + 8 | 0;
    i12 = HEAP32[i11 >> 2] | 0;
    do {
     if ((i16 + 1 | 0) >>> 0 > i12 >>> 0) {
      if (i12 >>> 0 > 2147483645) {
       _lexerror(i2, 12368, 0);
      }
      i17 = i12 << 1;
      i16 = HEAP32[i2 + 52 >> 2] | 0;
      if ((i17 | 0) == -2) {
       _luaM_toobig(i16);
      } else {
       i15 = _luaM_realloc_(i16, HEAP32[i10 >> 2] | 0, i12, i17) | 0;
       HEAP32[i10 >> 2] = i15;
       HEAP32[i11 >> 2] = i17;
       i14 = HEAP32[i13 >> 2] | 0;
       break;
      }
     } else {
      i14 = i16;
      i15 = HEAP32[i10 >> 2] | 0;
     }
    } while (0);
    HEAP32[i13 >> 2] = i14 + 1;
    HEAP8[i15 + i14 | 0] = i9;
    i9 = HEAP32[i5 >> 2] | 0;
    i27 = HEAP32[i9 >> 2] | 0;
    HEAP32[i9 >> 2] = i27 + -1;
    if ((i27 | 0) == 0) {
     i15 = _luaZ_fill(i9) | 0;
    } else {
     i27 = i9 + 4 | 0;
     i15 = HEAP32[i27 >> 2] | 0;
     HEAP32[i27 >> 2] = i15 + 1;
     i15 = HEAPU8[i15] | 0;
    }
    HEAP32[i2 >> 2] = i15;
    i9 = 12328;
   }
  } else {
   i15 = 0;
   i9 = 12312;
  }
 } else {
  i15 = i9;
  i9 = 12312;
 }
 i10 = i2 + 52 | 0;
 while (1) {
  if ((i15 | 0) != 0) {
   if ((_memchr(i9, i15, 3) | 0) != 0) {
    i12 = HEAP32[i4 >> 2] | 0;
    i11 = i12 + 4 | 0;
    i16 = HEAP32[i11 >> 2] | 0;
    i14 = i12 + 8 | 0;
    i13 = HEAP32[i14 >> 2] | 0;
    if ((i16 + 1 | 0) >>> 0 > i13 >>> 0) {
     if (i13 >>> 0 > 2147483645) {
      i9 = 227;
      break;
     }
     i17 = i13 << 1;
     i16 = HEAP32[i10 >> 2] | 0;
     if ((i17 | 0) == -2) {
      i9 = 229;
      break;
     }
     i27 = _luaM_realloc_(i16, HEAP32[i12 >> 2] | 0, i13, i17) | 0;
     HEAP32[i12 >> 2] = i27;
     HEAP32[i14 >> 2] = i17;
     i16 = HEAP32[i11 >> 2] | 0;
     i12 = i27;
    } else {
     i12 = HEAP32[i12 >> 2] | 0;
    }
    HEAP32[i11 >> 2] = i16 + 1;
    HEAP8[i12 + i16 | 0] = i15;
    i11 = HEAP32[i5 >> 2] | 0;
    i27 = HEAP32[i11 >> 2] | 0;
    HEAP32[i11 >> 2] = i27 + -1;
    if ((i27 | 0) == 0) {
     i15 = _luaZ_fill(i11) | 0;
    } else {
     i27 = i11 + 4 | 0;
     i15 = HEAP32[i27 >> 2] | 0;
     HEAP32[i27 >> 2] = i15 + 1;
     i15 = HEAPU8[i15] | 0;
    }
    HEAP32[i2 >> 2] = i15;
    if ((i15 | 0) != 0) {
     if ((_memchr(12336, i15, 3) | 0) != 0) {
      i12 = HEAP32[i4 >> 2] | 0;
      i11 = i12 + 4 | 0;
      i16 = HEAP32[i11 >> 2] | 0;
      i14 = i12 + 8 | 0;
      i13 = HEAP32[i14 >> 2] | 0;
      if ((i16 + 1 | 0) >>> 0 > i13 >>> 0) {
       if (i13 >>> 0 > 2147483645) {
        i9 = 239;
        break;
       }
       i17 = i13 << 1;
       i16 = HEAP32[i10 >> 2] | 0;
       if ((i17 | 0) == -2) {
        i9 = 241;
        break;
       }
       i27 = _luaM_realloc_(i16, HEAP32[i12 >> 2] | 0, i13, i17) | 0;
       HEAP32[i12 >> 2] = i27;
       HEAP32[i14 >> 2] = i17;
       i16 = HEAP32[i11 >> 2] | 0;
       i12 = i27;
      } else {
       i12 = HEAP32[i12 >> 2] | 0;
      }
      HEAP32[i11 >> 2] = i16 + 1;
      HEAP8[i12 + i16 | 0] = i15;
      i11 = HEAP32[i5 >> 2] | 0;
      i27 = HEAP32[i11 >> 2] | 0;
      HEAP32[i11 >> 2] = i27 + -1;
      if ((i27 | 0) == 0) {
       i15 = _luaZ_fill(i11) | 0;
      } else {
       i27 = i11 + 4 | 0;
       i15 = HEAP32[i27 >> 2] | 0;
       HEAP32[i27 >> 2] = i15 + 1;
       i15 = HEAPU8[i15] | 0;
      }
      HEAP32[i2 >> 2] = i15;
     }
    } else {
     i15 = 0;
    }
   }
  } else {
   i15 = 0;
  }
  i12 = HEAP32[i4 >> 2] | 0;
  i11 = i12 + 4 | 0;
  i17 = HEAP32[i11 >> 2] | 0;
  i14 = i12 + 8 | 0;
  i13 = HEAP32[i14 >> 2] | 0;
  i16 = (i17 + 1 | 0) >>> 0 > i13 >>> 0;
  if (!((HEAP8[i15 + 10913 | 0] & 16) != 0 | (i15 | 0) == 46)) {
   i9 = 259;
   break;
  }
  if (i16) {
   if (i13 >>> 0 > 2147483645) {
    i9 = 251;
    break;
   }
   i17 = i13 << 1;
   i16 = HEAP32[i10 >> 2] | 0;
   if ((i17 | 0) == -2) {
    i9 = 253;
    break;
   }
   i27 = _luaM_realloc_(i16, HEAP32[i12 >> 2] | 0, i13, i17) | 0;
   HEAP32[i12 >> 2] = i27;
   HEAP32[i14 >> 2] = i17;
   i17 = HEAP32[i11 >> 2] | 0;
   i12 = i27;
  } else {
   i12 = HEAP32[i12 >> 2] | 0;
  }
  HEAP32[i11 >> 2] = i17 + 1;
  HEAP8[i12 + i17 | 0] = i15;
  i11 = HEAP32[i5 >> 2] | 0;
  i27 = HEAP32[i11 >> 2] | 0;
  HEAP32[i11 >> 2] = i27 + -1;
  if ((i27 | 0) == 0) {
   i15 = _luaZ_fill(i11) | 0;
  } else {
   i27 = i11 + 4 | 0;
   i15 = HEAP32[i27 >> 2] | 0;
   HEAP32[i27 >> 2] = i15 + 1;
   i15 = HEAPU8[i15] | 0;
  }
  HEAP32[i2 >> 2] = i15;
 }
 if ((i9 | 0) == 227) {
  _lexerror(i2, 12368, 0);
 } else if ((i9 | 0) == 229) {
  _luaM_toobig(i16);
 } else if ((i9 | 0) == 239) {
  _lexerror(i2, 12368, 0);
 } else if ((i9 | 0) == 241) {
  _luaM_toobig(i16);
 } else if ((i9 | 0) == 251) {
  _lexerror(i2, 12368, 0);
 } else if ((i9 | 0) == 253) {
  _luaM_toobig(i16);
 } else if ((i9 | 0) == 259) {
  do {
   if (i16) {
    if (i13 >>> 0 > 2147483645) {
     _lexerror(i2, 12368, 0);
    }
    i5 = i13 << 1;
    i9 = HEAP32[i10 >> 2] | 0;
    if ((i5 | 0) == -2) {
     _luaM_toobig(i9);
    } else {
     i7 = _luaM_realloc_(i9, HEAP32[i12 >> 2] | 0, i13, i5) | 0;
     HEAP32[i12 >> 2] = i7;
     HEAP32[i14 >> 2] = i5;
     i8 = HEAP32[i11 >> 2] | 0;
     break;
    }
   } else {
    i8 = i17;
    i7 = HEAP32[i12 >> 2] | 0;
   }
  } while (0);
  HEAP32[i11 >> 2] = i8 + 1;
  HEAP8[i7 + i8 | 0] = 0;
  i5 = i2 + 76 | 0;
  i7 = HEAP8[i5] | 0;
  i10 = HEAP32[i4 >> 2] | 0;
  i8 = HEAP32[i10 >> 2] | 0;
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if ((i10 | 0) == 0) {
   i7 = -1;
  } else {
   do {
    i10 = i10 + -1 | 0;
    i9 = i8 + i10 | 0;
    if ((HEAP8[i9] | 0) == 46) {
     HEAP8[i9] = i7;
    }
   } while ((i10 | 0) != 0);
   i7 = HEAP32[i4 >> 2] | 0;
   i8 = HEAP32[i7 >> 2] | 0;
   i7 = (HEAP32[i7 + 4 >> 2] | 0) + -1 | 0;
  }
  if ((_luaO_str2d(i8, i7, i3) | 0) != 0) {
   i27 = 287;
   STACKTOP = i1;
   return i27 | 0;
  }
  i9 = HEAP8[i5] | 0;
  i8 = HEAP8[HEAP32[(_localeconv() | 0) >> 2] | 0] | 0;
  HEAP8[i5] = i8;
  i10 = HEAP32[i4 >> 2] | 0;
  i7 = HEAP32[i10 >> 2] | 0;
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if ((i10 | 0) == 0) {
   i8 = -1;
  } else {
   do {
    i10 = i10 + -1 | 0;
    i11 = i7 + i10 | 0;
    if ((HEAP8[i11] | 0) == i9 << 24 >> 24) {
     HEAP8[i11] = i8;
    }
   } while ((i10 | 0) != 0);
   i8 = HEAP32[i4 >> 2] | 0;
   i7 = HEAP32[i8 >> 2] | 0;
   i8 = (HEAP32[i8 + 4 >> 2] | 0) + -1 | 0;
  }
  if ((_luaO_str2d(i7, i8, i3) | 0) != 0) {
   i27 = 287;
   STACKTOP = i1;
   return i27 | 0;
  }
  i1 = HEAP8[i5] | 0;
  i4 = HEAP32[i4 >> 2] | 0;
  i3 = HEAP32[i4 >> 2] | 0;
  i4 = HEAP32[i4 + 4 >> 2] | 0;
  if ((i4 | 0) == 0) {
   _lexerror(i2, 12344, 287);
  } else {
   i6 = i4;
  }
  do {
   i6 = i6 + -1 | 0;
   i4 = i3 + i6 | 0;
   if ((HEAP8[i4] | 0) == i1 << 24 >> 24) {
    HEAP8[i4] = 46;
   }
  } while ((i6 | 0) != 0);
  _lexerror(i2, 12344, 287);
 }
 return 0;
}
function _luaV_execute(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 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, 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, d37 = 0.0, d38 = 0.0, d39 = 0.0;
 i12 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i13 = i12 + 24 | 0;
 i10 = i12 + 16 | 0;
 i9 = i12 + 8 | 0;
 i8 = i12;
 i3 = i1 + 16 | 0;
 i4 = i1 + 40 | 0;
 i6 = i1 + 12 | 0;
 i5 = i1 + 8 | 0;
 i11 = i1 + 24 | 0;
 i17 = i1 + 48 | 0;
 i2 = i1 + 20 | 0;
 i16 = i1 + 6 | 0;
 i7 = i1 + 44 | 0;
 i19 = HEAP32[i3 >> 2] | 0;
 L1 : while (1) {
  i22 = HEAP32[HEAP32[i19 >> 2] >> 2] | 0;
  i18 = i22 + 12 | 0;
  i23 = HEAP32[(HEAP32[i18 >> 2] | 0) + 8 >> 2] | 0;
  i20 = i19 + 24 | 0;
  i21 = i19 + 28 | 0;
  i22 = i22 + 16 | 0;
  i24 = i19 + 4 | 0;
  i25 = HEAP32[i20 >> 2] | 0;
  L3 : while (1) {
   i28 = HEAP32[i21 >> 2] | 0;
   HEAP32[i21 >> 2] = i28 + 4;
   i28 = HEAP32[i28 >> 2] | 0;
   i27 = HEAP8[i4] | 0;
   do {
    if (!((i27 & 12) == 0)) {
     i26 = (HEAP32[i17 >> 2] | 0) + -1 | 0;
     HEAP32[i17 >> 2] = i26;
     i26 = (i26 | 0) == 0;
     if (!i26 ? (i27 & 4) == 0 : 0) {
      break;
     }
     i25 = HEAP32[i3 >> 2] | 0;
     i29 = i27 & 255;
     if ((i29 & 8 | 0) == 0 | i26 ^ 1) {
      i27 = 0;
     } else {
      HEAP32[i17 >> 2] = HEAP32[i7 >> 2];
      i27 = 1;
     }
     i26 = i25 + 18 | 0;
     i30 = HEAPU8[i26] | 0;
     if ((i30 & 128 | 0) == 0) {
      if (i27) {
       _luaD_hook(i1, 3, -1);
      }
      do {
       if ((i29 & 4 | 0) == 0) {
        i29 = i25 + 28 | 0;
       } else {
        i34 = HEAP32[(HEAP32[HEAP32[i25 >> 2] >> 2] | 0) + 12 >> 2] | 0;
        i29 = i25 + 28 | 0;
        i32 = HEAP32[i29 >> 2] | 0;
        i35 = HEAP32[i34 + 12 >> 2] | 0;
        i33 = (i32 - i35 >> 2) + -1 | 0;
        i34 = HEAP32[i34 + 20 >> 2] | 0;
        i31 = (i34 | 0) == 0;
        if (i31) {
         i30 = 0;
        } else {
         i30 = HEAP32[i34 + (i33 << 2) >> 2] | 0;
        }
        if ((i33 | 0) != 0 ? (i14 = HEAP32[i2 >> 2] | 0, i32 >>> 0 > i14 >>> 0) : 0) {
         if (i31) {
          i31 = 0;
         } else {
          i31 = HEAP32[i34 + ((i14 - i35 >> 2) + -1 << 2) >> 2] | 0;
         }
         if ((i30 | 0) == (i31 | 0)) {
          break;
         }
        }
        _luaD_hook(i1, 2, i30);
       }
      } while (0);
      HEAP32[i2 >> 2] = HEAP32[i29 >> 2];
      if ((HEAP8[i16] | 0) == 1) {
       i15 = 23;
       break L1;
      }
     } else {
      HEAP8[i26] = i30 & 127;
     }
     i25 = HEAP32[i20 >> 2] | 0;
    }
   } while (0);
   i26 = i28 >>> 6 & 255;
   i27 = i25 + (i26 << 4) | 0;
   switch (i28 & 63 | 0) {
   case 9:
    {
     i28 = HEAP32[i22 + (i28 >>> 23 << 2) >> 2] | 0;
     i35 = HEAP32[i28 + 8 >> 2] | 0;
     i33 = i27;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i36 = i35;
     HEAP32[i36 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i36 + 4 >> 2] = i34;
     i36 = i25 + (i26 << 4) + 8 | 0;
     HEAP32[i35 + 8 >> 2] = HEAP32[i36 >> 2];
     if ((HEAP32[i36 >> 2] & 64 | 0) == 0) {
      continue L3;
     }
     i26 = HEAP32[i27 >> 2] | 0;
     if ((HEAP8[i26 + 5 | 0] & 3) == 0) {
      continue L3;
     }
     if ((HEAP8[i28 + 5 | 0] & 4) == 0) {
      continue L3;
     }
     _luaC_barrier_(i1, i28, i26);
     continue L3;
    }
   case 10:
    {
     i26 = i28 >>> 23;
     if ((i26 & 256 | 0) == 0) {
      i26 = i25 + (i26 << 4) | 0;
     } else {
      i26 = i23 + ((i26 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i25 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i28 & 255) << 4) | 0;
     }
     _luaV_settable(i1, i27, i26, i25);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 17:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      d37 = +HEAPF64[i29 >> 3];
      d38 = +HEAPF64[i28 >> 3];
      HEAPF64[i27 >> 3] = d37 - d38 * +Math_floor(+(d37 / d38));
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 10);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 23:
    {
     if ((i26 | 0) != 0) {
      _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i26 + -1 << 4) | 0);
     }
     HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + ((i28 >>> 14) + -131071 << 2);
     continue L3;
    }
   case 24:
    {
     i27 = i28 >>> 23;
     if ((i27 & 256 | 0) == 0) {
      i27 = i25 + (i27 << 4) | 0;
     } else {
      i27 = i23 + ((i27 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i25 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i27 + 8 >> 2] | 0) == (HEAP32[i25 + 8 >> 2] | 0)) {
      i27 = (_luaV_equalobj_(i1, i27, i25) | 0) != 0;
     } else {
      i27 = 0;
     }
     i25 = HEAP32[i21 >> 2] | 0;
     if ((i27 & 1 | 0) == (i26 | 0)) {
      i26 = HEAP32[i25 >> 2] | 0;
      i27 = i26 >>> 6 & 255;
      if ((i27 | 0) != 0) {
       _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i27 + -1 << 4) | 0);
       i25 = HEAP32[i21 >> 2] | 0;
      }
      i25 = i25 + ((i26 >>> 14) + -131070 << 2) | 0;
     } else {
      i25 = i25 + 4 | 0;
     }
     HEAP32[i21 >> 2] = i25;
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 18:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      HEAPF64[i27 >> 3] = +Math_pow(+(+HEAPF64[i29 >> 3]), +(+HEAPF64[i28 >> 3]));
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 11);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 1:
    {
     i36 = i28 >>> 14;
     i33 = i23 + (i36 << 4) | 0;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i35 = i27;
     HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i35 + 4 >> 2] = i34;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i23 + (i36 << 4) + 8 >> 2];
     continue L3;
    }
   case 0:
    {
     i36 = i28 >>> 23;
     i33 = i25 + (i36 << 4) | 0;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i35 = i27;
     HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i35 + 4 >> 2] = i34;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i25 + (i36 << 4) + 8 >> 2];
     continue L3;
    }
   case 2:
    {
     i36 = HEAP32[i21 >> 2] | 0;
     HEAP32[i21 >> 2] = i36 + 4;
     i36 = (HEAP32[i36 >> 2] | 0) >>> 6;
     i33 = i23 + (i36 << 4) | 0;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i35 = i27;
     HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i35 + 4 >> 2] = i34;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i23 + (i36 << 4) + 8 >> 2];
     continue L3;
    }
   case 5:
    {
     i36 = HEAP32[(HEAP32[i22 + (i28 >>> 23 << 2) >> 2] | 0) + 8 >> 2] | 0;
     i33 = i36;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i35 = i27;
     HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i35 + 4 >> 2] = i34;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i36 + 8 >> 2];
     continue L3;
    }
   case 3:
    {
     HEAP32[i27 >> 2] = i28 >>> 23;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = 1;
     if ((i28 & 8372224 | 0) == 0) {
      continue L3;
     }
     HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + 4;
     continue L3;
    }
   case 7:
    {
     i26 = i28 >>> 14;
     if ((i26 & 256 | 0) == 0) {
      i26 = i25 + ((i26 & 511) << 4) | 0;
     } else {
      i26 = i23 + ((i26 & 255) << 4) | 0;
     }
     _luaV_gettable(i1, i25 + (i28 >>> 23 << 4) | 0, i26, i27);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 12:
    {
     i36 = i28 >>> 23;
     i29 = i25 + (i36 << 4) | 0;
     i26 = i26 + 1 | 0;
     i33 = i29;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i35 = i25 + (i26 << 4) | 0;
     HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i35 + 4 >> 2] = i34;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i25 + (i36 << 4) + 8 >> 2];
     i26 = i28 >>> 14;
     if ((i26 & 256 | 0) == 0) {
      i25 = i25 + ((i26 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i26 & 255) << 4) | 0;
     }
     _luaV_gettable(i1, i29, i25, i27);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 13:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      HEAPF64[i27 >> 3] = +HEAPF64[i29 >> 3] + +HEAPF64[i28 >> 3];
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 6);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 14:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      HEAPF64[i27 >> 3] = +HEAPF64[i29 >> 3] - +HEAPF64[i28 >> 3];
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 7);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 6:
    {
     i26 = i28 >>> 14;
     if ((i26 & 256 | 0) == 0) {
      i25 = i25 + ((i26 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i26 & 255) << 4) | 0;
     }
     _luaV_gettable(i1, HEAP32[(HEAP32[i22 + (i28 >>> 23 << 2) >> 2] | 0) + 8 >> 2] | 0, i25, i27);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 4:
    {
     i26 = i28 >>> 23;
     while (1) {
      HEAP32[i27 + 8 >> 2] = 0;
      if ((i26 | 0) == 0) {
       continue L3;
      } else {
       i26 = i26 + -1 | 0;
       i27 = i27 + 16 | 0;
      }
     }
    }
   case 8:
    {
     i27 = i28 >>> 23;
     if ((i27 & 256 | 0) == 0) {
      i27 = i25 + (i27 << 4) | 0;
     } else {
      i27 = i23 + ((i27 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i25 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i28 & 255) << 4) | 0;
     }
     _luaV_settable(i1, HEAP32[(HEAP32[i22 + (i26 << 2) >> 2] | 0) + 8 >> 2] | 0, i27, i25);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 11:
    {
     i29 = i28 >>> 23;
     i28 = i28 >>> 14 & 511;
     i30 = _luaH_new(i1) | 0;
     HEAP32[i27 >> 2] = i30;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = 69;
     if ((i28 | i29 | 0) != 0) {
      i36 = _luaO_fb2int(i29) | 0;
      _luaH_resize(i1, i30, i36, _luaO_fb2int(i28) | 0);
     }
     if ((HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) > 0) {
      HEAP32[i5 >> 2] = i25 + (i26 + 1 << 4);
      _luaC_step(i1);
      HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     }
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 19:
    {
     i36 = i28 >>> 23;
     i28 = i25 + (i36 << 4) | 0;
     if ((HEAP32[i25 + (i36 << 4) + 8 >> 2] | 0) == 3) {
      HEAPF64[i27 >> 3] = -+HEAPF64[i28 >> 3];
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     } else {
      _luaV_arith(i1, i27, i28, i28, 12);
      i25 = HEAP32[i20 >> 2] | 0;
      continue L3;
     }
    }
   case 15:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      HEAPF64[i27 >> 3] = +HEAPF64[i29 >> 3] * +HEAPF64[i28 >> 3];
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 8);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 16:
    {
     i29 = i28 >>> 23;
     if ((i29 & 256 | 0) == 0) {
      i29 = i25 + (i29 << 4) | 0;
     } else {
      i29 = i23 + ((i29 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i28 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i28 = i23 + ((i28 & 255) << 4) | 0;
     }
     if ((HEAP32[i29 + 8 >> 2] | 0) == 3 ? (HEAP32[i28 + 8 >> 2] | 0) == 3 : 0) {
      HEAPF64[i27 >> 3] = +HEAPF64[i29 >> 3] / +HEAPF64[i28 >> 3];
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
      continue L3;
     }
     _luaV_arith(i1, i27, i29, i28, 9);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 20:
    {
     i29 = i28 >>> 23;
     i28 = HEAP32[i25 + (i29 << 4) + 8 >> 2] | 0;
     if ((i28 | 0) != 0) {
      if ((i28 | 0) == 1) {
       i28 = (HEAP32[i25 + (i29 << 4) >> 2] | 0) == 0;
      } else {
       i28 = 0;
      }
     } else {
      i28 = 1;
     }
     HEAP32[i27 >> 2] = i28 & 1;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = 1;
     continue L3;
    }
   case 21:
    {
     _luaV_objlen(i1, i27, i25 + (i28 >>> 23 << 4) | 0);
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 22:
    {
     i27 = i28 >>> 23;
     i28 = i28 >>> 14 & 511;
     HEAP32[i5 >> 2] = i25 + (i28 + 1 << 4);
     _luaV_concat(i1, 1 - i27 + i28 | 0);
     i25 = HEAP32[i20 >> 2] | 0;
     i28 = i25 + (i27 << 4) | 0;
     i34 = i28;
     i35 = HEAP32[i34 + 4 >> 2] | 0;
     i36 = i25 + (i26 << 4) | 0;
     HEAP32[i36 >> 2] = HEAP32[i34 >> 2];
     HEAP32[i36 + 4 >> 2] = i35;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = HEAP32[i25 + (i27 << 4) + 8 >> 2];
     if ((HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) > 0) {
      if (!(i26 >>> 0 < i27 >>> 0)) {
       i28 = i25 + (i26 + 1 << 4) | 0;
      }
      HEAP32[i5 >> 2] = i28;
      _luaC_step(i1);
      HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     }
     i25 = HEAP32[i20 >> 2] | 0;
     HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     continue L3;
    }
   case 25:
    {
     i27 = i28 >>> 23;
     if ((i27 & 256 | 0) == 0) {
      i27 = i25 + (i27 << 4) | 0;
     } else {
      i27 = i23 + ((i27 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i25 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i28 & 255) << 4) | 0;
     }
     i36 = (_luaV_lessthan(i1, i27, i25) | 0) == (i26 | 0);
     i26 = HEAP32[i21 >> 2] | 0;
     if (i36) {
      i25 = HEAP32[i26 >> 2] | 0;
      i27 = i25 >>> 6 & 255;
      if ((i27 | 0) != 0) {
       _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i27 + -1 << 4) | 0);
       i26 = HEAP32[i21 >> 2] | 0;
      }
      i25 = i26 + ((i25 >>> 14) + -131070 << 2) | 0;
     } else {
      i25 = i26 + 4 | 0;
     }
     HEAP32[i21 >> 2] = i25;
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 27:
    {
     i29 = HEAP32[i25 + (i26 << 4) + 8 >> 2] | 0;
     i26 = (i29 | 0) == 0;
     if ((i28 & 8372224 | 0) == 0) {
      if (!i26) {
       if (!((i29 | 0) == 1 ? (HEAP32[i27 >> 2] | 0) == 0 : 0)) {
        i15 = 192;
       }
      }
     } else {
      if (!i26) {
       if ((i29 | 0) == 1 ? (HEAP32[i27 >> 2] | 0) == 0 : 0) {
        i15 = 192;
       }
      } else {
       i15 = 192;
      }
     }
     if ((i15 | 0) == 192) {
      i15 = 0;
      HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + 4;
      continue L3;
     }
     i27 = HEAP32[i21 >> 2] | 0;
     i26 = HEAP32[i27 >> 2] | 0;
     i28 = i26 >>> 6 & 255;
     if ((i28 | 0) != 0) {
      _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i28 + -1 << 4) | 0);
      i27 = HEAP32[i21 >> 2] | 0;
     }
     HEAP32[i21 >> 2] = i27 + ((i26 >>> 14) + -131070 << 2);
     continue L3;
    }
   case 26:
    {
     i27 = i28 >>> 23;
     if ((i27 & 256 | 0) == 0) {
      i27 = i25 + (i27 << 4) | 0;
     } else {
      i27 = i23 + ((i27 & 255) << 4) | 0;
     }
     i28 = i28 >>> 14;
     if ((i28 & 256 | 0) == 0) {
      i25 = i25 + ((i28 & 511) << 4) | 0;
     } else {
      i25 = i23 + ((i28 & 255) << 4) | 0;
     }
     i36 = (_luaV_lessequal(i1, i27, i25) | 0) == (i26 | 0);
     i26 = HEAP32[i21 >> 2] | 0;
     if (i36) {
      i25 = HEAP32[i26 >> 2] | 0;
      i27 = i25 >>> 6 & 255;
      if ((i27 | 0) != 0) {
       _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i27 + -1 << 4) | 0);
       i26 = HEAP32[i21 >> 2] | 0;
      }
      i25 = i26 + ((i25 >>> 14) + -131070 << 2) | 0;
     } else {
      i25 = i26 + 4 | 0;
     }
     HEAP32[i21 >> 2] = i25;
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 28:
    {
     i30 = i28 >>> 23;
     i29 = i25 + (i30 << 4) | 0;
     i30 = HEAP32[i25 + (i30 << 4) + 8 >> 2] | 0;
     i31 = (i30 | 0) == 0;
     if ((i28 & 8372224 | 0) == 0) {
      if (!i31) {
       if (!((i30 | 0) == 1 ? (HEAP32[i29 >> 2] | 0) == 0 : 0)) {
        i15 = 203;
       }
      }
     } else {
      if (!i31) {
       if ((i30 | 0) == 1 ? (HEAP32[i29 >> 2] | 0) == 0 : 0) {
        i15 = 203;
       }
      } else {
       i15 = 203;
      }
     }
     if ((i15 | 0) == 203) {
      i15 = 0;
      HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + 4;
      continue L3;
     }
     i36 = i29;
     i28 = HEAP32[i36 + 4 >> 2] | 0;
     HEAP32[i27 >> 2] = HEAP32[i36 >> 2];
     HEAP32[i27 + 4 >> 2] = i28;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = i30;
     i27 = HEAP32[i21 >> 2] | 0;
     i26 = HEAP32[i27 >> 2] | 0;
     i28 = i26 >>> 6 & 255;
     if ((i28 | 0) != 0) {
      _luaF_close(i1, (HEAP32[i20 >> 2] | 0) + (i28 + -1 << 4) | 0);
      i27 = HEAP32[i21 >> 2] | 0;
     }
     HEAP32[i21 >> 2] = i27 + ((i26 >>> 14) + -131070 << 2);
     continue L3;
    }
   case 30:
    {
     i28 = i28 >>> 23;
     if ((i28 | 0) != 0) {
      HEAP32[i5 >> 2] = i25 + (i26 + i28 << 4);
     }
     if ((_luaD_precall(i1, i27, -1) | 0) == 0) {
      i15 = 218;
      break L3;
     }
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 29:
    {
     i29 = i28 >>> 23;
     i28 = i28 >>> 14 & 511;
     if ((i29 | 0) != 0) {
      HEAP32[i5 >> 2] = i25 + (i26 + i29 << 4);
     }
     if ((_luaD_precall(i1, i27, i28 + -1 | 0) | 0) == 0) {
      i15 = 213;
      break L3;
     }
     if ((i28 | 0) != 0) {
      HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     }
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 32:
    {
     d39 = +HEAPF64[i25 + (i26 + 2 << 4) >> 3];
     d38 = d39 + +HEAPF64[i27 >> 3];
     d37 = +HEAPF64[i25 + (i26 + 1 << 4) >> 3];
     if (d39 > 0.0) {
      if (!(d38 <= d37)) {
       continue L3;
      }
     } else {
      if (!(d37 <= d38)) {
       continue L3;
      }
     }
     HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + ((i28 >>> 14) + -131071 << 2);
     HEAPF64[i27 >> 3] = d38;
     HEAP32[i25 + (i26 << 4) + 8 >> 2] = 3;
     i36 = i26 + 3 | 0;
     HEAPF64[i25 + (i36 << 4) >> 3] = d38;
     HEAP32[i25 + (i36 << 4) + 8 >> 2] = 3;
     continue L3;
    }
   case 33:
    {
     i32 = i26 + 1 | 0;
     i30 = i25 + (i32 << 4) | 0;
     i31 = i26 + 2 | 0;
     i29 = i25 + (i31 << 4) | 0;
     i26 = i25 + (i26 << 4) + 8 | 0;
     i33 = HEAP32[i26 >> 2] | 0;
     if ((i33 | 0) != 3) {
      if ((i33 & 15 | 0) != 4) {
       i15 = 239;
       break L1;
      }
      i36 = HEAP32[i27 >> 2] | 0;
      if ((_luaO_str2d(i36 + 16 | 0, HEAP32[i36 + 12 >> 2] | 0, i8) | 0) == 0) {
       i15 = 239;
       break L1;
      }
      HEAPF64[i27 >> 3] = +HEAPF64[i8 >> 3];
      HEAP32[i26 >> 2] = 3;
      if ((i27 | 0) == 0) {
       i15 = 239;
       break L1;
      }
     }
     i33 = i25 + (i32 << 4) + 8 | 0;
     i32 = HEAP32[i33 >> 2] | 0;
     if ((i32 | 0) != 3) {
      if ((i32 & 15 | 0) != 4) {
       i15 = 244;
       break L1;
      }
      i36 = HEAP32[i30 >> 2] | 0;
      if ((_luaO_str2d(i36 + 16 | 0, HEAP32[i36 + 12 >> 2] | 0, i9) | 0) == 0) {
       i15 = 244;
       break L1;
      }
      HEAPF64[i30 >> 3] = +HEAPF64[i9 >> 3];
      HEAP32[i33 >> 2] = 3;
     }
     i31 = i25 + (i31 << 4) + 8 | 0;
     i30 = HEAP32[i31 >> 2] | 0;
     if ((i30 | 0) != 3) {
      if ((i30 & 15 | 0) != 4) {
       i15 = 249;
       break L1;
      }
      i36 = HEAP32[i29 >> 2] | 0;
      if ((_luaO_str2d(i36 + 16 | 0, HEAP32[i36 + 12 >> 2] | 0, i10) | 0) == 0) {
       i15 = 249;
       break L1;
      }
      HEAPF64[i29 >> 3] = +HEAPF64[i10 >> 3];
      HEAP32[i31 >> 2] = 3;
     }
     HEAPF64[i27 >> 3] = +HEAPF64[i27 >> 3] - +HEAPF64[i29 >> 3];
     HEAP32[i26 >> 2] = 3;
     HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + ((i28 >>> 14) + -131071 << 2);
     continue L3;
    }
   case 31:
    {
     i15 = 223;
     break L3;
    }
   case 34:
    {
     i35 = i26 + 3 | 0;
     i36 = i25 + (i35 << 4) | 0;
     i33 = i26 + 2 | 0;
     i34 = i26 + 5 | 0;
     i32 = i25 + (i33 << 4) | 0;
     i31 = HEAP32[i32 + 4 >> 2] | 0;
     i30 = i25 + (i34 << 4) | 0;
     HEAP32[i30 >> 2] = HEAP32[i32 >> 2];
     HEAP32[i30 + 4 >> 2] = i31;
     HEAP32[i25 + (i34 << 4) + 8 >> 2] = HEAP32[i25 + (i33 << 4) + 8 >> 2];
     i34 = i26 + 1 | 0;
     i33 = i26 + 4 | 0;
     i30 = i25 + (i34 << 4) | 0;
     i31 = HEAP32[i30 + 4 >> 2] | 0;
     i32 = i25 + (i33 << 4) | 0;
     HEAP32[i32 >> 2] = HEAP32[i30 >> 2];
     HEAP32[i32 + 4 >> 2] = i31;
     HEAP32[i25 + (i33 << 4) + 8 >> 2] = HEAP32[i25 + (i34 << 4) + 8 >> 2];
     i33 = i27;
     i34 = HEAP32[i33 + 4 >> 2] | 0;
     i27 = i36;
     HEAP32[i27 >> 2] = HEAP32[i33 >> 2];
     HEAP32[i27 + 4 >> 2] = i34;
     HEAP32[i25 + (i35 << 4) + 8 >> 2] = HEAP32[i25 + (i26 << 4) + 8 >> 2];
     HEAP32[i5 >> 2] = i25 + (i26 + 6 << 4);
     _luaD_call(i1, i36, i28 >>> 14 & 511, 1);
     i36 = HEAP32[i20 >> 2] | 0;
     HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     i27 = HEAP32[i21 >> 2] | 0;
     HEAP32[i21 >> 2] = i27 + 4;
     i27 = HEAP32[i27 >> 2] | 0;
     i25 = i36;
     i28 = i27;
     i27 = i36 + ((i27 >>> 6 & 255) << 4) | 0;
     break;
    }
   case 35:
    {
     break;
    }
   case 36:
    {
     i29 = i28 >>> 23;
     i28 = i28 >>> 14 & 511;
     if ((i29 | 0) == 0) {
      i29 = ((HEAP32[i5 >> 2] | 0) - i27 >> 4) + -1 | 0;
     }
     if ((i28 | 0) == 0) {
      i28 = HEAP32[i21 >> 2] | 0;
      HEAP32[i21 >> 2] = i28 + 4;
      i28 = (HEAP32[i28 >> 2] | 0) >>> 6;
     }
     i27 = HEAP32[i27 >> 2] | 0;
     i30 = i29 + -50 + (i28 * 50 | 0) | 0;
     if ((i30 | 0) > (HEAP32[i27 + 28 >> 2] | 0)) {
      _luaH_resizearray(i1, i27, i30);
     }
     if ((i29 | 0) > 0) {
      i28 = i27 + 5 | 0;
      while (1) {
       i36 = i29 + i26 | 0;
       i32 = i25 + (i36 << 4) | 0;
       i31 = i30 + -1 | 0;
       _luaH_setint(i1, i27, i30, i32);
       if (((HEAP32[i25 + (i36 << 4) + 8 >> 2] & 64 | 0) != 0 ? !((HEAP8[(HEAP32[i32 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) ? !((HEAP8[i28] & 4) == 0) : 0) {
        _luaC_barrierback_(i1, i27);
       }
       i29 = i29 + -1 | 0;
       if ((i29 | 0) > 0) {
        i30 = i31;
       } else {
        break;
       }
      }
     }
     HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     continue L3;
    }
   case 37:
    {
     i29 = HEAP32[(HEAP32[(HEAP32[i18 >> 2] | 0) + 16 >> 2] | 0) + (i28 >>> 14 << 2) >> 2] | 0;
     i28 = i29 + 32 | 0;
     i33 = HEAP32[i28 >> 2] | 0;
     i30 = HEAP32[i29 + 40 >> 2] | 0;
     i31 = HEAP32[i29 + 28 >> 2] | 0;
     L323 : do {
      if ((i33 | 0) == 0) {
       i15 = 276;
      } else {
       if ((i30 | 0) > 0) {
        i34 = i33 + 16 | 0;
        i32 = 0;
        while (1) {
         i35 = HEAPU8[i31 + (i32 << 3) + 5 | 0] | 0;
         if ((HEAP8[i31 + (i32 << 3) + 4 | 0] | 0) == 0) {
          i36 = HEAP32[(HEAP32[i22 + (i35 << 2) >> 2] | 0) + 8 >> 2] | 0;
         } else {
          i36 = i25 + (i35 << 4) | 0;
         }
         i35 = i32 + 1 | 0;
         if ((HEAP32[(HEAP32[i34 + (i32 << 2) >> 2] | 0) + 8 >> 2] | 0) != (i36 | 0)) {
          i15 = 276;
          break L323;
         }
         if ((i35 | 0) < (i30 | 0)) {
          i32 = i35;
         } else {
          break;
         }
        }
       }
       HEAP32[i27 >> 2] = i33;
       HEAP32[i25 + (i26 << 4) + 8 >> 2] = 70;
      }
     } while (0);
     if ((i15 | 0) == 276) {
      i15 = 0;
      i32 = _luaF_newLclosure(i1, i30) | 0;
      HEAP32[i32 + 12 >> 2] = i29;
      HEAP32[i27 >> 2] = i32;
      HEAP32[i25 + (i26 << 4) + 8 >> 2] = 70;
      if ((i30 | 0) > 0) {
       i27 = i32 + 16 | 0;
       i34 = 0;
       do {
        i33 = HEAPU8[i31 + (i34 << 3) + 5 | 0] | 0;
        if ((HEAP8[i31 + (i34 << 3) + 4 | 0] | 0) == 0) {
         HEAP32[i27 + (i34 << 2) >> 2] = HEAP32[i22 + (i33 << 2) >> 2];
        } else {
         HEAP32[i27 + (i34 << 2) >> 2] = _luaF_findupval(i1, i25 + (i33 << 4) | 0) | 0;
        }
        i34 = i34 + 1 | 0;
       } while ((i34 | 0) != (i30 | 0));
      }
      if (!((HEAP8[i29 + 5 | 0] & 4) == 0)) {
       _luaC_barrierproto_(i1, i29, i32);
      }
      HEAP32[i28 >> 2] = i32;
     }
     if ((HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) > 0) {
      HEAP32[i5 >> 2] = i25 + (i26 + 1 << 4);
      _luaC_step(i1);
      HEAP32[i5 >> 2] = HEAP32[i24 >> 2];
     }
     i25 = HEAP32[i20 >> 2] | 0;
     continue L3;
    }
   case 38:
    {
     i36 = i28 >>> 23;
     i29 = i36 + -1 | 0;
     i30 = (i25 - (HEAP32[i19 >> 2] | 0) >> 4) - (HEAPU8[(HEAP32[i18 >> 2] | 0) + 76 | 0] | 0) | 0;
     i28 = i30 + -1 | 0;
     if ((i36 | 0) == 0) {
      if (((HEAP32[i11 >> 2] | 0) - (HEAP32[i5 >> 2] | 0) >> 4 | 0) <= (i28 | 0)) {
       _luaD_growstack(i1, i28);
      }
      i27 = HEAP32[i20 >> 2] | 0;
      HEAP32[i5 >> 2] = i27 + (i28 + i26 << 4);
      i29 = i28;
      i25 = i27;
      i27 = i27 + (i26 << 4) | 0;
     }
     if ((i29 | 0) <= 0) {
      continue L3;
     }
     i26 = 1 - i30 | 0;
     i30 = 0;
     while (1) {
      if ((i30 | 0) < (i28 | 0)) {
       i36 = i30 + i26 | 0;
       i33 = i25 + (i36 << 4) | 0;
       i34 = HEAP32[i33 + 4 >> 2] | 0;
       i35 = i27 + (i30 << 4) | 0;
       HEAP32[i35 >> 2] = HEAP32[i33 >> 2];
       HEAP32[i35 + 4 >> 2] = i34;
       HEAP32[i27 + (i30 << 4) + 8 >> 2] = HEAP32[i25 + (i36 << 4) + 8 >> 2];
      } else {
       HEAP32[i27 + (i30 << 4) + 8 >> 2] = 0;
      }
      i30 = i30 + 1 | 0;
      if ((i30 | 0) == (i29 | 0)) {
       continue L3;
      }
     }
    }
   default:
    {
     continue L3;
    }
   }
   i26 = HEAP32[i27 + 24 >> 2] | 0;
   if ((i26 | 0) == 0) {
    continue;
   }
   i34 = i27 + 16 | 0;
   i35 = HEAP32[i34 + 4 >> 2] | 0;
   i36 = i27;
   HEAP32[i36 >> 2] = HEAP32[i34 >> 2];
   HEAP32[i36 + 4 >> 2] = i35;
   HEAP32[i27 + 8 >> 2] = i26;
   HEAP32[i21 >> 2] = (HEAP32[i21 >> 2] | 0) + ((i28 >>> 14) + -131071 << 2);
  }
  if ((i15 | 0) == 213) {
   i15 = 0;
   i19 = HEAP32[i3 >> 2] | 0;
   i36 = i19 + 18 | 0;
   HEAP8[i36] = HEAPU8[i36] | 4;
   continue;
  } else if ((i15 | 0) == 218) {
   i15 = 0;
   i22 = HEAP32[i3 >> 2] | 0;
   i19 = HEAP32[i22 + 8 >> 2] | 0;
   i23 = HEAP32[i22 >> 2] | 0;
   i24 = HEAP32[i19 >> 2] | 0;
   i20 = i22 + 24 | 0;
   i21 = (HEAP32[i20 >> 2] | 0) + (HEAPU8[(HEAP32[(HEAP32[i23 >> 2] | 0) + 12 >> 2] | 0) + 76 | 0] << 4) | 0;
   if ((HEAP32[(HEAP32[i18 >> 2] | 0) + 56 >> 2] | 0) > 0) {
    _luaF_close(i1, HEAP32[i19 + 24 >> 2] | 0);
   }
   if (i23 >>> 0 < i21 >>> 0) {
    i25 = i23;
    i18 = 0;
    do {
     i34 = i25;
     i35 = HEAP32[i34 + 4 >> 2] | 0;
     i36 = i24 + (i18 << 4) | 0;
     HEAP32[i36 >> 2] = HEAP32[i34 >> 2];
     HEAP32[i36 + 4 >> 2] = i35;
     HEAP32[i24 + (i18 << 4) + 8 >> 2] = HEAP32[i23 + (i18 << 4) + 8 >> 2];
     i18 = i18 + 1 | 0;
     i25 = i23 + (i18 << 4) | 0;
    } while (i25 >>> 0 < i21 >>> 0);
   }
   i36 = i23;
   HEAP32[i19 + 24 >> 2] = i24 + ((HEAP32[i20 >> 2] | 0) - i36 >> 4 << 4);
   i36 = i24 + ((HEAP32[i5 >> 2] | 0) - i36 >> 4 << 4) | 0;
   HEAP32[i5 >> 2] = i36;
   HEAP32[i19 + 4 >> 2] = i36;
   HEAP32[i19 + 28 >> 2] = HEAP32[i22 + 28 >> 2];
   i36 = i19 + 18 | 0;
   HEAP8[i36] = HEAPU8[i36] | 64;
   HEAP32[i3 >> 2] = i19;
   continue;
  } else if ((i15 | 0) == 223) {
   i15 = 0;
   i20 = i28 >>> 23;
   if ((i20 | 0) != 0) {
    HEAP32[i5 >> 2] = i25 + (i20 + -1 + i26 << 4);
   }
   if ((HEAP32[(HEAP32[i18 >> 2] | 0) + 56 >> 2] | 0) > 0) {
    _luaF_close(i1, i25);
   }
   i18 = _luaD_poscall(i1, i27) | 0;
   if ((HEAP8[i19 + 18 | 0] & 4) == 0) {
    i15 = 228;
    break;
   }
   i19 = HEAP32[i3 >> 2] | 0;
   if ((i18 | 0) == 0) {
    continue;
   }
   HEAP32[i5 >> 2] = HEAP32[i19 + 4 >> 2];
   continue;
  }
 }
 if ((i15 | 0) == 23) {
  if (!i27) {
   i36 = HEAP32[i29 >> 2] | 0;
   i36 = i36 + -4 | 0;
   HEAP32[i29 >> 2] = i36;
   i36 = HEAP8[i26] | 0;
   i36 = i36 & 255;
   i36 = i36 | 128;
   i36 = i36 & 255;
   HEAP8[i26] = i36;
   i36 = HEAP32[i5 >> 2] | 0;
   i36 = i36 + -16 | 0;
   HEAP32[i25 >> 2] = i36;
   _luaD_throw(i1, 1);
  }
  HEAP32[i17 >> 2] = 1;
  i36 = HEAP32[i29 >> 2] | 0;
  i36 = i36 + -4 | 0;
  HEAP32[i29 >> 2] = i36;
  i36 = HEAP8[i26] | 0;
  i36 = i36 & 255;
  i36 = i36 | 128;
  i36 = i36 & 255;
  HEAP8[i26] = i36;
  i36 = HEAP32[i5 >> 2] | 0;
  i36 = i36 + -16 | 0;
  HEAP32[i25 >> 2] = i36;
  _luaD_throw(i1, 1);
 } else if ((i15 | 0) == 228) {
  STACKTOP = i12;
  return;
 } else if ((i15 | 0) == 239) {
  _luaG_runerror(i1, 9040, i13);
 } else if ((i15 | 0) == 244) {
  _luaG_runerror(i1, 9080, i13);
 } else if ((i15 | 0) == 249) {
  _luaG_runerror(i1, 9112, i13);
 }
}
function ___floatscan(i8, i2, i11) {
 i8 = i8 | 0;
 i2 = i2 | 0;
 i11 = i11 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 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, d32 = 0.0, d33 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 512 | 0;
 i5 = i1;
 if ((i2 | 0) == 1) {
  i2 = 53;
  i3 = -1074;
 } else if ((i2 | 0) == 2) {
  i2 = 53;
  i3 = -1074;
 } else if ((i2 | 0) == 0) {
  i2 = 24;
  i3 = -149;
 } else {
  d31 = 0.0;
  STACKTOP = i1;
  return +d31;
 }
 i9 = i8 + 4 | 0;
 i10 = i8 + 100 | 0;
 do {
  i4 = HEAP32[i9 >> 2] | 0;
  if (i4 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
   HEAP32[i9 >> 2] = i4 + 1;
   i21 = HEAPU8[i4] | 0;
  } else {
   i21 = ___shgetc(i8) | 0;
  }
 } while ((_isspace(i21 | 0) | 0) != 0);
 do {
  if ((i21 | 0) == 43 | (i21 | 0) == 45) {
   i4 = 1 - (((i21 | 0) == 45) << 1) | 0;
   i7 = HEAP32[i9 >> 2] | 0;
   if (i7 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
    HEAP32[i9 >> 2] = i7 + 1;
    i21 = HEAPU8[i7] | 0;
    break;
   } else {
    i21 = ___shgetc(i8) | 0;
    break;
   }
  } else {
   i4 = 1;
  }
 } while (0);
 i7 = 0;
 do {
  if ((i21 | 32 | 0) != (HEAP8[13408 + i7 | 0] | 0)) {
   break;
  }
  do {
   if (i7 >>> 0 < 7) {
    i12 = HEAP32[i9 >> 2] | 0;
    if (i12 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
     HEAP32[i9 >> 2] = i12 + 1;
     i21 = HEAPU8[i12] | 0;
     break;
    } else {
     i21 = ___shgetc(i8) | 0;
     break;
    }
   }
  } while (0);
  i7 = i7 + 1 | 0;
 } while (i7 >>> 0 < 8);
 do {
  if ((i7 | 0) == 3) {
   i13 = 23;
  } else if ((i7 | 0) != 8) {
   i12 = (i11 | 0) == 0;
   if (!(i7 >>> 0 < 4 | i12)) {
    if ((i7 | 0) == 8) {
     break;
    } else {
     i13 = 23;
     break;
    }
   }
   L34 : do {
    if ((i7 | 0) == 0) {
     i7 = 0;
     do {
      if ((i21 | 32 | 0) != (HEAP8[13424 + i7 | 0] | 0)) {
       break L34;
      }
      do {
       if (i7 >>> 0 < 2) {
        i15 = HEAP32[i9 >> 2] | 0;
        if (i15 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
         HEAP32[i9 >> 2] = i15 + 1;
         i21 = HEAPU8[i15] | 0;
         break;
        } else {
         i21 = ___shgetc(i8) | 0;
         break;
        }
       }
      } while (0);
      i7 = i7 + 1 | 0;
     } while (i7 >>> 0 < 3);
    }
   } while (0);
   if ((i7 | 0) == 0) {
    do {
     if ((i21 | 0) == 48) {
      i7 = HEAP32[i9 >> 2] | 0;
      if (i7 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
       HEAP32[i9 >> 2] = i7 + 1;
       i7 = HEAPU8[i7] | 0;
      } else {
       i7 = ___shgetc(i8) | 0;
      }
      if ((i7 | 32 | 0) != 120) {
       if ((HEAP32[i10 >> 2] | 0) == 0) {
        i21 = 48;
        break;
       }
       HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
       i21 = 48;
       break;
      }
      i5 = HEAP32[i9 >> 2] | 0;
      if (i5 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
       HEAP32[i9 >> 2] = i5 + 1;
       i21 = HEAPU8[i5] | 0;
       i19 = 0;
      } else {
       i21 = ___shgetc(i8) | 0;
       i19 = 0;
      }
      while (1) {
       if ((i21 | 0) == 46) {
        i13 = 70;
        break;
       } else if ((i21 | 0) != 48) {
        i5 = 0;
        i7 = 0;
        i15 = 0;
        i16 = 0;
        i18 = 0;
        i20 = 0;
        d28 = 1.0;
        i17 = 0;
        d14 = 0.0;
        break;
       }
       i5 = HEAP32[i9 >> 2] | 0;
       if (i5 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
        HEAP32[i9 >> 2] = i5 + 1;
        i21 = HEAPU8[i5] | 0;
        i19 = 1;
        continue;
       } else {
        i21 = ___shgetc(i8) | 0;
        i19 = 1;
        continue;
       }
      }
      L66 : do {
       if ((i13 | 0) == 70) {
        i5 = HEAP32[i9 >> 2] | 0;
        if (i5 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
         HEAP32[i9 >> 2] = i5 + 1;
         i21 = HEAPU8[i5] | 0;
        } else {
         i21 = ___shgetc(i8) | 0;
        }
        if ((i21 | 0) == 48) {
         i15 = -1;
         i16 = -1;
         while (1) {
          i5 = HEAP32[i9 >> 2] | 0;
          if (i5 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
           HEAP32[i9 >> 2] = i5 + 1;
           i21 = HEAPU8[i5] | 0;
          } else {
           i21 = ___shgetc(i8) | 0;
          }
          if ((i21 | 0) != 48) {
           i5 = 0;
           i7 = 0;
           i19 = 1;
           i18 = 1;
           i20 = 0;
           d28 = 1.0;
           i17 = 0;
           d14 = 0.0;
           break L66;
          }
          i29 = _i64Add(i15 | 0, i16 | 0, -1, -1) | 0;
          i15 = i29;
          i16 = tempRet0;
         }
        } else {
         i5 = 0;
         i7 = 0;
         i15 = 0;
         i16 = 0;
         i18 = 1;
         i20 = 0;
         d28 = 1.0;
         i17 = 0;
         d14 = 0.0;
        }
       }
      } while (0);
      L79 : while (1) {
       i24 = i21 + -48 | 0;
       do {
        if (!(i24 >>> 0 < 10)) {
         i23 = i21 | 32;
         i22 = (i21 | 0) == 46;
         if (!((i23 + -97 | 0) >>> 0 < 6 | i22)) {
          break L79;
         }
         if (i22) {
          if ((i18 | 0) == 0) {
           i15 = i7;
           i16 = i5;
           i18 = 1;
           break;
          } else {
           i21 = 46;
           break L79;
          }
         } else {
          i24 = (i21 | 0) > 57 ? i23 + -87 | 0 : i24;
          i13 = 84;
          break;
         }
        } else {
         i13 = 84;
        }
       } while (0);
       if ((i13 | 0) == 84) {
        i13 = 0;
        do {
         if (!((i5 | 0) < 0 | (i5 | 0) == 0 & i7 >>> 0 < 8)) {
          if ((i5 | 0) < 0 | (i5 | 0) == 0 & i7 >>> 0 < 14) {
           d31 = d28 * .0625;
           d30 = d31;
           d14 = d14 + d31 * +(i24 | 0);
           break;
          }
          if ((i24 | 0) != 0 & (i20 | 0) == 0) {
           i20 = 1;
           d30 = d28;
           d14 = d14 + d28 * .5;
          } else {
           d30 = d28;
          }
         } else {
          d30 = d28;
          i17 = i24 + (i17 << 4) | 0;
         }
        } while (0);
        i7 = _i64Add(i7 | 0, i5 | 0, 1, 0) | 0;
        i5 = tempRet0;
        i19 = 1;
        d28 = d30;
       }
       i21 = HEAP32[i9 >> 2] | 0;
       if (i21 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
        HEAP32[i9 >> 2] = i21 + 1;
        i21 = HEAPU8[i21] | 0;
        continue;
       } else {
        i21 = ___shgetc(i8) | 0;
        continue;
       }
      }
      if ((i19 | 0) == 0) {
       i2 = (HEAP32[i10 >> 2] | 0) == 0;
       if (!i2) {
        HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
       }
       if (!i12) {
        if (!i2 ? (i6 = HEAP32[i9 >> 2] | 0, HEAP32[i9 >> 2] = i6 + -1, (i18 | 0) != 0) : 0) {
         HEAP32[i9 >> 2] = i6 + -2;
        }
       } else {
        ___shlim(i8, 0);
       }
       d31 = +(i4 | 0) * 0.0;
       STACKTOP = i1;
       return +d31;
      }
      i13 = (i18 | 0) == 0;
      i6 = i13 ? i7 : i15;
      i13 = i13 ? i5 : i16;
      if ((i5 | 0) < 0 | (i5 | 0) == 0 & i7 >>> 0 < 8) {
       do {
        i17 = i17 << 4;
        i7 = _i64Add(i7 | 0, i5 | 0, 1, 0) | 0;
        i5 = tempRet0;
       } while ((i5 | 0) < 0 | (i5 | 0) == 0 & i7 >>> 0 < 8);
      }
      do {
       if ((i21 | 32 | 0) == 112) {
        i7 = _scanexp(i8, i11) | 0;
        i5 = tempRet0;
        if ((i7 | 0) == 0 & (i5 | 0) == -2147483648) {
         if (i12) {
          ___shlim(i8, 0);
          d31 = 0.0;
          STACKTOP = i1;
          return +d31;
         } else {
          if ((HEAP32[i10 >> 2] | 0) == 0) {
           i7 = 0;
           i5 = 0;
           break;
          }
          HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
          i7 = 0;
          i5 = 0;
          break;
         }
        }
       } else {
        if ((HEAP32[i10 >> 2] | 0) == 0) {
         i7 = 0;
         i5 = 0;
        } else {
         HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
         i7 = 0;
         i5 = 0;
        }
       }
      } while (0);
      i6 = _bitshift64Shl(i6 | 0, i13 | 0, 2) | 0;
      i6 = _i64Add(i6 | 0, tempRet0 | 0, -32, -1) | 0;
      i5 = _i64Add(i6 | 0, tempRet0 | 0, i7 | 0, i5 | 0) | 0;
      i6 = tempRet0;
      if ((i17 | 0) == 0) {
       d31 = +(i4 | 0) * 0.0;
       STACKTOP = i1;
       return +d31;
      }
      if ((i6 | 0) > 0 | (i6 | 0) == 0 & i5 >>> 0 > (0 - i3 | 0) >>> 0) {
       HEAP32[(___errno_location() | 0) >> 2] = 34;
       d31 = +(i4 | 0) * 1.7976931348623157e+308 * 1.7976931348623157e+308;
       STACKTOP = i1;
       return +d31;
      }
      i29 = i3 + -106 | 0;
      i27 = ((i29 | 0) < 0) << 31 >> 31;
      if ((i6 | 0) < (i27 | 0) | (i6 | 0) == (i27 | 0) & i5 >>> 0 < i29 >>> 0) {
       HEAP32[(___errno_location() | 0) >> 2] = 34;
       d31 = +(i4 | 0) * 2.2250738585072014e-308 * 2.2250738585072014e-308;
       STACKTOP = i1;
       return +d31;
      }
      if ((i17 | 0) > -1) {
       do {
        i17 = i17 << 1;
        if (!(d14 >= .5)) {
         d28 = d14;
        } else {
         d28 = d14 + -1.0;
         i17 = i17 | 1;
        }
        d14 = d14 + d28;
        i5 = _i64Add(i5 | 0, i6 | 0, -1, -1) | 0;
        i6 = tempRet0;
       } while ((i17 | 0) > -1);
      }
      i3 = _i64Subtract(32, 0, i3 | 0, ((i3 | 0) < 0) << 31 >> 31 | 0) | 0;
      i3 = _i64Add(i5 | 0, i6 | 0, i3 | 0, tempRet0 | 0) | 0;
      i29 = tempRet0;
      if (0 > (i29 | 0) | 0 == (i29 | 0) & i2 >>> 0 > i3 >>> 0) {
       i2 = (i3 | 0) < 0 ? 0 : i3;
      }
      if ((i2 | 0) < 53) {
       d28 = +(i4 | 0);
       d30 = +_copysign(+(+_scalbn(1.0, 84 - i2 | 0)), +d28);
       if ((i2 | 0) < 32 & d14 != 0.0) {
        i29 = i17 & 1;
        i17 = (i29 ^ 1) + i17 | 0;
        d14 = (i29 | 0) == 0 ? 0.0 : d14;
       }
      } else {
       d28 = +(i4 | 0);
       d30 = 0.0;
      }
      d14 = d28 * d14 + (d30 + d28 * +(i17 >>> 0)) - d30;
      if (!(d14 != 0.0)) {
       HEAP32[(___errno_location() | 0) >> 2] = 34;
      }
      d31 = +_scalbnl(d14, i5);
      STACKTOP = i1;
      return +d31;
     }
    } while (0);
    i7 = i3 + i2 | 0;
    i6 = 0 - i7 | 0;
    i20 = 0;
    while (1) {
     if ((i21 | 0) == 46) {
      i13 = 139;
      break;
     } else if ((i21 | 0) != 48) {
      i25 = 0;
      i22 = 0;
      i19 = 0;
      break;
     }
     i15 = HEAP32[i9 >> 2] | 0;
     if (i15 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
      HEAP32[i9 >> 2] = i15 + 1;
      i21 = HEAPU8[i15] | 0;
      i20 = 1;
      continue;
     } else {
      i21 = ___shgetc(i8) | 0;
      i20 = 1;
      continue;
     }
    }
    L168 : do {
     if ((i13 | 0) == 139) {
      i15 = HEAP32[i9 >> 2] | 0;
      if (i15 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
       HEAP32[i9 >> 2] = i15 + 1;
       i21 = HEAPU8[i15] | 0;
      } else {
       i21 = ___shgetc(i8) | 0;
      }
      if ((i21 | 0) == 48) {
       i25 = -1;
       i22 = -1;
       while (1) {
        i15 = HEAP32[i9 >> 2] | 0;
        if (i15 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
         HEAP32[i9 >> 2] = i15 + 1;
         i21 = HEAPU8[i15] | 0;
        } else {
         i21 = ___shgetc(i8) | 0;
        }
        if ((i21 | 0) != 48) {
         i20 = 1;
         i19 = 1;
         break L168;
        }
        i29 = _i64Add(i25 | 0, i22 | 0, -1, -1) | 0;
        i25 = i29;
        i22 = tempRet0;
       }
      } else {
       i25 = 0;
       i22 = 0;
       i19 = 1;
      }
     }
    } while (0);
    HEAP32[i5 >> 2] = 0;
    i26 = i21 + -48 | 0;
    i27 = (i21 | 0) == 46;
    L182 : do {
     if (i26 >>> 0 < 10 | i27) {
      i15 = i5 + 496 | 0;
      i24 = 0;
      i23 = 0;
      i18 = 0;
      i17 = 0;
      i16 = 0;
      while (1) {
       do {
        if (i27) {
         if ((i19 | 0) == 0) {
          i25 = i24;
          i22 = i23;
          i19 = 1;
         } else {
          break L182;
         }
        } else {
         i27 = _i64Add(i24 | 0, i23 | 0, 1, 0) | 0;
         i23 = tempRet0;
         i29 = (i21 | 0) != 48;
         if ((i17 | 0) >= 125) {
          if (!i29) {
           i24 = i27;
           break;
          }
          HEAP32[i15 >> 2] = HEAP32[i15 >> 2] | 1;
          i24 = i27;
          break;
         }
         i20 = i5 + (i17 << 2) | 0;
         if ((i18 | 0) != 0) {
          i26 = i21 + -48 + ((HEAP32[i20 >> 2] | 0) * 10 | 0) | 0;
         }
         HEAP32[i20 >> 2] = i26;
         i18 = i18 + 1 | 0;
         i21 = (i18 | 0) == 9;
         i24 = i27;
         i20 = 1;
         i18 = i21 ? 0 : i18;
         i17 = (i21 & 1) + i17 | 0;
         i16 = i29 ? i27 : i16;
        }
       } while (0);
       i21 = HEAP32[i9 >> 2] | 0;
       if (i21 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
        HEAP32[i9 >> 2] = i21 + 1;
        i21 = HEAPU8[i21] | 0;
       } else {
        i21 = ___shgetc(i8) | 0;
       }
       i26 = i21 + -48 | 0;
       i27 = (i21 | 0) == 46;
       if (!(i26 >>> 0 < 10 | i27)) {
        i13 = 162;
        break;
       }
      }
     } else {
      i24 = 0;
      i23 = 0;
      i18 = 0;
      i17 = 0;
      i16 = 0;
      i13 = 162;
     }
    } while (0);
    if ((i13 | 0) == 162) {
     i13 = (i19 | 0) == 0;
     i25 = i13 ? i24 : i25;
     i22 = i13 ? i23 : i22;
    }
    i13 = (i20 | 0) != 0;
    if (i13 ? (i21 | 32 | 0) == 101 : 0) {
     i15 = _scanexp(i8, i11) | 0;
     i11 = tempRet0;
     do {
      if ((i15 | 0) == 0 & (i11 | 0) == -2147483648) {
       if (i12) {
        ___shlim(i8, 0);
        d31 = 0.0;
        STACKTOP = i1;
        return +d31;
       } else {
        if ((HEAP32[i10 >> 2] | 0) == 0) {
         i15 = 0;
         i11 = 0;
         break;
        }
        HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
        i15 = 0;
        i11 = 0;
        break;
       }
      }
     } while (0);
     i9 = _i64Add(i15 | 0, i11 | 0, i25 | 0, i22 | 0) | 0;
     i22 = tempRet0;
    } else {
     if ((i21 | 0) > -1 ? (HEAP32[i10 >> 2] | 0) != 0 : 0) {
      HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
      i9 = i25;
     } else {
      i9 = i25;
     }
    }
    if (!i13) {
     HEAP32[(___errno_location() | 0) >> 2] = 22;
     ___shlim(i8, 0);
     d31 = 0.0;
     STACKTOP = i1;
     return +d31;
    }
    i8 = HEAP32[i5 >> 2] | 0;
    if ((i8 | 0) == 0) {
     d31 = +(i4 | 0) * 0.0;
     STACKTOP = i1;
     return +d31;
    }
    do {
     if ((i9 | 0) == (i24 | 0) & (i22 | 0) == (i23 | 0) & ((i23 | 0) < 0 | (i23 | 0) == 0 & i24 >>> 0 < 10)) {
      if (!(i2 >>> 0 > 30) ? (i8 >>> i2 | 0) != 0 : 0) {
       break;
      }
      d31 = +(i4 | 0) * +(i8 >>> 0);
      STACKTOP = i1;
      return +d31;
     }
    } while (0);
    i29 = (i3 | 0) / -2 | 0;
    i27 = ((i29 | 0) < 0) << 31 >> 31;
    if ((i22 | 0) > (i27 | 0) | (i22 | 0) == (i27 | 0) & i9 >>> 0 > i29 >>> 0) {
     HEAP32[(___errno_location() | 0) >> 2] = 34;
     d31 = +(i4 | 0) * 1.7976931348623157e+308 * 1.7976931348623157e+308;
     STACKTOP = i1;
     return +d31;
    }
    i29 = i3 + -106 | 0;
    i27 = ((i29 | 0) < 0) << 31 >> 31;
    if ((i22 | 0) < (i27 | 0) | (i22 | 0) == (i27 | 0) & i9 >>> 0 < i29 >>> 0) {
     HEAP32[(___errno_location() | 0) >> 2] = 34;
     d31 = +(i4 | 0) * 2.2250738585072014e-308 * 2.2250738585072014e-308;
     STACKTOP = i1;
     return +d31;
    }
    if ((i18 | 0) != 0) {
     if ((i18 | 0) < 9) {
      i8 = i5 + (i17 << 2) | 0;
      i10 = HEAP32[i8 >> 2] | 0;
      do {
       i10 = i10 * 10 | 0;
       i18 = i18 + 1 | 0;
      } while ((i18 | 0) != 9);
      HEAP32[i8 >> 2] = i10;
     }
     i17 = i17 + 1 | 0;
    }
    do {
     if ((i16 | 0) < 9 ? (i16 | 0) <= (i9 | 0) & (i9 | 0) < 18 : 0) {
      if ((i9 | 0) == 9) {
       d31 = +(i4 | 0) * +((HEAP32[i5 >> 2] | 0) >>> 0);
       STACKTOP = i1;
       return +d31;
      }
      if ((i9 | 0) < 9) {
       d31 = +(i4 | 0) * +((HEAP32[i5 >> 2] | 0) >>> 0) / +(HEAP32[13440 + (8 - i9 << 2) >> 2] | 0);
       STACKTOP = i1;
       return +d31;
      }
      i10 = i2 + 27 + (Math_imul(i9, -3) | 0) | 0;
      i8 = HEAP32[i5 >> 2] | 0;
      if ((i10 | 0) <= 30 ? (i8 >>> i10 | 0) != 0 : 0) {
       break;
      }
      d31 = +(i4 | 0) * +(i8 >>> 0) * +(HEAP32[13440 + (i9 + -10 << 2) >> 2] | 0);
      STACKTOP = i1;
      return +d31;
     }
    } while (0);
    i8 = (i9 | 0) % 9 | 0;
    if ((i8 | 0) == 0) {
     i8 = 0;
     i10 = 0;
    } else {
     i11 = (i9 | 0) > -1 ? i8 : i8 + 9 | 0;
     i12 = HEAP32[13440 + (8 - i11 << 2) >> 2] | 0;
     if ((i17 | 0) != 0) {
      i10 = 1e9 / (i12 | 0) | 0;
      i8 = 0;
      i16 = 0;
      i15 = 0;
      while (1) {
       i27 = i5 + (i15 << 2) | 0;
       i13 = HEAP32[i27 >> 2] | 0;
       i29 = ((i13 >>> 0) / (i12 >>> 0) | 0) + i16 | 0;
       HEAP32[i27 >> 2] = i29;
       i16 = Math_imul((i13 >>> 0) % (i12 >>> 0) | 0, i10) | 0;
       i13 = i15 + 1 | 0;
       if ((i15 | 0) == (i8 | 0) & (i29 | 0) == 0) {
        i8 = i13 & 127;
        i9 = i9 + -9 | 0;
       }
       if ((i13 | 0) == (i17 | 0)) {
        break;
       } else {
        i15 = i13;
       }
      }
      if ((i16 | 0) != 0) {
       HEAP32[i5 + (i17 << 2) >> 2] = i16;
       i17 = i17 + 1 | 0;
      }
     } else {
      i8 = 0;
      i17 = 0;
     }
     i10 = 0;
     i9 = 9 - i11 + i9 | 0;
    }
    L280 : while (1) {
     i11 = i5 + (i8 << 2) | 0;
     if ((i9 | 0) < 18) {
      do {
       i13 = 0;
       i11 = i17 + 127 | 0;
       while (1) {
        i11 = i11 & 127;
        i12 = i5 + (i11 << 2) | 0;
        i15 = _bitshift64Shl(HEAP32[i12 >> 2] | 0, 0, 29) | 0;
        i15 = _i64Add(i15 | 0, tempRet0 | 0, i13 | 0, 0) | 0;
        i13 = tempRet0;
        if (i13 >>> 0 > 0 | (i13 | 0) == 0 & i15 >>> 0 > 1e9) {
         i29 = ___udivdi3(i15 | 0, i13 | 0, 1e9, 0) | 0;
         i15 = ___uremdi3(i15 | 0, i13 | 0, 1e9, 0) | 0;
         i13 = i29;
        } else {
         i13 = 0;
        }
        HEAP32[i12 >> 2] = i15;
        i12 = (i11 | 0) == (i8 | 0);
        if (!((i11 | 0) != (i17 + 127 & 127 | 0) | i12)) {
         i17 = (i15 | 0) == 0 ? i11 : i17;
        }
        if (i12) {
         break;
        } else {
         i11 = i11 + -1 | 0;
        }
       }
       i10 = i10 + -29 | 0;
      } while ((i13 | 0) == 0);
     } else {
      if ((i9 | 0) != 18) {
       break;
      }
      do {
       if (!((HEAP32[i11 >> 2] | 0) >>> 0 < 9007199)) {
        i9 = 18;
        break L280;
       }
       i13 = 0;
       i12 = i17 + 127 | 0;
       while (1) {
        i12 = i12 & 127;
        i15 = i5 + (i12 << 2) | 0;
        i16 = _bitshift64Shl(HEAP32[i15 >> 2] | 0, 0, 29) | 0;
        i16 = _i64Add(i16 | 0, tempRet0 | 0, i13 | 0, 0) | 0;
        i13 = tempRet0;
        if (i13 >>> 0 > 0 | (i13 | 0) == 0 & i16 >>> 0 > 1e9) {
         i29 = ___udivdi3(i16 | 0, i13 | 0, 1e9, 0) | 0;
         i16 = ___uremdi3(i16 | 0, i13 | 0, 1e9, 0) | 0;
         i13 = i29;
        } else {
         i13 = 0;
        }
        HEAP32[i15 >> 2] = i16;
        i15 = (i12 | 0) == (i8 | 0);
        if (!((i12 | 0) != (i17 + 127 & 127 | 0) | i15)) {
         i17 = (i16 | 0) == 0 ? i12 : i17;
        }
        if (i15) {
         break;
        } else {
         i12 = i12 + -1 | 0;
        }
       }
       i10 = i10 + -29 | 0;
      } while ((i13 | 0) == 0);
     }
     i8 = i8 + 127 & 127;
     if ((i8 | 0) == (i17 | 0)) {
      i29 = i17 + 127 & 127;
      i17 = i5 + ((i17 + 126 & 127) << 2) | 0;
      HEAP32[i17 >> 2] = HEAP32[i17 >> 2] | HEAP32[i5 + (i29 << 2) >> 2];
      i17 = i29;
     }
     HEAP32[i5 + (i8 << 2) >> 2] = i13;
     i9 = i9 + 9 | 0;
    }
    L311 : while (1) {
     i11 = i17 + 1 & 127;
     i12 = i5 + ((i17 + 127 & 127) << 2) | 0;
     while (1) {
      i15 = (i9 | 0) == 18;
      i13 = (i9 | 0) > 27 ? 9 : 1;
      while (1) {
       i16 = 0;
       while (1) {
        i18 = i16 + i8 & 127;
        if ((i18 | 0) == (i17 | 0)) {
         i16 = 2;
         break;
        }
        i18 = HEAP32[i5 + (i18 << 2) >> 2] | 0;
        i19 = HEAP32[13432 + (i16 << 2) >> 2] | 0;
        if (i18 >>> 0 < i19 >>> 0) {
         i16 = 2;
         break;
        }
        i20 = i16 + 1 | 0;
        if (i18 >>> 0 > i19 >>> 0) {
         break;
        }
        if ((i20 | 0) < 2) {
         i16 = i20;
        } else {
         i16 = i20;
         break;
        }
       }
       if ((i16 | 0) == 2 & i15) {
        break L311;
       }
       i10 = i13 + i10 | 0;
       if ((i8 | 0) == (i17 | 0)) {
        i8 = i17;
       } else {
        break;
       }
      }
      i15 = (1 << i13) + -1 | 0;
      i19 = 1e9 >>> i13;
      i18 = i8;
      i16 = 0;
      do {
       i27 = i5 + (i8 << 2) | 0;
       i29 = HEAP32[i27 >> 2] | 0;
       i20 = (i29 >>> i13) + i16 | 0;
       HEAP32[i27 >> 2] = i20;
       i16 = Math_imul(i29 & i15, i19) | 0;
       i20 = (i8 | 0) == (i18 | 0) & (i20 | 0) == 0;
       i8 = i8 + 1 & 127;
       i9 = i20 ? i9 + -9 | 0 : i9;
       i18 = i20 ? i8 : i18;
      } while ((i8 | 0) != (i17 | 0));
      if ((i16 | 0) == 0) {
       i8 = i18;
       continue;
      }
      if ((i11 | 0) != (i18 | 0)) {
       break;
      }
      HEAP32[i12 >> 2] = HEAP32[i12 >> 2] | 1;
      i8 = i18;
     }
     HEAP32[i5 + (i17 << 2) >> 2] = i16;
     i8 = i18;
     i17 = i11;
    }
    i9 = i8 & 127;
    if ((i9 | 0) == (i17 | 0)) {
     HEAP32[i5 + (i11 + -1 << 2) >> 2] = 0;
     i17 = i11;
    }
    d28 = +((HEAP32[i5 + (i9 << 2) >> 2] | 0) >>> 0);
    i9 = i8 + 1 & 127;
    if ((i9 | 0) == (i17 | 0)) {
     i17 = i17 + 1 & 127;
     HEAP32[i5 + (i17 + -1 << 2) >> 2] = 0;
    }
    d14 = +(i4 | 0);
    d30 = d14 * (d28 * 1.0e9 + +((HEAP32[i5 + (i9 << 2) >> 2] | 0) >>> 0));
    i4 = i10 + 53 | 0;
    i3 = i4 - i3 | 0;
    if ((i3 | 0) < (i2 | 0)) {
     i2 = (i3 | 0) < 0 ? 0 : i3;
     i9 = 1;
    } else {
     i9 = 0;
    }
    if ((i2 | 0) < 53) {
     d33 = +_copysign(+(+_scalbn(1.0, 105 - i2 | 0)), +d30);
     d32 = +_fmod(+d30, +(+_scalbn(1.0, 53 - i2 | 0)));
     d28 = d33;
     d31 = d32;
     d30 = d33 + (d30 - d32);
    } else {
     d28 = 0.0;
     d31 = 0.0;
    }
    i11 = i8 + 2 & 127;
    if ((i11 | 0) != (i17 | 0)) {
     i5 = HEAP32[i5 + (i11 << 2) >> 2] | 0;
     do {
      if (!(i5 >>> 0 < 5e8)) {
       if (i5 >>> 0 > 5e8) {
        d31 = d14 * .75 + d31;
        break;
       }
       if ((i8 + 3 & 127 | 0) == (i17 | 0)) {
        d31 = d14 * .5 + d31;
        break;
       } else {
        d31 = d14 * .75 + d31;
        break;
       }
      } else {
       if ((i5 | 0) == 0 ? (i8 + 3 & 127 | 0) == (i17 | 0) : 0) {
        break;
       }
       d31 = d14 * .25 + d31;
      }
     } while (0);
     if ((53 - i2 | 0) > 1 ? !(+_fmod(+d31, 1.0) != 0.0) : 0) {
      d31 = d31 + 1.0;
     }
    }
    d14 = d30 + d31 - d28;
    do {
     if ((i4 & 2147483647 | 0) > (-2 - i7 | 0)) {
      if (+Math_abs(+d14) >= 9007199254740992.0) {
       i9 = (i9 | 0) != 0 & (i2 | 0) == (i3 | 0) ? 0 : i9;
       i10 = i10 + 1 | 0;
       d14 = d14 * .5;
      }
      if ((i10 + 50 | 0) <= (i6 | 0) ? !((i9 | 0) != 0 & d31 != 0.0) : 0) {
       break;
      }
      HEAP32[(___errno_location() | 0) >> 2] = 34;
     }
    } while (0);
    d33 = +_scalbnl(d14, i10);
    STACKTOP = i1;
    return +d33;
   } else if ((i7 | 0) == 3) {
    i2 = HEAP32[i9 >> 2] | 0;
    if (i2 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
     HEAP32[i9 >> 2] = i2 + 1;
     i2 = HEAPU8[i2] | 0;
    } else {
     i2 = ___shgetc(i8) | 0;
    }
    if ((i2 | 0) == 40) {
     i2 = 1;
    } else {
     if ((HEAP32[i10 >> 2] | 0) == 0) {
      d33 = nan;
      STACKTOP = i1;
      return +d33;
     }
     HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
     d33 = nan;
     STACKTOP = i1;
     return +d33;
    }
    while (1) {
     i3 = HEAP32[i9 >> 2] | 0;
     if (i3 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0) {
      HEAP32[i9 >> 2] = i3 + 1;
      i3 = HEAPU8[i3] | 0;
     } else {
      i3 = ___shgetc(i8) | 0;
     }
     if (!((i3 + -48 | 0) >>> 0 < 10 | (i3 + -65 | 0) >>> 0 < 26) ? !((i3 + -97 | 0) >>> 0 < 26 | (i3 | 0) == 95) : 0) {
      break;
     }
     i2 = i2 + 1 | 0;
    }
    if ((i3 | 0) == 41) {
     d33 = nan;
     STACKTOP = i1;
     return +d33;
    }
    i3 = (HEAP32[i10 >> 2] | 0) == 0;
    if (!i3) {
     HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
    }
    if (i12) {
     HEAP32[(___errno_location() | 0) >> 2] = 22;
     ___shlim(i8, 0);
     d33 = 0.0;
     STACKTOP = i1;
     return +d33;
    }
    if ((i2 | 0) == 0 | i3) {
     d33 = nan;
     STACKTOP = i1;
     return +d33;
    }
    while (1) {
     i2 = i2 + -1 | 0;
     HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
     if ((i2 | 0) == 0) {
      d14 = nan;
      break;
     }
    }
    STACKTOP = i1;
    return +d14;
   } else {
    if ((HEAP32[i10 >> 2] | 0) != 0) {
     HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
    }
    HEAP32[(___errno_location() | 0) >> 2] = 22;
    ___shlim(i8, 0);
    d33 = 0.0;
    STACKTOP = i1;
    return +d33;
   }
  }
 } while (0);
 if ((i13 | 0) == 23) {
  i2 = (HEAP32[i10 >> 2] | 0) == 0;
  if (!i2) {
   HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
  }
  if (!(i7 >>> 0 < 4 | (i11 | 0) == 0 | i2)) {
   do {
    HEAP32[i9 >> 2] = (HEAP32[i9 >> 2] | 0) + -1;
    i7 = i7 + -1 | 0;
   } while (i7 >>> 0 > 3);
  }
 }
 d33 = +(i4 | 0) * inf;
 STACKTOP = i1;
 return +d33;
}
function _statement(i4) {
 i4 = i4 | 0;
 var i1 = 0, 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, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 160 | 0;
 i8 = i2 + 120 | 0;
 i24 = i2 + 96 | 0;
 i15 = i2 + 72 | 0;
 i25 = i2 + 48 | 0;
 i20 = i2 + 24 | 0;
 i21 = i2;
 i19 = i4 + 4 | 0;
 i6 = HEAP32[i19 >> 2] | 0;
 i3 = i4 + 48 | 0;
 i9 = HEAP32[i3 >> 2] | 0;
 i1 = i4 + 52 | 0;
 i26 = (HEAP32[i1 >> 2] | 0) + 38 | 0;
 i27 = (HEAP16[i26 >> 1] | 0) + 1 << 16 >> 16;
 HEAP16[i26 >> 1] = i27;
 if ((i27 & 65535) > 200) {
  i27 = i9 + 12 | 0;
  i26 = HEAP32[(HEAP32[i27 >> 2] | 0) + 52 >> 2] | 0;
  i5 = HEAP32[(HEAP32[i9 >> 2] | 0) + 64 >> 2] | 0;
  if ((i5 | 0) == 0) {
   i29 = 6552;
   HEAP32[i8 >> 2] = 6360;
   i28 = i8 + 4 | 0;
   HEAP32[i28 >> 2] = 200;
   i28 = i8 + 8 | 0;
   HEAP32[i28 >> 2] = i29;
   i28 = _luaO_pushfstring(i26, 6592, i8) | 0;
   i29 = HEAP32[i27 >> 2] | 0;
   _luaX_syntaxerror(i29, i28);
  }
  HEAP32[i8 >> 2] = i5;
  i28 = _luaO_pushfstring(i26, 6568, i8) | 0;
  HEAP32[i8 >> 2] = 6360;
  i29 = i8 + 4 | 0;
  HEAP32[i29 >> 2] = 200;
  i29 = i8 + 8 | 0;
  HEAP32[i29 >> 2] = i28;
  i29 = _luaO_pushfstring(i26, 6592, i8) | 0;
  i28 = HEAP32[i27 >> 2] | 0;
  _luaX_syntaxerror(i28, i29);
 }
 i5 = i4 + 16 | 0;
 L8 : do {
  switch (HEAP32[i5 >> 2] | 0) {
  case 59:
   {
    _luaX_next(i4);
    break;
   }
  case 267:
   {
    HEAP32[i21 >> 2] = -1;
    _test_then_block(i4, i21);
    while (1) {
     i8 = HEAP32[i5 >> 2] | 0;
     if ((i8 | 0) == 260) {
      i7 = 10;
      break;
     } else if ((i8 | 0) != 261) {
      break;
     }
     _test_then_block(i4, i21);
    }
    if ((i7 | 0) == 10) {
     _luaX_next(i4);
     i7 = HEAP32[i3 >> 2] | 0;
     HEAP8[i20 + 10 | 0] = 0;
     HEAP8[i20 + 8 | 0] = HEAP8[i7 + 46 | 0] | 0;
     i29 = HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 64 >> 2] | 0;
     HEAP16[i20 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
     HEAP16[i20 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
     HEAP8[i20 + 9 | 0] = 0;
     i29 = i7 + 16 | 0;
     HEAP32[i20 >> 2] = HEAP32[i29 >> 2];
     HEAP32[i29 >> 2] = i20;
     L16 : do {
      i8 = HEAP32[i5 >> 2] | 0;
      switch (i8 | 0) {
      case 277:
      case 286:
      case 262:
      case 261:
      case 260:
       {
        break L16;
       }
      default:
       {}
      }
      _statement(i4);
     } while ((i8 | 0) != 274);
     _leaveblock(i7);
    }
    _check_match(i4, 262, 267, i6);
    _luaK_patchtohere(i9, HEAP32[i21 >> 2] | 0);
    break;
   }
  case 259:
   {
    _luaX_next(i4);
    i7 = HEAP32[i3 >> 2] | 0;
    HEAP8[i20 + 10 | 0] = 0;
    HEAP8[i20 + 8 | 0] = HEAP8[i7 + 46 | 0] | 0;
    i29 = HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i20 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
    HEAP16[i20 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
    HEAP8[i20 + 9 | 0] = 0;
    i29 = i7 + 16 | 0;
    HEAP32[i20 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i20;
    L22 : do {
     i8 = HEAP32[i5 >> 2] | 0;
     switch (i8 | 0) {
     case 277:
     case 286:
     case 262:
     case 261:
     case 260:
      {
       break L22;
      }
     default:
      {}
     }
     _statement(i4);
    } while ((i8 | 0) != 274);
    _leaveblock(i7);
    _check_match(i4, 262, 259, i6);
    break;
   }
  case 269:
   {
    _luaX_next(i4);
    i6 = HEAP32[i5 >> 2] | 0;
    if ((i6 | 0) == 265) {
     _luaX_next(i4);
     i7 = HEAP32[i3 >> 2] | 0;
     if ((HEAP32[i5 >> 2] | 0) == 288) {
      i29 = HEAP32[i4 + 24 >> 2] | 0;
      _luaX_next(i4);
      _new_localvar(i4, i29);
      i29 = HEAP32[i3 >> 2] | 0;
      i27 = i29 + 46 | 0;
      i28 = (HEAPU8[i27] | 0) + 1 | 0;
      HEAP8[i27] = i28;
      HEAP32[(HEAP32[(HEAP32[i29 >> 2] | 0) + 24 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[(HEAP32[i29 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0) + ((i28 & 255) + -1 + (HEAP32[i29 + 40 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i29 + 20 >> 2];
      _body(i4, i25, 0, HEAP32[i19 >> 2] | 0);
      HEAP32[(HEAP32[(HEAP32[i7 >> 2] | 0) + 24 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0) + ((HEAP32[i7 + 40 >> 2] | 0) + (HEAP32[i25 + 8 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i7 + 20 >> 2];
      break L8;
     } else {
      _error_expected(i4, 288);
     }
    }
    if ((i6 | 0) != 288) {
     _error_expected(i4, 288);
    }
    i7 = i4 + 24 | 0;
    i6 = 1;
    while (1) {
     i8 = HEAP32[i7 >> 2] | 0;
     _luaX_next(i4);
     _new_localvar(i4, i8);
     i8 = HEAP32[i5 >> 2] | 0;
     if ((i8 | 0) == 61) {
      i7 = 81;
      break;
     } else if ((i8 | 0) != 44) {
      i7 = 83;
      break;
     }
     _luaX_next(i4);
     if ((HEAP32[i5 >> 2] | 0) == 288) {
      i6 = i6 + 1 | 0;
     } else {
      i7 = 78;
      break;
     }
    }
    do {
     if ((i7 | 0) == 78) {
      _error_expected(i4, 288);
     } else if ((i7 | 0) == 81) {
      _luaX_next(i4);
      _subexpr(i4, i15, 0) | 0;
      if ((HEAP32[i5 >> 2] | 0) == 44) {
       i8 = 1;
       do {
        _luaX_next(i4);
        _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i15);
        _subexpr(i4, i15, 0) | 0;
        i8 = i8 + 1 | 0;
       } while ((HEAP32[i5 >> 2] | 0) == 44);
      } else {
       i8 = 1;
      }
      i5 = HEAP32[i15 >> 2] | 0;
      i4 = HEAP32[i3 >> 2] | 0;
      i8 = i6 - i8 | 0;
      if ((i5 | 0) == 0) {
       i17 = i8;
       i18 = i4;
       i7 = 88;
       break;
      } else if (!((i5 | 0) == 13 | (i5 | 0) == 12)) {
       _luaK_exp2nextreg(i4, i15);
       i17 = i8;
       i18 = i4;
       i7 = 88;
       break;
      }
      i5 = i8 + 1 | 0;
      i5 = (i5 | 0) < 0 ? 0 : i5;
      _luaK_setreturns(i4, i15, i5);
      if ((i5 | 0) > 1) {
       _luaK_reserveregs(i4, i5 + -1 | 0);
      }
     } else if ((i7 | 0) == 83) {
      HEAP32[i15 >> 2] = 0;
      i17 = i6;
      i18 = HEAP32[i3 >> 2] | 0;
      i7 = 88;
     }
    } while (0);
    if ((i7 | 0) == 88 ? (i17 | 0) > 0 : 0) {
     i29 = HEAPU8[i18 + 48 | 0] | 0;
     _luaK_reserveregs(i18, i17);
     _luaK_nil(i18, i29, i17);
    }
    i5 = HEAP32[i3 >> 2] | 0;
    i4 = i5 + 46 | 0;
    i7 = (HEAPU8[i4] | 0) + i6 | 0;
    HEAP8[i4] = i7;
    if ((i6 | 0) != 0 ? (i11 = i5 + 20 | 0, i14 = i5 + 40 | 0, i12 = HEAP32[(HEAP32[i5 >> 2] | 0) + 24 >> 2] | 0, i13 = HEAP32[HEAP32[(HEAP32[i5 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0, HEAP32[i12 + ((HEAP16[i13 + ((i7 & 255) - i6 + (HEAP32[i14 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i11 >> 2], i16 = i6 + -1 | 0, (i16 | 0) != 0) : 0) {
     do {
      HEAP32[i12 + ((HEAP16[i13 + ((HEAPU8[i4] | 0) - i16 + (HEAP32[i14 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i11 >> 2];
      i16 = i16 + -1 | 0;
     } while ((i16 | 0) != 0);
    }
    break;
   }
  case 264:
   {
    HEAP8[i24 + 10 | 0] = 1;
    HEAP8[i24 + 8 | 0] = HEAP8[i9 + 46 | 0] | 0;
    i29 = HEAP32[(HEAP32[i9 + 12 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i24 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
    HEAP16[i24 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
    HEAP8[i24 + 9 | 0] = 0;
    i29 = i9 + 16 | 0;
    HEAP32[i24 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i24;
    _luaX_next(i4);
    if ((HEAP32[i5 >> 2] | 0) != 288) {
     _error_expected(i4, 288);
    }
    i14 = i4 + 24 | 0;
    i13 = HEAP32[i14 >> 2] | 0;
    _luaX_next(i4);
    i11 = HEAP32[i5 >> 2] | 0;
    if ((i11 | 0) == 268 | (i11 | 0) == 44) {
     i12 = HEAP32[i3 >> 2] | 0;
     i11 = HEAPU8[i12 + 48 | 0] | 0;
     _new_localvar(i4, _luaX_newstring(i4, 6744, 15) | 0);
     _new_localvar(i4, _luaX_newstring(i4, 6760, 11) | 0);
     _new_localvar(i4, _luaX_newstring(i4, 6776, 13) | 0);
     _new_localvar(i4, i13);
     i13 = HEAP32[i5 >> 2] | 0;
     do {
      if ((i13 | 0) == 44) {
       i15 = 4;
       while (1) {
        _luaX_next(i4);
        if ((HEAP32[i5 >> 2] | 0) != 288) {
         i7 = 40;
         break;
        }
        i13 = HEAP32[i14 >> 2] | 0;
        _luaX_next(i4);
        _new_localvar(i4, i13);
        i13 = HEAP32[i5 >> 2] | 0;
        if ((i13 | 0) == 44) {
         i15 = i15 + 1 | 0;
        } else {
         i7 = 42;
         break;
        }
       }
       if ((i7 | 0) == 40) {
        _error_expected(i4, 288);
       } else if ((i7 | 0) == 42) {
        i22 = i13;
        i10 = i15 + -2 | 0;
        break;
       }
      } else {
       i22 = i13;
       i10 = 1;
      }
     } while (0);
     if ((i22 | 0) != 268) {
      _error_expected(i4, 268);
     }
     _luaX_next(i4);
     i13 = HEAP32[i19 >> 2] | 0;
     _subexpr(i4, i8, 0) | 0;
     if ((HEAP32[i5 >> 2] | 0) == 44) {
      i14 = 1;
      do {
       _luaX_next(i4);
       _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i8);
       _subexpr(i4, i8, 0) | 0;
       i14 = i14 + 1 | 0;
      } while ((HEAP32[i5 >> 2] | 0) == 44);
     } else {
      i14 = 1;
     }
     i5 = HEAP32[i3 >> 2] | 0;
     i14 = 3 - i14 | 0;
     i15 = HEAP32[i8 >> 2] | 0;
     if ((i15 | 0) == 0) {
      i7 = 51;
     } else if ((i15 | 0) == 13 | (i15 | 0) == 12) {
      i15 = i14 + 1 | 0;
      i15 = (i15 | 0) < 0 ? 0 : i15;
      _luaK_setreturns(i5, i8, i15);
      if ((i15 | 0) > 1) {
       _luaK_reserveregs(i5, i15 + -1 | 0);
      }
     } else {
      _luaK_exp2nextreg(i5, i8);
      i7 = 51;
     }
     if ((i7 | 0) == 51 ? (i14 | 0) > 0 : 0) {
      i29 = HEAPU8[i5 + 48 | 0] | 0;
      _luaK_reserveregs(i5, i14);
      _luaK_nil(i5, i29, i14);
     }
     _luaK_checkstack(i12, 3);
     _forbody(i4, i11, i13, i10, 0);
    } else if ((i11 | 0) == 61) {
     i11 = HEAP32[i3 >> 2] | 0;
     i7 = i11 + 48 | 0;
     i10 = HEAPU8[i7] | 0;
     _new_localvar(i4, _luaX_newstring(i4, 6792, 11) | 0);
     _new_localvar(i4, _luaX_newstring(i4, 6808, 11) | 0);
     _new_localvar(i4, _luaX_newstring(i4, 6824, 10) | 0);
     _new_localvar(i4, i13);
     if ((HEAP32[i5 >> 2] | 0) != 61) {
      _error_expected(i4, 61);
     }
     _luaX_next(i4);
     _subexpr(i4, i8, 0) | 0;
     _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i8);
     if ((HEAP32[i5 >> 2] | 0) != 44) {
      _error_expected(i4, 44);
     }
     _luaX_next(i4);
     _subexpr(i4, i8, 0) | 0;
     _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i8);
     if ((HEAP32[i5 >> 2] | 0) == 44) {
      _luaX_next(i4);
      _subexpr(i4, i8, 0) | 0;
      _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i8);
     } else {
      i29 = HEAPU8[i7] | 0;
      _luaK_codek(i11, i29, _luaK_numberK(i11, 1.0) | 0) | 0;
      _luaK_reserveregs(i11, 1);
     }
     _forbody(i4, i10, i6, 1, 1);
    } else {
     _luaX_syntaxerror(i4, 6720);
    }
    _check_match(i4, 262, 264, i6);
    _leaveblock(i9);
    break;
   }
  case 265:
   {
    _luaX_next(i4);
    if ((HEAP32[i5 >> 2] | 0) != 288) {
     _error_expected(i4, 288);
    }
    i8 = HEAP32[i4 + 24 >> 2] | 0;
    _luaX_next(i4);
    i9 = HEAP32[i3 >> 2] | 0;
    if ((_singlevaraux(i9, i8, i20, 1) | 0) == 0) {
     _singlevaraux(i9, HEAP32[i4 + 72 >> 2] | 0, i20, 1) | 0;
     i29 = _luaK_stringK(HEAP32[i3 >> 2] | 0, i8) | 0;
     HEAP32[i25 + 16 >> 2] = -1;
     HEAP32[i25 + 20 >> 2] = -1;
     HEAP32[i25 >> 2] = 4;
     HEAP32[i25 + 8 >> 2] = i29;
     _luaK_indexed(i9, i20, i25);
    }
    while (1) {
     i8 = HEAP32[i5 >> 2] | 0;
     if ((i8 | 0) == 58) {
      i7 = 70;
      break;
     } else if ((i8 | 0) != 46) {
      i5 = 0;
      break;
     }
     _fieldsel(i4, i20);
    }
    if ((i7 | 0) == 70) {
     _fieldsel(i4, i20);
     i5 = 1;
    }
    _body(i4, i21, i5, i6);
    _luaK_storevar(HEAP32[i3 >> 2] | 0, i20, i21);
    _luaK_fixline(HEAP32[i3 >> 2] | 0, i6);
    break;
   }
  case 278:
   {
    _luaX_next(i4);
    i7 = _luaK_getlabel(i9) | 0;
    _subexpr(i4, i20, 0) | 0;
    if ((HEAP32[i20 >> 2] | 0) == 1) {
     HEAP32[i20 >> 2] = 3;
    }
    _luaK_goiftrue(HEAP32[i3 >> 2] | 0, i20);
    i8 = HEAP32[i20 + 20 >> 2] | 0;
    HEAP8[i21 + 10 | 0] = 1;
    HEAP8[i21 + 8 | 0] = HEAP8[i9 + 46 | 0] | 0;
    i29 = HEAP32[(HEAP32[i9 + 12 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i21 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
    HEAP16[i21 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
    HEAP8[i21 + 9 | 0] = 0;
    i29 = i9 + 16 | 0;
    HEAP32[i21 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i21;
    if ((HEAP32[i5 >> 2] | 0) != 259) {
     _error_expected(i4, 259);
    }
    _luaX_next(i4);
    i10 = HEAP32[i3 >> 2] | 0;
    HEAP8[i20 + 10 | 0] = 0;
    HEAP8[i20 + 8 | 0] = HEAP8[i10 + 46 | 0] | 0;
    i29 = HEAP32[(HEAP32[i10 + 12 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i20 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
    HEAP16[i20 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
    HEAP8[i20 + 9 | 0] = 0;
    i29 = i10 + 16 | 0;
    HEAP32[i20 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i20;
    L119 : do {
     i11 = HEAP32[i5 >> 2] | 0;
     switch (i11 | 0) {
     case 277:
     case 286:
     case 262:
     case 261:
     case 260:
      {
       break L119;
      }
     default:
      {}
     }
     _statement(i4);
    } while ((i11 | 0) != 274);
    _leaveblock(i10);
    _luaK_patchlist(i9, _luaK_jump(i9) | 0, i7);
    _check_match(i4, 262, 278, i6);
    _leaveblock(i9);
    _luaK_patchtohere(i9, i8);
    break;
   }
  case 273:
   {
    i7 = _luaK_getlabel(i9) | 0;
    HEAP8[i24 + 10 | 0] = 1;
    i28 = i9 + 46 | 0;
    HEAP8[i24 + 8 | 0] = HEAP8[i28] | 0;
    i11 = i9 + 12 | 0;
    i29 = HEAP32[(HEAP32[i11 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i24 + 4 >> 1] = HEAP32[i29 + 28 >> 2];
    HEAP16[i24 + 6 >> 1] = HEAP32[i29 + 16 >> 2];
    HEAP8[i24 + 9 | 0] = 0;
    i29 = i9 + 16 | 0;
    HEAP32[i24 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i24;
    HEAP8[i15 + 10 | 0] = 0;
    i10 = i15 + 8 | 0;
    HEAP8[i10] = HEAP8[i28] | 0;
    i11 = HEAP32[(HEAP32[i11 >> 2] | 0) + 64 >> 2] | 0;
    HEAP16[i15 + 4 >> 1] = HEAP32[i11 + 28 >> 2];
    HEAP16[i15 + 6 >> 1] = HEAP32[i11 + 16 >> 2];
    i11 = i15 + 9 | 0;
    HEAP8[i11] = 0;
    HEAP32[i15 >> 2] = HEAP32[i29 >> 2];
    HEAP32[i29 >> 2] = i15;
    _luaX_next(i4);
    L124 : do {
     i12 = HEAP32[i5 >> 2] | 0;
     switch (i12 | 0) {
     case 277:
     case 286:
     case 262:
     case 261:
     case 260:
      {
       break L124;
      }
     default:
      {}
     }
     _statement(i4);
    } while ((i12 | 0) != 274);
    _check_match(i4, 277, 273, i6);
    _subexpr(i4, i8, 0) | 0;
    if ((HEAP32[i8 >> 2] | 0) == 1) {
     HEAP32[i8 >> 2] = 3;
    }
    _luaK_goiftrue(HEAP32[i3 >> 2] | 0, i8);
    i4 = HEAP32[i8 + 20 >> 2] | 0;
    if ((HEAP8[i11] | 0) != 0) {
     _luaK_patchclose(i9, i4, HEAPU8[i10] | 0);
    }
    _leaveblock(i9);
    _luaK_patchlist(i9, i4, i7);
    _leaveblock(i9);
    break;
   }
  case 285:
   {
    _luaX_next(i4);
    if ((HEAP32[i5 >> 2] | 0) != 288) {
     _error_expected(i4, 288);
    }
    i10 = HEAP32[i4 + 24 >> 2] | 0;
    _luaX_next(i4);
    i15 = HEAP32[i3 >> 2] | 0;
    i9 = i4 + 64 | 0;
    i14 = HEAP32[i9 >> 2] | 0;
    i12 = i14 + 24 | 0;
    i11 = i15 + 16 | 0;
    i16 = HEAP16[(HEAP32[i11 >> 2] | 0) + 4 >> 1] | 0;
    i13 = i14 + 28 | 0;
    L138 : do {
     if ((i16 | 0) < (HEAP32[i13 >> 2] | 0)) {
      while (1) {
       i17 = i16 + 1 | 0;
       if ((_luaS_eqstr(i10, HEAP32[(HEAP32[i12 >> 2] | 0) + (i16 << 4) >> 2] | 0) | 0) != 0) {
        break;
       }
       if ((i17 | 0) < (HEAP32[i13 >> 2] | 0)) {
        i16 = i17;
       } else {
        break L138;
       }
      }
      i28 = i15 + 12 | 0;
      i29 = HEAP32[(HEAP32[i28 >> 2] | 0) + 52 >> 2] | 0;
      i27 = HEAP32[(HEAP32[i12 >> 2] | 0) + (i16 << 4) + 8 >> 2] | 0;
      HEAP32[i8 >> 2] = i10 + 16;
      HEAP32[i8 + 4 >> 2] = i27;
      i29 = _luaO_pushfstring(i29, 6680, i8) | 0;
      _semerror(HEAP32[i28 >> 2] | 0, i29);
     }
    } while (0);
    if ((HEAP32[i5 >> 2] | 0) != 285) {
     _error_expected(i4, 285);
    }
    _luaX_next(i4);
    i8 = HEAP32[i15 + 20 >> 2] | 0;
    i15 = HEAP32[i13 >> 2] | 0;
    i14 = i14 + 32 | 0;
    if ((i15 | 0) < (HEAP32[i14 >> 2] | 0)) {
     i14 = HEAP32[i12 >> 2] | 0;
    } else {
     i14 = _luaM_growaux_(HEAP32[i1 >> 2] | 0, HEAP32[i12 >> 2] | 0, i14, 16, 32767, 6312) | 0;
     HEAP32[i12 >> 2] = i14;
    }
    HEAP32[i14 + (i15 << 4) >> 2] = i10;
    i29 = HEAP32[i12 >> 2] | 0;
    HEAP32[i29 + (i15 << 4) + 8 >> 2] = i6;
    HEAP8[i29 + (i15 << 4) + 12 | 0] = HEAP8[(HEAP32[i3 >> 2] | 0) + 46 | 0] | 0;
    HEAP32[(HEAP32[i12 >> 2] | 0) + (i15 << 4) + 4 >> 2] = i8;
    HEAP32[i13 >> 2] = (HEAP32[i13 >> 2] | 0) + 1;
    L152 : while (1) {
     switch (HEAP32[i5 >> 2] | 0) {
     case 285:
     case 59:
      {
       break;
      }
     case 286:
     case 262:
     case 261:
     case 260:
      {
       i7 = 108;
       break L152;
      }
     default:
      {
       break L152;
      }
     }
     _statement(i4);
    }
    if ((i7 | 0) == 108) {
     HEAP8[(HEAP32[i12 >> 2] | 0) + (i15 << 4) + 12 | 0] = HEAP8[(HEAP32[i11 >> 2] | 0) + 8 | 0] | 0;
    }
    i5 = (HEAP32[i12 >> 2] | 0) + (i15 << 4) | 0;
    i8 = HEAP32[i9 >> 2] | 0;
    i7 = HEAP16[(HEAP32[(HEAP32[i3 >> 2] | 0) + 16 >> 2] | 0) + 6 >> 1] | 0;
    i6 = i8 + 16 | 0;
    if ((i7 | 0) < (HEAP32[i6 >> 2] | 0)) {
     i8 = i8 + 12 | 0;
     do {
      while (1) {
       if ((_luaS_eqstr(HEAP32[(HEAP32[i8 >> 2] | 0) + (i7 << 4) >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0) == 0) {
        break;
       }
       _closegoto(i4, i7, i5);
       if ((i7 | 0) >= (HEAP32[i6 >> 2] | 0)) {
        break L8;
       }
      }
      i7 = i7 + 1 | 0;
     } while ((i7 | 0) < (HEAP32[i6 >> 2] | 0));
    }
    break;
   }
  case 274:
   {
    _luaX_next(i4);
    i6 = HEAP32[i3 >> 2] | 0;
    L166 : do {
     switch (HEAP32[i5 >> 2] | 0) {
     case 59:
     case 277:
     case 286:
     case 262:
     case 261:
     case 260:
      {
       i8 = 0;
       i7 = 0;
       break;
      }
     default:
      {
       _subexpr(i4, i24, 0) | 0;
       if ((HEAP32[i5 >> 2] | 0) == 44) {
        i7 = 1;
        do {
         _luaX_next(i4);
         _luaK_exp2nextreg(HEAP32[i3 >> 2] | 0, i24);
         _subexpr(i4, i24, 0) | 0;
         i7 = i7 + 1 | 0;
        } while ((HEAP32[i5 >> 2] | 0) == 44);
       } else {
        i7 = 1;
       }
       if (!(((HEAP32[i24 >> 2] | 0) + -12 | 0) >>> 0 < 2)) {
        if ((i7 | 0) == 1) {
         i8 = _luaK_exp2anyreg(i6, i24) | 0;
         i7 = 1;
         break L166;
        } else {
         _luaK_exp2nextreg(i6, i24);
         i8 = HEAPU8[i6 + 46 | 0] | 0;
         break L166;
        }
       } else {
        _luaK_setreturns(i6, i24, -1);
        if ((HEAP32[i24 >> 2] | 0) == 12 & (i7 | 0) == 1) {
         i29 = (HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i24 + 8 >> 2] << 2) | 0;
         HEAP32[i29 >> 2] = HEAP32[i29 >> 2] & -64 | 30;
        }
        i8 = HEAPU8[i6 + 46 | 0] | 0;
        i7 = -1;
        break L166;
       }
      }
     }
    } while (0);
    _luaK_ret(i6, i8, i7);
    if ((HEAP32[i5 >> 2] | 0) == 59) {
     _luaX_next(i4);
    }
    break;
   }
  case 266:
  case 258:
   {
    i6 = _luaK_jump(i9) | 0;
    i7 = HEAP32[i19 >> 2] | 0;
    i29 = (HEAP32[i5 >> 2] | 0) == 266;
    _luaX_next(i4);
    do {
     if (i29) {
      if ((HEAP32[i5 >> 2] | 0) == 288) {
       i23 = HEAP32[i4 + 24 >> 2] | 0;
       _luaX_next(i4);
       break;
      } else {
       _error_expected(i4, 288);
      }
     } else {
      i23 = _luaS_new(HEAP32[i1 >> 2] | 0, 6304) | 0;
     }
    } while (0);
    i10 = HEAP32[i4 + 64 >> 2] | 0;
    i9 = i10 + 12 | 0;
    i5 = i10 + 16 | 0;
    i8 = HEAP32[i5 >> 2] | 0;
    i10 = i10 + 20 | 0;
    if ((i8 | 0) < (HEAP32[i10 >> 2] | 0)) {
     i10 = HEAP32[i9 >> 2] | 0;
    } else {
     i10 = _luaM_growaux_(HEAP32[i1 >> 2] | 0, HEAP32[i9 >> 2] | 0, i10, 16, 32767, 6312) | 0;
     HEAP32[i9 >> 2] = i10;
    }
    HEAP32[i10 + (i8 << 4) >> 2] = i23;
    i29 = HEAP32[i9 >> 2] | 0;
    HEAP32[i29 + (i8 << 4) + 8 >> 2] = i7;
    HEAP8[i29 + (i8 << 4) + 12 | 0] = HEAP8[(HEAP32[i3 >> 2] | 0) + 46 | 0] | 0;
    HEAP32[(HEAP32[i9 >> 2] | 0) + (i8 << 4) + 4 >> 2] = i6;
    HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
    _findlabel(i4, i8) | 0;
    break;
   }
  default:
   {
    i6 = i8 + 8 | 0;
    _suffixedexp(i4, i6);
    i29 = HEAP32[i5 >> 2] | 0;
    if ((i29 | 0) == 44 | (i29 | 0) == 61) {
     HEAP32[i8 >> 2] = 0;
     _assignment(i4, i8, 1);
     break L8;
    }
    if ((HEAP32[i6 >> 2] | 0) == 12) {
     i29 = (HEAP32[(HEAP32[i9 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i8 + 16 >> 2] << 2) | 0;
     HEAP32[i29 >> 2] = HEAP32[i29 >> 2] & -8372225 | 16384;
     break L8;
    } else {
     _luaX_syntaxerror(i4, 6344);
    }
   }
  }
 } while (0);
 i29 = HEAP32[i3 >> 2] | 0;
 HEAP8[i29 + 48 | 0] = HEAP8[i29 + 46 | 0] | 0;
 i29 = (HEAP32[i1 >> 2] | 0) + 38 | 0;
 HEAP16[i29 >> 1] = (HEAP16[i29 >> 1] | 0) + -1 << 16 >> 16;
 STACKTOP = i2;
 return;
}
function _match(i1, i12, i11) {
 i1 = i1 | 0;
 i12 = i12 | 0;
 i11 = i11 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 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;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i8 = i2;
 i32 = HEAP32[i1 >> 2] | 0;
 HEAP32[i1 >> 2] = i32 + -1;
 if ((i32 | 0) == 0) {
  _luaL_error(HEAP32[i1 + 16 >> 2] | 0, 7272, i8) | 0;
 }
 i14 = i1 + 12 | 0;
 i22 = HEAP32[i14 >> 2] | 0;
 L4 : do {
  if ((i22 | 0) != (i11 | 0)) {
   i3 = i1 + 8 | 0;
   i9 = i1 + 16 | 0;
   i16 = i1 + 4 | 0;
   i10 = i1 + 20 | 0;
   L6 : while (1) {
    i19 = i12 + 1 | 0;
    i20 = i12 + -1 | 0;
    L8 : while (1) {
     i23 = HEAP8[i11] | 0;
     i21 = i23 << 24 >> 24;
     L10 : do {
      if ((i21 | 0) == 36) {
       i7 = i11 + 1 | 0;
       if ((i7 | 0) == (i22 | 0)) {
        i7 = 23;
        break L6;
       } else {
        i22 = i7;
        i21 = i7;
        i7 = 89;
       }
      } else if ((i21 | 0) == 37) {
       i21 = i11 + 1 | 0;
       i23 = HEAP8[i21] | 0;
       switch (i23 << 24 >> 24 | 0) {
       case 57:
       case 56:
       case 55:
       case 54:
       case 53:
       case 52:
       case 51:
       case 50:
       case 49:
       case 48:
        {
         i7 = 69;
         break L8;
        }
       case 98:
        {
         i7 = 25;
         break L8;
        }
       case 102:
        {
         break;
        }
       default:
        {
         if ((i21 | 0) == (i22 | 0)) {
          _luaL_error(HEAP32[i9 >> 2] | 0, 7368, i8) | 0;
         }
         i22 = i11 + 2 | 0;
         i7 = 89;
         break L10;
        }
       }
       i22 = i11 + 2 | 0;
       if ((HEAP8[i22] | 0) == 91) {
        i21 = 91;
       } else {
        _luaL_error(HEAP32[i9 >> 2] | 0, 7296, i8) | 0;
        i21 = HEAP8[i22] | 0;
       }
       i23 = i11 + 3 | 0;
       i21 = i21 << 24 >> 24;
       if ((i21 | 0) == 91) {
        i21 = (HEAP8[i23] | 0) == 94 ? i11 + 4 | 0 : i23;
        while (1) {
         if ((i21 | 0) == (HEAP32[i14 >> 2] | 0)) {
          _luaL_error(HEAP32[i9 >> 2] | 0, 7408, i8) | 0;
         }
         i11 = i21 + 1 | 0;
         if ((HEAP8[i21] | 0) == 37) {
          i11 = i11 >>> 0 < (HEAP32[i14 >> 2] | 0) >>> 0 ? i21 + 2 | 0 : i11;
         }
         if ((HEAP8[i11] | 0) == 93) {
          break;
         } else {
          i21 = i11;
         }
        }
        i11 = i11 + 1 | 0;
       } else if ((i21 | 0) == 37) {
        if ((i23 | 0) == (HEAP32[i14 >> 2] | 0)) {
         _luaL_error(HEAP32[i9 >> 2] | 0, 7368, i8) | 0;
        }
        i11 = i11 + 4 | 0;
       } else {
        i11 = i23;
       }
       if ((i12 | 0) == (HEAP32[i16 >> 2] | 0)) {
        i25 = 0;
       } else {
        i25 = HEAP8[i20] | 0;
       }
       i24 = i25 & 255;
       i21 = i11 + -1 | 0;
       i26 = (HEAP8[i23] | 0) == 94;
       i28 = i26 ? i23 : i22;
       i27 = i26 & 1;
       i26 = i27 ^ 1;
       i30 = i28 + 1 | 0;
       L41 : do {
        if (i30 >>> 0 < i21 >>> 0) {
         while (1) {
          i32 = HEAP8[i30] | 0;
          i29 = i28 + 2 | 0;
          i31 = HEAP8[i29] | 0;
          do {
           if (i32 << 24 >> 24 == 37) {
            if ((_match_class(i24, i31 & 255) | 0) == 0) {
             i28 = i29;
            } else {
             break L41;
            }
           } else {
            if (i31 << 24 >> 24 == 45 ? (i18 = i28 + 3 | 0, i18 >>> 0 < i21 >>> 0) : 0) {
             if ((i32 & 255) > (i25 & 255)) {
              i28 = i18;
              break;
             }
             if ((HEAPU8[i18] | 0) < (i25 & 255)) {
              i28 = i18;
              break;
             } else {
              break L41;
             }
            }
            if (i32 << 24 >> 24 == i25 << 24 >> 24) {
             break L41;
            } else {
             i28 = i30;
            }
           }
          } while (0);
          i30 = i28 + 1 | 0;
          if (!(i30 >>> 0 < i21 >>> 0)) {
           i26 = i27;
           break;
          }
         }
        } else {
         i26 = i27;
        }
       } while (0);
       if ((i26 | 0) != 0) {
        i12 = 0;
        break L4;
       }
       i24 = HEAP8[i12] | 0;
       i25 = i24 & 255;
       i27 = (HEAP8[i23] | 0) == 94;
       i26 = i27 ? i23 : i22;
       i22 = i27 & 1;
       i23 = i22 ^ 1;
       i30 = i26 + 1 | 0;
       L55 : do {
        if (i30 >>> 0 < i21 >>> 0) {
         do {
          i29 = HEAP8[i30] | 0;
          i28 = i26 + 2 | 0;
          i27 = HEAP8[i28] | 0;
          do {
           if (i29 << 24 >> 24 == 37) {
            if ((_match_class(i25, i27 & 255) | 0) == 0) {
             i26 = i28;
            } else {
             i22 = i23;
             break L55;
            }
           } else {
            if (i27 << 24 >> 24 == 45 ? (i17 = i26 + 3 | 0, i17 >>> 0 < i21 >>> 0) : 0) {
             if ((i29 & 255) > (i24 & 255)) {
              i26 = i17;
              break;
             }
             if ((HEAPU8[i17] | 0) < (i24 & 255)) {
              i26 = i17;
              break;
             } else {
              i22 = i23;
              break L55;
             }
            }
            if (i29 << 24 >> 24 == i24 << 24 >> 24) {
             i22 = i23;
             break L55;
            } else {
             i26 = i30;
            }
           }
          } while (0);
          i30 = i26 + 1 | 0;
         } while (i30 >>> 0 < i21 >>> 0);
        }
       } while (0);
       if ((i22 | 0) == 0) {
        i12 = 0;
        break L4;
       }
      } else if ((i21 | 0) == 40) {
       i7 = 7;
       break L6;
      } else if ((i21 | 0) != 41) {
       i21 = i11 + 1 | 0;
       if (i23 << 24 >> 24 == 91) {
        i7 = (HEAP8[i21] | 0) == 94 ? i11 + 2 | 0 : i21;
        while (1) {
         if ((i7 | 0) == (i22 | 0)) {
          _luaL_error(HEAP32[i9 >> 2] | 0, 7408, i8) | 0;
         }
         i22 = i7 + 1 | 0;
         if ((HEAP8[i7] | 0) == 37) {
          i7 = i22 >>> 0 < (HEAP32[i14 >> 2] | 0) >>> 0 ? i7 + 2 | 0 : i22;
         } else {
          i7 = i22;
         }
         if ((HEAP8[i7] | 0) == 93) {
          break;
         }
         i22 = HEAP32[i14 >> 2] | 0;
        }
        i22 = i7 + 1 | 0;
        i7 = 89;
       } else {
        i22 = i21;
        i7 = 89;
       }
      } else {
       i7 = 16;
       break L6;
      }
     } while (0);
     L80 : do {
      if ((i7 | 0) == 89) {
       i7 = 0;
       do {
        if ((HEAP32[i3 >> 2] | 0) >>> 0 > i12 >>> 0) {
         i23 = HEAP8[i12] | 0;
         i24 = i23 & 255;
         i26 = HEAP8[i11] | 0;
         i25 = i26 << 24 >> 24;
         L85 : do {
          if ((i25 | 0) == 46) {
           i23 = HEAP8[i22] | 0;
          } else if ((i25 | 0) == 37) {
           i25 = _match_class(i24, HEAPU8[i21] | 0) | 0;
           i7 = 104;
          } else if ((i25 | 0) == 91) {
           i7 = i22 + -1 | 0;
           i25 = (HEAP8[i21] | 0) == 94;
           i27 = i25 ? i21 : i11;
           i26 = i25 & 1;
           i25 = i26 ^ 1;
           i30 = i27 + 1 | 0;
           if (i30 >>> 0 < i7 >>> 0) {
            while (1) {
             i31 = HEAP8[i30] | 0;
             i29 = i27 + 2 | 0;
             i28 = HEAP8[i29] | 0;
             do {
              if (i31 << 24 >> 24 == 37) {
               if ((_match_class(i24, i28 & 255) | 0) == 0) {
                i27 = i29;
               } else {
                i7 = 104;
                break L85;
               }
              } else {
               if (i28 << 24 >> 24 == 45 ? (i13 = i27 + 3 | 0, i13 >>> 0 < i7 >>> 0) : 0) {
                if ((i31 & 255) > (i23 & 255)) {
                 i27 = i13;
                 break;
                }
                if ((HEAPU8[i13] | 0) < (i23 & 255)) {
                 i27 = i13;
                 break;
                } else {
                 i7 = 104;
                 break L85;
                }
               }
               if (i31 << 24 >> 24 == i23 << 24 >> 24) {
                i7 = 104;
                break L85;
               } else {
                i27 = i30;
               }
              }
             } while (0);
             i30 = i27 + 1 | 0;
             if (!(i30 >>> 0 < i7 >>> 0)) {
              i25 = i26;
              i7 = 104;
              break;
             }
            }
           } else {
            i25 = i26;
            i7 = 104;
           }
          } else {
           i25 = i26 << 24 >> 24 == i23 << 24 >> 24 | 0;
           i7 = 104;
          }
         } while (0);
         if ((i7 | 0) == 104) {
          i7 = 0;
          i23 = HEAP8[i22] | 0;
          if ((i25 | 0) == 0) {
           break;
          }
         }
         i23 = i23 << 24 >> 24;
         if ((i23 | 0) == 45) {
          i7 = 109;
          break L6;
         } else if ((i23 | 0) == 42) {
          i7 = 112;
          break L6;
         } else if ((i23 | 0) == 43) {
          break L6;
         } else if ((i23 | 0) != 63) {
          i12 = i19;
          i11 = i22;
          break L8;
         }
         i11 = i22 + 1 | 0;
         i21 = _match(i1, i19, i11) | 0;
         if ((i21 | 0) == 0) {
          break L80;
         } else {
          i12 = i21;
          break L4;
         }
        } else {
         i23 = HEAP8[i22] | 0;
        }
       } while (0);
       if (!(i23 << 24 >> 24 == 45 | i23 << 24 >> 24 == 63 | i23 << 24 >> 24 == 42)) {
        i12 = 0;
        break L4;
       }
       i11 = i22 + 1 | 0;
      }
     } while (0);
     i22 = HEAP32[i14 >> 2] | 0;
     if ((i11 | 0) == (i22 | 0)) {
      break L4;
     }
    }
    if ((i7 | 0) == 25) {
     i7 = 0;
     i21 = i11 + 2 | 0;
     if (!((i22 + -1 | 0) >>> 0 > i21 >>> 0)) {
      _luaL_error(HEAP32[i9 >> 2] | 0, 7440, i8) | 0;
     }
     i20 = HEAP8[i12] | 0;
     if (!(i20 << 24 >> 24 == (HEAP8[i21] | 0))) {
      i12 = 0;
      break L4;
     }
     i21 = HEAP8[i11 + 3 | 0] | 0;
     i22 = HEAP32[i3 >> 2] | 0;
     if (i19 >>> 0 < i22 >>> 0) {
      i24 = 1;
     } else {
      i12 = 0;
      break L4;
     }
     while (1) {
      i23 = HEAP8[i19] | 0;
      if (i23 << 24 >> 24 == i21 << 24 >> 24) {
       i24 = i24 + -1 | 0;
       if ((i24 | 0) == 0) {
        break;
       }
      } else {
       i24 = (i23 << 24 >> 24 == i20 << 24 >> 24) + i24 | 0;
      }
      i12 = i19 + 1 | 0;
      if (i12 >>> 0 < i22 >>> 0) {
       i32 = i19;
       i19 = i12;
       i12 = i32;
      } else {
       i12 = 0;
       break L4;
      }
     }
     i12 = i12 + 2 | 0;
     i11 = i11 + 4 | 0;
    } else if ((i7 | 0) == 69) {
     i7 = 0;
     i20 = i23 & 255;
     i19 = i20 + -49 | 0;
     if (((i19 | 0) >= 0 ? (i19 | 0) < (HEAP32[i10 >> 2] | 0) : 0) ? (i15 = HEAP32[i1 + (i19 << 3) + 28 >> 2] | 0, !((i15 | 0) == -1)) : 0) {
      i20 = i15;
     } else {
      i19 = HEAP32[i9 >> 2] | 0;
      HEAP32[i8 >> 2] = i20 + -48;
      i20 = _luaL_error(i19, 7336, i8) | 0;
      i19 = i20;
      i20 = HEAP32[i1 + (i20 << 3) + 28 >> 2] | 0;
     }
     if (((HEAP32[i3 >> 2] | 0) - i12 | 0) >>> 0 < i20 >>> 0) {
      i12 = 0;
      break L4;
     }
     if ((_memcmp(HEAP32[i1 + (i19 << 3) + 24 >> 2] | 0, i12, i20) | 0) != 0) {
      i12 = 0;
      break L4;
     }
     i12 = i12 + i20 | 0;
     if ((i12 | 0) == 0) {
      i12 = 0;
      break L4;
     }
     i11 = i11 + 2 | 0;
    }
    i22 = HEAP32[i14 >> 2] | 0;
    if ((i11 | 0) == (i22 | 0)) {
     break L4;
    }
   }
   if ((i7 | 0) == 7) {
    i3 = i11 + 1 | 0;
    if ((HEAP8[i3] | 0) == 41) {
     i3 = HEAP32[i10 >> 2] | 0;
     if ((i3 | 0) > 31) {
      _luaL_error(HEAP32[i9 >> 2] | 0, 7200, i8) | 0;
     }
     HEAP32[i1 + (i3 << 3) + 24 >> 2] = i12;
     HEAP32[i1 + (i3 << 3) + 28 >> 2] = -2;
     HEAP32[i10 >> 2] = i3 + 1;
     i12 = _match(i1, i12, i11 + 2 | 0) | 0;
     if ((i12 | 0) != 0) {
      break;
     }
     HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + -1;
     i12 = 0;
     break;
    } else {
     i4 = HEAP32[i10 >> 2] | 0;
     if ((i4 | 0) > 31) {
      _luaL_error(HEAP32[i9 >> 2] | 0, 7200, i8) | 0;
     }
     HEAP32[i1 + (i4 << 3) + 24 >> 2] = i12;
     HEAP32[i1 + (i4 << 3) + 28 >> 2] = -1;
     HEAP32[i10 >> 2] = i4 + 1;
     i12 = _match(i1, i12, i3) | 0;
     if ((i12 | 0) != 0) {
      break;
     }
     HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + -1;
     i12 = 0;
     break;
    }
   } else if ((i7 | 0) == 16) {
    i3 = i11 + 1 | 0;
    i5 = HEAP32[i10 >> 2] | 0;
    while (1) {
     i4 = i5 + -1 | 0;
     if ((i5 | 0) <= 0) {
      i7 = 19;
      break;
     }
     if ((HEAP32[i1 + (i4 << 3) + 28 >> 2] | 0) == -1) {
      break;
     } else {
      i5 = i4;
     }
    }
    if ((i7 | 0) == 19) {
     i4 = _luaL_error(HEAP32[i9 >> 2] | 0, 7488, i8) | 0;
    }
    i5 = i1 + (i4 << 3) + 28 | 0;
    HEAP32[i5 >> 2] = i12 - (HEAP32[i1 + (i4 << 3) + 24 >> 2] | 0);
    i12 = _match(i1, i12, i3) | 0;
    if ((i12 | 0) != 0) {
     break;
    }
    HEAP32[i5 >> 2] = -1;
    i12 = 0;
    break;
   } else if ((i7 | 0) == 23) {
    i12 = (i12 | 0) == (HEAP32[i3 >> 2] | 0) ? i12 : 0;
    break;
   } else if ((i7 | 0) == 109) {
    i4 = i22 + 1 | 0;
    i8 = _match(i1, i12, i4) | 0;
    if ((i8 | 0) != 0) {
     i12 = i8;
     break;
    }
    i8 = i22 + -1 | 0;
    while (1) {
     if (!((HEAP32[i3 >> 2] | 0) >>> 0 > i12 >>> 0)) {
      i12 = 0;
      break L4;
     }
     i9 = HEAP8[i12] | 0;
     i10 = i9 & 255;
     i14 = HEAP8[i11] | 0;
     i13 = i14 << 24 >> 24;
     L139 : do {
      if ((i13 | 0) == 91) {
       i6 = (HEAP8[i21] | 0) == 94;
       i13 = i6 ? i21 : i11;
       i6 = i6 & 1;
       i7 = i6 ^ 1;
       i14 = i13 + 1 | 0;
       if (i14 >>> 0 < i8 >>> 0) {
        while (1) {
         i17 = HEAP8[i14] | 0;
         i15 = i13 + 2 | 0;
         i16 = HEAP8[i15] | 0;
         do {
          if (i17 << 24 >> 24 == 37) {
           if ((_match_class(i10, i16 & 255) | 0) == 0) {
            i13 = i15;
           } else {
            i6 = i7;
            i7 = 147;
            break L139;
           }
          } else {
           if (i16 << 24 >> 24 == 45 ? (i5 = i13 + 3 | 0, i5 >>> 0 < i8 >>> 0) : 0) {
            if ((i17 & 255) > (i9 & 255)) {
             i13 = i5;
             break;
            }
            if ((HEAPU8[i5] | 0) < (i9 & 255)) {
             i13 = i5;
             break;
            } else {
             i6 = i7;
             i7 = 147;
             break L139;
            }
           }
           if (i17 << 24 >> 24 == i9 << 24 >> 24) {
            i6 = i7;
            i7 = 147;
            break L139;
           } else {
            i13 = i14;
           }
          }
         } while (0);
         i14 = i13 + 1 | 0;
         if (!(i14 >>> 0 < i8 >>> 0)) {
          i7 = 147;
          break;
         }
        }
       } else {
        i7 = 147;
       }
      } else if ((i13 | 0) == 37) {
       i6 = _match_class(i10, HEAPU8[i21] | 0) | 0;
       i7 = 147;
      } else if ((i13 | 0) != 46) {
       i6 = i14 << 24 >> 24 == i9 << 24 >> 24 | 0;
       i7 = 147;
      }
     } while (0);
     if ((i7 | 0) == 147 ? (i7 = 0, (i6 | 0) == 0) : 0) {
      i12 = 0;
      break L4;
     }
     i9 = i12 + 1 | 0;
     i12 = _match(i1, i9, i4) | 0;
     if ((i12 | 0) == 0) {
      i12 = i9;
     } else {
      break L4;
     }
    }
   } else if ((i7 | 0) == 112) {
    i19 = i12;
   }
   i10 = HEAP32[i3 >> 2] | 0;
   if (i10 >>> 0 > i19 >>> 0) {
    i5 = i22 + -1 | 0;
    i8 = i19;
    i6 = 0;
    do {
     i8 = HEAP8[i8] | 0;
     i9 = i8 & 255;
     i13 = HEAP8[i11] | 0;
     i12 = i13 << 24 >> 24;
     L183 : do {
      if ((i12 | 0) == 37) {
       i10 = _match_class(i9, HEAPU8[i21] | 0) | 0;
       i7 = 129;
      } else if ((i12 | 0) == 91) {
       i7 = (HEAP8[i21] | 0) == 94;
       i12 = i7 ? i21 : i11;
       i10 = i7 & 1;
       i7 = i10 ^ 1;
       i13 = i12 + 1 | 0;
       if (i13 >>> 0 < i5 >>> 0) {
        while (1) {
         i14 = HEAP8[i13] | 0;
         i16 = i12 + 2 | 0;
         i15 = HEAP8[i16] | 0;
         do {
          if (i14 << 24 >> 24 == 37) {
           if ((_match_class(i9, i15 & 255) | 0) == 0) {
            i12 = i16;
           } else {
            i10 = i7;
            i7 = 129;
            break L183;
           }
          } else {
           if (i15 << 24 >> 24 == 45 ? (i4 = i12 + 3 | 0, i4 >>> 0 < i5 >>> 0) : 0) {
            if ((i14 & 255) > (i8 & 255)) {
             i12 = i4;
             break;
            }
            if ((HEAPU8[i4] | 0) < (i8 & 255)) {
             i12 = i4;
             break;
            } else {
             i10 = i7;
             i7 = 129;
             break L183;
            }
           }
           if (i14 << 24 >> 24 == i8 << 24 >> 24) {
            i10 = i7;
            i7 = 129;
            break L183;
           } else {
            i12 = i13;
           }
          }
         } while (0);
         i13 = i12 + 1 | 0;
         if (!(i13 >>> 0 < i5 >>> 0)) {
          i7 = 129;
          break;
         }
        }
       } else {
        i7 = 129;
       }
      } else if ((i12 | 0) != 46) {
       i10 = i13 << 24 >> 24 == i8 << 24 >> 24 | 0;
       i7 = 129;
      }
     } while (0);
     if ((i7 | 0) == 129) {
      i7 = 0;
      if ((i10 | 0) == 0) {
       break;
      }
      i10 = HEAP32[i3 >> 2] | 0;
     }
     i6 = i6 + 1 | 0;
     i8 = i19 + i6 | 0;
    } while (i10 >>> 0 > i8 >>> 0);
    if (!((i6 | 0) > -1)) {
     i12 = 0;
     break;
    }
   } else {
    i6 = 0;
   }
   i3 = i22 + 1 | 0;
   while (1) {
    i12 = _match(i1, i19 + i6 | 0, i3) | 0;
    if ((i12 | 0) != 0) {
     break L4;
    }
    if ((i6 | 0) > 0) {
     i6 = i6 + -1 | 0;
    } else {
     i12 = 0;
     break;
    }
   }
  }
 } while (0);
 HEAP32[i1 >> 2] = (HEAP32[i1 >> 2] | 0) + 1;
 STACKTOP = i2;
 return i12 | 0;
}
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[12928 >> 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[12932 >> 2] | 0)) {
    i2 = i7 + (i8 + -4) | 0;
    if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
     i2 = i13;
     i11 = i12;
     break;
    }
    HEAP32[12920 >> 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 = 12952 + (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[3228] = HEAP32[3228] & ~(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 = 13216 + (i18 << 2) | 0;
    if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) {
     HEAP32[i16 >> 2] = i14;
     if ((i14 | 0) == 0) {
      HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i18);
      i2 = i13;
      i11 = i12;
      break;
     }
    } else {
     if (i17 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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[12928 >> 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[12928 >> 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[12936 >> 2] | 0)) {
   i21 = (HEAP32[12924 >> 2] | 0) + i11 | 0;
   HEAP32[12924 >> 2] = i21;
   HEAP32[12936 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i21 | 1;
   if ((i2 | 0) != (HEAP32[12932 >> 2] | 0)) {
    STACKTOP = i1;
    return;
   }
   HEAP32[12932 >> 2] = 0;
   HEAP32[12920 >> 2] = 0;
   STACKTOP = i1;
   return;
  }
  if ((i6 | 0) == (HEAP32[12932 >> 2] | 0)) {
   i21 = (HEAP32[12920 >> 2] | 0) + i11 | 0;
   HEAP32[12920 >> 2] = i21;
   HEAP32[12932 >> 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[12928 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i13 >> 2] = 0;
       i9 = i12;
       break;
      }
     } else {
      i13 = HEAP32[i7 + i8 >> 2] | 0;
      if (i13 >>> 0 < (HEAP32[12928 >> 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 = 13216 + (i12 << 2) | 0;
     if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) {
      HEAP32[i13 >> 2] = i9;
      if ((i9 | 0) == 0) {
       HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i12);
       break;
      }
     } else {
      if (i10 >>> 0 < (HEAP32[12928 >> 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[12928 >> 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[12928 >> 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[12928 >> 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 = 12952 + (i12 << 1 << 2) | 0;
    if ((i9 | 0) != (i8 | 0)) {
     if (i9 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     }
     if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) {
      _abort();
     }
    }
    if ((i7 | 0) == (i9 | 0)) {
     HEAP32[3228] = HEAP32[3228] & ~(1 << i12);
     break;
    }
    if ((i7 | 0) != (i8 | 0)) {
     if (i7 >>> 0 < (HEAP32[12928 >> 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[12932 >> 2] | 0)) {
   HEAP32[12920 >> 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 = 12952 + (i7 << 2) | 0;
  i8 = HEAP32[3228] | 0;
  i6 = 1 << i6;
  if ((i8 & i6 | 0) != 0) {
   i6 = 12952 + (i7 + 2 << 2) | 0;
   i7 = HEAP32[i6 >> 2] | 0;
   if (i7 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
    _abort();
   } else {
    i4 = i6;
    i5 = i7;
   }
  } else {
   HEAP32[3228] = i8 | i6;
   i4 = 12952 + (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 = 13216 + (i4 << 2) | 0;
 HEAP32[i2 + 28 >> 2] = i4;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 i7 = HEAP32[12916 >> 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[12928 >> 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[12928 >> 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[12916 >> 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[12944 >> 2] | 0) + -1 | 0;
 HEAP32[12944 >> 2] = i21;
 if ((i21 | 0) == 0) {
  i2 = 13368 | 0;
 } else {
  STACKTOP = i1;
  return;
 }
 while (1) {
  i2 = HEAP32[i2 >> 2] | 0;
  if ((i2 | 0) == 0) {
   break;
  } else {
   i2 = i2 + 8 | 0;
  }
 }
 HEAP32[12944 >> 2] = -1;
 STACKTOP = i1;
 return;
}
function _dispose_chunk(i6, i7) {
 i6 = i6 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 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;
 i1 = STACKTOP;
 i5 = i6 + i7 | 0;
 i10 = HEAP32[i6 + 4 >> 2] | 0;
 do {
  if ((i10 & 1 | 0) == 0) {
   i14 = HEAP32[i6 >> 2] | 0;
   if ((i10 & 3 | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   i10 = i6 + (0 - i14) | 0;
   i11 = i14 + i7 | 0;
   i15 = HEAP32[12928 >> 2] | 0;
   if (i10 >>> 0 < i15 >>> 0) {
    _abort();
   }
   if ((i10 | 0) == (HEAP32[12932 >> 2] | 0)) {
    i2 = i6 + (i7 + 4) | 0;
    if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
     i2 = i10;
     i12 = i11;
     break;
    }
    HEAP32[12920 >> 2] = i11;
    HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2;
    HEAP32[i6 + (4 - i14) >> 2] = i11 | 1;
    HEAP32[i5 >> 2] = i11;
    STACKTOP = i1;
    return;
   }
   i17 = i14 >>> 3;
   if (i14 >>> 0 < 256) {
    i2 = HEAP32[i6 + (8 - i14) >> 2] | 0;
    i12 = HEAP32[i6 + (12 - i14) >> 2] | 0;
    i13 = 12952 + (i17 << 1 << 2) | 0;
    if ((i2 | 0) != (i13 | 0)) {
     if (i2 >>> 0 < i15 >>> 0) {
      _abort();
     }
     if ((HEAP32[i2 + 12 >> 2] | 0) != (i10 | 0)) {
      _abort();
     }
    }
    if ((i12 | 0) == (i2 | 0)) {
     HEAP32[3228] = HEAP32[3228] & ~(1 << i17);
     i2 = i10;
     i12 = i11;
     break;
    }
    if ((i12 | 0) != (i13 | 0)) {
     if (i12 >>> 0 < i15 >>> 0) {
      _abort();
     }
     i13 = i12 + 8 | 0;
     if ((HEAP32[i13 >> 2] | 0) == (i10 | 0)) {
      i16 = i13;
     } else {
      _abort();
     }
    } else {
     i16 = i12 + 8 | 0;
    }
    HEAP32[i2 + 12 >> 2] = i12;
    HEAP32[i16 >> 2] = i2;
    i2 = i10;
    i12 = i11;
    break;
   }
   i16 = HEAP32[i6 + (24 - i14) >> 2] | 0;
   i18 = HEAP32[i6 + (12 - i14) >> 2] | 0;
   do {
    if ((i18 | 0) == (i10 | 0)) {
     i19 = 16 - i14 | 0;
     i18 = i6 + (i19 + 4) | 0;
     i17 = HEAP32[i18 >> 2] | 0;
     if ((i17 | 0) == 0) {
      i18 = i6 + i19 | 0;
      i17 = HEAP32[i18 >> 2] | 0;
      if ((i17 | 0) == 0) {
       i13 = 0;
       break;
      }
     }
     while (1) {
      i19 = i17 + 20 | 0;
      i20 = HEAP32[i19 >> 2] | 0;
      if ((i20 | 0) != 0) {
       i17 = i20;
       i18 = i19;
       continue;
      }
      i20 = i17 + 16 | 0;
      i19 = HEAP32[i20 >> 2] | 0;
      if ((i19 | 0) == 0) {
       break;
      } else {
       i17 = i19;
       i18 = i20;
      }
     }
     if (i18 >>> 0 < i15 >>> 0) {
      _abort();
     } else {
      HEAP32[i18 >> 2] = 0;
      i13 = i17;
      break;
     }
    } else {
     i17 = HEAP32[i6 + (8 - i14) >> 2] | 0;
     if (i17 >>> 0 < i15 >>> 0) {
      _abort();
     }
     i19 = i17 + 12 | 0;
     if ((HEAP32[i19 >> 2] | 0) != (i10 | 0)) {
      _abort();
     }
     i15 = i18 + 8 | 0;
     if ((HEAP32[i15 >> 2] | 0) == (i10 | 0)) {
      HEAP32[i19 >> 2] = i18;
      HEAP32[i15 >> 2] = i17;
      i13 = i18;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   if ((i16 | 0) != 0) {
    i15 = HEAP32[i6 + (28 - i14) >> 2] | 0;
    i17 = 13216 + (i15 << 2) | 0;
    if ((i10 | 0) == (HEAP32[i17 >> 2] | 0)) {
     HEAP32[i17 >> 2] = i13;
     if ((i13 | 0) == 0) {
      HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i15);
      i2 = i10;
      i12 = i11;
      break;
     }
    } else {
     if (i16 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     }
     i15 = i16 + 16 | 0;
     if ((HEAP32[i15 >> 2] | 0) == (i10 | 0)) {
      HEAP32[i15 >> 2] = i13;
     } else {
      HEAP32[i16 + 20 >> 2] = i13;
     }
     if ((i13 | 0) == 0) {
      i2 = i10;
      i12 = i11;
      break;
     }
    }
    if (i13 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
     _abort();
    }
    HEAP32[i13 + 24 >> 2] = i16;
    i14 = 16 - i14 | 0;
    i15 = HEAP32[i6 + i14 >> 2] | 0;
    do {
     if ((i15 | 0) != 0) {
      if (i15 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i13 + 16 >> 2] = i15;
       HEAP32[i15 + 24 >> 2] = i13;
       break;
      }
     }
    } while (0);
    i14 = HEAP32[i6 + (i14 + 4) >> 2] | 0;
    if ((i14 | 0) != 0) {
     if (i14 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i13 + 20 >> 2] = i14;
      HEAP32[i14 + 24 >> 2] = i13;
      i2 = i10;
      i12 = i11;
      break;
     }
    } else {
     i2 = i10;
     i12 = i11;
    }
   } else {
    i2 = i10;
    i12 = i11;
   }
  } else {
   i2 = i6;
   i12 = i7;
  }
 } while (0);
 i10 = HEAP32[12928 >> 2] | 0;
 if (i5 >>> 0 < i10 >>> 0) {
  _abort();
 }
 i11 = i6 + (i7 + 4) | 0;
 i13 = HEAP32[i11 >> 2] | 0;
 if ((i13 & 2 | 0) == 0) {
  if ((i5 | 0) == (HEAP32[12936 >> 2] | 0)) {
   i20 = (HEAP32[12924 >> 2] | 0) + i12 | 0;
   HEAP32[12924 >> 2] = i20;
   HEAP32[12936 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i20 | 1;
   if ((i2 | 0) != (HEAP32[12932 >> 2] | 0)) {
    STACKTOP = i1;
    return;
   }
   HEAP32[12932 >> 2] = 0;
   HEAP32[12920 >> 2] = 0;
   STACKTOP = i1;
   return;
  }
  if ((i5 | 0) == (HEAP32[12932 >> 2] | 0)) {
   i20 = (HEAP32[12920 >> 2] | 0) + i12 | 0;
   HEAP32[12920 >> 2] = i20;
   HEAP32[12932 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i20 | 1;
   HEAP32[i2 + i20 >> 2] = i20;
   STACKTOP = i1;
   return;
  }
  i12 = (i13 & -8) + i12 | 0;
  i11 = i13 >>> 3;
  do {
   if (!(i13 >>> 0 < 256)) {
    i9 = HEAP32[i6 + (i7 + 24) >> 2] | 0;
    i11 = HEAP32[i6 + (i7 + 12) >> 2] | 0;
    do {
     if ((i11 | 0) == (i5 | 0)) {
      i13 = i6 + (i7 + 20) | 0;
      i11 = HEAP32[i13 >> 2] | 0;
      if ((i11 | 0) == 0) {
       i13 = i6 + (i7 + 16) | 0;
       i11 = HEAP32[i13 >> 2] | 0;
       if ((i11 | 0) == 0) {
        i8 = 0;
        break;
       }
      }
      while (1) {
       i15 = i11 + 20 | 0;
       i14 = HEAP32[i15 >> 2] | 0;
       if ((i14 | 0) != 0) {
        i11 = i14;
        i13 = i15;
        continue;
       }
       i14 = i11 + 16 | 0;
       i15 = HEAP32[i14 >> 2] | 0;
       if ((i15 | 0) == 0) {
        break;
       } else {
        i11 = i15;
        i13 = i14;
       }
      }
      if (i13 >>> 0 < i10 >>> 0) {
       _abort();
      } else {
       HEAP32[i13 >> 2] = 0;
       i8 = i11;
       break;
      }
     } else {
      i13 = HEAP32[i6 + (i7 + 8) >> 2] | 0;
      if (i13 >>> 0 < i10 >>> 0) {
       _abort();
      }
      i10 = i13 + 12 | 0;
      if ((HEAP32[i10 >> 2] | 0) != (i5 | 0)) {
       _abort();
      }
      i14 = i11 + 8 | 0;
      if ((HEAP32[i14 >> 2] | 0) == (i5 | 0)) {
       HEAP32[i10 >> 2] = i11;
       HEAP32[i14 >> 2] = i13;
       i8 = i11;
       break;
      } else {
       _abort();
      }
     }
    } while (0);
    if ((i9 | 0) != 0) {
     i10 = HEAP32[i6 + (i7 + 28) >> 2] | 0;
     i11 = 13216 + (i10 << 2) | 0;
     if ((i5 | 0) == (HEAP32[i11 >> 2] | 0)) {
      HEAP32[i11 >> 2] = i8;
      if ((i8 | 0) == 0) {
       HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i10);
       break;
      }
     } else {
      if (i9 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
       _abort();
      }
      i10 = i9 + 16 | 0;
      if ((HEAP32[i10 >> 2] | 0) == (i5 | 0)) {
       HEAP32[i10 >> 2] = i8;
      } else {
       HEAP32[i9 + 20 >> 2] = i8;
      }
      if ((i8 | 0) == 0) {
       break;
      }
     }
     if (i8 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     }
     HEAP32[i8 + 24 >> 2] = i9;
     i5 = HEAP32[i6 + (i7 + 16) >> 2] | 0;
     do {
      if ((i5 | 0) != 0) {
       if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[i8 + 16 >> 2] = i5;
        HEAP32[i5 + 24 >> 2] = i8;
        break;
       }
      }
     } while (0);
     i5 = HEAP32[i6 + (i7 + 20) >> 2] | 0;
     if ((i5 | 0) != 0) {
      if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i8 + 20 >> 2] = i5;
       HEAP32[i5 + 24 >> 2] = i8;
       break;
      }
     }
    }
   } else {
    i8 = HEAP32[i6 + (i7 + 8) >> 2] | 0;
    i6 = HEAP32[i6 + (i7 + 12) >> 2] | 0;
    i7 = 12952 + (i11 << 1 << 2) | 0;
    if ((i8 | 0) != (i7 | 0)) {
     if (i8 >>> 0 < i10 >>> 0) {
      _abort();
     }
     if ((HEAP32[i8 + 12 >> 2] | 0) != (i5 | 0)) {
      _abort();
     }
    }
    if ((i6 | 0) == (i8 | 0)) {
     HEAP32[3228] = HEAP32[3228] & ~(1 << i11);
     break;
    }
    if ((i6 | 0) != (i7 | 0)) {
     if (i6 >>> 0 < i10 >>> 0) {
      _abort();
     }
     i7 = i6 + 8 | 0;
     if ((HEAP32[i7 >> 2] | 0) == (i5 | 0)) {
      i9 = i7;
     } else {
      _abort();
     }
    } else {
     i9 = i6 + 8 | 0;
    }
    HEAP32[i8 + 12 >> 2] = i6;
    HEAP32[i9 >> 2] = i8;
   }
  } while (0);
  HEAP32[i2 + 4 >> 2] = i12 | 1;
  HEAP32[i2 + i12 >> 2] = i12;
  if ((i2 | 0) == (HEAP32[12932 >> 2] | 0)) {
   HEAP32[12920 >> 2] = i12;
   STACKTOP = i1;
   return;
  }
 } else {
  HEAP32[i11 >> 2] = i13 & -2;
  HEAP32[i2 + 4 >> 2] = i12 | 1;
  HEAP32[i2 + i12 >> 2] = i12;
 }
 i6 = i12 >>> 3;
 if (i12 >>> 0 < 256) {
  i7 = i6 << 1;
  i5 = 12952 + (i7 << 2) | 0;
  i8 = HEAP32[3228] | 0;
  i6 = 1 << i6;
  if ((i8 & i6 | 0) != 0) {
   i7 = 12952 + (i7 + 2 << 2) | 0;
   i6 = HEAP32[i7 >> 2] | 0;
   if (i6 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
    _abort();
   } else {
    i4 = i7;
    i3 = i6;
   }
  } else {
   HEAP32[3228] = i8 | i6;
   i4 = 12952 + (i7 + 2 << 2) | 0;
   i3 = i5;
  }
  HEAP32[i4 >> 2] = i2;
  HEAP32[i3 + 12 >> 2] = i2;
  HEAP32[i2 + 8 >> 2] = i3;
  HEAP32[i2 + 12 >> 2] = i5;
  STACKTOP = i1;
  return;
 }
 i3 = i12 >>> 8;
 if ((i3 | 0) != 0) {
  if (i12 >>> 0 > 16777215) {
   i3 = 31;
  } else {
   i19 = (i3 + 1048320 | 0) >>> 16 & 8;
   i20 = i3 << i19;
   i18 = (i20 + 520192 | 0) >>> 16 & 4;
   i20 = i20 << i18;
   i3 = (i20 + 245760 | 0) >>> 16 & 2;
   i3 = 14 - (i18 | i19 | i3) + (i20 << i3 >>> 15) | 0;
   i3 = i12 >>> (i3 + 7 | 0) & 1 | i3 << 1;
  }
 } else {
  i3 = 0;
 }
 i6 = 13216 + (i3 << 2) | 0;
 HEAP32[i2 + 28 >> 2] = i3;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 i5 = HEAP32[12916 >> 2] | 0;
 i4 = 1 << i3;
 if ((i5 & i4 | 0) == 0) {
  HEAP32[12916 >> 2] = i5 | i4;
  HEAP32[i6 >> 2] = i2;
  HEAP32[i2 + 24 >> 2] = i6;
  HEAP32[i2 + 12 >> 2] = i2;
  HEAP32[i2 + 8 >> 2] = i2;
  STACKTOP = i1;
  return;
 }
 i4 = HEAP32[i6 >> 2] | 0;
 if ((i3 | 0) == 31) {
  i3 = 0;
 } else {
  i3 = 25 - (i3 >>> 1) | 0;
 }
 L194 : do {
  if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i12 | 0)) {
   i3 = i12 << i3;
   i6 = i4;
   while (1) {
    i5 = i6 + (i3 >>> 31 << 2) + 16 | 0;
    i4 = HEAP32[i5 >> 2] | 0;
    if ((i4 | 0) == 0) {
     break;
    }
    if ((HEAP32[i4 + 4 >> 2] & -8 | 0) == (i12 | 0)) {
     break L194;
    } else {
     i3 = i3 << 1;
     i6 = i4;
    }
   }
   if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
    _abort();
   }
   HEAP32[i5 >> 2] = i2;
   HEAP32[i2 + 24 >> 2] = i6;
   HEAP32[i2 + 12 >> 2] = i2;
   HEAP32[i2 + 8 >> 2] = i2;
   STACKTOP = i1;
   return;
  }
 } while (0);
 i3 = i4 + 8 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i5 = HEAP32[12928 >> 2] | 0;
 if (i4 >>> 0 < i5 >>> 0) {
  _abort();
 }
 if (i6 >>> 0 < i5 >>> 0) {
  _abort();
 }
 HEAP32[i6 + 12 >> 2] = i2;
 HEAP32[i3 >> 2] = i2;
 HEAP32[i2 + 8 >> 2] = i6;
 HEAP32[i2 + 12 >> 2] = i4;
 HEAP32[i2 + 24 >> 2] = 0;
 STACKTOP = i1;
 return;
}
function _singlestep(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 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, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i14 = i1;
 i3 = i2 + 12 | 0;
 i8 = HEAP32[i3 >> 2] | 0;
 i6 = i8 + 61 | 0;
 switch (HEAPU8[i6] | 0) {
 case 0:
  {
   if ((HEAP32[i8 + 84 >> 2] | 0) != 0) {
    i21 = i8 + 16 | 0;
    i22 = HEAP32[i21 >> 2] | 0;
    _propagatemark(i8);
    i22 = (HEAP32[i21 >> 2] | 0) - i22 | 0;
    STACKTOP = i1;
    return i22 | 0;
   }
   HEAP8[i6] = 1;
   i6 = i8 + 20 | 0;
   HEAP32[i6 >> 2] = HEAP32[i8 + 16 >> 2];
   i8 = HEAP32[i3 >> 2] | 0;
   i7 = i8 + 16 | 0;
   i14 = HEAP32[i7 >> 2] | 0;
   if ((i2 | 0) != 0 ? !((HEAP8[i2 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i8, i2);
   }
   if ((HEAP32[i8 + 48 >> 2] & 64 | 0) != 0 ? (i13 = HEAP32[i8 + 40 >> 2] | 0, !((HEAP8[i13 + 5 | 0] & 3) == 0)) : 0) {
    _reallymarkobject(i8, i13);
   }
   _markmt(i8);
   i13 = i8 + 112 | 0;
   i15 = HEAP32[i8 + 132 >> 2] | 0;
   if ((i15 | 0) != (i13 | 0)) {
    do {
     if (((HEAP8[i15 + 5 | 0] & 7) == 0 ? (i12 = HEAP32[i15 + 8 >> 2] | 0, (HEAP32[i12 + 8 >> 2] & 64 | 0) != 0) : 0) ? (i11 = HEAP32[i12 >> 2] | 0, !((HEAP8[i11 + 5 | 0] & 3) == 0)) : 0) {
      _reallymarkobject(i8, i11);
     }
     i15 = HEAP32[i15 + 20 >> 2] | 0;
    } while ((i15 | 0) != (i13 | 0));
   }
   i16 = i8 + 84 | 0;
   if ((HEAP32[i16 >> 2] | 0) != 0) {
    do {
     _propagatemark(i8);
    } while ((HEAP32[i16 >> 2] | 0) != 0);
   }
   i17 = (HEAP32[i7 >> 2] | 0) - i14 | 0;
   i11 = i8 + 92 | 0;
   i12 = HEAP32[i11 >> 2] | 0;
   i21 = i8 + 88 | 0;
   i22 = HEAP32[i21 >> 2] | 0;
   i15 = i8 + 96 | 0;
   i13 = HEAP32[i15 >> 2] | 0;
   HEAP32[i15 >> 2] = 0;
   HEAP32[i21 >> 2] = 0;
   HEAP32[i11 >> 2] = 0;
   HEAP32[i16 >> 2] = i22;
   if ((i22 | 0) != 0) {
    do {
     _propagatemark(i8);
    } while ((HEAP32[i16 >> 2] | 0) != 0);
   }
   HEAP32[i16 >> 2] = i12;
   if ((i12 | 0) != 0) {
    do {
     _propagatemark(i8);
    } while ((HEAP32[i16 >> 2] | 0) != 0);
   }
   HEAP32[i16 >> 2] = i13;
   if ((i13 | 0) != 0) {
    do {
     _propagatemark(i8);
    } while ((HEAP32[i16 >> 2] | 0) != 0);
   }
   i18 = HEAP32[i7 >> 2] | 0;
   while (1) {
    i13 = HEAP32[i15 >> 2] | 0;
    HEAP32[i15 >> 2] = 0;
    i12 = 0;
    L42 : while (1) {
     i14 = i13;
     while (1) {
      if ((i14 | 0) == 0) {
       break L42;
      }
      i13 = HEAP32[i14 + 24 >> 2] | 0;
      if ((_traverseephemeron(i8, i14) | 0) == 0) {
       i14 = i13;
      } else {
       break;
      }
     }
     if ((HEAP32[i16 >> 2] | 0) == 0) {
      i12 = 1;
      continue;
     }
     while (1) {
      _propagatemark(i8);
      if ((HEAP32[i16 >> 2] | 0) == 0) {
       i12 = 1;
       continue L42;
      }
     }
    }
    if ((i12 | 0) == 0) {
     break;
    }
   }
   _clearvalues(i8, HEAP32[i11 >> 2] | 0, 0);
   i14 = i8 + 100 | 0;
   _clearvalues(i8, HEAP32[i14 >> 2] | 0, 0);
   i13 = HEAP32[i11 >> 2] | 0;
   i12 = HEAP32[i14 >> 2] | 0;
   i21 = HEAP32[i7 >> 2] | 0;
   i20 = HEAP32[i3 >> 2] | 0;
   i19 = i20 + 104 | 0;
   while (1) {
    i22 = HEAP32[i19 >> 2] | 0;
    if ((i22 | 0) == 0) {
     break;
    } else {
     i19 = i22;
    }
   }
   i17 = i17 - i18 + i21 | 0;
   i20 = i20 + 72 | 0;
   i21 = HEAP32[i20 >> 2] | 0;
   L55 : do {
    if ((i21 | 0) != 0) {
     while (1) {
      i18 = i21;
      while (1) {
       i22 = i18 + 5 | 0;
       i21 = HEAP8[i22] | 0;
       if ((i21 & 3) == 0) {
        break;
       }
       HEAP8[i22] = i21 & 255 | 8;
       HEAP32[i20 >> 2] = HEAP32[i18 >> 2];
       HEAP32[i18 >> 2] = HEAP32[i19 >> 2];
       HEAP32[i19 >> 2] = i18;
       i19 = HEAP32[i20 >> 2] | 0;
       if ((i19 | 0) == 0) {
        break L55;
       } else {
        i22 = i18;
        i18 = i19;
        i19 = i22;
       }
      }
      i21 = HEAP32[i18 >> 2] | 0;
      if ((i21 | 0) == 0) {
       break;
      } else {
       i20 = i18;
      }
     }
    }
   } while (0);
   i19 = HEAP32[i8 + 104 >> 2] | 0;
   if ((i19 | 0) != 0) {
    i18 = i8 + 60 | 0;
    do {
     i22 = i19 + 5 | 0;
     HEAP8[i22] = HEAP8[i18] & 3 | HEAP8[i22] & 184;
     _reallymarkobject(i8, i19);
     i19 = HEAP32[i19 >> 2] | 0;
    } while ((i19 | 0) != 0);
   }
   if ((HEAP32[i16 >> 2] | 0) != 0) {
    do {
     _propagatemark(i8);
    } while ((HEAP32[i16 >> 2] | 0) != 0);
   }
   i18 = HEAP32[i7 >> 2] | 0;
   while (1) {
    i20 = HEAP32[i15 >> 2] | 0;
    HEAP32[i15 >> 2] = 0;
    i19 = 0;
    L74 : while (1) {
     i21 = i20;
     while (1) {
      if ((i21 | 0) == 0) {
       break L74;
      }
      i20 = HEAP32[i21 + 24 >> 2] | 0;
      if ((_traverseephemeron(i8, i21) | 0) == 0) {
       i21 = i20;
      } else {
       break;
      }
     }
     if ((HEAP32[i16 >> 2] | 0) == 0) {
      i19 = 1;
      continue;
     }
     while (1) {
      _propagatemark(i8);
      if ((HEAP32[i16 >> 2] | 0) == 0) {
       i19 = 1;
       continue L74;
      }
     }
    }
    if ((i19 | 0) == 0) {
     break;
    }
   }
   i16 = i17 - i18 | 0;
   i15 = HEAP32[i15 >> 2] | 0;
   if ((i15 | 0) != 0) {
    do {
     i22 = 1 << HEAPU8[i15 + 7 | 0];
     i19 = HEAP32[i15 + 16 >> 2] | 0;
     i17 = i19 + (i22 << 5) | 0;
     if ((i22 | 0) > 0) {
      do {
       i18 = i19 + 8 | 0;
       do {
        if ((HEAP32[i18 >> 2] | 0) != 0 ? (i9 = i19 + 24 | 0, i10 = HEAP32[i9 >> 2] | 0, (i10 & 64 | 0) != 0) : 0) {
         i20 = HEAP32[i19 + 16 >> 2] | 0;
         if ((i10 & 15 | 0) == 4) {
          if ((i20 | 0) == 0) {
           break;
          }
          if ((HEAP8[i20 + 5 | 0] & 3) == 0) {
           break;
          }
          _reallymarkobject(i8, i20);
          break;
         } else {
          i20 = i20 + 5 | 0;
          if ((HEAP8[i20] & 3) == 0) {
           break;
          }
          HEAP32[i18 >> 2] = 0;
          if ((HEAP8[i20] & 3) == 0) {
           break;
          }
          HEAP32[i9 >> 2] = 11;
          break;
         }
        }
       } while (0);
       i19 = i19 + 32 | 0;
      } while (i19 >>> 0 < i17 >>> 0);
     }
     i15 = HEAP32[i15 + 24 >> 2] | 0;
    } while ((i15 | 0) != 0);
   }
   i10 = HEAP32[i14 >> 2] | 0;
   if ((i10 | 0) != 0) {
    do {
     i22 = 1 << HEAPU8[i10 + 7 | 0];
     i17 = HEAP32[i10 + 16 >> 2] | 0;
     i9 = i17 + (i22 << 5) | 0;
     if ((i22 | 0) > 0) {
      do {
       i15 = i17 + 8 | 0;
       do {
        if ((HEAP32[i15 >> 2] | 0) != 0 ? (i5 = i17 + 24 | 0, i4 = HEAP32[i5 >> 2] | 0, (i4 & 64 | 0) != 0) : 0) {
         i18 = HEAP32[i17 + 16 >> 2] | 0;
         if ((i4 & 15 | 0) == 4) {
          if ((i18 | 0) == 0) {
           break;
          }
          if ((HEAP8[i18 + 5 | 0] & 3) == 0) {
           break;
          }
          _reallymarkobject(i8, i18);
          break;
         } else {
          i18 = i18 + 5 | 0;
          if ((HEAP8[i18] & 3) == 0) {
           break;
          }
          HEAP32[i15 >> 2] = 0;
          if ((HEAP8[i18] & 3) == 0) {
           break;
          }
          HEAP32[i5 >> 2] = 11;
          break;
         }
        }
       } while (0);
       i17 = i17 + 32 | 0;
      } while (i17 >>> 0 < i9 >>> 0);
     }
     i10 = HEAP32[i10 + 24 >> 2] | 0;
    } while ((i10 | 0) != 0);
   }
   _clearvalues(i8, HEAP32[i11 >> 2] | 0, i13);
   _clearvalues(i8, HEAP32[i14 >> 2] | 0, i12);
   i4 = i8 + 60 | 0;
   HEAP8[i4] = HEAPU8[i4] ^ 3;
   i4 = i16 + (HEAP32[i7 >> 2] | 0) | 0;
   HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i4;
   i3 = HEAP32[i3 >> 2] | 0;
   HEAP8[i3 + 61 | 0] = 2;
   HEAP32[i3 + 64 >> 2] = 0;
   i7 = i3 + 72 | 0;
   i5 = 0;
   do {
    i5 = i5 + 1 | 0;
    i6 = _sweeplist(i2, i7, 1) | 0;
   } while ((i6 | 0) == (i7 | 0));
   HEAP32[i3 + 80 >> 2] = i6;
   i6 = i3 + 68 | 0;
   i7 = 0;
   do {
    i7 = i7 + 1 | 0;
    i8 = _sweeplist(i2, i6, 1) | 0;
   } while ((i8 | 0) == (i6 | 0));
   HEAP32[i3 + 76 >> 2] = i8;
   i22 = ((i7 + i5 | 0) * 5 | 0) + i4 | 0;
   STACKTOP = i1;
   return i22 | 0;
  }
 case 2:
  {
   i3 = i8 + 64 | 0;
   i4 = i8 + 32 | 0;
   i8 = i8 + 24 | 0;
   i5 = 0;
   while (1) {
    i10 = HEAP32[i3 >> 2] | 0;
    i11 = i10 + i5 | 0;
    i9 = HEAP32[i4 >> 2] | 0;
    if ((i11 | 0) >= (i9 | 0)) {
     i2 = i10;
     break;
    }
    _sweeplist(i2, (HEAP32[i8 >> 2] | 0) + (i11 << 2) | 0, -3) | 0;
    i5 = i5 + 1 | 0;
    if ((i5 | 0) >= 80) {
     i7 = 96;
     break;
    }
   }
   if ((i7 | 0) == 96) {
    i2 = HEAP32[i3 >> 2] | 0;
    i9 = HEAP32[i4 >> 2] | 0;
   }
   i22 = i2 + i5 | 0;
   HEAP32[i3 >> 2] = i22;
   if ((i22 | 0) >= (i9 | 0)) {
    HEAP8[i6] = 3;
   }
   i22 = i5 * 5 | 0;
   STACKTOP = i1;
   return i22 | 0;
  }
 case 5:
  {
   i2 = i8 + 16 | 0;
   HEAP32[i2 >> 2] = HEAP32[i8 + 32 >> 2] << 2;
   i22 = i8 + 84 | 0;
   i3 = i8 + 172 | 0;
   HEAP32[i22 + 0 >> 2] = 0;
   HEAP32[i22 + 4 >> 2] = 0;
   HEAP32[i22 + 8 >> 2] = 0;
   HEAP32[i22 + 12 >> 2] = 0;
   HEAP32[i22 + 16 >> 2] = 0;
   i3 = HEAP32[i3 >> 2] | 0;
   if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i8, i3);
   }
   if ((HEAP32[i8 + 48 >> 2] & 64 | 0) != 0 ? (i15 = HEAP32[i8 + 40 >> 2] | 0, !((HEAP8[i15 + 5 | 0] & 3) == 0)) : 0) {
    _reallymarkobject(i8, i15);
   }
   _markmt(i8);
   i4 = HEAP32[i8 + 104 >> 2] | 0;
   if ((i4 | 0) != 0) {
    i3 = i8 + 60 | 0;
    do {
     i22 = i4 + 5 | 0;
     HEAP8[i22] = HEAP8[i3] & 3 | HEAP8[i22] & 184;
     _reallymarkobject(i8, i4);
     i4 = HEAP32[i4 >> 2] | 0;
    } while ((i4 | 0) != 0);
   }
   HEAP8[i6] = 0;
   i22 = HEAP32[i2 >> 2] | 0;
   STACKTOP = i1;
   return i22 | 0;
  }
 case 3:
  {
   i3 = i8 + 80 | 0;
   i4 = HEAP32[i3 >> 2] | 0;
   if ((i4 | 0) == 0) {
    HEAP8[i6] = 4;
    i22 = 0;
    STACKTOP = i1;
    return i22 | 0;
   } else {
    HEAP32[i3 >> 2] = _sweeplist(i2, i4, 80) | 0;
    i22 = 400;
    STACKTOP = i1;
    return i22 | 0;
   }
  }
 case 4:
  {
   i4 = i8 + 76 | 0;
   i5 = HEAP32[i4 >> 2] | 0;
   if ((i5 | 0) != 0) {
    HEAP32[i4 >> 2] = _sweeplist(i2, i5, 80) | 0;
    i22 = 400;
    STACKTOP = i1;
    return i22 | 0;
   }
   HEAP32[i14 >> 2] = HEAP32[i8 + 172 >> 2];
   _sweeplist(i2, i14, 1) | 0;
   i3 = HEAP32[i3 >> 2] | 0;
   if ((HEAP8[i3 + 62 | 0] | 0) != 1) {
    i4 = (HEAP32[i3 + 32 >> 2] | 0) / 2 | 0;
    if ((HEAP32[i3 + 28 >> 2] | 0) >>> 0 < i4 >>> 0) {
     _luaS_resize(i2, i4);
    }
    i21 = i3 + 144 | 0;
    i22 = i3 + 152 | 0;
    HEAP32[i21 >> 2] = _luaM_realloc_(i2, HEAP32[i21 >> 2] | 0, HEAP32[i22 >> 2] | 0, 0) | 0;
    HEAP32[i22 >> 2] = 0;
   }
   HEAP8[i6] = 5;
   i22 = 5;
   STACKTOP = i1;
   return i22 | 0;
  }
 default:
  {
   i22 = 0;
   STACKTOP = i1;
   return i22 | 0;
  }
 }
 return 0;
}
function _pmain(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;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 i7 = _lua_tointegerx(i3, 1, 0) | 0;
 i4 = _lua_touserdata(i3, 2) | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) != 0 ? (HEAP8[i5] | 0) != 0 : 0) {
  HEAP32[20] = i5;
 }
 i12 = HEAP32[i4 + 4 >> 2] | 0;
 do {
  if ((i12 | 0) == 0) {
   i5 = 0;
   i6 = 0;
   i8 = 0;
   i9 = 1;
   i10 = 1;
  } else {
   i9 = 0;
   i8 = 0;
   i11 = 0;
   i6 = 0;
   i5 = 1;
   L6 : while (1) {
    if ((HEAP8[i12] | 0) != 45) {
     i10 = 18;
     break;
    }
    switch (HEAP8[i12 + 1 | 0] | 0) {
    case 108:
     {
      i10 = 12;
      break;
     }
    case 69:
     {
      i9 = 1;
      break;
     }
    case 45:
     {
      i10 = 7;
      break L6;
     }
    case 105:
     {
      if ((HEAP8[i12 + 2 | 0] | 0) == 0) {
       i11 = 1;
       i6 = 1;
      } else {
       i5 = -1;
       break L6;
      }
      break;
     }
    case 101:
     {
      i8 = 1;
      i10 = 12;
      break;
     }
    case 118:
     {
      if ((HEAP8[i12 + 2 | 0] | 0) == 0) {
       i11 = 1;
      } else {
       i5 = -1;
       break L6;
      }
      break;
     }
    case 0:
     {
      i10 = 18;
      break L6;
     }
    default:
     {
      i10 = 16;
      break L6;
     }
    }
    if ((i10 | 0) == 12) {
     i10 = 0;
     if ((HEAP8[i12 + 2 | 0] | 0) == 0) {
      i12 = i5 + 1 | 0;
      i13 = HEAP32[i4 + (i12 << 2) >> 2] | 0;
      if ((i13 | 0) == 0) {
       i10 = 15;
       break;
      }
      if ((HEAP8[i13] | 0) == 45) {
       i10 = 15;
       break;
      } else {
       i5 = i12;
      }
     }
    }
    i5 = i5 + 1 | 0;
    i12 = HEAP32[i4 + (i5 << 2) >> 2] | 0;
    if ((i12 | 0) == 0) {
     i5 = 0;
     i12 = i9;
     i10 = 23;
     break;
    }
   }
   if ((i10 | 0) == 7) {
    if ((HEAP8[i12 + 2 | 0] | 0) == 0) {
     i5 = i5 + 1 | 0;
     i5 = (HEAP32[i4 + (i5 << 2) >> 2] | 0) == 0 ? 0 : i5;
     i10 = 18;
    } else {
     i5 = -1;
    }
   } else if ((i10 | 0) == 15) {
    i5 = 0 - i5 | 0;
    i10 = 18;
   } else if ((i10 | 0) == 16) {
    i5 = 0 - i5 | 0;
    i10 = 18;
   }
   if ((i10 | 0) == 18) {
    if ((i5 | 0) >= 0) {
     i12 = i9;
     i10 = 23;
    }
   }
   if ((i10 | 0) == 23) {
    if ((i11 | 0) == 0) {
     i9 = 1;
    } else {
     i9 = HEAP32[_stdout >> 2] | 0;
     _fwrite(440, 1, 51, i9 | 0) | 0;
     _fputc(10, i9 | 0) | 0;
     _fflush(i9 | 0) | 0;
     i9 = 0;
    }
    if ((i12 | 0) == 0) {
     i10 = 1;
     break;
    }
    _lua_pushboolean(i3, 1);
    _lua_setfield(i3, -1001e3, 96);
    i10 = 0;
    break;
   }
   i3 = HEAP32[i4 + (0 - i5 << 2) >> 2] | 0;
   i4 = HEAP32[_stderr >> 2] | 0;
   HEAP32[i2 >> 2] = HEAP32[20];
   _fprintf(i4 | 0, 496, i2 | 0) | 0;
   _fflush(i4 | 0) | 0;
   i13 = HEAP8[i3 + 1 | 0] | 0;
   if (i13 << 24 >> 24 == 108 | i13 << 24 >> 24 == 101) {
    HEAP32[i2 >> 2] = i3;
    _fprintf(i4 | 0, 504, i2 | 0) | 0;
    _fflush(i4 | 0) | 0;
   } else {
    HEAP32[i2 >> 2] = i3;
    _fprintf(i4 | 0, 528, i2 | 0) | 0;
    _fflush(i4 | 0) | 0;
   }
   HEAP32[i2 >> 2] = HEAP32[20];
   _fprintf(i4 | 0, 560, i2 | 0) | 0;
   _fflush(i4 | 0) | 0;
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
 } while (0);
 _luaL_checkversion_(i3, 502.0);
 _lua_gc(i3, 0, 0) | 0;
 _luaL_openlibs(i3);
 _lua_gc(i3, 1, 0) | 0;
 do {
  if (i10) {
   i10 = _getenv(409 | 0) | 0;
   if ((i10 | 0) == 0) {
    i10 = _getenv(425 | 0) | 0;
    if ((i10 | 0) == 0) {
     break;
    } else {
     i11 = 424;
    }
   } else {
    i11 = 408;
   }
   if ((HEAP8[i10] | 0) == 64) {
    i13 = _luaL_loadfilex(i3, i10 + 1 | 0, 0) | 0;
    if ((i13 | 0) == 0) {
     i12 = _lua_gettop(i3) | 0;
     _lua_pushcclosure(i3, 142, 0);
     _lua_insert(i3, i12);
     HEAP32[48] = i3;
     _signal(2, 1) | 0;
     i13 = _lua_pcallk(i3, 0, 0, i12, 0, 0) | 0;
     _signal(2, 0) | 0;
     _lua_remove(i3, i12);
     if ((i13 | 0) == 0) {
      break;
     }
    }
    if ((_lua_type(i3, -1) | 0) == 0) {
     i13 = 0;
     STACKTOP = i1;
     return i13 | 0;
    }
    i11 = _lua_tolstring(i3, -1, 0) | 0;
    i12 = HEAP32[20] | 0;
    i10 = HEAP32[_stderr >> 2] | 0;
    if ((i12 | 0) != 0) {
     HEAP32[i2 >> 2] = i12;
     _fprintf(i10 | 0, 496, i2 | 0) | 0;
     _fflush(i10 | 0) | 0;
    }
    HEAP32[i2 >> 2] = (i11 | 0) == 0 ? 48 : i11;
    _fprintf(i10 | 0, 912, i2 | 0) | 0;
    _fflush(i10 | 0) | 0;
    _lua_settop(i3, -2);
    _lua_gc(i3, 2, 0) | 0;
   } else {
    i13 = _luaL_loadbufferx(i3, i10, _strlen(i10 | 0) | 0, i11, 0) | 0;
    if ((i13 | 0) == 0) {
     i12 = _lua_gettop(i3) | 0;
     _lua_pushcclosure(i3, 142, 0);
     _lua_insert(i3, i12);
     HEAP32[48] = i3;
     _signal(2, 1) | 0;
     i13 = _lua_pcallk(i3, 0, 0, i12, 0, 0) | 0;
     _signal(2, 0) | 0;
     _lua_remove(i3, i12);
     if ((i13 | 0) == 0) {
      break;
     }
    }
    if ((_lua_type(i3, -1) | 0) == 0) {
     i13 = 0;
     STACKTOP = i1;
     return i13 | 0;
    }
    i11 = _lua_tolstring(i3, -1, 0) | 0;
    i10 = HEAP32[20] | 0;
    i12 = HEAP32[_stderr >> 2] | 0;
    if ((i10 | 0) != 0) {
     HEAP32[i2 >> 2] = i10;
     _fprintf(i12 | 0, 496, i2 | 0) | 0;
     _fflush(i12 | 0) | 0;
    }
    HEAP32[i2 >> 2] = (i11 | 0) == 0 ? 48 : i11;
    _fprintf(i12 | 0, 912, i2 | 0) | 0;
    _fflush(i12 | 0) | 0;
    _lua_settop(i3, -2);
    _lua_gc(i3, 2, 0) | 0;
   }
   if ((i13 | 0) != 0) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
 } while (0);
 i7 = (i5 | 0) > 0 ? i5 : i7;
 L67 : do {
  if ((i7 | 0) > 1) {
   i10 = 1;
   while (1) {
    i11 = HEAP32[i4 + (i10 << 2) >> 2] | 0;
    i12 = HEAP8[i11 + 1 | 0] | 0;
    if ((i12 | 0) == 108) {
     i11 = i11 + 2 | 0;
     if ((HEAP8[i11] | 0) == 0) {
      i10 = i10 + 1 | 0;
      i11 = HEAP32[i4 + (i10 << 2) >> 2] | 0;
     }
     _lua_getglobal(i3, 400);
     _lua_pushstring(i3, i11) | 0;
     i12 = (_lua_gettop(i3) | 0) + -1 | 0;
     _lua_pushcclosure(i3, 142, 0);
     _lua_insert(i3, i12);
     HEAP32[48] = i3;
     _signal(2, 1) | 0;
     i13 = _lua_pcallk(i3, 1, 1, i12, 0, 0) | 0;
     _signal(2, 0) | 0;
     _lua_remove(i3, i12);
     if ((i13 | 0) != 0) {
      i10 = 58;
      break;
     }
     _lua_setglobal(i3, i11);
    } else if ((i12 | 0) == 101) {
     i11 = i11 + 2 | 0;
     if ((HEAP8[i11] | 0) == 0) {
      i10 = i10 + 1 | 0;
      i11 = HEAP32[i4 + (i10 << 2) >> 2] | 0;
     }
     if ((_luaL_loadbufferx(i3, i11, _strlen(i11 | 0) | 0, 384, 0) | 0) != 0) {
      i10 = 50;
      break;
     }
     i12 = _lua_gettop(i3) | 0;
     _lua_pushcclosure(i3, 142, 0);
     _lua_insert(i3, i12);
     HEAP32[48] = i3;
     _signal(2, 1) | 0;
     i13 = _lua_pcallk(i3, 0, 0, i12, 0, 0) | 0;
     _signal(2, 0) | 0;
     _lua_remove(i3, i12);
     if ((i13 | 0) != 0) {
      i10 = 50;
      break;
     }
    }
    i10 = i10 + 1 | 0;
    if ((i10 | 0) >= (i7 | 0)) {
     break L67;
    }
   }
   if ((i10 | 0) == 50) {
    if ((_lua_type(i3, -1) | 0) == 0) {
     i13 = 0;
     STACKTOP = i1;
     return i13 | 0;
    }
    i5 = _lua_tolstring(i3, -1, 0) | 0;
    i6 = HEAP32[20] | 0;
    i4 = HEAP32[_stderr >> 2] | 0;
    if ((i6 | 0) != 0) {
     HEAP32[i2 >> 2] = i6;
     _fprintf(i4 | 0, 496, i2 | 0) | 0;
     _fflush(i4 | 0) | 0;
    }
    HEAP32[i2 >> 2] = (i5 | 0) == 0 ? 48 : i5;
    _fprintf(i4 | 0, 912, i2 | 0) | 0;
    _fflush(i4 | 0) | 0;
    _lua_settop(i3, -2);
    _lua_gc(i3, 2, 0) | 0;
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   } else if ((i10 | 0) == 58) {
    if ((_lua_type(i3, -1) | 0) == 0) {
     i13 = 0;
     STACKTOP = i1;
     return i13 | 0;
    }
    i5 = _lua_tolstring(i3, -1, 0) | 0;
    i6 = HEAP32[20] | 0;
    i4 = HEAP32[_stderr >> 2] | 0;
    if ((i6 | 0) != 0) {
     HEAP32[i2 >> 2] = i6;
     _fprintf(i4 | 0, 496, i2 | 0) | 0;
     _fflush(i4 | 0) | 0;
    }
    HEAP32[i2 >> 2] = (i5 | 0) == 0 ? 48 : i5;
    _fprintf(i4 | 0, 912, i2 | 0) | 0;
    _fflush(i4 | 0) | 0;
    _lua_settop(i3, -2);
    _lua_gc(i3, 2, 0) | 0;
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
 } while (0);
 do {
  if ((i5 | 0) != 0) {
   i10 = 0;
   while (1) {
    if ((HEAP32[i4 + (i10 << 2) >> 2] | 0) == 0) {
     break;
    } else {
     i10 = i10 + 1 | 0;
    }
   }
   i11 = i5 + 1 | 0;
   i7 = i10 - i11 | 0;
   _luaL_checkstack(i3, i7 + 3 | 0, 352);
   if ((i11 | 0) < (i10 | 0)) {
    i12 = i11;
    do {
     _lua_pushstring(i3, HEAP32[i4 + (i12 << 2) >> 2] | 0) | 0;
     i12 = i12 + 1 | 0;
    } while ((i12 | 0) != (i10 | 0));
   }
   _lua_createtable(i3, i7, i11);
   if ((i10 | 0) > 0) {
    i11 = 0;
    do {
     _lua_pushstring(i3, HEAP32[i4 + (i11 << 2) >> 2] | 0) | 0;
     _lua_rawseti(i3, -2, i11 - i5 | 0);
     i11 = i11 + 1 | 0;
    } while ((i11 | 0) != (i10 | 0));
   }
   _lua_setglobal(i3, 328);
   i10 = HEAP32[i4 + (i5 << 2) >> 2] | 0;
   if ((_strcmp(i10, 336) | 0) == 0) {
    i13 = (_strcmp(HEAP32[i4 + (i5 + -1 << 2) >> 2] | 0, 344) | 0) == 0;
    i10 = i13 ? i10 : 0;
   }
   i10 = _luaL_loadfilex(i3, i10, 0) | 0;
   i4 = ~i7;
   _lua_insert(i3, i4);
   if ((i10 | 0) == 0) {
    i13 = (_lua_gettop(i3) | 0) - i7 | 0;
    _lua_pushcclosure(i3, 142, 0);
    _lua_insert(i3, i13);
    HEAP32[48] = i3;
    _signal(2, 1) | 0;
    i10 = _lua_pcallk(i3, i7, -1, i13, 0, 0) | 0;
    _signal(2, 0) | 0;
    _lua_remove(i3, i13);
    if ((i10 | 0) == 0) {
     break;
    }
   } else {
    _lua_settop(i3, i4);
   }
   if ((_lua_type(i3, -1) | 0) != 0) {
    i7 = _lua_tolstring(i3, -1, 0) | 0;
    i11 = HEAP32[20] | 0;
    i4 = HEAP32[_stderr >> 2] | 0;
    if ((i11 | 0) != 0) {
     HEAP32[i2 >> 2] = i11;
     _fprintf(i4 | 0, 496, i2 | 0) | 0;
     _fflush(i4 | 0) | 0;
    }
    HEAP32[i2 >> 2] = (i7 | 0) == 0 ? 48 : i7;
    _fprintf(i4 | 0, 912, i2 | 0) | 0;
    _fflush(i4 | 0) | 0;
    _lua_settop(i3, -2);
    _lua_gc(i3, 2, 0) | 0;
   }
   if ((i10 | 0) != 0) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
 } while (0);
 if ((i6 | 0) == 0) {
  if (!((i8 | i5 | 0) != 0 | i9 ^ 1)) {
   i13 = HEAP32[_stdout >> 2] | 0;
   _fwrite(440, 1, 51, i13 | 0) | 0;
   _fputc(10, i13 | 0) | 0;
   _fflush(i13 | 0) | 0;
   _dotty(i3);
  }
 } else {
  _dotty(i3);
 }
 _lua_pushboolean(i3, 1);
 i13 = 1;
 STACKTOP = i1;
 return i13 | 0;
}
function _DumpFunction(i6, i2) {
 i6 = i6 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 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, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i17 = i5 + 56 | 0;
 i19 = i5 + 52 | 0;
 i20 = i5 + 48 | 0;
 i18 = i5;
 i21 = i5 + 60 | 0;
 i22 = i5 + 44 | 0;
 i1 = i5 + 40 | 0;
 i16 = i5 + 36 | 0;
 i23 = i5 + 32 | 0;
 i3 = i5 + 28 | 0;
 i7 = i5 + 24 | 0;
 i8 = i5 + 20 | 0;
 i9 = i5 + 16 | 0;
 i10 = i5 + 12 | 0;
 i12 = i5 + 8 | 0;
 HEAP32[i17 >> 2] = HEAP32[i6 + 64 >> 2];
 i4 = i2 + 16 | 0;
 i28 = HEAP32[i4 >> 2] | 0;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 HEAP32[i17 >> 2] = HEAP32[i6 + 68 >> 2];
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 HEAP8[i17] = HEAP8[i6 + 76 | 0] | 0;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 1, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 HEAP8[i17] = HEAP8[i6 + 77 | 0] | 0;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 1, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 HEAP8[i17] = HEAP8[i6 + 78 | 0] | 0;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 1, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 i25 = HEAP32[i6 + 12 >> 2] | 0;
 i24 = HEAP32[i6 + 48 >> 2] | 0;
 HEAP32[i23 >> 2] = i24;
 if ((i28 | 0) == 0) {
  i26 = i2 + 4 | 0;
  i27 = i2 + 8 | 0;
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i26 >> 2] & 3](HEAP32[i2 >> 2] | 0, i23, 4, HEAP32[i27 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
  if ((i28 | 0) == 0) {
   i28 = FUNCTION_TABLE_iiiii[HEAP32[i26 >> 2] & 3](HEAP32[i2 >> 2] | 0, i25, i24 << 2, HEAP32[i27 >> 2] | 0) | 0;
   HEAP32[i4 >> 2] = i28;
   i25 = HEAP32[i6 + 44 >> 2] | 0;
   HEAP32[i22 >> 2] = i25;
   if ((i28 | 0) == 0) {
    i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i22, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i28;
   }
  } else {
   i11 = 13;
  }
 } else {
  i11 = 13;
 }
 if ((i11 | 0) == 13) {
  i25 = HEAP32[i6 + 44 >> 2] | 0;
  HEAP32[i22 >> 2] = i25;
 }
 if ((i25 | 0) > 0) {
  i24 = i6 + 8 | 0;
  i23 = i2 + 4 | 0;
  i22 = i2 + 8 | 0;
  i26 = 0;
  do {
   i30 = HEAP32[i24 >> 2] | 0;
   i27 = i30 + (i26 << 4) | 0;
   i30 = i30 + (i26 << 4) + 8 | 0;
   i29 = HEAP32[i30 >> 2] | 0;
   HEAP8[i17] = i29 & 15;
   if ((i28 | 0) == 0) {
    i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 1, HEAP32[i22 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i28;
    i29 = HEAP32[i30 >> 2] | 0;
   }
   i29 = i29 & 15;
   do {
    if ((i29 | 0) == 3) {
     HEAPF64[i18 >> 3] = +HEAPF64[i27 >> 3];
     if ((i28 | 0) == 0) {
      i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i18, 8, HEAP32[i22 >> 2] | 0) | 0;
      HEAP32[i4 >> 2] = i28;
     }
    } else if ((i29 | 0) == 1) {
     HEAP8[i21] = HEAP32[i27 >> 2];
     if ((i28 | 0) == 0) {
      i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i21, 1, HEAP32[i22 >> 2] | 0) | 0;
      HEAP32[i4 >> 2] = i28;
     }
    } else if ((i29 | 0) == 4) {
     i27 = HEAP32[i27 >> 2] | 0;
     if ((i27 | 0) == 0) {
      HEAP32[i19 >> 2] = 0;
      if ((i28 | 0) != 0) {
       break;
      }
      i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i19, 4, HEAP32[i22 >> 2] | 0) | 0;
      HEAP32[i4 >> 2] = i28;
      break;
     }
     HEAP32[i20 >> 2] = (HEAP32[i27 + 12 >> 2] | 0) + 1;
     if ((i28 | 0) == 0) {
      i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i20, 4, HEAP32[i22 >> 2] | 0) | 0;
      HEAP32[i4 >> 2] = i28;
      if ((i28 | 0) == 0) {
       i28 = FUNCTION_TABLE_iiiii[HEAP32[i23 >> 2] & 3](HEAP32[i2 >> 2] | 0, i27 + 16 | 0, HEAP32[i20 >> 2] | 0, HEAP32[i22 >> 2] | 0) | 0;
       HEAP32[i4 >> 2] = i28;
      }
     }
    }
   } while (0);
   i26 = i26 + 1 | 0;
  } while ((i26 | 0) != (i25 | 0));
 }
 i18 = HEAP32[i6 + 56 >> 2] | 0;
 HEAP32[i17 >> 2] = i18;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i17, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 if ((i18 | 0) > 0) {
  i17 = i6 + 16 | 0;
  i19 = 0;
  do {
   _DumpFunction(HEAP32[(HEAP32[i17 >> 2] | 0) + (i19 << 2) >> 2] | 0, i2);
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) != (i18 | 0));
  i28 = HEAP32[i4 >> 2] | 0;
 }
 i17 = i6 + 40 | 0;
 i18 = HEAP32[i17 >> 2] | 0;
 HEAP32[i16 >> 2] = i18;
 if ((i28 | 0) == 0) {
  i28 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i16, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i28;
 }
 if ((i18 | 0) > 0) {
  i19 = i6 + 28 | 0;
  i16 = i2 + 4 | 0;
  i20 = i2 + 8 | 0;
  i21 = 0;
  do {
   i22 = HEAP32[i19 >> 2] | 0;
   HEAP8[i1] = HEAP8[i22 + (i21 << 3) + 4 | 0] | 0;
   if ((i28 | 0) == 0) {
    i28 = FUNCTION_TABLE_iiiii[HEAP32[i16 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 1, HEAP32[i20 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i28;
    i22 = HEAP32[i19 >> 2] | 0;
   }
   HEAP8[i1] = HEAP8[i22 + (i21 << 3) + 5 | 0] | 0;
   if ((i28 | 0) == 0) {
    i28 = FUNCTION_TABLE_iiiii[HEAP32[i16 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 1, HEAP32[i20 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i28;
   }
   i21 = i21 + 1 | 0;
  } while ((i21 | 0) != (i18 | 0));
 }
 i16 = i2 + 12 | 0;
 if ((HEAP32[i16 >> 2] | 0) == 0 ? (i13 = HEAP32[i6 + 36 >> 2] | 0, (i13 | 0) != 0) : 0) {
  HEAP32[i12 >> 2] = (HEAP32[i13 + 12 >> 2] | 0) + 1;
  if ((i28 | 0) == 0 ? (i14 = i2 + 4 | 0, i15 = i2 + 8 | 0, i30 = FUNCTION_TABLE_iiiii[HEAP32[i14 >> 2] & 3](HEAP32[i2 >> 2] | 0, i12, 4, HEAP32[i15 >> 2] | 0) | 0, HEAP32[i4 >> 2] = i30, (i30 | 0) == 0) : 0) {
   HEAP32[i4 >> 2] = FUNCTION_TABLE_iiiii[HEAP32[i14 >> 2] & 3](HEAP32[i2 >> 2] | 0, i13 + 16 | 0, HEAP32[i12 >> 2] | 0, HEAP32[i15 >> 2] | 0) | 0;
  }
 } else {
  i12 = i10;
  i11 = 50;
 }
 if ((i11 | 0) == 50) {
  HEAP32[i10 >> 2] = 0;
  if ((i28 | 0) == 0) {
   HEAP32[i4 >> 2] = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i12, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  }
 }
 if ((HEAP32[i16 >> 2] | 0) == 0) {
  i11 = HEAP32[i6 + 52 >> 2] | 0;
 } else {
  i11 = 0;
 }
 i10 = HEAP32[i6 + 20 >> 2] | 0;
 HEAP32[i9 >> 2] = i11;
 i14 = HEAP32[i4 >> 2] | 0;
 if ((i14 | 0) == 0) {
  i12 = i2 + 4 | 0;
  i13 = i2 + 8 | 0;
  i14 = FUNCTION_TABLE_iiiii[HEAP32[i12 >> 2] & 3](HEAP32[i2 >> 2] | 0, i9, 4, HEAP32[i13 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i14;
  if ((i14 | 0) == 0) {
   i14 = FUNCTION_TABLE_iiiii[HEAP32[i12 >> 2] & 3](HEAP32[i2 >> 2] | 0, i10, i11 << 2, HEAP32[i13 >> 2] | 0) | 0;
   HEAP32[i4 >> 2] = i14;
  }
 }
 if ((HEAP32[i16 >> 2] | 0) == 0) {
  i9 = HEAP32[i6 + 60 >> 2] | 0;
 } else {
  i9 = 0;
 }
 HEAP32[i8 >> 2] = i9;
 if ((i14 | 0) == 0) {
  i14 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i8, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i14;
 }
 if ((i9 | 0) > 0) {
  i10 = i6 + 24 | 0;
  i11 = i2 + 4 | 0;
  i8 = i2 + 8 | 0;
  i12 = 0;
  do {
   i13 = HEAP32[(HEAP32[i10 >> 2] | 0) + (i12 * 12 | 0) >> 2] | 0;
   if ((i13 | 0) == 0) {
    HEAP32[i1 >> 2] = 0;
    if ((i14 | 0) == 0) {
     i14 = FUNCTION_TABLE_iiiii[HEAP32[i11 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 4, HEAP32[i8 >> 2] | 0) | 0;
     HEAP32[i4 >> 2] = i14;
    }
   } else {
    HEAP32[i3 >> 2] = (HEAP32[i13 + 12 >> 2] | 0) + 1;
    if ((i14 | 0) == 0) {
     i14 = FUNCTION_TABLE_iiiii[HEAP32[i11 >> 2] & 3](HEAP32[i2 >> 2] | 0, i3, 4, HEAP32[i8 >> 2] | 0) | 0;
     HEAP32[i4 >> 2] = i14;
     if ((i14 | 0) == 0) {
      i14 = FUNCTION_TABLE_iiiii[HEAP32[i11 >> 2] & 3](HEAP32[i2 >> 2] | 0, i13 + 16 | 0, HEAP32[i3 >> 2] | 0, HEAP32[i8 >> 2] | 0) | 0;
      HEAP32[i4 >> 2] = i14;
     }
    }
   }
   i13 = HEAP32[i10 >> 2] | 0;
   HEAP32[i1 >> 2] = HEAP32[i13 + (i12 * 12 | 0) + 4 >> 2];
   if ((i14 | 0) == 0) {
    i14 = FUNCTION_TABLE_iiiii[HEAP32[i11 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 4, HEAP32[i8 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i14;
    i13 = HEAP32[i10 >> 2] | 0;
   }
   HEAP32[i1 >> 2] = HEAP32[i13 + (i12 * 12 | 0) + 8 >> 2];
   if ((i14 | 0) == 0) {
    i14 = FUNCTION_TABLE_iiiii[HEAP32[i11 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 4, HEAP32[i8 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i14;
   }
   i12 = i12 + 1 | 0;
  } while ((i12 | 0) != (i9 | 0));
 }
 if ((HEAP32[i16 >> 2] | 0) == 0) {
  i8 = HEAP32[i17 >> 2] | 0;
 } else {
  i8 = 0;
 }
 HEAP32[i7 >> 2] = i8;
 if ((i14 | 0) == 0) {
  i14 = FUNCTION_TABLE_iiiii[HEAP32[i2 + 4 >> 2] & 3](HEAP32[i2 >> 2] | 0, i7, 4, HEAP32[i2 + 8 >> 2] | 0) | 0;
  HEAP32[i4 >> 2] = i14;
 }
 if ((i8 | 0) <= 0) {
  STACKTOP = i5;
  return;
 }
 i7 = i6 + 28 | 0;
 i6 = i2 + 4 | 0;
 i9 = i2 + 8 | 0;
 i10 = 0;
 do {
  i11 = HEAP32[(HEAP32[i7 >> 2] | 0) + (i10 << 3) >> 2] | 0;
  if ((i11 | 0) == 0) {
   HEAP32[i1 >> 2] = 0;
   if ((i14 | 0) == 0) {
    i14 = FUNCTION_TABLE_iiiii[HEAP32[i6 >> 2] & 3](HEAP32[i2 >> 2] | 0, i1, 4, HEAP32[i9 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i14;
   }
  } else {
   HEAP32[i3 >> 2] = (HEAP32[i11 + 12 >> 2] | 0) + 1;
   if ((i14 | 0) == 0) {
    i14 = FUNCTION_TABLE_iiiii[HEAP32[i6 >> 2] & 3](HEAP32[i2 >> 2] | 0, i3, 4, HEAP32[i9 >> 2] | 0) | 0;
    HEAP32[i4 >> 2] = i14;
    if ((i14 | 0) == 0) {
     i14 = FUNCTION_TABLE_iiiii[HEAP32[i6 >> 2] & 3](HEAP32[i2 >> 2] | 0, i11 + 16 | 0, HEAP32[i3 >> 2] | 0, HEAP32[i9 >> 2] | 0) | 0;
     HEAP32[i4 >> 2] = i14;
    }
   }
  }
  i10 = i10 + 1 | 0;
 } while ((i10 | 0) != (i8 | 0));
 STACKTOP = i5;
 return;
}
function _LoadFunction(i2, i6) {
 i2 = i2 | 0;
 i6 = i6 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 i5 = i1 + 8 | 0;
 i4 = i2 + 4 | 0;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i8 = HEAP32[i3 >> 2] | 0;
 if ((i8 | 0) < 0) {
  _error(i2, 8872);
 }
 HEAP32[i6 + 64 >> 2] = i8;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i8 = HEAP32[i3 >> 2] | 0;
 if ((i8 | 0) < 0) {
  _error(i2, 8872);
 }
 HEAP32[i6 + 68 >> 2] = i8;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
  _error(i2, 8824);
 }
 HEAP8[i6 + 76 | 0] = HEAP8[i3] | 0;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
  _error(i2, 8824);
 }
 HEAP8[i6 + 77 | 0] = HEAP8[i3] | 0;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
  _error(i2, 8824);
 }
 HEAP8[i6 + 78 | 0] = HEAP8[i3] | 0;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i9 = HEAP32[i3 >> 2] | 0;
 if ((i9 | 0) < 0) {
  _error(i2, 8872);
 }
 i8 = HEAP32[i2 >> 2] | 0;
 if ((i9 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i8);
 }
 i14 = i9 << 2;
 i13 = _luaM_realloc_(i8, 0, 0, i14) | 0;
 HEAP32[i6 + 12 >> 2] = i13;
 HEAP32[i6 + 48 >> 2] = i9;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i13, i14) | 0) != 0) {
  _error(i2, 8824);
 }
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i8 = HEAP32[i3 >> 2] | 0;
 if ((i8 | 0) < 0) {
  _error(i2, 8872);
 }
 i9 = HEAP32[i2 >> 2] | 0;
 if ((i8 + 1 | 0) >>> 0 > 268435455) {
  _luaM_toobig(i9);
 }
 i11 = _luaM_realloc_(i9, 0, 0, i8 << 4) | 0;
 i9 = i6 + 8 | 0;
 HEAP32[i9 >> 2] = i11;
 HEAP32[i6 + 44 >> 2] = i8;
 i12 = (i8 | 0) > 0;
 L43 : do {
  if (i12) {
   i10 = 0;
   do {
    HEAP32[i11 + (i10 << 4) + 8 >> 2] = 0;
    i10 = i10 + 1 | 0;
   } while ((i10 | 0) != (i8 | 0));
   if (i12) {
    i10 = i2 + 8 | 0;
    i13 = 0;
    while (1) {
     i12 = i11 + (i13 << 4) | 0;
     if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
      i9 = 34;
      break;
     }
     i14 = HEAP8[i3] | 0;
     if ((i14 | 0) == 4) {
      if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
       i9 = 44;
       break;
      }
      i14 = HEAP32[i3 >> 2] | 0;
      if ((i14 | 0) == 0) {
       i14 = 0;
      } else {
       i14 = _luaZ_openspace(HEAP32[i2 >> 2] | 0, HEAP32[i10 >> 2] | 0, i14) | 0;
       if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i14, HEAP32[i3 >> 2] | 0) | 0) != 0) {
        i9 = 47;
        break;
       }
       i14 = _luaS_newlstr(HEAP32[i2 >> 2] | 0, i14, (HEAP32[i3 >> 2] | 0) + -1 | 0) | 0;
      }
      HEAP32[i12 >> 2] = i14;
      HEAP32[i11 + (i13 << 4) + 8 >> 2] = HEAPU8[i14 + 4 | 0] | 64;
     } else if ((i14 | 0) == 1) {
      if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
       i9 = 38;
       break;
      }
      HEAP32[i12 >> 2] = HEAP8[i3] | 0;
      HEAP32[i11 + (i13 << 4) + 8 >> 2] = 1;
     } else if ((i14 | 0) == 3) {
      if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 8) | 0) != 0) {
       i9 = 41;
       break;
      }
      HEAPF64[i12 >> 3] = +HEAPF64[i3 >> 3];
      HEAP32[i11 + (i13 << 4) + 8 >> 2] = 3;
     } else if ((i14 | 0) == 0) {
      HEAP32[i11 + (i13 << 4) + 8 >> 2] = 0;
     }
     i13 = i13 + 1 | 0;
     if ((i13 | 0) >= (i8 | 0)) {
      break L43;
     }
     i11 = HEAP32[i9 >> 2] | 0;
    }
    if ((i9 | 0) == 34) {
     _error(i2, 8824);
    } else if ((i9 | 0) == 38) {
     _error(i2, 8824);
    } else if ((i9 | 0) == 41) {
     _error(i2, 8824);
    } else if ((i9 | 0) == 44) {
     _error(i2, 8824);
    } else if ((i9 | 0) == 47) {
     _error(i2, 8824);
    }
   }
  }
 } while (0);
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i8 = HEAP32[i3 >> 2] | 0;
 if ((i8 | 0) < 0) {
  _error(i2, 8872);
 }
 i9 = HEAP32[i2 >> 2] | 0;
 if ((i8 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i9);
 }
 i11 = _luaM_realloc_(i9, 0, 0, i8 << 2) | 0;
 i9 = i6 + 16 | 0;
 HEAP32[i9 >> 2] = i11;
 HEAP32[i6 + 56 >> 2] = i8;
 i10 = (i8 | 0) > 0;
 if (i10) {
  i12 = 0;
  while (1) {
   HEAP32[i11 + (i12 << 2) >> 2] = 0;
   i12 = i12 + 1 | 0;
   if ((i12 | 0) == (i8 | 0)) {
    break;
   }
   i11 = HEAP32[i9 >> 2] | 0;
  }
  if (i10) {
   i10 = 0;
   do {
    i14 = _luaF_newproto(HEAP32[i2 >> 2] | 0) | 0;
    HEAP32[(HEAP32[i9 >> 2] | 0) + (i10 << 2) >> 2] = i14;
    _LoadFunction(i2, HEAP32[(HEAP32[i9 >> 2] | 0) + (i10 << 2) >> 2] | 0);
    i10 = i10 + 1 | 0;
   } while ((i10 | 0) != (i8 | 0));
  }
 }
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i9 = HEAP32[i3 >> 2] | 0;
 if ((i9 | 0) < 0) {
  _error(i2, 8872);
 }
 i8 = HEAP32[i2 >> 2] | 0;
 if ((i9 + 1 | 0) >>> 0 > 536870911) {
  _luaM_toobig(i8);
 }
 i10 = _luaM_realloc_(i8, 0, 0, i9 << 3) | 0;
 i8 = i6 + 28 | 0;
 HEAP32[i8 >> 2] = i10;
 HEAP32[i6 + 40 >> 2] = i9;
 L98 : do {
  if ((i9 | 0) > 0) {
   HEAP32[i10 >> 2] = 0;
   if ((i9 | 0) == 1) {
    i10 = 0;
   } else {
    i10 = 1;
    while (1) {
     HEAP32[(HEAP32[i8 >> 2] | 0) + (i10 << 3) >> 2] = 0;
     i10 = i10 + 1 | 0;
     if ((i10 | 0) == (i9 | 0)) {
      i10 = 0;
      break;
     }
    }
   }
   while (1) {
    if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
     i9 = 73;
     break;
    }
    HEAP8[(HEAP32[i8 >> 2] | 0) + (i10 << 3) + 4 | 0] = HEAP8[i3] | 0;
    if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 1) | 0) != 0) {
     i9 = 75;
     break;
    }
    HEAP8[(HEAP32[i8 >> 2] | 0) + (i10 << 3) + 5 | 0] = HEAP8[i3] | 0;
    i10 = i10 + 1 | 0;
    if ((i10 | 0) >= (i9 | 0)) {
     break L98;
    }
   }
   if ((i9 | 0) == 73) {
    _error(i2, 8824);
   } else if ((i9 | 0) == 75) {
    _error(i2, 8824);
   }
  }
 } while (0);
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i9 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i9 | 0) != 0) {
   i9 = _luaZ_openspace(HEAP32[i2 >> 2] | 0, HEAP32[i2 + 8 >> 2] | 0, i9) | 0;
   if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i9, HEAP32[i3 >> 2] | 0) | 0) == 0) {
    i7 = _luaS_newlstr(HEAP32[i2 >> 2] | 0, i9, (HEAP32[i3 >> 2] | 0) + -1 | 0) | 0;
    break;
   } else {
    _error(i2, 8824);
   }
  } else {
   i7 = 0;
  }
 } while (0);
 HEAP32[i6 + 36 >> 2] = i7;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i7 = HEAP32[i3 >> 2] | 0;
 if ((i7 | 0) < 0) {
  _error(i2, 8872);
 }
 i9 = HEAP32[i2 >> 2] | 0;
 if ((i7 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i9);
 }
 i14 = i7 << 2;
 i13 = _luaM_realloc_(i9, 0, 0, i14) | 0;
 HEAP32[i6 + 20 >> 2] = i13;
 HEAP32[i6 + 52 >> 2] = i7;
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i13, i14) | 0) != 0) {
  _error(i2, 8824);
 }
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i7 = HEAP32[i3 >> 2] | 0;
 if ((i7 | 0) < 0) {
  _error(i2, 8872);
 }
 i9 = HEAP32[i2 >> 2] | 0;
 if ((i7 + 1 | 0) >>> 0 > 357913941) {
  _luaM_toobig(i9);
 }
 i10 = _luaM_realloc_(i9, 0, 0, i7 * 12 | 0) | 0;
 i9 = i6 + 24 | 0;
 HEAP32[i9 >> 2] = i10;
 HEAP32[i6 + 60 >> 2] = i7;
 L141 : do {
  if ((i7 | 0) > 0) {
   HEAP32[i10 >> 2] = 0;
   if ((i7 | 0) != 1) {
    i6 = 1;
    do {
     HEAP32[(HEAP32[i9 >> 2] | 0) + (i6 * 12 | 0) >> 2] = 0;
     i6 = i6 + 1 | 0;
    } while ((i6 | 0) != (i7 | 0));
   }
   i6 = i2 + 8 | 0;
   i10 = 0;
   while (1) {
    if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
     i9 = 102;
     break;
    }
    i11 = HEAP32[i3 >> 2] | 0;
    if ((i11 | 0) == 0) {
     i11 = 0;
    } else {
     i11 = _luaZ_openspace(HEAP32[i2 >> 2] | 0, HEAP32[i6 >> 2] | 0, i11) | 0;
     if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i11, HEAP32[i3 >> 2] | 0) | 0) != 0) {
      i9 = 105;
      break;
     }
     i11 = _luaS_newlstr(HEAP32[i2 >> 2] | 0, i11, (HEAP32[i3 >> 2] | 0) + -1 | 0) | 0;
    }
    HEAP32[(HEAP32[i9 >> 2] | 0) + (i10 * 12 | 0) >> 2] = i11;
    if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
     i9 = 108;
     break;
    }
    i11 = HEAP32[i3 >> 2] | 0;
    if ((i11 | 0) < 0) {
     i9 = 110;
     break;
    }
    HEAP32[(HEAP32[i9 >> 2] | 0) + (i10 * 12 | 0) + 4 >> 2] = i11;
    if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
     i9 = 112;
     break;
    }
    i11 = HEAP32[i3 >> 2] | 0;
    if ((i11 | 0) < 0) {
     i9 = 114;
     break;
    }
    HEAP32[(HEAP32[i9 >> 2] | 0) + (i10 * 12 | 0) + 8 >> 2] = i11;
    i10 = i10 + 1 | 0;
    if ((i10 | 0) >= (i7 | 0)) {
     break L141;
    }
   }
   if ((i9 | 0) == 102) {
    _error(i2, 8824);
   } else if ((i9 | 0) == 105) {
    _error(i2, 8824);
   } else if ((i9 | 0) == 108) {
    _error(i2, 8824);
   } else if ((i9 | 0) == 110) {
    _error(i2, 8872);
   } else if ((i9 | 0) == 112) {
    _error(i2, 8824);
   } else if ((i9 | 0) == 114) {
    _error(i2, 8872);
   }
  }
 } while (0);
 if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i5, 4) | 0) != 0) {
  _error(i2, 8824);
 }
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) < 0) {
  _error(i2, 8872);
 }
 if ((i6 | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i5 = i2 + 8 | 0;
 i7 = 0;
 while (1) {
  if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i3, 4) | 0) != 0) {
   i9 = 123;
   break;
  }
  i9 = HEAP32[i3 >> 2] | 0;
  if ((i9 | 0) == 0) {
   i9 = 0;
  } else {
   i9 = _luaZ_openspace(HEAP32[i2 >> 2] | 0, HEAP32[i5 >> 2] | 0, i9) | 0;
   if ((_luaZ_read(HEAP32[i4 >> 2] | 0, i9, HEAP32[i3 >> 2] | 0) | 0) != 0) {
    i9 = 126;
    break;
   }
   i9 = _luaS_newlstr(HEAP32[i2 >> 2] | 0, i9, (HEAP32[i3 >> 2] | 0) + -1 | 0) | 0;
  }
  HEAP32[(HEAP32[i8 >> 2] | 0) + (i7 << 3) >> 2] = i9;
  i7 = i7 + 1 | 0;
  if ((i7 | 0) >= (i6 | 0)) {
   i9 = 129;
   break;
  }
 }
 if ((i9 | 0) == 123) {
  _error(i2, 8824);
 } else if ((i9 | 0) == 126) {
  _error(i2, 8824);
 } else if ((i9 | 0) == 129) {
  STACKTOP = i1;
  return;
 }
}
function _exp2reg(i4, i1, i7) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 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, i22 = 0, i23 = 0, i24 = 0, i25 = 0;
 i5 = STACKTOP;
 _discharge2reg(i4, i1, i7);
 i6 = i1 + 16 | 0;
 do {
  if ((HEAP32[i1 >> 2] | 0) == 10 ? (i10 = HEAP32[i1 + 8 >> 2] | 0, !((i10 | 0) == -1)) : 0) {
   i22 = HEAP32[i6 >> 2] | 0;
   if ((i22 | 0) == -1) {
    HEAP32[i6 >> 2] = i10;
    break;
   }
   i20 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
   while (1) {
    i19 = i20 + (i22 << 2) | 0;
    i21 = HEAP32[i19 >> 2] | 0;
    i23 = (i21 >>> 14) + -131071 | 0;
    if ((i23 | 0) == -1) {
     break;
    }
    i23 = i22 + 1 + i23 | 0;
    if ((i23 | 0) == -1) {
     break;
    } else {
     i22 = i23;
    }
   }
   i10 = i10 + ~i22 | 0;
   if ((((i10 | 0) > -1 ? i10 : 0 - i10 | 0) | 0) > 131071) {
    _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
   } else {
    HEAP32[i19 >> 2] = (i10 << 14) + 2147467264 | i21 & 16383;
    break;
   }
  }
 } while (0);
 i21 = HEAP32[i6 >> 2] | 0;
 i10 = i1 + 20 | 0;
 i19 = HEAP32[i10 >> 2] | 0;
 if ((i21 | 0) == (i19 | 0)) {
  HEAP32[i6 >> 2] = -1;
  HEAP32[i10 >> 2] = -1;
  i25 = i1 + 8 | 0;
  HEAP32[i25 >> 2] = i7;
  HEAP32[i1 >> 2] = 6;
  STACKTOP = i5;
  return;
 }
 L18 : do {
  if ((i21 | 0) == -1) {
   i18 = 20;
  } else {
   i20 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
   while (1) {
    i23 = i20 + (i21 << 2) | 0;
    if ((i21 | 0) > 0 ? (i18 = HEAP32[i20 + (i21 + -1 << 2) >> 2] | 0, (HEAP8[5584 + (i18 & 63) | 0] | 0) < 0) : 0) {
     i22 = i18;
    } else {
     i22 = HEAP32[i23 >> 2] | 0;
    }
    if ((i22 & 63 | 0) != 28) {
     i18 = 28;
     break L18;
    }
    i22 = ((HEAP32[i23 >> 2] | 0) >>> 14) + -131071 | 0;
    if ((i22 | 0) == -1) {
     i18 = 20;
     break L18;
    }
    i21 = i21 + 1 + i22 | 0;
    if ((i21 | 0) == -1) {
     i18 = 20;
     break;
    }
   }
  }
 } while (0);
 L29 : do {
  if ((i18 | 0) == 20) {
   if ((i19 | 0) == -1) {
    i15 = -1;
    i8 = -1;
   } else {
    i20 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
    while (1) {
     i21 = i20 + (i19 << 2) | 0;
     if ((i19 | 0) > 0 ? (i17 = HEAP32[i20 + (i19 + -1 << 2) >> 2] | 0, (HEAP8[5584 + (i17 & 63) | 0] | 0) < 0) : 0) {
      i22 = i17;
     } else {
      i22 = HEAP32[i21 >> 2] | 0;
     }
     if ((i22 & 63 | 0) != 28) {
      i18 = 28;
      break L29;
     }
     i21 = ((HEAP32[i21 >> 2] | 0) >>> 14) + -131071 | 0;
     if ((i21 | 0) == -1) {
      i15 = -1;
      i8 = -1;
      break L29;
     }
     i19 = i19 + 1 + i21 | 0;
     if ((i19 | 0) == -1) {
      i15 = -1;
      i8 = -1;
      break;
     }
    }
   }
  }
 } while (0);
 do {
  if ((i18 | 0) == 28) {
   i17 = i4 + 28 | 0;
   do {
    if ((HEAP32[i1 >> 2] | 0) != 10) {
     i21 = HEAP32[i17 >> 2] | 0;
     HEAP32[i17 >> 2] = -1;
     i18 = _luaK_code(i4, 2147450903) | 0;
     if (!((i21 | 0) == -1)) {
      if (!((i18 | 0) == -1)) {
       i23 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
       i22 = i18;
       while (1) {
        i20 = i23 + (i22 << 2) | 0;
        i19 = HEAP32[i20 >> 2] | 0;
        i24 = (i19 >>> 14) + -131071 | 0;
        if ((i24 | 0) == -1) {
         break;
        }
        i24 = i22 + 1 + i24 | 0;
        if ((i24 | 0) == -1) {
         break;
        } else {
         i22 = i24;
        }
       }
       i21 = i21 + ~i22 | 0;
       if ((((i21 | 0) > -1 ? i21 : 0 - i21 | 0) | 0) > 131071) {
        _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
       } else {
        HEAP32[i20 >> 2] = (i21 << 14) + 2147467264 | i19 & 16383;
        i16 = i18;
        break;
       }
      } else {
       i16 = i21;
      }
     } else {
      i16 = i18;
     }
    } else {
     i16 = -1;
    }
   } while (0);
   i24 = i4 + 20 | 0;
   i25 = i4 + 24 | 0;
   HEAP32[i25 >> 2] = HEAP32[i24 >> 2];
   i19 = i7 << 6;
   i18 = _luaK_code(i4, i19 | 16387) | 0;
   HEAP32[i25 >> 2] = HEAP32[i24 >> 2];
   i19 = _luaK_code(i4, i19 | 8388611) | 0;
   HEAP32[i25 >> 2] = HEAP32[i24 >> 2];
   if (!((i16 | 0) == -1)) {
    i22 = HEAP32[i17 >> 2] | 0;
    if ((i22 | 0) == -1) {
     HEAP32[i17 >> 2] = i16;
     i15 = i18;
     i8 = i19;
     break;
    }
    i17 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
    while (1) {
     i21 = i17 + (i22 << 2) | 0;
     i20 = HEAP32[i21 >> 2] | 0;
     i23 = (i20 >>> 14) + -131071 | 0;
     if ((i23 | 0) == -1) {
      break;
     }
     i23 = i22 + 1 + i23 | 0;
     if ((i23 | 0) == -1) {
      break;
     } else {
      i22 = i23;
     }
    }
    i16 = i16 + ~i22 | 0;
    if ((((i16 | 0) > -1 ? i16 : 0 - i16 | 0) | 0) > 131071) {
     _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
    } else {
     HEAP32[i21 >> 2] = (i16 << 14) + 2147467264 | i20 & 16383;
     i15 = i18;
     i8 = i19;
     break;
    }
   } else {
    i15 = i18;
    i8 = i19;
   }
  }
 } while (0);
 i16 = HEAP32[i4 + 20 >> 2] | 0;
 HEAP32[i4 + 24 >> 2] = i16;
 i22 = HEAP32[i10 >> 2] | 0;
 L67 : do {
  if (!((i22 | 0) == -1)) {
   i19 = (i7 | 0) == 255;
   i17 = i7 << 6 & 16320;
   i18 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
   while (1) {
    i20 = i18 + (i22 << 2) | 0;
    i23 = HEAP32[i20 >> 2] | 0;
    i21 = (i23 >>> 14) + -131071 | 0;
    if ((i21 | 0) == -1) {
     i21 = -1;
    } else {
     i21 = i22 + 1 + i21 | 0;
    }
    if ((i22 | 0) > 0 ? (i14 = i18 + (i22 + -1 << 2) | 0, i13 = HEAP32[i14 >> 2] | 0, (HEAP8[5584 + (i13 & 63) | 0] | 0) < 0) : 0) {
     i24 = i14;
     i25 = i13;
    } else {
     i24 = i20;
     i25 = i23;
    }
    if ((i25 & 63 | 0) == 28) {
     i23 = i25 >>> 23;
     if (i19 | (i23 | 0) == (i7 | 0)) {
      i23 = i25 & 8372224 | i23 << 6 | 27;
     } else {
      i23 = i25 & -16321 | i17;
     }
     HEAP32[i24 >> 2] = i23;
     i22 = i16 + ~i22 | 0;
     if ((((i22 | 0) > -1 ? i22 : 0 - i22 | 0) | 0) > 131071) {
      i18 = 58;
      break;
     }
     i22 = HEAP32[i20 >> 2] & 16383 | (i22 << 14) + 2147467264;
    } else {
     i22 = i15 + ~i22 | 0;
     if ((((i22 | 0) > -1 ? i22 : 0 - i22 | 0) | 0) > 131071) {
      i18 = 61;
      break;
     }
     i22 = i23 & 16383 | (i22 << 14) + 2147467264;
    }
    HEAP32[i20 >> 2] = i22;
    if ((i21 | 0) == -1) {
     break L67;
    } else {
     i22 = i21;
    }
   }
   if ((i18 | 0) == 58) {
    _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
   } else if ((i18 | 0) == 61) {
    _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
   }
  }
 } while (0);
 i20 = HEAP32[i6 >> 2] | 0;
 if ((i20 | 0) == -1) {
  HEAP32[i6 >> 2] = -1;
  HEAP32[i10 >> 2] = -1;
  i25 = i1 + 8 | 0;
  HEAP32[i25 >> 2] = i7;
  HEAP32[i1 >> 2] = 6;
  STACKTOP = i5;
  return;
 }
 i13 = i7 << 6;
 i15 = i13 & 16320;
 i14 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
 if ((i7 | 0) == 255) {
  while (1) {
   i17 = i14 + (i20 << 2) | 0;
   i19 = HEAP32[i17 >> 2] | 0;
   i18 = (i19 >>> 14) + -131071 | 0;
   if ((i18 | 0) == -1) {
    i18 = -1;
   } else {
    i18 = i20 + 1 + i18 | 0;
   }
   if ((i20 | 0) > 0 ? (i12 = i14 + (i20 + -1 << 2) | 0, i11 = HEAP32[i12 >> 2] | 0, (HEAP8[5584 + (i11 & 63) | 0] | 0) < 0) : 0) {
    i22 = i12;
    i21 = i11;
   } else {
    i22 = i17;
    i21 = i19;
   }
   if ((i21 & 63 | 0) == 28) {
    HEAP32[i22 >> 2] = i21 & 8372224 | i21 >>> 23 << 6 | 27;
    i19 = i16 + ~i20 | 0;
    if ((((i19 | 0) > -1 ? i19 : 0 - i19 | 0) | 0) > 131071) {
     i18 = 87;
     break;
    }
    i19 = HEAP32[i17 >> 2] & 16383 | (i19 << 14) + 2147467264;
   } else {
    i20 = i8 + ~i20 | 0;
    if ((((i20 | 0) > -1 ? i20 : 0 - i20 | 0) | 0) > 131071) {
     i18 = 90;
     break;
    }
    i19 = i19 & 16383 | (i20 << 14) + 2147467264;
   }
   HEAP32[i17 >> 2] = i19;
   if ((i18 | 0) == -1) {
    i18 = 93;
    break;
   } else {
    i20 = i18;
   }
  }
  if ((i18 | 0) == 87) {
   i25 = i4 + 12 | 0;
   i25 = HEAP32[i25 >> 2] | 0;
   _luaX_syntaxerror(i25, 10624);
  } else if ((i18 | 0) == 90) {
   i25 = i4 + 12 | 0;
   i25 = HEAP32[i25 >> 2] | 0;
   _luaX_syntaxerror(i25, 10624);
  } else if ((i18 | 0) == 93) {
   HEAP32[i6 >> 2] = -1;
   HEAP32[i10 >> 2] = -1;
   i25 = i1 + 8 | 0;
   HEAP32[i25 >> 2] = i7;
   HEAP32[i1 >> 2] = 6;
   STACKTOP = i5;
   return;
  }
 } else {
  i9 = i20;
 }
 while (1) {
  i11 = i14 + (i9 << 2) | 0;
  i17 = HEAP32[i11 >> 2] | 0;
  i12 = (i17 >>> 14) + -131071 | 0;
  if ((i12 | 0) == -1) {
   i12 = -1;
  } else {
   i12 = i9 + 1 + i12 | 0;
  }
  if ((i9 | 0) > 0 ? (i3 = i14 + (i9 + -1 << 2) | 0, i2 = HEAP32[i3 >> 2] | 0, (HEAP8[5584 + (i2 & 63) | 0] | 0) < 0) : 0) {
   i18 = i3;
   i19 = i2;
  } else {
   i18 = i11;
   i19 = i17;
  }
  if ((i19 & 63 | 0) == 28) {
   if ((i19 >>> 23 | 0) == (i7 | 0)) {
    i17 = i19 & 8372224 | i13 | 27;
   } else {
    i17 = i19 & -16321 | i15;
   }
   HEAP32[i18 >> 2] = i17;
   i9 = i16 + ~i9 | 0;
   if ((((i9 | 0) > -1 ? i9 : 0 - i9 | 0) | 0) > 131071) {
    i18 = 87;
    break;
   }
   i9 = HEAP32[i11 >> 2] & 16383 | (i9 << 14) + 2147467264;
  } else {
   i9 = i8 + ~i9 | 0;
   if ((((i9 | 0) > -1 ? i9 : 0 - i9 | 0) | 0) > 131071) {
    i18 = 90;
    break;
   }
   i9 = i17 & 16383 | (i9 << 14) + 2147467264;
  }
  HEAP32[i11 >> 2] = i9;
  if ((i12 | 0) == -1) {
   i18 = 93;
   break;
  } else {
   i9 = i12;
  }
 }
 if ((i18 | 0) == 87) {
  i25 = i4 + 12 | 0;
  i25 = HEAP32[i25 >> 2] | 0;
  _luaX_syntaxerror(i25, 10624);
 } else if ((i18 | 0) == 90) {
  i25 = i4 + 12 | 0;
  i25 = HEAP32[i25 >> 2] | 0;
  _luaX_syntaxerror(i25, 10624);
 } else if ((i18 | 0) == 93) {
  HEAP32[i6 >> 2] = -1;
  HEAP32[i10 >> 2] = -1;
  i25 = i1 + 8 | 0;
  HEAP32[i25 >> 2] = i7;
  HEAP32[i1 >> 2] = 6;
  STACKTOP = i5;
  return;
 }
}
function _propagatemark(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 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;
 i1 = STACKTOP;
 i15 = i2 + 84 | 0;
 i3 = HEAP32[i15 >> 2] | 0;
 i10 = i3 + 5 | 0;
 HEAP8[i10] = HEAPU8[i10] | 4;
 switch (HEAPU8[i3 + 4 | 0] | 0) {
 case 5:
  {
   i9 = i3 + 24 | 0;
   HEAP32[i15 >> 2] = HEAP32[i9 >> 2];
   i15 = i3 + 8 | 0;
   i14 = HEAP32[i15 >> 2] | 0;
   do {
    if ((i14 | 0) != 0) {
     if ((HEAP8[i14 + 6 | 0] & 8) == 0) {
      i11 = _luaT_gettm(i14, 3, HEAP32[i2 + 196 >> 2] | 0) | 0;
      i14 = HEAP32[i15 >> 2] | 0;
      if ((i14 | 0) != 0) {
       i6 = 5;
      }
     } else {
      i11 = 0;
      i6 = 5;
     }
     if ((i6 | 0) == 5) {
      if (!((HEAP8[i14 + 5 | 0] & 3) == 0)) {
       _reallymarkobject(i2, i14);
      }
     }
     if (((i11 | 0) != 0 ? (HEAP32[i11 + 8 >> 2] & 15 | 0) == 4 : 0) ? (i13 = (HEAP32[i11 >> 2] | 0) + 16 | 0, i12 = _strchr(i13, 107) | 0, i12 = (i12 | 0) != 0, i13 = (_strchr(i13, 118) | 0) == 0, !(i13 & (i12 ^ 1))) : 0) {
      HEAP8[i10] = HEAP8[i10] & 251;
      if (i12) {
       if (i13) {
        _traverseephemeron(i2, i3) | 0;
        break;
       } else {
        i15 = i2 + 100 | 0;
        HEAP32[i9 >> 2] = HEAP32[i15 >> 2];
        HEAP32[i15 >> 2] = i3;
        break;
       }
      }
      i15 = 1 << HEAPU8[i3 + 7 | 0];
      i5 = HEAP32[i3 + 16 >> 2] | 0;
      i4 = i5 + (i15 << 5) | 0;
      i8 = (HEAP32[i3 + 28 >> 2] | 0) > 0 | 0;
      if ((i15 | 0) > 0) {
       do {
        i12 = i5 + 8 | 0;
        i10 = i5 + 24 | 0;
        i11 = (HEAP32[i10 >> 2] & 64 | 0) == 0;
        do {
         if ((HEAP32[i12 >> 2] | 0) == 0) {
          if (!i11 ? !((HEAP8[(HEAP32[i5 + 16 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) {
           HEAP32[i10 >> 2] = 11;
          }
         } else {
          if (!i11 ? (i7 = HEAP32[i5 + 16 >> 2] | 0, !((HEAP8[i7 + 5 | 0] & 3) == 0)) : 0) {
           _reallymarkobject(i2, i7);
          }
          if ((i8 | 0) == 0) {
           i10 = HEAP32[i12 >> 2] | 0;
           if ((i10 & 64 | 0) != 0) {
            i8 = HEAP32[i5 >> 2] | 0;
            if ((i10 & 15 | 0) != 4) {
             i8 = (HEAP8[i8 + 5 | 0] & 3) != 0 | 0;
             break;
            }
            if ((i8 | 0) != 0 ? !((HEAP8[i8 + 5 | 0] & 3) == 0) : 0) {
             _reallymarkobject(i2, i8);
             i8 = 0;
            } else {
             i8 = 0;
            }
           } else {
            i8 = 0;
           }
          }
         }
        } while (0);
        i5 = i5 + 32 | 0;
       } while (i5 >>> 0 < i4 >>> 0);
      }
      if ((i8 | 0) == 0) {
       i15 = i2 + 88 | 0;
       HEAP32[i9 >> 2] = HEAP32[i15 >> 2];
       HEAP32[i15 >> 2] = i3;
       break;
      } else {
       i15 = i2 + 92 | 0;
       HEAP32[i9 >> 2] = HEAP32[i15 >> 2];
       HEAP32[i15 >> 2] = i3;
       break;
      }
     } else {
      i6 = 33;
     }
    } else {
     i6 = 33;
    }
   } while (0);
   if ((i6 | 0) == 33) {
    i7 = i3 + 16 | 0;
    i10 = HEAP32[i7 >> 2] | 0;
    i6 = i10 + (1 << HEAPU8[i3 + 7 | 0] << 5) | 0;
    i9 = i3 + 28 | 0;
    i13 = HEAP32[i9 >> 2] | 0;
    if ((i13 | 0) > 0) {
     i10 = i3 + 12 | 0;
     i11 = 0;
     do {
      i12 = HEAP32[i10 >> 2] | 0;
      if ((HEAP32[i12 + (i11 << 4) + 8 >> 2] & 64 | 0) != 0 ? (i8 = HEAP32[i12 + (i11 << 4) >> 2] | 0, !((HEAP8[i8 + 5 | 0] & 3) == 0)) : 0) {
       _reallymarkobject(i2, i8);
       i13 = HEAP32[i9 >> 2] | 0;
      }
      i11 = i11 + 1 | 0;
     } while ((i11 | 0) < (i13 | 0));
     i7 = HEAP32[i7 >> 2] | 0;
    } else {
     i7 = i10;
    }
    if (i7 >>> 0 < i6 >>> 0) {
     do {
      i10 = i7 + 8 | 0;
      i11 = HEAP32[i10 >> 2] | 0;
      i9 = i7 + 24 | 0;
      i8 = (HEAP32[i9 >> 2] & 64 | 0) == 0;
      if ((i11 | 0) == 0) {
       if (!i8 ? !((HEAP8[(HEAP32[i7 + 16 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) {
        HEAP32[i9 >> 2] = 11;
       }
      } else {
       if (!i8 ? (i5 = HEAP32[i7 + 16 >> 2] | 0, !((HEAP8[i5 + 5 | 0] & 3) == 0)) : 0) {
        _reallymarkobject(i2, i5);
        i11 = HEAP32[i10 >> 2] | 0;
       }
       if ((i11 & 64 | 0) != 0 ? (i4 = HEAP32[i7 >> 2] | 0, !((HEAP8[i4 + 5 | 0] & 3) == 0)) : 0) {
        _reallymarkobject(i2, i4);
       }
      }
      i7 = i7 + 32 | 0;
     } while (i7 >>> 0 < i6 >>> 0);
    }
   }
   i3 = (HEAP32[i3 + 28 >> 2] << 4) + 32 + (32 << HEAPU8[i3 + 7 | 0]) | 0;
   break;
  }
 case 8:
  {
   i7 = i3 + 60 | 0;
   HEAP32[i15 >> 2] = HEAP32[i7 >> 2];
   i4 = i2 + 88 | 0;
   HEAP32[i7 >> 2] = HEAP32[i4 >> 2];
   HEAP32[i4 >> 2] = i3;
   HEAP8[i10] = HEAP8[i10] & 251;
   i4 = i3 + 28 | 0;
   i7 = HEAP32[i4 >> 2] | 0;
   if ((i7 | 0) == 0) {
    i3 = 1;
   } else {
    i5 = i3 + 8 | 0;
    i6 = HEAP32[i5 >> 2] | 0;
    if (i7 >>> 0 < i6 >>> 0) {
     do {
      if ((HEAP32[i7 + 8 >> 2] & 64 | 0) != 0 ? (i11 = HEAP32[i7 >> 2] | 0, !((HEAP8[i11 + 5 | 0] & 3) == 0)) : 0) {
       _reallymarkobject(i2, i11);
       i6 = HEAP32[i5 >> 2] | 0;
      }
      i7 = i7 + 16 | 0;
     } while (i7 >>> 0 < i6 >>> 0);
    }
    if ((HEAP8[i2 + 61 | 0] | 0) == 1) {
     i3 = i3 + 32 | 0;
     i4 = (HEAP32[i4 >> 2] | 0) + (HEAP32[i3 >> 2] << 4) | 0;
     if (i7 >>> 0 < i4 >>> 0) {
      do {
       HEAP32[i7 + 8 >> 2] = 0;
       i7 = i7 + 16 | 0;
      } while (i7 >>> 0 < i4 >>> 0);
     }
    } else {
     i3 = i3 + 32 | 0;
    }
    i3 = (HEAP32[i3 >> 2] << 4) + 112 | 0;
   }
   break;
  }
 case 9:
  {
   HEAP32[i15 >> 2] = HEAP32[i3 + 72 >> 2];
   i5 = i3 + 32 | 0;
   i4 = HEAP32[i5 >> 2] | 0;
   if ((i4 | 0) != 0 ? !((HEAP8[i4 + 5 | 0] & 3) == 0) : 0) {
    HEAP32[i5 >> 2] = 0;
   }
   i4 = HEAP32[i3 + 36 >> 2] | 0;
   if ((i4 | 0) != 0 ? !((HEAP8[i4 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i2, i4);
   }
   i4 = i3 + 44 | 0;
   i8 = HEAP32[i4 >> 2] | 0;
   if ((i8 | 0) > 0) {
    i5 = i3 + 8 | 0;
    i6 = 0;
    do {
     i7 = HEAP32[i5 >> 2] | 0;
     if ((HEAP32[i7 + (i6 << 4) + 8 >> 2] & 64 | 0) != 0 ? (i9 = HEAP32[i7 + (i6 << 4) >> 2] | 0, !((HEAP8[i9 + 5 | 0] & 3) == 0)) : 0) {
      _reallymarkobject(i2, i9);
      i8 = HEAP32[i4 >> 2] | 0;
     }
     i6 = i6 + 1 | 0;
    } while ((i6 | 0) < (i8 | 0));
   }
   i5 = i3 + 40 | 0;
   i8 = HEAP32[i5 >> 2] | 0;
   if ((i8 | 0) > 0) {
    i6 = i3 + 28 | 0;
    i7 = 0;
    do {
     i9 = HEAP32[(HEAP32[i6 >> 2] | 0) + (i7 << 3) >> 2] | 0;
     if ((i9 | 0) != 0 ? !((HEAP8[i9 + 5 | 0] & 3) == 0) : 0) {
      _reallymarkobject(i2, i9);
      i8 = HEAP32[i5 >> 2] | 0;
     }
     i7 = i7 + 1 | 0;
    } while ((i7 | 0) < (i8 | 0));
   }
   i6 = i3 + 56 | 0;
   i8 = HEAP32[i6 >> 2] | 0;
   if ((i8 | 0) > 0) {
    i7 = i3 + 16 | 0;
    i9 = 0;
    do {
     i10 = HEAP32[(HEAP32[i7 >> 2] | 0) + (i9 << 2) >> 2] | 0;
     if ((i10 | 0) != 0 ? !((HEAP8[i10 + 5 | 0] & 3) == 0) : 0) {
      _reallymarkobject(i2, i10);
      i8 = HEAP32[i6 >> 2] | 0;
     }
     i9 = i9 + 1 | 0;
    } while ((i9 | 0) < (i8 | 0));
   }
   i7 = i3 + 60 | 0;
   i11 = HEAP32[i7 >> 2] | 0;
   if ((i11 | 0) > 0) {
    i8 = i3 + 24 | 0;
    i9 = 0;
    do {
     i10 = HEAP32[(HEAP32[i8 >> 2] | 0) + (i9 * 12 | 0) >> 2] | 0;
     if ((i10 | 0) != 0 ? !((HEAP8[i10 + 5 | 0] & 3) == 0) : 0) {
      _reallymarkobject(i2, i10);
      i11 = HEAP32[i7 >> 2] | 0;
     }
     i9 = i9 + 1 | 0;
    } while ((i9 | 0) < (i11 | 0));
    i8 = HEAP32[i6 >> 2] | 0;
   }
   i3 = (i11 * 12 | 0) + 80 + (HEAP32[i4 >> 2] << 4) + (HEAP32[i5 >> 2] << 3) + ((HEAP32[i3 + 48 >> 2] | 0) + i8 + (HEAP32[i3 + 52 >> 2] | 0) << 2) | 0;
   break;
  }
 case 38:
  {
   HEAP32[i15 >> 2] = HEAP32[i3 + 8 >> 2];
   i4 = i3 + 6 | 0;
   i5 = HEAP8[i4] | 0;
   if (i5 << 24 >> 24 == 0) {
    i7 = i5 & 255;
   } else {
    i6 = 0;
    do {
     if ((HEAP32[i3 + (i6 << 4) + 24 >> 2] & 64 | 0) != 0 ? (i14 = HEAP32[i3 + (i6 << 4) + 16 >> 2] | 0, !((HEAP8[i14 + 5 | 0] & 3) == 0)) : 0) {
      _reallymarkobject(i2, i14);
      i5 = HEAP8[i4] | 0;
     }
     i6 = i6 + 1 | 0;
     i7 = i5 & 255;
    } while ((i6 | 0) < (i7 | 0));
   }
   i3 = (i7 << 4) + 16 | 0;
   break;
  }
 case 6:
  {
   HEAP32[i15 >> 2] = HEAP32[i3 + 8 >> 2];
   i4 = HEAP32[i3 + 12 >> 2] | 0;
   if ((i4 | 0) != 0 ? !((HEAP8[i4 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i2, i4);
   }
   i4 = i3 + 6 | 0;
   i6 = HEAP8[i4] | 0;
   if (i6 << 24 >> 24 == 0) {
    i7 = i6 & 255;
   } else {
    i5 = 0;
    do {
     i7 = HEAP32[i3 + (i5 << 2) + 16 >> 2] | 0;
     if ((i7 | 0) != 0 ? !((HEAP8[i7 + 5 | 0] & 3) == 0) : 0) {
      _reallymarkobject(i2, i7);
      i6 = HEAP8[i4] | 0;
     }
     i5 = i5 + 1 | 0;
     i7 = i6 & 255;
    } while ((i5 | 0) < (i7 | 0));
   }
   i3 = (i7 << 2) + 16 | 0;
   break;
  }
 default:
  {
   STACKTOP = i1;
   return;
  }
 }
 i15 = i2 + 16 | 0;
 HEAP32[i15 >> 2] = (HEAP32[i15 >> 2] | 0) + i3;
 STACKTOP = i1;
 return;
}
function _strstr(i8, i4) {
 i8 = i8 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 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;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i6 = i1 + 1024 | 0;
 i2 = i1;
 i10 = HEAP8[i4] | 0;
 if (i10 << 24 >> 24 == 0) {
  i20 = i8;
  STACKTOP = i1;
  return i20 | 0;
 }
 i8 = _strchr(i8, i10 << 24 >> 24) | 0;
 if ((i8 | 0) == 0) {
  i20 = 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 i13 = HEAP8[i4 + 1 | 0] | 0;
 if (i13 << 24 >> 24 == 0) {
  i20 = i8;
  STACKTOP = i1;
  return i20 | 0;
 }
 i11 = i8 + 1 | 0;
 i9 = HEAP8[i11] | 0;
 if (i9 << 24 >> 24 == 0) {
  i20 = 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 i15 = HEAP8[i4 + 2 | 0] | 0;
 if (i15 << 24 >> 24 == 0) {
  i2 = i13 & 255 | (i10 & 255) << 8;
  i3 = i9;
  i4 = HEAPU8[i8] << 8 | i9 & 255;
  while (1) {
   i5 = i4 & 65535;
   if ((i5 | 0) == (i2 | 0)) {
    break;
   }
   i11 = i11 + 1 | 0;
   i4 = HEAP8[i11] | 0;
   if (i4 << 24 >> 24 == 0) {
    i3 = 0;
    break;
   } else {
    i3 = i4;
    i4 = i4 & 255 | i5 << 8;
   }
  }
  i20 = i3 << 24 >> 24 == 0 ? 0 : i11 + -1 | 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 i16 = i8 + 2 | 0;
 i11 = HEAP8[i16] | 0;
 if (i11 << 24 >> 24 == 0) {
  i20 = 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 i18 = HEAP8[i4 + 3 | 0] | 0;
 if (i18 << 24 >> 24 == 0) {
  i2 = (i13 & 255) << 16 | (i10 & 255) << 24 | (i15 & 255) << 8;
  i4 = (i11 & 255) << 8 | (i9 & 255) << 16 | HEAPU8[i8] << 24;
  if ((i4 | 0) == (i2 | 0)) {
   i3 = 0;
  } else {
   do {
    i16 = i16 + 1 | 0;
    i3 = HEAP8[i16] | 0;
    i4 = (i3 & 255 | i4) << 8;
    i3 = i3 << 24 >> 24 == 0;
   } while (!(i3 | (i4 | 0) == (i2 | 0)));
  }
  i20 = i3 ? 0 : i16 + -2 | 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 i16 = i8 + 3 | 0;
 i17 = HEAP8[i16] | 0;
 if (i17 << 24 >> 24 == 0) {
  i20 = 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 if ((HEAP8[i4 + 4 | 0] | 0) == 0) {
  i2 = (i13 & 255) << 16 | (i10 & 255) << 24 | (i15 & 255) << 8 | i18 & 255;
  i3 = (i11 & 255) << 8 | (i9 & 255) << 16 | i17 & 255 | HEAPU8[i8] << 24;
  if ((i3 | 0) == (i2 | 0)) {
   i4 = 0;
  } else {
   do {
    i16 = i16 + 1 | 0;
    i4 = HEAP8[i16] | 0;
    i3 = i4 & 255 | i3 << 8;
    i4 = i4 << 24 >> 24 == 0;
   } while (!(i4 | (i3 | 0) == (i2 | 0)));
  }
  i20 = i4 ? 0 : i16 + -3 | 0;
  STACKTOP = i1;
  return i20 | 0;
 }
 HEAP32[i6 + 0 >> 2] = 0;
 HEAP32[i6 + 4 >> 2] = 0;
 HEAP32[i6 + 8 >> 2] = 0;
 HEAP32[i6 + 12 >> 2] = 0;
 HEAP32[i6 + 16 >> 2] = 0;
 HEAP32[i6 + 20 >> 2] = 0;
 HEAP32[i6 + 24 >> 2] = 0;
 HEAP32[i6 + 28 >> 2] = 0;
 i9 = 0;
 while (1) {
  if ((HEAP8[i8 + i9 | 0] | 0) == 0) {
   i14 = 0;
   i12 = 80;
   break;
  }
  i20 = i10 & 255;
  i3 = i6 + (i20 >>> 5 << 2) | 0;
  HEAP32[i3 >> 2] = HEAP32[i3 >> 2] | 1 << (i20 & 31);
  i3 = i9 + 1 | 0;
  HEAP32[i2 + (i20 << 2) >> 2] = i3;
  i10 = HEAP8[i4 + i3 | 0] | 0;
  if (i10 << 24 >> 24 == 0) {
   break;
  } else {
   i9 = i3;
  }
 }
 if ((i12 | 0) == 80) {
  STACKTOP = i1;
  return i14 | 0;
 }
 L49 : do {
  if (i3 >>> 0 > 1) {
   i14 = 1;
   i11 = -1;
   i12 = 0;
   L50 : while (1) {
    i10 = 1;
    while (1) {
     i13 = i14;
     L54 : while (1) {
      i14 = 1;
      while (1) {
       i15 = HEAP8[i4 + (i14 + i11) | 0] | 0;
       i16 = HEAP8[i4 + i13 | 0] | 0;
       if (!(i15 << 24 >> 24 == i16 << 24 >> 24)) {
        break L54;
       }
       i15 = i14 + 1 | 0;
       if ((i14 | 0) == (i10 | 0)) {
        break;
       }
       i13 = i15 + i12 | 0;
       if (i13 >>> 0 < i3 >>> 0) {
        i14 = i15;
       } else {
        break L50;
       }
      }
      i12 = i12 + i10 | 0;
      i13 = i12 + 1 | 0;
      if (!(i13 >>> 0 < i3 >>> 0)) {
       break L50;
      }
     }
     i10 = i13 - i11 | 0;
     if (!((i15 & 255) > (i16 & 255))) {
      break;
     }
     i14 = i13 + 1 | 0;
     if (i14 >>> 0 < i3 >>> 0) {
      i12 = i13;
     } else {
      break L50;
     }
    }
    i14 = i12 + 2 | 0;
    if (i14 >>> 0 < i3 >>> 0) {
     i11 = i12;
     i12 = i12 + 1 | 0;
    } else {
     i11 = i12;
     i10 = 1;
     break;
    }
   }
   i16 = 1;
   i12 = -1;
   i14 = 0;
   while (1) {
    i13 = 1;
    while (1) {
     i15 = i16;
     L69 : while (1) {
      i18 = 1;
      while (1) {
       i17 = HEAP8[i4 + (i18 + i12) | 0] | 0;
       i16 = HEAP8[i4 + i15 | 0] | 0;
       if (!(i17 << 24 >> 24 == i16 << 24 >> 24)) {
        break L69;
       }
       i16 = i18 + 1 | 0;
       if ((i18 | 0) == (i13 | 0)) {
        break;
       }
       i15 = i16 + i14 | 0;
       if (i15 >>> 0 < i3 >>> 0) {
        i18 = i16;
       } else {
        i14 = i12;
        break L49;
       }
      }
      i14 = i14 + i13 | 0;
      i15 = i14 + 1 | 0;
      if (!(i15 >>> 0 < i3 >>> 0)) {
       i14 = i12;
       break L49;
      }
     }
     i13 = i15 - i12 | 0;
     if (!((i17 & 255) < (i16 & 255))) {
      break;
     }
     i16 = i15 + 1 | 0;
     if (i16 >>> 0 < i3 >>> 0) {
      i14 = i15;
     } else {
      i14 = i12;
      break L49;
     }
    }
    i16 = i14 + 2 | 0;
    if (i16 >>> 0 < i3 >>> 0) {
     i12 = i14;
     i14 = i14 + 1 | 0;
    } else {
     i13 = 1;
     break;
    }
   }
  } else {
   i11 = -1;
   i14 = -1;
   i10 = 1;
   i13 = 1;
  }
 } while (0);
 i15 = (i14 + 1 | 0) >>> 0 > (i11 + 1 | 0) >>> 0;
 i12 = i15 ? i13 : i10;
 i11 = i15 ? i14 : i11;
 i10 = i11 + 1 | 0;
 if ((_memcmp(i4, i4 + i12 | 0, i10) | 0) == 0) {
  i15 = i3 - i12 | 0;
  i16 = i3 | 63;
  if ((i3 | 0) != (i12 | 0)) {
   i14 = i8;
   i13 = 0;
   i17 = i8;
   L82 : while (1) {
    i18 = i14;
    do {
     if ((i17 - i18 | 0) >>> 0 < i3 >>> 0) {
      i19 = _memchr(i17, 0, i16) | 0;
      if ((i19 | 0) != 0) {
       if ((i19 - i18 | 0) >>> 0 < i3 >>> 0) {
        i14 = 0;
        i12 = 80;
        break L82;
       } else {
        i17 = i19;
        break;
       }
      } else {
       i17 = i17 + i16 | 0;
       break;
      }
     }
    } while (0);
    i18 = HEAPU8[i14 + i9 | 0] | 0;
    if ((1 << (i18 & 31) & HEAP32[i6 + (i18 >>> 5 << 2) >> 2] | 0) == 0) {
     i14 = i14 + i3 | 0;
     i13 = 0;
     continue;
    }
    i20 = HEAP32[i2 + (i18 << 2) >> 2] | 0;
    i18 = i3 - i20 | 0;
    if ((i3 | 0) != (i20 | 0)) {
     i14 = i14 + ((i13 | 0) != 0 & i18 >>> 0 < i12 >>> 0 ? i15 : i18) | 0;
     i13 = 0;
     continue;
    }
    i20 = i10 >>> 0 > i13 >>> 0 ? i10 : i13;
    i18 = HEAP8[i4 + i20 | 0] | 0;
    L96 : do {
     if (i18 << 24 >> 24 == 0) {
      i19 = i10;
     } else {
      while (1) {
       i19 = i20 + 1 | 0;
       if (!(i18 << 24 >> 24 == (HEAP8[i14 + i20 | 0] | 0))) {
        break;
       }
       i18 = HEAP8[i4 + i19 | 0] | 0;
       if (i18 << 24 >> 24 == 0) {
        i19 = i10;
        break L96;
       } else {
        i20 = i19;
       }
      }
      i14 = i14 + (i20 - i11) | 0;
      i13 = 0;
      continue L82;
     }
    } while (0);
    while (1) {
     if (!(i19 >>> 0 > i13 >>> 0)) {
      break;
     }
     i18 = i19 + -1 | 0;
     if ((HEAP8[i4 + i18 | 0] | 0) == (HEAP8[i14 + i18 | 0] | 0)) {
      i19 = i18;
     } else {
      break;
     }
    }
    if ((i19 | 0) == (i13 | 0)) {
     i12 = 80;
     break;
    }
    i14 = i14 + i12 | 0;
    i13 = i15;
   }
   if ((i12 | 0) == 80) {
    STACKTOP = i1;
    return i14 | 0;
   }
  } else {
   i5 = i16;
   i7 = i3;
  }
 } else {
  i7 = i3 - i11 + -1 | 0;
  i5 = i3 | 63;
  i7 = (i11 >>> 0 > i7 >>> 0 ? i11 : i7) + 1 | 0;
 }
 i12 = i4 + i10 | 0;
 i14 = i8;
 L111 : while (1) {
  i13 = i14;
  do {
   if ((i8 - i13 | 0) >>> 0 < i3 >>> 0) {
    i15 = _memchr(i8, 0, i5) | 0;
    if ((i15 | 0) != 0) {
     if ((i15 - i13 | 0) >>> 0 < i3 >>> 0) {
      i14 = 0;
      i12 = 80;
      break L111;
     } else {
      i8 = i15;
      break;
     }
    } else {
     i8 = i8 + i5 | 0;
     break;
    }
   }
  } while (0);
  i13 = HEAPU8[i14 + i9 | 0] | 0;
  if ((1 << (i13 & 31) & HEAP32[i6 + (i13 >>> 5 << 2) >> 2] | 0) == 0) {
   i14 = i14 + i3 | 0;
   continue;
  }
  i13 = HEAP32[i2 + (i13 << 2) >> 2] | 0;
  if ((i3 | 0) != (i13 | 0)) {
   i14 = i14 + (i3 - i13) | 0;
   continue;
  }
  i15 = HEAP8[i12] | 0;
  L125 : do {
   if (i15 << 24 >> 24 == 0) {
    i13 = i10;
   } else {
    i16 = i10;
    while (1) {
     i13 = i16 + 1 | 0;
     if (!(i15 << 24 >> 24 == (HEAP8[i14 + i16 | 0] | 0))) {
      break;
     }
     i15 = HEAP8[i4 + i13 | 0] | 0;
     if (i15 << 24 >> 24 == 0) {
      i13 = i10;
      break L125;
     } else {
      i16 = i13;
     }
    }
    i14 = i14 + (i16 - i11) | 0;
    continue L111;
   }
  } while (0);
  do {
   if ((i13 | 0) == 0) {
    i12 = 80;
    break L111;
   }
   i13 = i13 + -1 | 0;
  } while ((HEAP8[i4 + i13 | 0] | 0) == (HEAP8[i14 + i13 | 0] | 0));
  i14 = i14 + i7 | 0;
 }
 if ((i12 | 0) == 80) {
  STACKTOP = i1;
  return i14 | 0;
 }
 return 0;
}
function _str_format(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 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, i17 = 0, i18 = 0, i19 = 0, i20 = 0, d21 = 0.0, i22 = 0;
 i12 = STACKTOP;
 STACKTOP = STACKTOP + 1104 | 0;
 i4 = i12;
 i7 = i12 + 1060 | 0;
 i9 = i12 + 1082 | 0;
 i20 = i12 + 1056 | 0;
 i10 = i12 + 16 | 0;
 i5 = i12 + 1064 | 0;
 i6 = i12 + 8 | 0;
 i8 = _lua_gettop(i2) | 0;
 i16 = _luaL_checklstring(i2, 1, i20) | 0;
 i20 = HEAP32[i20 >> 2] | 0;
 i3 = i16 + i20 | 0;
 _luaL_buffinit(i2, i10);
 L1 : do {
  if ((i20 | 0) > 0) {
   i1 = i10 + 8 | 0;
   i13 = i10 + 4 | 0;
   i14 = i5 + 1 | 0;
   i19 = 1;
   L3 : while (1) {
    while (1) {
     i15 = HEAP8[i16] | 0;
     if (i15 << 24 >> 24 == 37) {
      i18 = i16 + 1 | 0;
      if ((HEAP8[i18] | 0) != 37) {
       break;
      }
      i15 = HEAP32[i1 >> 2] | 0;
      if (i15 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0) {
       i17 = 37;
      } else {
       _luaL_prepbuffsize(i10, 1) | 0;
       i15 = HEAP32[i1 >> 2] | 0;
       i17 = HEAP8[i18] | 0;
      }
      HEAP32[i1 >> 2] = i15 + 1;
      HEAP8[(HEAP32[i10 >> 2] | 0) + i15 | 0] = i17;
      i16 = i16 + 2 | 0;
     } else {
      i17 = HEAP32[i1 >> 2] | 0;
      if (!(i17 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
       _luaL_prepbuffsize(i10, 1) | 0;
       i17 = HEAP32[i1 >> 2] | 0;
       i15 = HEAP8[i16] | 0;
      }
      HEAP32[i1 >> 2] = i17 + 1;
      HEAP8[(HEAP32[i10 >> 2] | 0) + i17 | 0] = i15;
      i16 = i16 + 1 | 0;
     }
     if (!(i16 >>> 0 < i3 >>> 0)) {
      break L1;
     }
    }
    i17 = _luaL_prepbuffsize(i10, 512) | 0;
    i15 = i19 + 1 | 0;
    if ((i19 | 0) >= (i8 | 0)) {
     _luaL_argerror(i2, i15, 7648) | 0;
    }
    i19 = HEAP8[i18] | 0;
    L22 : do {
     if (i19 << 24 >> 24 == 0) {
      i19 = 0;
      i20 = i18;
     } else {
      i20 = i18;
      while (1) {
       i16 = i20 + 1 | 0;
       if ((_memchr(7800, i19 << 24 >> 24, 6) | 0) == 0) {
        break L22;
       }
       i19 = HEAP8[i16] | 0;
       if (i19 << 24 >> 24 == 0) {
        i19 = 0;
        i20 = i16;
        break;
       } else {
        i20 = i16;
       }
      }
     }
    } while (0);
    i16 = i18;
    if ((i20 - i16 | 0) >>> 0 > 5) {
     _luaL_error(i2, 7808, i4) | 0;
     i19 = HEAP8[i20] | 0;
    }
    i19 = ((i19 & 255) + -48 | 0) >>> 0 < 10 ? i20 + 1 | 0 : i20;
    i19 = ((HEAPU8[i19] | 0) + -48 | 0) >>> 0 < 10 ? i19 + 1 | 0 : i19;
    i20 = HEAP8[i19] | 0;
    if (i20 << 24 >> 24 == 46) {
     i20 = i19 + 1 | 0;
     i19 = ((HEAPU8[i20] | 0) + -48 | 0) >>> 0 < 10 ? i19 + 2 | 0 : i20;
     i19 = ((HEAPU8[i19] | 0) + -48 | 0) >>> 0 < 10 ? i19 + 1 | 0 : i19;
     i20 = HEAP8[i19] | 0;
    }
    if (((i20 & 255) + -48 | 0) >>> 0 < 10) {
     _luaL_error(i2, 7840, i4) | 0;
    }
    HEAP8[i5] = 37;
    i16 = i19 - i16 | 0;
    _memcpy(i14 | 0, i18 | 0, i16 + 1 | 0) | 0;
    HEAP8[i5 + (i16 + 2) | 0] = 0;
    i16 = i19 + 1 | 0;
    i18 = HEAP8[i19] | 0;
    L36 : do {
     switch (i18 | 0) {
     case 115:
      {
       i18 = _luaL_tolstring(i2, i15, i6) | 0;
       if ((_strchr(i5, 46) | 0) == 0 ? (HEAP32[i6 >> 2] | 0) >>> 0 > 99 : 0) {
        _luaL_addvalue(i10);
        i17 = 0;
        break L36;
       }
       HEAP32[i4 >> 2] = i18;
       i17 = _sprintf(i17 | 0, i5 | 0, i4 | 0) | 0;
       _lua_settop(i2, -2);
       break;
      }
     case 88:
     case 120:
     case 117:
     case 111:
      {
       d21 = +_luaL_checknumber(i2, i15);
       i18 = ~~d21 >>> 0;
       d21 = d21 - +(i18 >>> 0);
       if (!(d21 > -1.0 & d21 < 1.0)) {
        _luaL_argerror(i2, i15, 7696) | 0;
       }
       i20 = _strlen(i5 | 0) | 0;
       i22 = i5 + (i20 + -1) | 0;
       i19 = HEAP8[i22] | 0;
       HEAP8[i22] = 108;
       HEAP8[i22 + 1 | 0] = 0;
       HEAP8[i5 + i20 | 0] = i19;
       HEAP8[i5 + (i20 + 1) | 0] = 0;
       HEAP32[i4 >> 2] = i18;
       i17 = _sprintf(i17 | 0, i5 | 0, i4 | 0) | 0;
       break;
      }
     case 99:
      {
       HEAP32[i4 >> 2] = _luaL_checkinteger(i2, i15) | 0;
       i17 = _sprintf(i17 | 0, i5 | 0, i4 | 0) | 0;
       break;
      }
     case 113:
      {
       i17 = _luaL_checklstring(i2, i15, i7) | 0;
       i18 = HEAP32[i1 >> 2] | 0;
       if (!(i18 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
        _luaL_prepbuffsize(i10, 1) | 0;
        i18 = HEAP32[i1 >> 2] | 0;
       }
       HEAP32[i1 >> 2] = i18 + 1;
       HEAP8[(HEAP32[i10 >> 2] | 0) + i18 | 0] = 34;
       i22 = HEAP32[i7 >> 2] | 0;
       HEAP32[i7 >> 2] = i22 + -1;
       if ((i22 | 0) != 0) {
        while (1) {
         i18 = HEAP8[i17] | 0;
         do {
          if (i18 << 24 >> 24 == 10 | i18 << 24 >> 24 == 92 | i18 << 24 >> 24 == 34) {
           i18 = HEAP32[i1 >> 2] | 0;
           if (!(i18 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
            _luaL_prepbuffsize(i10, 1) | 0;
            i18 = HEAP32[i1 >> 2] | 0;
           }
           HEAP32[i1 >> 2] = i18 + 1;
           HEAP8[(HEAP32[i10 >> 2] | 0) + i18 | 0] = 92;
           i18 = HEAP32[i1 >> 2] | 0;
           if (!(i18 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
            _luaL_prepbuffsize(i10, 1) | 0;
            i18 = HEAP32[i1 >> 2] | 0;
           }
           i22 = HEAP8[i17] | 0;
           HEAP32[i1 >> 2] = i18 + 1;
           HEAP8[(HEAP32[i10 >> 2] | 0) + i18 | 0] = i22;
          } else if (i18 << 24 >> 24 == 0) {
           i18 = 0;
           i11 = 44;
          } else {
           if ((_iscntrl(i18 & 255 | 0) | 0) != 0) {
            i18 = HEAP8[i17] | 0;
            i11 = 44;
            break;
           }
           i18 = HEAP32[i1 >> 2] | 0;
           if (!(i18 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
            _luaL_prepbuffsize(i10, 1) | 0;
            i18 = HEAP32[i1 >> 2] | 0;
           }
           i22 = HEAP8[i17] | 0;
           HEAP32[i1 >> 2] = i18 + 1;
           HEAP8[(HEAP32[i10 >> 2] | 0) + i18 | 0] = i22;
          }
         } while (0);
         if ((i11 | 0) == 44) {
          i11 = 0;
          i18 = i18 & 255;
          if (((HEAPU8[i17 + 1 | 0] | 0) + -48 | 0) >>> 0 < 10) {
           HEAP32[i4 >> 2] = i18;
           _sprintf(i9 | 0, 7792, i4 | 0) | 0;
          } else {
           HEAP32[i4 >> 2] = i18;
           _sprintf(i9 | 0, 7784, i4 | 0) | 0;
          }
          _luaL_addstring(i10, i9);
         }
         i22 = HEAP32[i7 >> 2] | 0;
         HEAP32[i7 >> 2] = i22 + -1;
         if ((i22 | 0) == 0) {
          break;
         } else {
          i17 = i17 + 1 | 0;
         }
        }
       }
       i17 = HEAP32[i1 >> 2] | 0;
       if (!(i17 >>> 0 < (HEAP32[i13 >> 2] | 0) >>> 0)) {
        _luaL_prepbuffsize(i10, 1) | 0;
        i17 = HEAP32[i1 >> 2] | 0;
       }
       HEAP32[i1 >> 2] = i17 + 1;
       HEAP8[(HEAP32[i10 >> 2] | 0) + i17 | 0] = 34;
       i17 = 0;
       break;
      }
     case 71:
     case 103:
     case 102:
     case 69:
     case 101:
      {
       HEAP8[i5 + (_strlen(i5 | 0) | 0) | 0] = 0;
       d21 = +_luaL_checknumber(i2, i15);
       HEAPF64[tempDoublePtr >> 3] = d21;
       HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
       HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
       i17 = _sprintf(i17 | 0, i5 | 0, i4 | 0) | 0;
       break;
      }
     case 105:
     case 100:
      {
       d21 = +_luaL_checknumber(i2, i15);
       i18 = ~~d21;
       d21 = d21 - +(i18 | 0);
       if (!(d21 > -1.0 & d21 < 1.0)) {
        _luaL_argerror(i2, i15, 7664) | 0;
       }
       i22 = _strlen(i5 | 0) | 0;
       i19 = i5 + (i22 + -1) | 0;
       i20 = HEAP8[i19] | 0;
       HEAP8[i19] = 108;
       HEAP8[i19 + 1 | 0] = 0;
       HEAP8[i5 + i22 | 0] = i20;
       HEAP8[i5 + (i22 + 1) | 0] = 0;
       HEAP32[i4 >> 2] = i18;
       i17 = _sprintf(i17 | 0, i5 | 0, i4 | 0) | 0;
       break;
      }
     default:
      {
       break L3;
      }
     }
    } while (0);
    HEAP32[i1 >> 2] = (HEAP32[i1 >> 2] | 0) + i17;
    if (i16 >>> 0 < i3 >>> 0) {
     i19 = i15;
    } else {
     break L1;
    }
   }
   HEAP32[i4 >> 2] = i18;
   i22 = _luaL_error(i2, 7744, i4) | 0;
   STACKTOP = i12;
   return i22 | 0;
  }
 } while (0);
 _luaL_pushresult(i10);
 i22 = 1;
 STACKTOP = i12;
 return i22 | 0;
}
function _luaD_precall(i3, i17, i4) {
 i3 = i3 | 0;
 i17 = i17 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 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, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i8 = i1;
 i6 = i3 + 28 | 0;
 i2 = i3 + 8 | 0;
 i13 = i3 + 24 | 0;
 i14 = i3 + 32 | 0;
 while (1) {
  i15 = HEAP32[i6 >> 2] | 0;
  i16 = i17;
  i12 = i15;
  i5 = i16 - i12 | 0;
  i11 = HEAP32[i17 + 8 >> 2] & 63;
  if ((i11 | 0) == 38) {
   i11 = 4;
   break;
  } else if ((i11 | 0) == 22) {
   i11 = 3;
   break;
  } else if ((i11 | 0) == 6) {
   i11 = 31;
   break;
  }
  i11 = _luaT_gettmbyobj(i3, i17, 16) | 0;
  i15 = i16 - (HEAP32[i6 >> 2] | 0) | 0;
  i16 = i11 + 8 | 0;
  if ((HEAP32[i16 >> 2] & 15 | 0) != 6) {
   i11 = 54;
   break;
  }
  i19 = HEAP32[i2 >> 2] | 0;
  if (i19 >>> 0 > i17 >>> 0) {
   while (1) {
    i18 = i19 + -16 | 0;
    i22 = i18;
    i21 = HEAP32[i22 + 4 >> 2] | 0;
    i20 = i19;
    HEAP32[i20 >> 2] = HEAP32[i22 >> 2];
    HEAP32[i20 + 4 >> 2] = i21;
    HEAP32[i19 + 8 >> 2] = HEAP32[i19 + -8 >> 2];
    if (i18 >>> 0 > i17 >>> 0) {
     i19 = i18;
    } else {
     break;
    }
   }
   i19 = HEAP32[i2 >> 2] | 0;
  }
  i17 = i19 + 16 | 0;
  HEAP32[i2 >> 2] = i17;
  if (((HEAP32[i13 >> 2] | 0) - i17 | 0) < 16) {
   i18 = HEAP32[i14 >> 2] | 0;
   if ((i18 | 0) > 1e6) {
    i11 = 60;
    break;
   }
   i17 = (i17 - (HEAP32[i6 >> 2] | 0) >> 4) + 5 | 0;
   i18 = i18 << 1;
   i18 = (i18 | 0) > 1e6 ? 1e6 : i18;
   i17 = (i18 | 0) < (i17 | 0) ? i17 : i18;
   if ((i17 | 0) > 1e6) {
    i11 = 62;
    break;
   }
   _luaD_reallocstack(i3, i17);
  }
  i22 = HEAP32[i6 >> 2] | 0;
  i17 = i22 + i15 | 0;
  i19 = i11;
  i20 = HEAP32[i19 + 4 >> 2] | 0;
  i21 = i17;
  HEAP32[i21 >> 2] = HEAP32[i19 >> 2];
  HEAP32[i21 + 4 >> 2] = i20;
  HEAP32[i22 + (i15 + 8) >> 2] = HEAP32[i16 >> 2];
 }
 if ((i11 | 0) == 3) {
  i10 = i17;
 } else if ((i11 | 0) == 4) {
  i10 = (HEAP32[i17 >> 2] | 0) + 12 | 0;
 } else if ((i11 | 0) == 31) {
  i10 = HEAP32[(HEAP32[i17 >> 2] | 0) + 12 >> 2] | 0;
  i18 = HEAP32[i2 >> 2] | 0;
  i16 = i18;
  i11 = i10 + 78 | 0;
  i17 = HEAPU8[i11] | 0;
  do {
   if (((HEAP32[i13 >> 2] | 0) - i16 >> 4 | 0) <= (i17 | 0)) {
    i13 = HEAP32[i14 >> 2] | 0;
    if ((i13 | 0) > 1e6) {
     _luaD_throw(i3, 6);
    }
    i12 = i17 + 5 + (i16 - i12 >> 4) | 0;
    i13 = i13 << 1;
    i13 = (i13 | 0) > 1e6 ? 1e6 : i13;
    i12 = (i13 | 0) < (i12 | 0) ? i12 : i13;
    if ((i12 | 0) > 1e6) {
     _luaD_reallocstack(i3, 1000200);
     _luaG_runerror(i3, 2224, i8);
    } else {
     _luaD_reallocstack(i3, i12);
     i7 = HEAP32[i6 >> 2] | 0;
     i9 = HEAP32[i2 >> 2] | 0;
     break;
    }
   } else {
    i7 = i15;
    i9 = i18;
   }
  } while (0);
  i6 = i7 + i5 | 0;
  i22 = i9 - i6 >> 4;
  i12 = i22 + -1 | 0;
  i8 = i10 + 76 | 0;
  i13 = HEAP8[i8] | 0;
  if ((i22 | 0) > (i13 & 255 | 0)) {
   i8 = i13;
  } else {
   i13 = i9;
   while (1) {
    i9 = i13 + 16 | 0;
    HEAP32[i2 >> 2] = i9;
    HEAP32[i13 + 8 >> 2] = 0;
    i12 = i12 + 1 | 0;
    i13 = HEAP8[i8] | 0;
    if ((i12 | 0) < (i13 & 255 | 0)) {
     i13 = i9;
    } else {
     i8 = i13;
     break;
    }
   }
  }
  if ((HEAP8[i10 + 77 | 0] | 0) != 0) {
   i5 = i8 & 255;
   if (!(i8 << 24 >> 24 == 0) ? (i22 = 0 - i12 | 0, HEAP32[i2 >> 2] = i9 + 16, i19 = i9 + (i22 << 4) | 0, i20 = HEAP32[i19 + 4 >> 2] | 0, i21 = i9, HEAP32[i21 >> 2] = HEAP32[i19 >> 2], HEAP32[i21 + 4 >> 2] = i20, i22 = i9 + (i22 << 4) + 8 | 0, HEAP32[i9 + 8 >> 2] = HEAP32[i22 >> 2], HEAP32[i22 >> 2] = 0, (i8 & 255) > 1) : 0) {
    i7 = 1;
    do {
     i21 = HEAP32[i2 >> 2] | 0;
     i22 = i7 - i12 | 0;
     HEAP32[i2 >> 2] = i21 + 16;
     i18 = i9 + (i22 << 4) | 0;
     i19 = HEAP32[i18 + 4 >> 2] | 0;
     i20 = i21;
     HEAP32[i20 >> 2] = HEAP32[i18 >> 2];
     HEAP32[i20 + 4 >> 2] = i19;
     i22 = i9 + (i22 << 4) + 8 | 0;
     HEAP32[i21 + 8 >> 2] = HEAP32[i22 >> 2];
     HEAP32[i22 >> 2] = 0;
     i7 = i7 + 1 | 0;
    } while ((i7 | 0) < (i5 | 0));
   }
  } else {
   i9 = i7 + (i5 + 16) | 0;
  }
  i7 = i3 + 16 | 0;
  i5 = HEAP32[(HEAP32[i7 >> 2] | 0) + 12 >> 2] | 0;
  if ((i5 | 0) == 0) {
   i5 = _luaE_extendCI(i3) | 0;
  }
  HEAP32[i7 >> 2] = i5;
  HEAP16[i5 + 16 >> 1] = i4;
  HEAP32[i5 >> 2] = i6;
  HEAP32[i5 + 24 >> 2] = i9;
  i22 = i9 + (HEAPU8[i11] << 4) | 0;
  HEAP32[i5 + 4 >> 2] = i22;
  i4 = i5 + 28 | 0;
  HEAP32[i4 >> 2] = HEAP32[i10 + 12 >> 2];
  i6 = i5 + 18 | 0;
  HEAP8[i6] = 1;
  HEAP32[i2 >> 2] = i22;
  if ((HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
   _luaC_step(i3);
  }
  if ((HEAP8[i3 + 40 | 0] & 1) == 0) {
   i22 = 0;
   STACKTOP = i1;
   return i22 | 0;
  }
  HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 4;
  i2 = HEAP32[i5 + 8 >> 2] | 0;
  if (!((HEAP8[i2 + 18 | 0] & 1) == 0) ? (HEAP32[(HEAP32[i2 + 28 >> 2] | 0) + -4 >> 2] & 63 | 0) == 30 : 0) {
   HEAP8[i6] = HEAPU8[i6] | 64;
   i2 = 4;
  } else {
   i2 = 0;
  }
  _luaD_hook(i3, i2, -1);
  HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -4;
  i22 = 0;
  STACKTOP = i1;
  return i22 | 0;
 } else if ((i11 | 0) == 54) {
  _luaG_typeerror(i3, i17, 2520);
 } else if ((i11 | 0) == 60) {
  _luaD_throw(i3, 6);
 } else if ((i11 | 0) == 62) {
  _luaD_reallocstack(i3, 1000200);
  _luaG_runerror(i3, 2224, i8);
 }
 i7 = HEAP32[i10 >> 2] | 0;
 i9 = HEAP32[i2 >> 2] | 0;
 do {
  if (((HEAP32[i13 >> 2] | 0) - i9 | 0) < 336) {
   i10 = HEAP32[i14 >> 2] | 0;
   if ((i10 | 0) > 1e6) {
    _luaD_throw(i3, 6);
   }
   i9 = (i9 - i12 >> 4) + 25 | 0;
   i10 = i10 << 1;
   i10 = (i10 | 0) > 1e6 ? 1e6 : i10;
   i9 = (i10 | 0) < (i9 | 0) ? i9 : i10;
   if ((i9 | 0) > 1e6) {
    _luaD_reallocstack(i3, 1000200);
    _luaG_runerror(i3, 2224, i8);
   } else {
    _luaD_reallocstack(i3, i9);
    break;
   }
  }
 } while (0);
 i8 = i3 + 16 | 0;
 i9 = HEAP32[(HEAP32[i8 >> 2] | 0) + 12 >> 2] | 0;
 if ((i9 | 0) == 0) {
  i9 = _luaE_extendCI(i3) | 0;
 }
 HEAP32[i8 >> 2] = i9;
 HEAP16[i9 + 16 >> 1] = i4;
 HEAP32[i9 >> 2] = (HEAP32[i6 >> 2] | 0) + i5;
 HEAP32[i9 + 4 >> 2] = (HEAP32[i2 >> 2] | 0) + 320;
 HEAP8[i9 + 18 | 0] = 0;
 if ((HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i3);
 }
 i5 = i3 + 40 | 0;
 if (!((HEAP8[i5] & 1) == 0)) {
  _luaD_hook(i3, 0, -1);
 }
 i7 = FUNCTION_TABLE_ii[i7 & 255](i3) | 0;
 i7 = (HEAP32[i2 >> 2] | 0) + (0 - i7 << 4) | 0;
 i4 = HEAP32[i8 >> 2] | 0;
 i5 = HEAPU8[i5] | 0;
 if ((i5 & 6 | 0) == 0) {
  i5 = i7;
  i6 = i4 + 8 | 0;
 } else {
  if ((i5 & 2 | 0) == 0) {
   i5 = i7;
  } else {
   i5 = i7 - (HEAP32[i6 >> 2] | 0) | 0;
   _luaD_hook(i3, 1, -1);
   i5 = (HEAP32[i6 >> 2] | 0) + i5 | 0;
  }
  i6 = i4 + 8 | 0;
  HEAP32[i3 + 20 >> 2] = HEAP32[(HEAP32[i6 >> 2] | 0) + 28 >> 2];
 }
 i3 = HEAP32[i4 >> 2] | 0;
 i4 = HEAP16[i4 + 16 >> 1] | 0;
 HEAP32[i8 >> 2] = HEAP32[i6 >> 2];
 L82 : do {
  if (!(i4 << 16 >> 16 == 0)) {
   i4 = i4 << 16 >> 16;
   while (1) {
    if (!(i5 >>> 0 < (HEAP32[i2 >> 2] | 0) >>> 0)) {
     break;
    }
    i6 = i3 + 16 | 0;
    i20 = i5;
    i21 = HEAP32[i20 + 4 >> 2] | 0;
    i22 = i3;
    HEAP32[i22 >> 2] = HEAP32[i20 >> 2];
    HEAP32[i22 + 4 >> 2] = i21;
    HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    i4 = i4 + -1 | 0;
    if ((i4 | 0) == 0) {
     i3 = i6;
     break L82;
    }
    i5 = i5 + 16 | 0;
    i3 = i6;
   }
   if ((i4 | 0) > 0) {
    i5 = i4;
    i6 = i3;
    while (1) {
     i5 = i5 + -1 | 0;
     HEAP32[i6 + 8 >> 2] = 0;
     if ((i5 | 0) <= 0) {
      break;
     } else {
      i6 = i6 + 16 | 0;
     }
    }
    i3 = i3 + (i4 << 4) | 0;
   }
  }
 } while (0);
 HEAP32[i2 >> 2] = i3;
 i22 = 1;
 STACKTOP = i1;
 return i22 | 0;
}
function _lua_getinfo(i1, i6, i29) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i29 = i29 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 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, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i30 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i3;
 if ((HEAP8[i6] | 0) == 62) {
  i10 = i1 + 8 | 0;
  i7 = (HEAP32[i10 >> 2] | 0) + -16 | 0;
  HEAP32[i10 >> 2] = i7;
  i6 = i6 + 1 | 0;
  i10 = 0;
 } else {
  i7 = HEAP32[i29 + 96 >> 2] | 0;
  i10 = i7;
  i7 = HEAP32[i7 >> 2] | 0;
 }
 i8 = i7 + 8 | 0;
 if ((HEAP32[i8 >> 2] & 31 | 0) == 6) {
  i9 = HEAP32[i7 >> 2] | 0;
 } else {
  i9 = 0;
 }
 i34 = HEAP8[i6] | 0;
 L8 : do {
  if (i34 << 24 >> 24 == 0) {
   i33 = 1;
  } else {
   i12 = (i9 | 0) == 0;
   i27 = i29 + 16 | 0;
   i28 = i29 + 24 | 0;
   i21 = i29 + 28 | 0;
   i25 = i29 + 12 | 0;
   i26 = i29 + 36 | 0;
   i19 = i9 + 4 | 0;
   i24 = i9 + 12 | 0;
   i18 = (i10 | 0) == 0;
   i23 = i29 + 20 | 0;
   i17 = i10 + 18 | 0;
   i22 = i10 + 28 | 0;
   i15 = i29 + 32 | 0;
   i14 = i29 + 34 | 0;
   i13 = i29 + 33 | 0;
   i11 = i9 + 6 | 0;
   i16 = i29 + 35 | 0;
   i20 = i29 + 8 | 0;
   i30 = i29 + 4 | 0;
   i29 = i10 + 8 | 0;
   i31 = i1 + 12 | 0;
   i32 = i6;
   i33 = 1;
   while (1) {
    L12 : do {
     switch (i34 << 24 >> 24 | 0) {
     case 116:
      {
       if (i18) {
        i34 = 0;
       } else {
        i34 = HEAPU8[i17] & 64;
       }
       HEAP8[i16] = i34;
       break;
      }
     case 110:
      {
       L18 : do {
        if ((!i18 ? (HEAP8[i17] & 64) == 0 : 0) ? (i5 = HEAP32[i29 >> 2] | 0, !((HEAP8[i5 + 18 | 0] & 1) == 0)) : 0) {
         i36 = HEAP32[(HEAP32[HEAP32[i5 >> 2] >> 2] | 0) + 12 >> 2] | 0;
         i35 = HEAP32[i36 + 12 >> 2] | 0;
         i34 = ((HEAP32[i5 + 28 >> 2] | 0) - i35 >> 2) + -1 | 0;
         i35 = HEAP32[i35 + (i34 << 2) >> 2] | 0;
         switch (i35 & 63 | 0) {
         case 10:
         case 8:
          {
           i34 = 1;
           i4 = 46;
           break;
          }
         case 24:
          {
           i34 = 5;
           i4 = 46;
           break;
          }
         case 13:
          {
           i34 = 6;
           i4 = 46;
           break;
          }
         case 14:
          {
           i34 = 7;
           i4 = 46;
           break;
          }
         case 15:
          {
           i34 = 8;
           i4 = 46;
           break;
          }
         case 16:
          {
           i34 = 9;
           i4 = 46;
           break;
          }
         case 17:
          {
           i34 = 10;
           i4 = 46;
           break;
          }
         case 18:
          {
           i34 = 11;
           i4 = 46;
           break;
          }
         case 19:
          {
           i34 = 12;
           i4 = 46;
           break;
          }
         case 21:
          {
           i34 = 4;
           i4 = 46;
           break;
          }
         case 25:
          {
           i34 = 13;
           i4 = 46;
           break;
          }
         case 26:
          {
           i34 = 14;
           i4 = 46;
           break;
          }
         case 22:
          {
           i34 = 15;
           i4 = 46;
           break;
          }
         case 7:
         case 6:
         case 12:
          {
           i34 = 0;
           i4 = 46;
           break;
          }
         case 34:
          {
           i34 = 2120;
           i35 = 2120;
           break;
          }
         case 30:
         case 29:
          {
           i36 = _getobjname(i36, i34, i35 >>> 6 & 255, i30) | 0;
           HEAP32[i20 >> 2] = i36;
           if ((i36 | 0) == 0) {
            break L18;
           } else {
            break L12;
           }
          }
         default:
          {
           i4 = 47;
           break L18;
          }
         }
         if ((i4 | 0) == 46) {
          i4 = 0;
          i34 = (HEAP32[(HEAP32[i31 >> 2] | 0) + (i34 << 2) + 184 >> 2] | 0) + 16 | 0;
          i35 = 2136;
         }
         HEAP32[i30 >> 2] = i34;
         HEAP32[i20 >> 2] = i35;
         break L12;
        } else {
         i4 = 47;
        }
       } while (0);
       if ((i4 | 0) == 47) {
        i4 = 0;
        HEAP32[i20 >> 2] = 0;
       }
       HEAP32[i20 >> 2] = 2112;
       HEAP32[i30 >> 2] = 0;
       break;
      }
     case 108:
      {
       if (!i18 ? !((HEAP8[i17] & 1) == 0) : 0) {
        i35 = HEAP32[(HEAP32[HEAP32[i10 >> 2] >> 2] | 0) + 12 >> 2] | 0;
        i34 = HEAP32[i35 + 20 >> 2] | 0;
        if ((i34 | 0) == 0) {
         i34 = 0;
        } else {
         i34 = HEAP32[i34 + (((HEAP32[i22 >> 2] | 0) - (HEAP32[i35 + 12 >> 2] | 0) >> 2) + -1 << 2) >> 2] | 0;
        }
       } else {
        i34 = -1;
       }
       HEAP32[i23 >> 2] = i34;
       break;
      }
     case 83:
      {
       if (!i12 ? (HEAP8[i19] | 0) != 38 : 0) {
        i34 = HEAP32[i24 >> 2] | 0;
        i35 = HEAP32[i34 + 36 >> 2] | 0;
        if ((i35 | 0) == 0) {
         i35 = 2168;
        } else {
         i35 = i35 + 16 | 0;
        }
        HEAP32[i27 >> 2] = i35;
        i36 = HEAP32[i34 + 64 >> 2] | 0;
        HEAP32[i28 >> 2] = i36;
        HEAP32[i21 >> 2] = HEAP32[i34 + 68 >> 2];
        i34 = (i36 | 0) == 0 ? 2176 : 2184;
       } else {
        HEAP32[i27 >> 2] = 2152;
        HEAP32[i28 >> 2] = -1;
        HEAP32[i21 >> 2] = -1;
        i35 = 2152;
        i34 = 2160;
       }
       HEAP32[i25 >> 2] = i34;
       _luaO_chunkid(i26, i35, 60);
       break;
      }
     case 117:
      {
       if (!i12) {
        HEAP8[i15] = HEAP8[i11] | 0;
        if ((HEAP8[i19] | 0) != 38) {
         HEAP8[i14] = HEAP8[(HEAP32[i24 >> 2] | 0) + 77 | 0] | 0;
         HEAP8[i13] = HEAP8[(HEAP32[i24 >> 2] | 0) + 76 | 0] | 0;
         break L12;
        }
       } else {
        HEAP8[i15] = 0;
       }
       HEAP8[i14] = 1;
       HEAP8[i13] = 0;
       break;
      }
     case 102:
     case 76:
      {
       break;
      }
     default:
      {
       i33 = 0;
      }
     }
    } while (0);
    i32 = i32 + 1 | 0;
    i34 = HEAP8[i32] | 0;
    if (i34 << 24 >> 24 == 0) {
     break L8;
    }
   }
  }
 } while (0);
 if ((_strchr(i6, 102) | 0) != 0) {
  i36 = i1 + 8 | 0;
  i35 = HEAP32[i36 >> 2] | 0;
  i31 = i7;
  i32 = HEAP32[i31 + 4 >> 2] | 0;
  i34 = i35;
  HEAP32[i34 >> 2] = HEAP32[i31 >> 2];
  HEAP32[i34 + 4 >> 2] = i32;
  HEAP32[i35 + 8 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i36 >> 2] = (HEAP32[i36 >> 2] | 0) + 16;
 }
 if ((_strchr(i6, 76) | 0) == 0) {
  STACKTOP = i3;
  return i33 | 0;
 }
 if ((i9 | 0) != 0 ? (HEAP8[i9 + 4 | 0] | 0) != 38 : 0) {
  i6 = i9 + 12 | 0;
  i5 = HEAP32[(HEAP32[i6 >> 2] | 0) + 20 >> 2] | 0;
  i4 = _luaH_new(i1) | 0;
  i36 = i1 + 8 | 0;
  i35 = HEAP32[i36 >> 2] | 0;
  HEAP32[i35 >> 2] = i4;
  HEAP32[i35 + 8 >> 2] = 69;
  HEAP32[i36 >> 2] = (HEAP32[i36 >> 2] | 0) + 16;
  HEAP32[i2 >> 2] = 1;
  HEAP32[i2 + 8 >> 2] = 1;
  if ((HEAP32[(HEAP32[i6 >> 2] | 0) + 52 >> 2] | 0) > 0) {
   i7 = 0;
  } else {
   STACKTOP = i3;
   return i33 | 0;
  }
  do {
   _luaH_setint(i1, i4, HEAP32[i5 + (i7 << 2) >> 2] | 0, i2);
   i7 = i7 + 1 | 0;
  } while ((i7 | 0) < (HEAP32[(HEAP32[i6 >> 2] | 0) + 52 >> 2] | 0));
  STACKTOP = i3;
  return i33 | 0;
 }
 i36 = i1 + 8 | 0;
 i35 = HEAP32[i36 >> 2] | 0;
 HEAP32[i35 + 8 >> 2] = 0;
 HEAP32[i36 >> 2] = i35 + 16;
 STACKTOP = i3;
 return i33 | 0;
}
function _read_long_string(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, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0;
 i2 = STACKTOP;
 i14 = HEAP32[i3 >> 2] | 0;
 i4 = i3 + 60 | 0;
 i13 = HEAP32[i4 >> 2] | 0;
 i15 = i13 + 4 | 0;
 i16 = HEAP32[i15 >> 2] | 0;
 i10 = i13 + 8 | 0;
 i12 = HEAP32[i10 >> 2] | 0;
 do {
  if ((i16 + 1 | 0) >>> 0 > i12 >>> 0) {
   if (i12 >>> 0 > 2147483645) {
    _lexerror(i3, 12368, 0);
   }
   i16 = i12 << 1;
   i17 = HEAP32[i3 + 52 >> 2] | 0;
   if ((i16 | 0) == -2) {
    _luaM_toobig(i17);
   } else {
    i8 = _luaM_realloc_(i17, HEAP32[i13 >> 2] | 0, i12, i16) | 0;
    HEAP32[i13 >> 2] = i8;
    HEAP32[i10 >> 2] = i16;
    i9 = HEAP32[i15 >> 2] | 0;
    break;
   }
  } else {
   i9 = i16;
   i8 = HEAP32[i13 >> 2] | 0;
  }
 } while (0);
 HEAP32[i15 >> 2] = i9 + 1;
 HEAP8[i8 + i9 | 0] = i14;
 i9 = i3 + 56 | 0;
 i8 = HEAP32[i9 >> 2] | 0;
 i18 = HEAP32[i8 >> 2] | 0;
 HEAP32[i8 >> 2] = i18 + -1;
 if ((i18 | 0) == 0) {
  i12 = _luaZ_fill(i8) | 0;
 } else {
  i18 = i8 + 4 | 0;
  i12 = HEAP32[i18 >> 2] | 0;
  HEAP32[i18 >> 2] = i12 + 1;
  i12 = HEAPU8[i12] | 0;
 }
 HEAP32[i3 >> 2] = i12;
 if ((i12 | 0) == 13 | (i12 | 0) == 10) {
  _inclinenumber(i3);
  i11 = 13;
 }
 L17 : while (1) {
  if ((i11 | 0) == 13) {
   i11 = 0;
   i12 = HEAP32[i3 >> 2] | 0;
  }
  i8 = (i1 | 0) == 0;
  i10 = i3 + 52 | 0;
  L21 : do {
   if (i8) {
    while (1) {
     if ((i12 | 0) == 13 | (i12 | 0) == 10) {
      break L21;
     } else if ((i12 | 0) == 93) {
      i11 = 22;
      break L21;
     } else if ((i12 | 0) == -1) {
      i11 = 21;
      break L17;
     }
     i12 = HEAP32[i9 >> 2] | 0;
     i18 = HEAP32[i12 >> 2] | 0;
     HEAP32[i12 >> 2] = i18 + -1;
     if ((i18 | 0) == 0) {
      i12 = _luaZ_fill(i12) | 0;
     } else {
      i18 = i12 + 4 | 0;
      i12 = HEAP32[i18 >> 2] | 0;
      HEAP32[i18 >> 2] = i12 + 1;
      i12 = HEAPU8[i12] | 0;
     }
     HEAP32[i3 >> 2] = i12;
    }
   } else {
    while (1) {
     if ((i12 | 0) == 13 | (i12 | 0) == 10) {
      break L21;
     } else if ((i12 | 0) == 93) {
      i11 = 22;
      break L21;
     } else if ((i12 | 0) == -1) {
      i11 = 21;
      break L17;
     }
     i14 = HEAP32[i4 >> 2] | 0;
     i13 = i14 + 4 | 0;
     i17 = HEAP32[i13 >> 2] | 0;
     i16 = i14 + 8 | 0;
     i15 = HEAP32[i16 >> 2] | 0;
     if ((i17 + 1 | 0) >>> 0 > i15 >>> 0) {
      if (i15 >>> 0 > 2147483645) {
       i11 = 46;
       break L17;
      }
      i17 = i15 << 1;
      i18 = HEAP32[i10 >> 2] | 0;
      if ((i17 | 0) == -2) {
       i11 = 48;
       break L17;
      }
      i18 = _luaM_realloc_(i18, HEAP32[i14 >> 2] | 0, i15, i17) | 0;
      HEAP32[i14 >> 2] = i18;
      HEAP32[i16 >> 2] = i17;
      i17 = HEAP32[i13 >> 2] | 0;
      i14 = i18;
     } else {
      i14 = HEAP32[i14 >> 2] | 0;
     }
     HEAP32[i13 >> 2] = i17 + 1;
     HEAP8[i14 + i17 | 0] = i12;
     i12 = HEAP32[i9 >> 2] | 0;
     i18 = HEAP32[i12 >> 2] | 0;
     HEAP32[i12 >> 2] = i18 + -1;
     if ((i18 | 0) == 0) {
      i12 = _luaZ_fill(i12) | 0;
     } else {
      i18 = i12 + 4 | 0;
      i12 = HEAP32[i18 >> 2] | 0;
      HEAP32[i18 >> 2] = i12 + 1;
      i12 = HEAPU8[i12] | 0;
     }
     HEAP32[i3 >> 2] = i12;
    }
   }
  } while (0);
  if ((i11 | 0) == 22) {
   if ((_skip_sep(i3) | 0) == (i5 | 0)) {
    i11 = 23;
    break;
   } else {
    i11 = 13;
    continue;
   }
  }
  i12 = HEAP32[i4 >> 2] | 0;
  i11 = i12 + 4 | 0;
  i15 = HEAP32[i11 >> 2] | 0;
  i14 = i12 + 8 | 0;
  i13 = HEAP32[i14 >> 2] | 0;
  if ((i15 + 1 | 0) >>> 0 > i13 >>> 0) {
   if (i13 >>> 0 > 2147483645) {
    i11 = 37;
    break;
   }
   i15 = i13 << 1;
   i10 = HEAP32[i10 >> 2] | 0;
   if ((i15 | 0) == -2) {
    i11 = 39;
    break;
   }
   i10 = _luaM_realloc_(i10, HEAP32[i12 >> 2] | 0, i13, i15) | 0;
   HEAP32[i12 >> 2] = i10;
   HEAP32[i14 >> 2] = i15;
   i15 = HEAP32[i11 >> 2] | 0;
  } else {
   i10 = HEAP32[i12 >> 2] | 0;
  }
  HEAP32[i11 >> 2] = i15 + 1;
  HEAP8[i10 + i15 | 0] = 10;
  _inclinenumber(i3);
  if (!i8) {
   i11 = 13;
   continue;
  }
  HEAP32[(HEAP32[i4 >> 2] | 0) + 4 >> 2] = 0;
  i11 = 13;
 }
 if ((i11 | 0) == 21) {
  _lexerror(i3, (i1 | 0) != 0 ? 12512 : 12536, 286);
 } else if ((i11 | 0) == 23) {
  i15 = HEAP32[i3 >> 2] | 0;
  i13 = HEAP32[i4 >> 2] | 0;
  i14 = i13 + 4 | 0;
  i16 = HEAP32[i14 >> 2] | 0;
  i11 = i13 + 8 | 0;
  i12 = HEAP32[i11 >> 2] | 0;
  do {
   if ((i16 + 1 | 0) >>> 0 > i12 >>> 0) {
    if (i12 >>> 0 > 2147483645) {
     _lexerror(i3, 12368, 0);
    }
    i17 = i12 << 1;
    i16 = HEAP32[i10 >> 2] | 0;
    if ((i17 | 0) == -2) {
     _luaM_toobig(i16);
    } else {
     i6 = _luaM_realloc_(i16, HEAP32[i13 >> 2] | 0, i12, i17) | 0;
     HEAP32[i13 >> 2] = i6;
     HEAP32[i11 >> 2] = i17;
     i7 = HEAP32[i14 >> 2] | 0;
     break;
    }
   } else {
    i7 = i16;
    i6 = HEAP32[i13 >> 2] | 0;
   }
  } while (0);
  HEAP32[i14 >> 2] = i7 + 1;
  HEAP8[i6 + i7 | 0] = i15;
  i6 = HEAP32[i9 >> 2] | 0;
  i18 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i18 + -1;
  if ((i18 | 0) == 0) {
   i6 = _luaZ_fill(i6) | 0;
  } else {
   i18 = i6 + 4 | 0;
   i6 = HEAP32[i18 >> 2] | 0;
   HEAP32[i18 >> 2] = i6 + 1;
   i6 = HEAPU8[i6] | 0;
  }
  HEAP32[i3 >> 2] = i6;
  if (i8) {
   STACKTOP = i2;
   return;
  }
  i4 = HEAP32[i4 >> 2] | 0;
  i5 = i5 + 2 | 0;
  i6 = HEAP32[i10 >> 2] | 0;
  i5 = _luaS_newlstr(i6, (HEAP32[i4 >> 2] | 0) + i5 | 0, (HEAP32[i4 + 4 >> 2] | 0) - (i5 << 1) | 0) | 0;
  i4 = i6 + 8 | 0;
  i7 = HEAP32[i4 >> 2] | 0;
  HEAP32[i4 >> 2] = i7 + 16;
  HEAP32[i7 >> 2] = i5;
  HEAP32[i7 + 8 >> 2] = HEAPU8[i5 + 4 | 0] | 0 | 64;
  i7 = _luaH_set(i6, HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 4 >> 2] | 0, (HEAP32[i4 >> 2] | 0) + -16 | 0) | 0;
  i3 = i7 + 8 | 0;
  if ((HEAP32[i3 >> 2] | 0) == 0 ? (HEAP32[i7 >> 2] = 1, HEAP32[i3 >> 2] = 1, (HEAP32[(HEAP32[i6 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) : 0) {
   _luaC_step(i6);
  }
  HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -16;
  HEAP32[i1 >> 2] = i5;
  STACKTOP = i2;
  return;
 } else if ((i11 | 0) == 37) {
  _lexerror(i3, 12368, 0);
 } else if ((i11 | 0) == 39) {
  _luaM_toobig(i10);
 } else if ((i11 | 0) == 46) {
  _lexerror(i3, 12368, 0);
 } else if ((i11 | 0) == 48) {
  _luaM_toobig(i18);
 }
}
function _try_realloc_chunk(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var 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;
 i2 = STACKTOP;
 i4 = i1 + 4 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 i8 = i6 & -8;
 i5 = i1 + i8 | 0;
 i10 = HEAP32[12928 >> 2] | 0;
 if (i1 >>> 0 < i10 >>> 0) {
  _abort();
 }
 i12 = i6 & 3;
 if (!((i12 | 0) != 1 & i1 >>> 0 < i5 >>> 0)) {
  _abort();
 }
 i7 = i1 + (i8 | 4) | 0;
 i13 = HEAP32[i7 >> 2] | 0;
 if ((i13 & 1 | 0) == 0) {
  _abort();
 }
 if ((i12 | 0) == 0) {
  if (i3 >>> 0 < 256) {
   i15 = 0;
   STACKTOP = i2;
   return i15 | 0;
  }
  if (!(i8 >>> 0 < (i3 + 4 | 0) >>> 0) ? !((i8 - i3 | 0) >>> 0 > HEAP32[13392 >> 2] << 1 >>> 0) : 0) {
   i15 = i1;
   STACKTOP = i2;
   return i15 | 0;
  }
  i15 = 0;
  STACKTOP = i2;
  return i15 | 0;
 }
 if (!(i8 >>> 0 < i3 >>> 0)) {
  i5 = i8 - i3 | 0;
  if (!(i5 >>> 0 > 15)) {
   i15 = i1;
   STACKTOP = i2;
   return i15 | 0;
  }
  HEAP32[i4 >> 2] = i6 & 1 | i3 | 2;
  HEAP32[i1 + (i3 + 4) >> 2] = i5 | 3;
  HEAP32[i7 >> 2] = HEAP32[i7 >> 2] | 1;
  _dispose_chunk(i1 + i3 | 0, i5);
  i15 = i1;
  STACKTOP = i2;
  return i15 | 0;
 }
 if ((i5 | 0) == (HEAP32[12936 >> 2] | 0)) {
  i5 = (HEAP32[12924 >> 2] | 0) + i8 | 0;
  if (!(i5 >>> 0 > i3 >>> 0)) {
   i15 = 0;
   STACKTOP = i2;
   return i15 | 0;
  }
  i15 = i5 - i3 | 0;
  HEAP32[i4 >> 2] = i6 & 1 | i3 | 2;
  HEAP32[i1 + (i3 + 4) >> 2] = i15 | 1;
  HEAP32[12936 >> 2] = i1 + i3;
  HEAP32[12924 >> 2] = i15;
  i15 = i1;
  STACKTOP = i2;
  return i15 | 0;
 }
 if ((i5 | 0) == (HEAP32[12932 >> 2] | 0)) {
  i7 = (HEAP32[12920 >> 2] | 0) + i8 | 0;
  if (i7 >>> 0 < i3 >>> 0) {
   i15 = 0;
   STACKTOP = i2;
   return i15 | 0;
  }
  i5 = i7 - i3 | 0;
  if (i5 >>> 0 > 15) {
   HEAP32[i4 >> 2] = i6 & 1 | i3 | 2;
   HEAP32[i1 + (i3 + 4) >> 2] = i5 | 1;
   HEAP32[i1 + i7 >> 2] = i5;
   i15 = i1 + (i7 + 4) | 0;
   HEAP32[i15 >> 2] = HEAP32[i15 >> 2] & -2;
   i3 = i1 + i3 | 0;
  } else {
   HEAP32[i4 >> 2] = i6 & 1 | i7 | 2;
   i3 = i1 + (i7 + 4) | 0;
   HEAP32[i3 >> 2] = HEAP32[i3 >> 2] | 1;
   i3 = 0;
   i5 = 0;
  }
  HEAP32[12920 >> 2] = i5;
  HEAP32[12932 >> 2] = i3;
  i15 = i1;
  STACKTOP = i2;
  return i15 | 0;
 }
 if ((i13 & 2 | 0) != 0) {
  i15 = 0;
  STACKTOP = i2;
  return i15 | 0;
 }
 i7 = (i13 & -8) + i8 | 0;
 if (i7 >>> 0 < i3 >>> 0) {
  i15 = 0;
  STACKTOP = i2;
  return i15 | 0;
 }
 i6 = i7 - i3 | 0;
 i12 = i13 >>> 3;
 do {
  if (!(i13 >>> 0 < 256)) {
   i11 = HEAP32[i1 + (i8 + 24) >> 2] | 0;
   i13 = HEAP32[i1 + (i8 + 12) >> 2] | 0;
   do {
    if ((i13 | 0) == (i5 | 0)) {
     i13 = i1 + (i8 + 20) | 0;
     i12 = HEAP32[i13 >> 2] | 0;
     if ((i12 | 0) == 0) {
      i13 = i1 + (i8 + 16) | 0;
      i12 = HEAP32[i13 >> 2] | 0;
      if ((i12 | 0) == 0) {
       i9 = 0;
       break;
      }
     }
     while (1) {
      i15 = i12 + 20 | 0;
      i14 = HEAP32[i15 >> 2] | 0;
      if ((i14 | 0) != 0) {
       i12 = i14;
       i13 = i15;
       continue;
      }
      i15 = i12 + 16 | 0;
      i14 = HEAP32[i15 >> 2] | 0;
      if ((i14 | 0) == 0) {
       break;
      } else {
       i12 = i14;
       i13 = i15;
      }
     }
     if (i13 >>> 0 < i10 >>> 0) {
      _abort();
     } else {
      HEAP32[i13 >> 2] = 0;
      i9 = i12;
      break;
     }
    } else {
     i12 = HEAP32[i1 + (i8 + 8) >> 2] | 0;
     if (i12 >>> 0 < i10 >>> 0) {
      _abort();
     }
     i14 = i12 + 12 | 0;
     if ((HEAP32[i14 >> 2] | 0) != (i5 | 0)) {
      _abort();
     }
     i10 = i13 + 8 | 0;
     if ((HEAP32[i10 >> 2] | 0) == (i5 | 0)) {
      HEAP32[i14 >> 2] = i13;
      HEAP32[i10 >> 2] = i12;
      i9 = i13;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   if ((i11 | 0) != 0) {
    i10 = HEAP32[i1 + (i8 + 28) >> 2] | 0;
    i12 = 13216 + (i10 << 2) | 0;
    if ((i5 | 0) == (HEAP32[i12 >> 2] | 0)) {
     HEAP32[i12 >> 2] = i9;
     if ((i9 | 0) == 0) {
      HEAP32[12916 >> 2] = HEAP32[12916 >> 2] & ~(1 << i10);
      break;
     }
    } else {
     if (i11 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     }
     i10 = i11 + 16 | 0;
     if ((HEAP32[i10 >> 2] | 0) == (i5 | 0)) {
      HEAP32[i10 >> 2] = i9;
     } else {
      HEAP32[i11 + 20 >> 2] = i9;
     }
     if ((i9 | 0) == 0) {
      break;
     }
    }
    if (i9 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
     _abort();
    }
    HEAP32[i9 + 24 >> 2] = i11;
    i5 = HEAP32[i1 + (i8 + 16) >> 2] | 0;
    do {
     if ((i5 | 0) != 0) {
      if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i9 + 16 >> 2] = i5;
       HEAP32[i5 + 24 >> 2] = i9;
       break;
      }
     }
    } while (0);
    i5 = HEAP32[i1 + (i8 + 20) >> 2] | 0;
    if ((i5 | 0) != 0) {
     if (i5 >>> 0 < (HEAP32[12928 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i9 + 20 >> 2] = i5;
      HEAP32[i5 + 24 >> 2] = i9;
      break;
     }
    }
   }
  } else {
   i9 = HEAP32[i1 + (i8 + 8) >> 2] | 0;
   i8 = HEAP32[i1 + (i8 + 12) >> 2] | 0;
   i13 = 12952 + (i12 << 1 << 2) | 0;
   if ((i9 | 0) != (i13 | 0)) {
    if (i9 >>> 0 < i10 >>> 0) {
     _abort();
    }
    if ((HEAP32[i9 + 12 >> 2] | 0) != (i5 | 0)) {
     _abort();
    }
   }
   if ((i8 | 0) == (i9 | 0)) {
    HEAP32[3228] = HEAP32[3228] & ~(1 << i12);
    break;
   }
   if ((i8 | 0) != (i13 | 0)) {
    if (i8 >>> 0 < i10 >>> 0) {
     _abort();
    }
    i10 = i8 + 8 | 0;
    if ((HEAP32[i10 >> 2] | 0) == (i5 | 0)) {
     i11 = i10;
    } else {
     _abort();
    }
   } else {
    i11 = i8 + 8 | 0;
   }
   HEAP32[i9 + 12 >> 2] = i8;
   HEAP32[i11 >> 2] = i9;
  }
 } while (0);
 if (i6 >>> 0 < 16) {
  HEAP32[i4 >> 2] = i7 | HEAP32[i4 >> 2] & 1 | 2;
  i15 = i1 + (i7 | 4) | 0;
  HEAP32[i15 >> 2] = HEAP32[i15 >> 2] | 1;
  i15 = i1;
  STACKTOP = i2;
  return i15 | 0;
 } else {
  HEAP32[i4 >> 2] = HEAP32[i4 >> 2] & 1 | i3 | 2;
  HEAP32[i1 + (i3 + 4) >> 2] = i6 | 3;
  i15 = i1 + (i7 | 4) | 0;
  HEAP32[i15 >> 2] = HEAP32[i15 >> 2] | 1;
  _dispose_chunk(i1 + i3 | 0, i6);
  i15 = i1;
  STACKTOP = i2;
  return i15 | 0;
 }
 return 0;
}
function _luaK_posfix(i3, i16, i1, i4, i14) {
 i3 = i3 | 0;
 i16 = i16 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i14 = i14 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i15 = 0;
 i2 = STACKTOP;
 switch (i16 | 0) {
 case 14:
  {
   _luaK_dischargevars(i3, i4);
   i6 = i4 + 16 | 0;
   i5 = HEAP32[i1 + 16 >> 2] | 0;
   do {
    if (!((i5 | 0) == -1)) {
     i9 = HEAP32[i6 >> 2] | 0;
     if ((i9 | 0) == -1) {
      HEAP32[i6 >> 2] = i5;
      break;
     }
     i7 = HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0;
     while (1) {
      i6 = i7 + (i9 << 2) | 0;
      i8 = HEAP32[i6 >> 2] | 0;
      i10 = (i8 >>> 14) + -131071 | 0;
      if ((i10 | 0) == -1) {
       break;
      }
      i10 = i9 + 1 + i10 | 0;
      if ((i10 | 0) == -1) {
       break;
      } else {
       i9 = i10;
      }
     }
     i5 = i5 + ~i9 | 0;
     if ((((i5 | 0) > -1 ? i5 : 0 - i5 | 0) | 0) > 131071) {
      _luaX_syntaxerror(HEAP32[i3 + 12 >> 2] | 0, 10624);
     } else {
      HEAP32[i6 >> 2] = (i5 << 14) + 2147467264 | i8 & 16383;
      break;
     }
    }
   } while (0);
   HEAP32[i1 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i1 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i1 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i1 + 12 >> 2] = HEAP32[i4 + 12 >> 2];
   HEAP32[i1 + 16 >> 2] = HEAP32[i4 + 16 >> 2];
   HEAP32[i1 + 20 >> 2] = HEAP32[i4 + 20 >> 2];
   STACKTOP = i2;
   return;
  }
 case 13:
  {
   _luaK_dischargevars(i3, i4);
   i6 = i4 + 20 | 0;
   i5 = HEAP32[i1 + 20 >> 2] | 0;
   do {
    if (!((i5 | 0) == -1)) {
     i9 = HEAP32[i6 >> 2] | 0;
     if ((i9 | 0) == -1) {
      HEAP32[i6 >> 2] = i5;
      break;
     }
     i7 = HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0;
     while (1) {
      i8 = i7 + (i9 << 2) | 0;
      i6 = HEAP32[i8 >> 2] | 0;
      i10 = (i6 >>> 14) + -131071 | 0;
      if ((i10 | 0) == -1) {
       break;
      }
      i10 = i9 + 1 + i10 | 0;
      if ((i10 | 0) == -1) {
       break;
      } else {
       i9 = i10;
      }
     }
     i5 = i5 + ~i9 | 0;
     if ((((i5 | 0) > -1 ? i5 : 0 - i5 | 0) | 0) > 131071) {
      _luaX_syntaxerror(HEAP32[i3 + 12 >> 2] | 0, 10624);
     } else {
      HEAP32[i8 >> 2] = (i5 << 14) + 2147467264 | i6 & 16383;
      break;
     }
    }
   } while (0);
   HEAP32[i1 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i1 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i1 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i1 + 12 >> 2] = HEAP32[i4 + 12 >> 2];
   HEAP32[i1 + 16 >> 2] = HEAP32[i4 + 16 >> 2];
   HEAP32[i1 + 20 >> 2] = HEAP32[i4 + 20 >> 2];
   STACKTOP = i2;
   return;
  }
 case 6:
  {
   i12 = i4 + 16 | 0;
   i13 = i4 + 20 | 0;
   i16 = (HEAP32[i12 >> 2] | 0) == (HEAP32[i13 >> 2] | 0);
   _luaK_dischargevars(i3, i4);
   do {
    if (!i16) {
     if ((HEAP32[i4 >> 2] | 0) == 6) {
      i10 = HEAP32[i4 + 8 >> 2] | 0;
      if ((HEAP32[i12 >> 2] | 0) == (HEAP32[i13 >> 2] | 0)) {
       break;
      }
      if ((i10 | 0) >= (HEAPU8[i3 + 46 | 0] | 0 | 0)) {
       _exp2reg(i3, i4, i10);
       break;
      }
     }
     _luaK_exp2nextreg(i3, i4);
    }
   } while (0);
   if ((HEAP32[i4 >> 2] | 0) == 11 ? (i5 = i4 + 8 | 0, i7 = HEAP32[i5 >> 2] | 0, i8 = (HEAP32[i3 >> 2] | 0) + 12 | 0, i9 = HEAP32[i8 >> 2] | 0, i6 = HEAP32[i9 + (i7 << 2) >> 2] | 0, (i6 & 63 | 0) == 22) : 0) {
    i4 = i1 + 8 | 0;
    if (((HEAP32[i1 >> 2] | 0) == 6 ? (i11 = HEAP32[i4 >> 2] | 0, (i11 & 256 | 0) == 0) : 0) ? (HEAPU8[i3 + 46 | 0] | 0 | 0) <= (i11 | 0) : 0) {
     i6 = i3 + 48 | 0;
     HEAP8[i6] = (HEAP8[i6] | 0) + -1 << 24 >> 24;
     i6 = HEAP32[i5 >> 2] | 0;
     i16 = HEAP32[i8 >> 2] | 0;
     i9 = i16;
     i7 = i6;
     i6 = HEAP32[i16 + (i6 << 2) >> 2] | 0;
    }
    HEAP32[i9 + (i7 << 2) >> 2] = HEAP32[i4 >> 2] << 23 | i6 & 8388607;
    HEAP32[i1 >> 2] = 11;
    HEAP32[i4 >> 2] = HEAP32[i5 >> 2];
    STACKTOP = i2;
    return;
   }
   _luaK_exp2nextreg(i3, i4);
   _codearith(i3, 22, i1, i4, i14);
   STACKTOP = i2;
   return;
  }
 case 9:
 case 8:
 case 7:
  {
   i7 = i16 + 17 | 0;
   i6 = _luaK_exp2RK(i3, i1) | 0;
   i5 = _luaK_exp2RK(i3, i4) | 0;
   if (((HEAP32[i4 >> 2] | 0) == 6 ? (i15 = HEAP32[i4 + 8 >> 2] | 0, (i15 & 256 | 0) == 0) : 0) ? (HEAPU8[i3 + 46 | 0] | 0 | 0) <= (i15 | 0) : 0) {
    i16 = i3 + 48 | 0;
    HEAP8[i16] = (HEAP8[i16] | 0) + -1 << 24 >> 24;
   }
   i4 = i1 + 8 | 0;
   if (((HEAP32[i1 >> 2] | 0) == 6 ? (i10 = HEAP32[i4 >> 2] | 0, (i10 & 256 | 0) == 0) : 0) ? (HEAPU8[i3 + 46 | 0] | 0 | 0) <= (i10 | 0) : 0) {
    i16 = i3 + 48 | 0;
    HEAP8[i16] = (HEAP8[i16] | 0) + -1 << 24 >> 24;
   }
   HEAP32[i4 >> 2] = _condjump(i3, i7, 1, i6, i5) | 0;
   HEAP32[i1 >> 2] = 10;
   STACKTOP = i2;
   return;
  }
 case 12:
 case 11:
 case 10:
  {
   i7 = i16 + 14 | 0;
   i6 = _luaK_exp2RK(i3, i1) | 0;
   i5 = _luaK_exp2RK(i3, i4) | 0;
   if (((HEAP32[i4 >> 2] | 0) == 6 ? (i13 = HEAP32[i4 + 8 >> 2] | 0, (i13 & 256 | 0) == 0) : 0) ? (HEAPU8[i3 + 46 | 0] | 0 | 0) <= (i13 | 0) : 0) {
    i16 = i3 + 48 | 0;
    HEAP8[i16] = (HEAP8[i16] | 0) + -1 << 24 >> 24;
   }
   i4 = i1 + 8 | 0;
   if (((HEAP32[i1 >> 2] | 0) == 6 ? (i12 = HEAP32[i4 >> 2] | 0, (i12 & 256 | 0) == 0) : 0) ? (HEAPU8[i3 + 46 | 0] | 0 | 0) <= (i12 | 0) : 0) {
    i16 = i3 + 48 | 0;
    HEAP8[i16] = (HEAP8[i16] | 0) + -1 << 24 >> 24;
   }
   i8 = (i7 | 0) == 24;
   HEAP32[i4 >> 2] = _condjump(i3, i7, i8 & 1 ^ 1, i8 ? i6 : i5, i8 ? i5 : i6) | 0;
   HEAP32[i1 >> 2] = 10;
   STACKTOP = i2;
   return;
  }
 case 5:
 case 4:
 case 3:
 case 2:
 case 1:
 case 0:
  {
   _codearith(i3, i16 + 13 | 0, i1, i4, i14);
   STACKTOP = i2;
   return;
  }
 default:
  {
   STACKTOP = i2;
   return;
  }
 }
}
function _body(i1, i4, i13, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i13 = i13 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i3 = i6 + 12 | 0;
 i14 = i6;
 i2 = i1 + 48 | 0;
 i19 = HEAP32[i2 >> 2] | 0;
 i18 = i1 + 52 | 0;
 i17 = HEAP32[i18 >> 2] | 0;
 i16 = HEAP32[i19 >> 2] | 0;
 i19 = i19 + 36 | 0;
 i23 = i16 + 56 | 0;
 i24 = HEAP32[i23 >> 2] | 0;
 i15 = i16 + 16 | 0;
 if (((HEAP32[i19 >> 2] | 0) >= (i24 | 0) ? (i21 = _luaM_growaux_(i17, HEAP32[i15 >> 2] | 0, i23, 4, 262143, 6512) | 0, HEAP32[i15 >> 2] = i21, i20 = HEAP32[i23 >> 2] | 0, (i24 | 0) < (i20 | 0)) : 0) ? (i22 = i24 + 1 | 0, HEAP32[i21 + (i24 << 2) >> 2] = 0, (i22 | 0) < (i20 | 0)) : 0) {
  while (1) {
   i21 = i22 + 1 | 0;
   HEAP32[(HEAP32[i15 >> 2] | 0) + (i22 << 2) >> 2] = 0;
   if ((i21 | 0) == (i20 | 0)) {
    break;
   } else {
    i22 = i21;
   }
  }
 }
 i20 = _luaF_newproto(i17) | 0;
 i24 = HEAP32[i19 >> 2] | 0;
 HEAP32[i19 >> 2] = i24 + 1;
 HEAP32[(HEAP32[i15 >> 2] | 0) + (i24 << 2) >> 2] = i20;
 if (!((HEAP8[i20 + 5 | 0] & 3) == 0) ? !((HEAP8[i16 + 5 | 0] & 4) == 0) : 0) {
  _luaC_barrier_(i17, i16, i20);
 }
 HEAP32[i3 >> 2] = i20;
 HEAP32[i20 + 64 >> 2] = i5;
 i16 = HEAP32[i18 >> 2] | 0;
 HEAP32[i3 + 8 >> 2] = HEAP32[i2 >> 2];
 i17 = i3 + 12 | 0;
 HEAP32[i17 >> 2] = i1;
 HEAP32[i2 >> 2] = i3;
 HEAP32[i3 + 20 >> 2] = 0;
 HEAP32[i3 + 24 >> 2] = 0;
 HEAP32[i3 + 28 >> 2] = -1;
 HEAP32[i3 + 32 >> 2] = 0;
 HEAP32[i3 + 36 >> 2] = 0;
 i22 = i3 + 44 | 0;
 i15 = i1 + 64 | 0;
 HEAP32[i22 + 0 >> 2] = 0;
 HEAP8[i22 + 4 | 0] = 0;
 HEAP32[i3 + 40 >> 2] = HEAP32[(HEAP32[i15 >> 2] | 0) + 4 >> 2];
 i15 = i3 + 16 | 0;
 HEAP32[i15 >> 2] = 0;
 HEAP32[i20 + 36 >> 2] = HEAP32[i1 + 68 >> 2];
 HEAP8[i20 + 78 | 0] = 2;
 i22 = _luaH_new(i16) | 0;
 HEAP32[i3 + 4 >> 2] = i22;
 i23 = i16 + 8 | 0;
 i24 = HEAP32[i23 >> 2] | 0;
 HEAP32[i24 >> 2] = i22;
 HEAP32[i24 + 8 >> 2] = 69;
 i24 = (HEAP32[i23 >> 2] | 0) + 16 | 0;
 HEAP32[i23 >> 2] = i24;
 if (((HEAP32[i16 + 24 >> 2] | 0) - i24 | 0) < 16) {
  _luaD_growstack(i16, 0);
 }
 HEAP8[i14 + 10 | 0] = 0;
 HEAP8[i14 + 8 | 0] = HEAP8[i3 + 46 | 0] | 0;
 i24 = HEAP32[(HEAP32[i17 >> 2] | 0) + 64 >> 2] | 0;
 HEAP16[i14 + 4 >> 1] = HEAP32[i24 + 28 >> 2];
 HEAP16[i14 + 6 >> 1] = HEAP32[i24 + 16 >> 2];
 HEAP8[i14 + 9 | 0] = 0;
 HEAP32[i14 >> 2] = HEAP32[i15 >> 2];
 HEAP32[i15 >> 2] = i14;
 i14 = i1 + 16 | 0;
 if ((HEAP32[i14 >> 2] | 0) != 40) {
  _error_expected(i1, 40);
 }
 _luaX_next(i1);
 if ((i13 | 0) != 0) {
  _new_localvar(i1, _luaX_newstring(i1, 6456, 4) | 0);
  i24 = HEAP32[i2 >> 2] | 0;
  i22 = i24 + 46 | 0;
  i23 = (HEAPU8[i22] | 0) + 1 | 0;
  HEAP8[i22] = i23;
  HEAP32[(HEAP32[(HEAP32[i24 >> 2] | 0) + 24 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[(HEAP32[i24 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0) + ((i23 & 255) + -1 + (HEAP32[i24 + 40 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i24 + 20 >> 2];
 }
 i13 = HEAP32[i2 >> 2] | 0;
 i15 = HEAP32[i13 >> 2] | 0;
 i16 = i15 + 77 | 0;
 HEAP8[i16] = 0;
 i19 = HEAP32[i14 >> 2] | 0;
 L20 : do {
  if ((i19 | 0) != 41) {
   i17 = i1 + 24 | 0;
   i18 = 0;
   while (1) {
    if ((i19 | 0) == 280) {
     i17 = 18;
     break;
    } else if ((i19 | 0) != 288) {
     i17 = 19;
     break;
    }
    i24 = HEAP32[i17 >> 2] | 0;
    _luaX_next(i1);
    _new_localvar(i1, i24);
    i18 = i18 + 1 | 0;
    if ((HEAP8[i16] | 0) != 0) {
     i11 = i18;
     break L20;
    }
    if ((HEAP32[i14 >> 2] | 0) != 44) {
     i11 = i18;
     break L20;
    }
    _luaX_next(i1);
    i19 = HEAP32[i14 >> 2] | 0;
   }
   if ((i17 | 0) == 18) {
    _luaX_next(i1);
    HEAP8[i16] = 1;
    i11 = i18;
    break;
   } else if ((i17 | 0) == 19) {
    _luaX_syntaxerror(i1, 6464);
   }
  } else {
   i11 = 0;
  }
 } while (0);
 i18 = HEAP32[i2 >> 2] | 0;
 i16 = i18 + 46 | 0;
 i17 = (HEAPU8[i16] | 0) + i11 | 0;
 HEAP8[i16] = i17;
 if ((i11 | 0) != 0 ? (i8 = i18 + 20 | 0, i9 = i18 + 40 | 0, i7 = HEAP32[(HEAP32[i18 >> 2] | 0) + 24 >> 2] | 0, i10 = HEAP32[HEAP32[(HEAP32[i18 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0, HEAP32[i7 + ((HEAP16[i10 + ((i17 & 255) - i11 + (HEAP32[i9 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i8 >> 2], i12 = i11 + -1 | 0, (i12 | 0) != 0) : 0) {
  do {
   HEAP32[i7 + ((HEAP16[i10 + ((HEAPU8[i16] | 0) - i12 + (HEAP32[i9 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i8 >> 2];
   i12 = i12 + -1 | 0;
  } while ((i12 | 0) != 0);
 }
 i24 = i13 + 46 | 0;
 HEAP8[i15 + 76 | 0] = HEAP8[i24] | 0;
 _luaK_reserveregs(i13, HEAPU8[i24] | 0);
 if ((HEAP32[i14 >> 2] | 0) != 41) {
  _error_expected(i1, 41);
 }
 _luaX_next(i1);
 L39 : while (1) {
  i7 = HEAP32[i14 >> 2] | 0;
  switch (i7 | 0) {
  case 277:
  case 286:
  case 262:
  case 261:
  case 260:
   {
    i17 = 30;
    break L39;
   }
  default:
   {}
  }
  _statement(i1);
  if ((i7 | 0) == 274) {
   i17 = 30;
   break;
  }
 }
 if ((i17 | 0) == 30) {
  HEAP32[(HEAP32[i3 >> 2] | 0) + 68 >> 2] = HEAP32[i1 + 4 >> 2];
  _check_match(i1, 262, 265, i5);
  i24 = HEAP32[(HEAP32[i2 >> 2] | 0) + 8 >> 2] | 0;
  i23 = _luaK_codeABx(i24, 37, 0, (HEAP32[i24 + 36 >> 2] | 0) + -1 | 0) | 0;
  HEAP32[i4 + 16 >> 2] = -1;
  HEAP32[i4 + 20 >> 2] = -1;
  HEAP32[i4 >> 2] = 11;
  HEAP32[i4 + 8 >> 2] = i23;
  _luaK_exp2nextreg(i24, i4);
  _close_func(i1);
  STACKTOP = i6;
  return;
 }
}
function _luaH_newkey(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var 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, i17 = 0, i18 = 0, i19 = 0, i20 = 0, d21 = 0.0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 144 | 0;
 i8 = i4 + 8 | 0;
 i10 = i4;
 i5 = i4 + 16 | 0;
 i6 = i1 + 8 | 0;
 i11 = HEAP32[i6 >> 2] | 0;
 if ((i11 | 0) == 0) {
  _luaG_runerror(i3, 7968, i8);
 } else if ((i11 | 0) == 3) {
  i15 = 3;
 }
 if ((i15 | 0) == 3 ? (d21 = +HEAPF64[i1 >> 3], !(d21 == d21 & 0.0 == 0.0)) : 0) {
  _luaG_runerror(i3, 7992, i8);
 }
 i13 = _mainposition(i2, i1) | 0;
 i14 = i13 + 8 | 0;
 do {
  if ((HEAP32[i14 >> 2] | 0) != 0 | (i13 | 0) == 8016) {
   i18 = i2 + 20 | 0;
   i11 = i2 + 16 | 0;
   i17 = HEAP32[i11 >> 2] | 0;
   i16 = HEAP32[i18 >> 2] | 0;
   while (1) {
    if (!(i16 >>> 0 > i17 >>> 0)) {
     break;
    }
    i12 = i16 + -32 | 0;
    HEAP32[i18 >> 2] = i12;
    if ((HEAP32[i16 + -8 >> 2] | 0) == 0) {
     i15 = 37;
     break;
    } else {
     i16 = i12;
    }
   }
   if ((i15 | 0) == 37) {
    i5 = _mainposition(i2, i13 + 16 | 0) | 0;
    if ((i5 | 0) == (i13 | 0)) {
     i20 = i13 + 28 | 0;
     HEAP32[i16 + -4 >> 2] = HEAP32[i20 >> 2];
     HEAP32[i20 >> 2] = i12;
     break;
    } else {
     i7 = i5;
    }
    do {
     i5 = i7 + 28 | 0;
     i7 = HEAP32[i5 >> 2] | 0;
    } while ((i7 | 0) != (i13 | 0));
    HEAP32[i5 >> 2] = i12;
    HEAP32[i12 + 0 >> 2] = HEAP32[i13 + 0 >> 2];
    HEAP32[i12 + 4 >> 2] = HEAP32[i13 + 4 >> 2];
    HEAP32[i12 + 8 >> 2] = HEAP32[i13 + 8 >> 2];
    HEAP32[i12 + 12 >> 2] = HEAP32[i13 + 12 >> 2];
    HEAP32[i12 + 16 >> 2] = HEAP32[i13 + 16 >> 2];
    HEAP32[i12 + 20 >> 2] = HEAP32[i13 + 20 >> 2];
    HEAP32[i12 + 24 >> 2] = HEAP32[i13 + 24 >> 2];
    HEAP32[i12 + 28 >> 2] = HEAP32[i13 + 28 >> 2];
    HEAP32[i13 + 28 >> 2] = 0;
    HEAP32[i14 >> 2] = 0;
    i12 = i13;
    break;
   }
   i13 = i5 + 0 | 0;
   i12 = i13 + 124 | 0;
   do {
    HEAP32[i13 >> 2] = 0;
    i13 = i13 + 4 | 0;
   } while ((i13 | 0) < (i12 | 0));
   i15 = i2 + 12 | 0;
   i13 = HEAP32[i2 + 28 >> 2] | 0;
   i12 = 0;
   i20 = 1;
   i16 = 0;
   i14 = 1;
   while (1) {
    if ((i14 | 0) > (i13 | 0)) {
     if ((i20 | 0) > (i13 | 0)) {
      break;
     } else {
      i19 = i13;
     }
    } else {
     i19 = i14;
    }
    if ((i20 | 0) > (i19 | 0)) {
     i18 = i20;
     i17 = 0;
    } else {
     i18 = HEAP32[i15 >> 2] | 0;
     i17 = 0;
     while (1) {
      i17 = ((HEAP32[i18 + (i20 + -1 << 4) + 8 >> 2] | 0) != 0) + i17 | 0;
      if ((i20 | 0) >= (i19 | 0)) {
       break;
      } else {
       i20 = i20 + 1 | 0;
      }
     }
     i18 = i19 + 1 | 0;
    }
    i20 = i5 + (i16 << 2) | 0;
    HEAP32[i20 >> 2] = (HEAP32[i20 >> 2] | 0) + i17;
    i12 = i17 + i12 | 0;
    i16 = i16 + 1 | 0;
    if ((i16 | 0) < 31) {
     i20 = i18;
     i14 = i14 << 1;
    } else {
     break;
    }
   }
   i14 = 0;
   i15 = 1 << (HEAPU8[i2 + 7 | 0] | 0);
   i13 = 0;
   L32 : while (1) {
    i16 = i15;
    while (1) {
     i15 = i16 + -1 | 0;
     if ((i16 | 0) == 0) {
      break L32;
     }
     i16 = HEAP32[i11 >> 2] | 0;
     if ((HEAP32[i16 + (i15 << 5) + 8 >> 2] | 0) == 0) {
      i16 = i15;
     } else {
      break;
     }
    }
    if (((HEAP32[i16 + (i15 << 5) + 24 >> 2] | 0) == 3 ? (d21 = +HEAPF64[i16 + (i15 << 5) + 16 >> 3], HEAPF64[i10 >> 3] = d21 + 6755399441055744.0, i9 = HEAP32[i10 >> 2] | 0, +(i9 | 0) == d21) : 0) ? (i9 + -1 | 0) >>> 0 < 1073741824 : 0) {
     i16 = i5 + ((_luaO_ceillog2(i9) | 0) << 2) | 0;
     HEAP32[i16 >> 2] = (HEAP32[i16 >> 2] | 0) + 1;
     i16 = 1;
    } else {
     i16 = 0;
    }
    i14 = i16 + i14 | 0;
    i13 = i13 + 1 | 0;
   }
   i9 = i14 + i12 | 0;
   if (((HEAP32[i6 >> 2] | 0) == 3 ? (d21 = +HEAPF64[i1 >> 3], HEAPF64[i8 >> 3] = d21 + 6755399441055744.0, i7 = HEAP32[i8 >> 2] | 0, +(i7 | 0) == d21) : 0) ? (i7 + -1 | 0) >>> 0 < 1073741824 : 0) {
    i6 = i5 + ((_luaO_ceillog2(i7) | 0) << 2) | 0;
    HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
    i6 = 1;
   } else {
    i6 = 0;
   }
   i7 = i9 + i6 | 0;
   L49 : do {
    if ((i7 | 0) > 0) {
     i14 = 0;
     i10 = 0;
     i6 = 0;
     i8 = 0;
     i11 = 0;
     i9 = 1;
     while (1) {
      i15 = HEAP32[i5 + (i6 << 2) >> 2] | 0;
      if ((i15 | 0) > 0) {
       i15 = i15 + i10 | 0;
       i14 = (i15 | 0) > (i14 | 0);
       i10 = i15;
       i8 = i14 ? i9 : i8;
       i11 = i14 ? i15 : i11;
      }
      if ((i10 | 0) == (i7 | 0)) {
       break L49;
      }
      i9 = i9 << 1;
      i14 = (i9 | 0) / 2 | 0;
      if ((i14 | 0) < (i7 | 0)) {
       i6 = i6 + 1 | 0;
      } else {
       break;
      }
     }
    } else {
     i8 = 0;
     i11 = 0;
    }
   } while (0);
   _luaH_resize(i3, i2, i8, i12 + 1 + i13 - i11 | 0);
   i5 = _luaH_get(i2, i1) | 0;
   if ((i5 | 0) != 5192) {
    i20 = i5;
    STACKTOP = i4;
    return i20 | 0;
   }
   i20 = _luaH_newkey(i3, i2, i1) | 0;
   STACKTOP = i4;
   return i20 | 0;
  } else {
   i12 = i13;
  }
 } while (0);
 i18 = i1;
 i19 = HEAP32[i18 + 4 >> 2] | 0;
 i20 = i12 + 16 | 0;
 HEAP32[i20 >> 2] = HEAP32[i18 >> 2];
 HEAP32[i20 + 4 >> 2] = i19;
 HEAP32[i12 + 24 >> 2] = HEAP32[i6 >> 2];
 if (((HEAP32[i6 >> 2] & 64 | 0) != 0 ? !((HEAP8[(HEAP32[i1 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) ? !((HEAP8[i2 + 5 | 0] & 4) == 0) : 0) {
  _luaC_barrierback_(i3, i2);
 }
 i20 = i12;
 STACKTOP = i4;
 return i20 | 0;
}
function _luaV_concat(i7, i10) {
 i7 = i7 | 0;
 i10 = i10 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i9 = i5;
 i8 = i5 + 8 | 0;
 i6 = i7 + 8 | 0;
 i2 = i7 + 12 | 0;
 i3 = i7 + 28 | 0;
 i4 = i7 + 16 | 0;
 i11 = HEAP32[i6 >> 2] | 0;
 L1 : while (1) {
  i14 = i11 + -32 | 0;
  i12 = i11 + -24 | 0;
  i17 = HEAP32[i12 >> 2] | 0;
  i13 = i11 + -16 | 0;
  do {
   if ((i17 & 15 | 0) == 4 | (i17 | 0) == 3) {
    i15 = i11 + -8 | 0;
    i16 = HEAP32[i15 >> 2] | 0;
    if ((i16 & 15 | 0) == 4) {
     i16 = i13;
    } else {
     if ((i16 | 0) != 3) {
      i1 = 7;
      break;
     }
     HEAPF64[tempDoublePtr >> 3] = +HEAPF64[i13 >> 3];
     HEAP32[i9 >> 2] = HEAP32[tempDoublePtr >> 2];
     HEAP32[i9 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
     i16 = _luaS_newlstr(i7, i8, _sprintf(i8 | 0, 8936, i9 | 0) | 0) | 0;
     HEAP32[i13 >> 2] = i16;
     HEAP32[i15 >> 2] = HEAPU8[i16 + 4 | 0] | 0 | 64;
     i16 = i13;
     i17 = HEAP32[i12 >> 2] | 0;
    }
    i16 = HEAP32[(HEAP32[i16 >> 2] | 0) + 12 >> 2] | 0;
    i18 = (i17 & 15 | 0) == 4;
    if ((i16 | 0) == 0) {
     if (i18) {
      i12 = 2;
      break;
     }
     if ((i17 | 0) != 3) {
      i12 = 2;
      break;
     }
     HEAPF64[tempDoublePtr >> 3] = +HEAPF64[i14 >> 3];
     HEAP32[i9 >> 2] = HEAP32[tempDoublePtr >> 2];
     HEAP32[i9 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
     i18 = _luaS_newlstr(i7, i8, _sprintf(i8 | 0, 8936, i9 | 0) | 0) | 0;
     HEAP32[i14 >> 2] = i18;
     HEAP32[i12 >> 2] = HEAPU8[i18 + 4 | 0] | 0 | 64;
     i12 = 2;
     break;
    }
    if (i18 ? (HEAP32[(HEAP32[i14 >> 2] | 0) + 12 >> 2] | 0) == 0 : 0) {
     i16 = i13;
     i17 = HEAP32[i16 + 4 >> 2] | 0;
     i18 = i14;
     HEAP32[i18 >> 2] = HEAP32[i16 >> 2];
     HEAP32[i18 + 4 >> 2] = i17;
     HEAP32[i12 >> 2] = HEAP32[i15 >> 2];
     i12 = 2;
     break;
    }
    L19 : do {
     if ((i10 | 0) > 1) {
      i12 = 1;
      do {
       i15 = ~i12;
       i14 = i11 + (i15 << 4) | 0;
       i15 = i11 + (i15 << 4) + 8 | 0;
       i13 = HEAP32[i15 >> 2] | 0;
       if ((i13 & 15 | 0) != 4) {
        if ((i13 | 0) != 3) {
         break L19;
        }
        HEAPF64[tempDoublePtr >> 3] = +HEAPF64[i14 >> 3];
        HEAP32[i9 >> 2] = HEAP32[tempDoublePtr >> 2];
        HEAP32[i9 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
        i18 = _luaS_newlstr(i7, i8, _sprintf(i8 | 0, 8936, i9 | 0) | 0) | 0;
        HEAP32[i14 >> 2] = i18;
        HEAP32[i15 >> 2] = HEAPU8[i18 + 4 | 0] | 0 | 64;
       }
       i13 = HEAP32[(HEAP32[i14 >> 2] | 0) + 12 >> 2] | 0;
       if (!(i13 >>> 0 < (-3 - i16 | 0) >>> 0)) {
        i1 = 24;
        break L1;
       }
       i16 = i13 + i16 | 0;
       i12 = i12 + 1 | 0;
      } while ((i12 | 0) < (i10 | 0));
     } else {
      i12 = 1;
     }
    } while (0);
    i14 = _luaZ_openspace(i7, (HEAP32[i2 >> 2] | 0) + 144 | 0, i16) | 0;
    i15 = i12;
    i13 = 0;
    do {
     i17 = HEAP32[i11 + (0 - i15 << 4) >> 2] | 0;
     i18 = HEAP32[i17 + 12 >> 2] | 0;
     _memcpy(i14 + i13 | 0, i17 + 16 | 0, i18 | 0) | 0;
     i13 = i18 + i13 | 0;
     i15 = i15 + -1 | 0;
    } while ((i15 | 0) > 0);
    i18 = 0 - i12 | 0;
    i17 = _luaS_newlstr(i7, i14, i13) | 0;
    HEAP32[i11 + (i18 << 4) >> 2] = i17;
    HEAP32[i11 + (i18 << 4) + 8 >> 2] = HEAPU8[i17 + 4 | 0] | 0 | 64;
   } else {
    i1 = 7;
   }
  } while (0);
  if ((i1 | 0) == 7) {
   i1 = 0;
   i15 = _luaT_gettmbyobj(i7, i14, 15) | 0;
   if ((HEAP32[i15 + 8 >> 2] | 0) == 0) {
    i15 = _luaT_gettmbyobj(i7, i13, 15) | 0;
    if ((HEAP32[i15 + 8 >> 2] | 0) == 0) {
     i1 = 10;
     break;
    }
   }
   i18 = i14 - (HEAP32[i3 >> 2] | 0) | 0;
   i16 = HEAP32[i6 >> 2] | 0;
   HEAP32[i6 >> 2] = i16 + 16;
   i20 = i15;
   i19 = HEAP32[i20 + 4 >> 2] | 0;
   i17 = i16;
   HEAP32[i17 >> 2] = HEAP32[i20 >> 2];
   HEAP32[i17 + 4 >> 2] = i19;
   HEAP32[i16 + 8 >> 2] = HEAP32[i15 + 8 >> 2];
   i15 = HEAP32[i6 >> 2] | 0;
   HEAP32[i6 >> 2] = i15 + 16;
   i16 = i14;
   i17 = HEAP32[i16 + 4 >> 2] | 0;
   i14 = i15;
   HEAP32[i14 >> 2] = HEAP32[i16 >> 2];
   HEAP32[i14 + 4 >> 2] = i17;
   HEAP32[i15 + 8 >> 2] = HEAP32[i12 >> 2];
   i12 = HEAP32[i6 >> 2] | 0;
   HEAP32[i6 >> 2] = i12 + 16;
   i15 = i13;
   i14 = HEAP32[i15 + 4 >> 2] | 0;
   i17 = i12;
   HEAP32[i17 >> 2] = HEAP32[i15 >> 2];
   HEAP32[i17 + 4 >> 2] = i14;
   HEAP32[i12 + 8 >> 2] = HEAP32[i11 + -8 >> 2];
   _luaD_call(i7, (HEAP32[i6 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i4 >> 2] | 0) + 18 | 0] & 1);
   i12 = HEAP32[i3 >> 2] | 0;
   i17 = HEAP32[i6 >> 2] | 0;
   i14 = i17 + -16 | 0;
   HEAP32[i6 >> 2] = i14;
   i15 = HEAP32[i14 + 4 >> 2] | 0;
   i16 = i12 + i18 | 0;
   HEAP32[i16 >> 2] = HEAP32[i14 >> 2];
   HEAP32[i16 + 4 >> 2] = i15;
   HEAP32[i12 + (i18 + 8) >> 2] = HEAP32[i17 + -8 >> 2];
   i12 = 2;
  }
  i10 = i10 + 1 - i12 | 0;
  i11 = (HEAP32[i6 >> 2] | 0) + (1 - i12 << 4) | 0;
  HEAP32[i6 >> 2] = i11;
  if ((i10 | 0) <= 1) {
   i1 = 30;
   break;
  }
 }
 if ((i1 | 0) == 10) {
  _luaG_concaterror(i7, i14, i13);
 } else if ((i1 | 0) == 24) {
  _luaG_runerror(i7, 9e3, i9);
 } else if ((i1 | 0) == 30) {
  STACKTOP = i5;
  return;
 }
}
function _str_gsub(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 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, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 1344 | 0;
 i4 = i3;
 i5 = i3 + 1336 | 0;
 i14 = i3 + 1332 | 0;
 i10 = i3 + 1328 | 0;
 i6 = i3 + 1048 | 0;
 i2 = i3 + 8 | 0;
 i20 = _luaL_checklstring(i1, 1, i14) | 0;
 i13 = _luaL_checklstring(i1, 2, i10) | 0;
 i8 = _lua_type(i1, 3) | 0;
 i9 = _luaL_optinteger(i1, 4, (HEAP32[i14 >> 2] | 0) + 1 | 0) | 0;
 i7 = (HEAP8[i13] | 0) == 94;
 if (!((i8 + -3 | 0) >>> 0 < 2 | (i8 | 0) == 6 | (i8 | 0) == 5)) {
  _luaL_argerror(i1, 3, 7528) | 0;
 }
 _luaL_buffinit(i1, i2);
 if (i7) {
  i15 = (HEAP32[i10 >> 2] | 0) + -1 | 0;
  HEAP32[i10 >> 2] = i15;
  i13 = i13 + 1 | 0;
 } else {
  i15 = HEAP32[i10 >> 2] | 0;
 }
 i11 = i6 + 16 | 0;
 HEAP32[i11 >> 2] = i1;
 HEAP32[i6 >> 2] = 200;
 i12 = i6 + 4 | 0;
 HEAP32[i12 >> 2] = i20;
 i10 = i6 + 8 | 0;
 HEAP32[i10 >> 2] = i20 + (HEAP32[i14 >> 2] | 0);
 HEAP32[i6 + 12 >> 2] = i13 + i15;
 i14 = i6 + 20 | 0;
 i15 = i2 + 8 | 0;
 i18 = i2 + 4 | 0;
 i16 = i6 + 28 | 0;
 i17 = i6 + 24 | 0;
 i22 = 0;
 while (1) {
  if (!(i22 >>> 0 < i9 >>> 0)) {
   i19 = 48;
   break;
  }
  HEAP32[i14 >> 2] = 0;
  i21 = _match(i6, i20, i13) | 0;
  if ((i21 | 0) != 0) {
   i22 = i22 + 1 | 0;
   i23 = HEAP32[i11 >> 2] | 0;
   if ((i8 | 0) == 5) {
    do {
     if ((HEAP32[i14 >> 2] | 0) > 0) {
      i24 = HEAP32[i16 >> 2] | 0;
      if (!((i24 | 0) == -1)) {
       i25 = HEAP32[i17 >> 2] | 0;
       if ((i24 | 0) == -2) {
        _lua_pushinteger(i23, i25 + 1 - (HEAP32[i12 >> 2] | 0) | 0);
        break;
       } else {
        i19 = i23;
       }
      } else {
       _luaL_error(i23, 7248, i4) | 0;
       i19 = HEAP32[i11 >> 2] | 0;
       i25 = HEAP32[i17 >> 2] | 0;
      }
      _lua_pushlstring(i19, i25, i24) | 0;
     } else {
      _lua_pushlstring(i23, i20, i21 - i20 | 0) | 0;
     }
    } while (0);
    _lua_gettable(i23, 3);
    i19 = 37;
   } else if ((i8 | 0) != 6) {
    i24 = _lua_tolstring(i23, 3, i5) | 0;
    if ((HEAP32[i5 >> 2] | 0) != 0) {
     i23 = i21 - i20 | 0;
     i25 = 0;
     do {
      i26 = i24 + i25 | 0;
      i27 = HEAP8[i26] | 0;
      do {
       if (i27 << 24 >> 24 == 37) {
        i25 = i25 + 1 | 0;
        i26 = i24 + i25 | 0;
        i28 = HEAP8[i26] | 0;
        i27 = i28 << 24 >> 24;
        if (((i28 & 255) + -48 | 0) >>> 0 < 10) {
         if (i28 << 24 >> 24 == 48) {
          _luaL_addlstring(i2, i20, i23);
          break;
         } else {
          _push_onecapture(i6, i27 + -49 | 0, i20, i21);
          _luaL_addvalue(i2);
          break;
         }
        }
        if (!(i28 << 24 >> 24 == 37)) {
         i28 = HEAP32[i11 >> 2] | 0;
         HEAP32[i4 >> 2] = 37;
         _luaL_error(i28, 7600, i4) | 0;
        }
        i27 = HEAP32[i15 >> 2] | 0;
        if (!(i27 >>> 0 < (HEAP32[i18 >> 2] | 0) >>> 0)) {
         _luaL_prepbuffsize(i2, 1) | 0;
         i27 = HEAP32[i15 >> 2] | 0;
        }
        i28 = HEAP8[i26] | 0;
        HEAP32[i15 >> 2] = i27 + 1;
        HEAP8[(HEAP32[i2 >> 2] | 0) + i27 | 0] = i28;
       } else {
        i28 = HEAP32[i15 >> 2] | 0;
        if (!(i28 >>> 0 < (HEAP32[i18 >> 2] | 0) >>> 0)) {
         _luaL_prepbuffsize(i2, 1) | 0;
         i28 = HEAP32[i15 >> 2] | 0;
         i27 = HEAP8[i26] | 0;
        }
        HEAP32[i15 >> 2] = i28 + 1;
        HEAP8[(HEAP32[i2 >> 2] | 0) + i28 | 0] = i27;
       }
      } while (0);
      i25 = i25 + 1 | 0;
     } while (i25 >>> 0 < (HEAP32[i5 >> 2] | 0) >>> 0);
    }
   } else {
    _lua_pushvalue(i23, 3);
    i19 = HEAP32[i14 >> 2] | 0;
    i19 = (i19 | 0) != 0 | (i20 | 0) == 0 ? i19 : 1;
    _luaL_checkstack(HEAP32[i11 >> 2] | 0, i19, 7200);
    if ((i19 | 0) > 0) {
     i24 = 0;
     do {
      _push_onecapture(i6, i24, i20, i21);
      i24 = i24 + 1 | 0;
     } while ((i24 | 0) != (i19 | 0));
    }
    _lua_callk(i23, i19, 1, 0, 0);
    i19 = 37;
   }
   if ((i19 | 0) == 37) {
    i19 = 0;
    if ((_lua_toboolean(i23, -1) | 0) != 0) {
     if ((_lua_isstring(i23, -1) | 0) == 0) {
      HEAP32[i4 >> 2] = _lua_typename(i23, _lua_type(i23, -1) | 0) | 0;
      _luaL_error(i23, 7560, i4) | 0;
     }
    } else {
     _lua_settop(i23, -2);
     _lua_pushlstring(i23, i20, i21 - i20 | 0) | 0;
    }
    _luaL_addvalue(i2);
   }
   if (i21 >>> 0 > i20 >>> 0) {
    i20 = i21;
   } else {
    i19 = 43;
   }
  } else {
   i19 = 43;
  }
  if ((i19 | 0) == 43) {
   i19 = 0;
   if (!(i20 >>> 0 < (HEAP32[i10 >> 2] | 0) >>> 0)) {
    i19 = 48;
    break;
   }
   i21 = HEAP32[i15 >> 2] | 0;
   if (!(i21 >>> 0 < (HEAP32[i18 >> 2] | 0) >>> 0)) {
    _luaL_prepbuffsize(i2, 1) | 0;
    i21 = HEAP32[i15 >> 2] | 0;
   }
   i28 = HEAP8[i20] | 0;
   HEAP32[i15 >> 2] = i21 + 1;
   HEAP8[(HEAP32[i2 >> 2] | 0) + i21 | 0] = i28;
   i20 = i20 + 1 | 0;
  }
  if (i7) {
   i19 = 48;
   break;
  }
 }
 if ((i19 | 0) == 48) {
  _luaL_addlstring(i2, i20, (HEAP32[i10 >> 2] | 0) - i20 | 0);
  _luaL_pushresult(i2);
  _lua_pushinteger(i1, i22);
  STACKTOP = i3;
  return 2;
 }
 return 0;
}
function _constructor(i11, i13) {
 i11 = i11 | 0;
 i13 = i13 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i14 = 0, i15 = 0, i16 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i10 = i5 + 40 | 0;
 i8 = i5;
 i12 = i11 + 48 | 0;
 i6 = HEAP32[i12 >> 2] | 0;
 i9 = HEAP32[i11 + 4 >> 2] | 0;
 i2 = _luaK_codeABC(i6, 11, 0, 0, 0) | 0;
 i7 = i8 + 36 | 0;
 HEAP32[i7 >> 2] = 0;
 i4 = i8 + 28 | 0;
 HEAP32[i4 >> 2] = 0;
 i3 = i8 + 32 | 0;
 HEAP32[i3 >> 2] = 0;
 i1 = i8 + 24 | 0;
 HEAP32[i1 >> 2] = i13;
 HEAP32[i13 + 16 >> 2] = -1;
 HEAP32[i13 + 20 >> 2] = -1;
 HEAP32[i13 >> 2] = 11;
 HEAP32[i13 + 8 >> 2] = i2;
 HEAP32[i8 + 16 >> 2] = -1;
 HEAP32[i8 + 20 >> 2] = -1;
 HEAP32[i8 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 _luaK_exp2nextreg(HEAP32[i12 >> 2] | 0, i13);
 i13 = i11 + 16 | 0;
 if ((HEAP32[i13 >> 2] | 0) != 123) {
  _error_expected(i11, 123);
 }
 _luaX_next(i11);
 L4 : do {
  if ((HEAP32[i13 >> 2] | 0) != 125) {
   L5 : while (1) {
    if ((HEAP32[i8 >> 2] | 0) != 0 ? (_luaK_exp2nextreg(i6, i8), HEAP32[i8 >> 2] = 0, (HEAP32[i7 >> 2] | 0) == 50) : 0) {
     _luaK_setlist(i6, HEAP32[(HEAP32[i1 >> 2] | 0) + 8 >> 2] | 0, HEAP32[i3 >> 2] | 0, 50);
     HEAP32[i7 >> 2] = 0;
    }
    i14 = HEAP32[i13 >> 2] | 0;
    do {
     if ((i14 | 0) == 288) {
      if ((_luaX_lookahead(i11) | 0) == 61) {
       _recfield(i11, i8);
       break;
      }
      _subexpr(i11, i8, 0) | 0;
      i14 = HEAP32[i12 >> 2] | 0;
      i15 = HEAP32[i3 >> 2] | 0;
      if ((i15 | 0) > 2147483645) {
       i12 = 10;
       break L5;
      }
      HEAP32[i3 >> 2] = i15 + 1;
      HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + 1;
     } else if ((i14 | 0) == 91) {
      _recfield(i11, i8);
     } else {
      _subexpr(i11, i8, 0) | 0;
      i14 = HEAP32[i12 >> 2] | 0;
      i15 = HEAP32[i3 >> 2] | 0;
      if ((i15 | 0) > 2147483645) {
       i12 = 17;
       break L5;
      }
      HEAP32[i3 >> 2] = i15 + 1;
      HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + 1;
     }
    } while (0);
    i14 = HEAP32[i13 >> 2] | 0;
    if ((i14 | 0) == 44) {
     _luaX_next(i11);
    } else if ((i14 | 0) == 59) {
     _luaX_next(i11);
    } else {
     break L4;
    }
    if ((HEAP32[i13 >> 2] | 0) == 125) {
     break L4;
    }
   }
   if ((i12 | 0) == 10) {
    i12 = i14 + 12 | 0;
    i13 = HEAP32[(HEAP32[i12 >> 2] | 0) + 52 >> 2] | 0;
    i14 = HEAP32[(HEAP32[i14 >> 2] | 0) + 64 >> 2] | 0;
    if ((i14 | 0) == 0) {
     i16 = 6552;
     HEAP32[i10 >> 2] = 6528;
     i15 = i10 + 4 | 0;
     HEAP32[i15 >> 2] = 2147483645;
     i15 = i10 + 8 | 0;
     HEAP32[i15 >> 2] = i16;
     i15 = _luaO_pushfstring(i13, 6592, i10) | 0;
     i16 = HEAP32[i12 >> 2] | 0;
     _luaX_syntaxerror(i16, i15);
    }
    HEAP32[i10 >> 2] = i14;
    i15 = _luaO_pushfstring(i13, 6568, i10) | 0;
    HEAP32[i10 >> 2] = 6528;
    i16 = i10 + 4 | 0;
    HEAP32[i16 >> 2] = 2147483645;
    i16 = i10 + 8 | 0;
    HEAP32[i16 >> 2] = i15;
    i16 = _luaO_pushfstring(i13, 6592, i10) | 0;
    i15 = HEAP32[i12 >> 2] | 0;
    _luaX_syntaxerror(i15, i16);
   } else if ((i12 | 0) == 17) {
    i13 = i14 + 12 | 0;
    i12 = HEAP32[(HEAP32[i13 >> 2] | 0) + 52 >> 2] | 0;
    i14 = HEAP32[(HEAP32[i14 >> 2] | 0) + 64 >> 2] | 0;
    if ((i14 | 0) == 0) {
     i15 = 6552;
     HEAP32[i10 >> 2] = 6528;
     i16 = i10 + 4 | 0;
     HEAP32[i16 >> 2] = 2147483645;
     i16 = i10 + 8 | 0;
     HEAP32[i16 >> 2] = i15;
     i16 = _luaO_pushfstring(i12, 6592, i10) | 0;
     i15 = HEAP32[i13 >> 2] | 0;
     _luaX_syntaxerror(i15, i16);
    }
    HEAP32[i10 >> 2] = i14;
    i15 = _luaO_pushfstring(i12, 6568, i10) | 0;
    HEAP32[i10 >> 2] = 6528;
    i16 = i10 + 4 | 0;
    HEAP32[i16 >> 2] = 2147483645;
    i16 = i10 + 8 | 0;
    HEAP32[i16 >> 2] = i15;
    i16 = _luaO_pushfstring(i12, 6592, i10) | 0;
    i15 = HEAP32[i13 >> 2] | 0;
    _luaX_syntaxerror(i15, i16);
   }
  }
 } while (0);
 _check_match(i11, 125, 123, i9);
 i9 = HEAP32[i7 >> 2] | 0;
 do {
  if ((i9 | 0) != 0) {
   i10 = HEAP32[i8 >> 2] | 0;
   if ((i10 | 0) != 0) if ((i10 | 0) == 13 | (i10 | 0) == 12) {
    _luaK_setreturns(i6, i8, -1);
    _luaK_setlist(i6, HEAP32[(HEAP32[i1 >> 2] | 0) + 8 >> 2] | 0, HEAP32[i3 >> 2] | 0, -1);
    HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + -1;
    break;
   } else {
    _luaK_exp2nextreg(i6, i8);
    i9 = HEAP32[i7 >> 2] | 0;
   }
   _luaK_setlist(i6, HEAP32[(HEAP32[i1 >> 2] | 0) + 8 >> 2] | 0, HEAP32[i3 >> 2] | 0, i9);
  }
 } while (0);
 i16 = HEAP32[(HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) + (i2 << 2) >> 2] & 8388607;
 i16 = (_luaO_int2fb(HEAP32[i3 >> 2] | 0) | 0) << 23 | i16;
 HEAP32[(HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) + (i2 << 2) >> 2] = i16;
 i16 = (_luaO_int2fb(HEAP32[i4 >> 2] | 0) | 0) << 14 & 8372224 | i16 & -8372225;
 HEAP32[(HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] | 0) + (i2 << 2) >> 2] = i16;
 STACKTOP = i5;
 return;
}
function _luaK_prefix(i4, i14, i7, i13) {
 i4 = i4 | 0;
 i14 = i14 | 0;
 i7 = i7 | 0;
 i13 = i13 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i12 = i1;
 HEAP32[i12 + 20 >> 2] = -1;
 HEAP32[i12 + 16 >> 2] = -1;
 HEAP32[i12 >> 2] = 5;
 HEAPF64[i12 + 8 >> 3] = 0.0;
 if ((i14 | 0) == 1) {
  _luaK_dischargevars(i4, i7);
  switch (HEAP32[i7 >> 2] | 0) {
  case 2:
  case 5:
  case 4:
   {
    HEAP32[i7 >> 2] = 3;
    break;
   }
  case 10:
   {
    i13 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
    i12 = HEAP32[i7 + 8 >> 2] | 0;
    i10 = i13 + (i12 << 2) | 0;
    if (!((i12 | 0) > 0 ? (i11 = i13 + (i12 + -1 << 2) | 0, i9 = HEAP32[i11 >> 2] | 0, (HEAP8[5584 + (i9 & 63) | 0] | 0) < 0) : 0)) {
     i11 = i10;
     i9 = HEAP32[i10 >> 2] | 0;
    }
    HEAP32[i11 >> 2] = ((i9 & 16320 | 0) == 0) << 6 | i9 & -16321;
    break;
   }
  case 6:
   {
    i8 = 25;
    break;
   }
  case 3:
  case 1:
   {
    HEAP32[i7 >> 2] = 2;
    break;
   }
  case 11:
   {
    i12 = i4 + 48 | 0;
    i8 = HEAP8[i12] | 0;
    i11 = (i8 & 255) + 1 | 0;
    i9 = (HEAP32[i4 >> 2] | 0) + 78 | 0;
    do {
     if (i11 >>> 0 > (HEAPU8[i9] | 0) >>> 0) {
      if (i11 >>> 0 > 249) {
       _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10536);
      } else {
       HEAP8[i9] = i11;
       i10 = HEAP8[i12] | 0;
       break;
      }
     } else {
      i10 = i8;
     }
    } while (0);
    i14 = (i10 & 255) + 1 | 0;
    HEAP8[i12] = i14;
    _discharge2reg(i4, i7, (i14 & 255) + -1 | 0);
    if ((HEAP32[i7 >> 2] | 0) == 6) {
     i8 = 25;
    } else {
     i9 = i7 + 8 | 0;
     i8 = 28;
    }
    break;
   }
  default:
   {}
  }
  if ((i8 | 0) == 25) {
   i8 = i7 + 8 | 0;
   i9 = HEAP32[i8 >> 2] | 0;
   if ((i9 & 256 | 0) == 0 ? (HEAPU8[i4 + 46 | 0] | 0) <= (i9 | 0) : 0) {
    i9 = i4 + 48 | 0;
    HEAP8[i9] = (HEAP8[i9] | 0) + -1 << 24 >> 24;
    i9 = i8;
    i8 = 28;
   } else {
    i9 = i8;
    i8 = 28;
   }
  }
  if ((i8 | 0) == 28) {
   HEAP32[i9 >> 2] = _luaK_code(i4, HEAP32[i9 >> 2] << 23 | 20) | 0;
   HEAP32[i7 >> 2] = 11;
  }
  i14 = i7 + 20 | 0;
  i8 = HEAP32[i14 >> 2] | 0;
  i7 = i7 + 16 | 0;
  i9 = HEAP32[i7 >> 2] | 0;
  HEAP32[i14 >> 2] = i9;
  HEAP32[i7 >> 2] = i8;
  if (!((i9 | 0) == -1)) {
   i8 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
   do {
    i12 = i8 + (i9 << 2) | 0;
    if ((i9 | 0) > 0 ? (i5 = i8 + (i9 + -1 << 2) | 0, i6 = HEAP32[i5 >> 2] | 0, (HEAP8[5584 + (i6 & 63) | 0] | 0) < 0) : 0) {
     i10 = i5;
     i11 = i6;
    } else {
     i10 = i12;
     i11 = HEAP32[i12 >> 2] | 0;
    }
    if ((i11 & 63 | 0) == 28) {
     HEAP32[i10 >> 2] = i11 & 8372224 | i11 >>> 23 << 6 | 27;
    }
    i10 = ((HEAP32[i12 >> 2] | 0) >>> 14) + -131071 | 0;
    if ((i10 | 0) == -1) {
     break;
    }
    i9 = i9 + 1 + i10 | 0;
   } while (!((i9 | 0) == -1));
   i8 = HEAP32[i7 >> 2] | 0;
  }
  if ((i8 | 0) == -1) {
   STACKTOP = i1;
   return;
  }
  i4 = HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0;
  while (1) {
   i6 = i4 + (i8 << 2) | 0;
   if ((i8 | 0) > 0 ? (i2 = i4 + (i8 + -1 << 2) | 0, i3 = HEAP32[i2 >> 2] | 0, (HEAP8[5584 + (i3 & 63) | 0] | 0) < 0) : 0) {
    i7 = i2;
    i5 = i3;
   } else {
    i7 = i6;
    i5 = HEAP32[i6 >> 2] | 0;
   }
   if ((i5 & 63 | 0) == 28) {
    HEAP32[i7 >> 2] = i5 & 8372224 | i5 >>> 23 << 6 | 27;
   }
   i5 = ((HEAP32[i6 >> 2] | 0) >>> 14) + -131071 | 0;
   if ((i5 | 0) == -1) {
    i8 = 54;
    break;
   }
   i8 = i8 + 1 + i5 | 0;
   if ((i8 | 0) == -1) {
    i8 = 54;
    break;
   }
  }
  if ((i8 | 0) == 54) {
   STACKTOP = i1;
   return;
  }
 } else if ((i14 | 0) == 0) {
  if (((HEAP32[i7 >> 2] | 0) == 5 ? (HEAP32[i7 + 16 >> 2] | 0) == -1 : 0) ? (HEAP32[i7 + 20 >> 2] | 0) == -1 : 0) {
   i14 = i7 + 8 | 0;
   HEAPF64[i14 >> 3] = -+HEAPF64[i14 >> 3];
   STACKTOP = i1;
   return;
  }
  _luaK_dischargevars(i4, i7);
  if ((HEAP32[i7 >> 2] | 0) == 6) {
   i2 = HEAP32[i7 + 8 >> 2] | 0;
   if ((HEAP32[i7 + 16 >> 2] | 0) != (HEAP32[i7 + 20 >> 2] | 0)) {
    if ((i2 | 0) < (HEAPU8[i4 + 46 | 0] | 0)) {
     i8 = 10;
    } else {
     _exp2reg(i4, i7, i2);
    }
   }
  } else {
   i8 = 10;
  }
  if ((i8 | 0) == 10) {
   _luaK_exp2nextreg(i4, i7);
  }
  _codearith(i4, 19, i7, i12, i13);
  STACKTOP = i1;
  return;
 } else if ((i14 | 0) == 2) {
  _luaK_dischargevars(i4, i7);
  if ((HEAP32[i7 >> 2] | 0) == 6) {
   i2 = HEAP32[i7 + 8 >> 2] | 0;
   if ((HEAP32[i7 + 16 >> 2] | 0) != (HEAP32[i7 + 20 >> 2] | 0)) {
    if ((i2 | 0) < (HEAPU8[i4 + 46 | 0] | 0)) {
     i8 = 52;
    } else {
     _exp2reg(i4, i7, i2);
    }
   }
  } else {
   i8 = 52;
  }
  if ((i8 | 0) == 52) {
   _luaK_exp2nextreg(i4, i7);
  }
  _codearith(i4, 21, i7, i12, i13);
  STACKTOP = i1;
  return;
 } else {
  STACKTOP = i1;
  return;
 }
}
function _subexpr(i6, i3, i7) {
 i6 = i6 | 0;
 i3 = i3 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i11 = i2 + 24 | 0;
 i5 = i2;
 i4 = i6 + 48 | 0;
 i9 = HEAP32[i4 >> 2] | 0;
 i1 = i6 + 52 | 0;
 i12 = (HEAP32[i1 >> 2] | 0) + 38 | 0;
 i13 = (HEAP16[i12 >> 1] | 0) + 1 << 16 >> 16;
 HEAP16[i12 >> 1] = i13;
 if ((i13 & 65535) > 200) {
  i10 = i9 + 12 | 0;
  i12 = HEAP32[(HEAP32[i10 >> 2] | 0) + 52 >> 2] | 0;
  i13 = HEAP32[(HEAP32[i9 >> 2] | 0) + 64 >> 2] | 0;
  if ((i13 | 0) == 0) {
   i15 = 6552;
   HEAP32[i11 >> 2] = 6360;
   i14 = i11 + 4 | 0;
   HEAP32[i14 >> 2] = 200;
   i14 = i11 + 8 | 0;
   HEAP32[i14 >> 2] = i15;
   i14 = _luaO_pushfstring(i12, 6592, i11) | 0;
   i15 = HEAP32[i10 >> 2] | 0;
   _luaX_syntaxerror(i15, i14);
  }
  HEAP32[i11 >> 2] = i13;
  i14 = _luaO_pushfstring(i12, 6568, i11) | 0;
  HEAP32[i11 >> 2] = 6360;
  i15 = i11 + 4 | 0;
  HEAP32[i15 >> 2] = 200;
  i15 = i11 + 8 | 0;
  HEAP32[i15 >> 2] = i14;
  i15 = _luaO_pushfstring(i12, 6592, i11) | 0;
  i14 = HEAP32[i10 >> 2] | 0;
  _luaX_syntaxerror(i14, i15);
 }
 i10 = i6 + 16 | 0;
 L8 : do {
  switch (HEAP32[i10 >> 2] | 0) {
  case 287:
   {
    HEAP32[i3 + 16 >> 2] = -1;
    HEAP32[i3 + 20 >> 2] = -1;
    HEAP32[i3 >> 2] = 5;
    HEAP32[i3 + 8 >> 2] = 0;
    HEAPF64[i3 + 8 >> 3] = +HEAPF64[i6 + 24 >> 3];
    i8 = 20;
    break;
   }
  case 271:
   {
    i9 = 1;
    i8 = 8;
    break;
   }
  case 289:
   {
    i8 = _luaK_stringK(i9, HEAP32[i6 + 24 >> 2] | 0) | 0;
    HEAP32[i3 + 16 >> 2] = -1;
    HEAP32[i3 + 20 >> 2] = -1;
    HEAP32[i3 >> 2] = 4;
    HEAP32[i3 + 8 >> 2] = i8;
    i8 = 20;
    break;
   }
  case 265:
   {
    _luaX_next(i6);
    _body(i6, i3, 0, HEAP32[i6 + 4 >> 2] | 0);
    break;
   }
  case 276:
   {
    HEAP32[i3 + 16 >> 2] = -1;
    HEAP32[i3 + 20 >> 2] = -1;
    HEAP32[i3 >> 2] = 2;
    HEAP32[i3 + 8 >> 2] = 0;
    i8 = 20;
    break;
   }
  case 45:
   {
    i9 = 0;
    i8 = 8;
    break;
   }
  case 35:
   {
    i9 = 2;
    i8 = 8;
    break;
   }
  case 123:
   {
    _constructor(i6, i3);
    break;
   }
  case 263:
   {
    HEAP32[i3 + 16 >> 2] = -1;
    HEAP32[i3 + 20 >> 2] = -1;
    HEAP32[i3 >> 2] = 3;
    HEAP32[i3 + 8 >> 2] = 0;
    i8 = 20;
    break;
   }
  case 280:
   {
    if ((HEAP8[(HEAP32[i9 >> 2] | 0) + 77 | 0] | 0) == 0) {
     _luaX_syntaxerror(i6, 6408);
    } else {
     i8 = _luaK_codeABC(i9, 38, 0, 1, 0) | 0;
     HEAP32[i3 + 16 >> 2] = -1;
     HEAP32[i3 + 20 >> 2] = -1;
     HEAP32[i3 >> 2] = 13;
     HEAP32[i3 + 8 >> 2] = i8;
     i8 = 20;
     break L8;
    }
    break;
   }
  case 270:
   {
    HEAP32[i3 + 16 >> 2] = -1;
    HEAP32[i3 + 20 >> 2] = -1;
    HEAP32[i3 >> 2] = 1;
    HEAP32[i3 + 8 >> 2] = 0;
    i8 = 20;
    break;
   }
  default:
   {
    _suffixedexp(i6, i3);
   }
  }
 } while (0);
 if ((i8 | 0) == 8) {
  i15 = HEAP32[i6 + 4 >> 2] | 0;
  _luaX_next(i6);
  _subexpr(i6, i3, 8) | 0;
  _luaK_prefix(HEAP32[i4 >> 2] | 0, i9, i3, i15);
 } else if ((i8 | 0) == 20) {
  _luaX_next(i6);
 }
 switch (HEAP32[i10 >> 2] | 0) {
 case 257:
  {
   i9 = 13;
   break;
  }
 case 272:
  {
   i9 = 14;
   break;
  }
 case 47:
  {
   i9 = 3;
   break;
  }
 case 37:
  {
   i9 = 4;
   break;
  }
 case 43:
  {
   i9 = 0;
   break;
  }
 case 284:
  {
   i9 = 10;
   break;
  }
 case 281:
  {
   i9 = 7;
   break;
  }
 case 62:
  {
   i9 = 11;
   break;
  }
 case 282:
  {
   i9 = 12;
   break;
  }
 case 45:
  {
   i9 = 1;
   break;
  }
 case 42:
  {
   i9 = 2;
   break;
  }
 case 60:
  {
   i9 = 8;
   break;
  }
 case 283:
  {
   i9 = 9;
   break;
  }
 case 94:
  {
   i9 = 5;
   break;
  }
 case 279:
  {
   i9 = 6;
   break;
  }
 default:
  {
   i15 = 15;
   i14 = HEAP32[i1 >> 2] | 0;
   i14 = i14 + 38 | 0;
   i13 = HEAP16[i14 >> 1] | 0;
   i13 = i13 + -1 << 16 >> 16;
   HEAP16[i14 >> 1] = i13;
   STACKTOP = i2;
   return i15 | 0;
  }
 }
 i8 = i6 + 4 | 0;
 while (1) {
  if ((HEAPU8[6376 + (i9 << 1) | 0] | 0) <= (i7 | 0)) {
   i8 = 39;
   break;
  }
  i15 = HEAP32[i8 >> 2] | 0;
  _luaX_next(i6);
  _luaK_infix(HEAP32[i4 >> 2] | 0, i9, i3);
  i10 = _subexpr(i6, i5, HEAPU8[6377 + (i9 << 1) | 0] | 0) | 0;
  _luaK_posfix(HEAP32[i4 >> 2] | 0, i9, i3, i5, i15);
  if ((i10 | 0) == 15) {
   i9 = 15;
   i8 = 39;
   break;
  } else {
   i9 = i10;
  }
 }
 if ((i8 | 0) == 39) {
  i15 = HEAP32[i1 >> 2] | 0;
  i15 = i15 + 38 | 0;
  i14 = HEAP16[i15 >> 1] | 0;
  i14 = i14 + -1 << 16 >> 16;
  HEAP16[i15 >> 1] = i14;
  STACKTOP = i2;
  return i9 | 0;
 }
 return 0;
}
function _luaV_lessequal(i5, i3, i2) {
 i5 = i5 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 i4 = i3 + 8 | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 if ((i7 | 0) == 3) {
  if ((HEAP32[i2 + 8 >> 2] | 0) == 3) {
   i9 = +HEAPF64[i3 >> 3] <= +HEAPF64[i2 >> 3] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 } else {
  if ((i7 & 15 | 0) == 4 ? (HEAP32[i2 + 8 >> 2] & 15 | 0) == 4 : 0) {
   i3 = HEAP32[i3 >> 2] | 0;
   i6 = HEAP32[i2 >> 2] | 0;
   i4 = i3 + 16 | 0;
   i5 = i6 + 16 | 0;
   i7 = _strcmp(i4, i5) | 0;
   L8 : do {
    if ((i7 | 0) == 0) {
     i2 = HEAP32[i3 + 12 >> 2] | 0;
     i3 = HEAP32[i6 + 12 >> 2] | 0;
     i6 = i5;
     while (1) {
      i5 = _strlen(i4 | 0) | 0;
      i7 = (i5 | 0) == (i2 | 0);
      if ((i5 | 0) == (i3 | 0)) {
       break;
      }
      if (i7) {
       i7 = -1;
       break L8;
      }
      i5 = i5 + 1 | 0;
      i4 = i4 + i5 | 0;
      i6 = i6 + i5 | 0;
      i7 = _strcmp(i4, i6) | 0;
      if ((i7 | 0) == 0) {
       i2 = i2 - i5 | 0;
       i3 = i3 - i5 | 0;
      } else {
       break L8;
      }
     }
     i7 = i7 & 1 ^ 1;
    }
   } while (0);
   i9 = (i7 | 0) < 1 | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 }
 i7 = i5 + 8 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i9 = _luaT_gettmbyobj(i5, i3, 14) | 0;
 if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
  i9 = _luaT_gettmbyobj(i5, i2, 14) | 0;
  if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
   i8 = HEAP32[i7 >> 2] | 0;
   i9 = _luaT_gettmbyobj(i5, i2, 13) | 0;
   if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
    i9 = _luaT_gettmbyobj(i5, i3, 13) | 0;
    if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
     _luaG_ordererror(i5, i3, i2);
    } else {
     i6 = i9;
    }
   } else {
    i6 = i9;
   }
   i10 = i5 + 28 | 0;
   i9 = i8 - (HEAP32[i10 >> 2] | 0) | 0;
   i8 = HEAP32[i7 >> 2] | 0;
   HEAP32[i7 >> 2] = i8 + 16;
   i13 = i6;
   i11 = HEAP32[i13 + 4 >> 2] | 0;
   i12 = i8;
   HEAP32[i12 >> 2] = HEAP32[i13 >> 2];
   HEAP32[i12 + 4 >> 2] = i11;
   HEAP32[i8 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   i8 = HEAP32[i7 >> 2] | 0;
   HEAP32[i7 >> 2] = i8 + 16;
   i12 = i2;
   i11 = HEAP32[i12 + 4 >> 2] | 0;
   i6 = i8;
   HEAP32[i6 >> 2] = HEAP32[i12 >> 2];
   HEAP32[i6 + 4 >> 2] = i11;
   HEAP32[i8 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   i2 = HEAP32[i7 >> 2] | 0;
   HEAP32[i7 >> 2] = i2 + 16;
   i8 = i3;
   i6 = HEAP32[i8 + 4 >> 2] | 0;
   i3 = i2;
   HEAP32[i3 >> 2] = HEAP32[i8 >> 2];
   HEAP32[i3 + 4 >> 2] = i6;
   HEAP32[i2 + 8 >> 2] = HEAP32[i4 >> 2];
   _luaD_call(i5, (HEAP32[i7 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i5 + 16 >> 2] | 0) + 18 | 0] & 1);
   i3 = HEAP32[i10 >> 2] | 0;
   i2 = HEAP32[i7 >> 2] | 0;
   i5 = i2 + -16 | 0;
   HEAP32[i7 >> 2] = i5;
   i6 = HEAP32[i5 + 4 >> 2] | 0;
   i8 = i3 + i9 | 0;
   HEAP32[i8 >> 2] = HEAP32[i5 >> 2];
   HEAP32[i8 + 4 >> 2] = i6;
   HEAP32[i3 + (i9 + 8) >> 2] = HEAP32[i2 + -8 >> 2];
   i3 = HEAP32[i7 >> 2] | 0;
   i2 = HEAP32[i3 + 8 >> 2] | 0;
   if ((i2 | 0) != 0) {
    if ((i2 | 0) == 1) {
     i2 = (HEAP32[i3 >> 2] | 0) != 0;
    } else {
     i2 = 1;
    }
   } else {
    i2 = 0;
   }
   i13 = i2 & 1 ^ 1;
   STACKTOP = i1;
   return i13 | 0;
  }
 }
 i10 = i5 + 28 | 0;
 i13 = i8 - (HEAP32[i10 >> 2] | 0) | 0;
 i11 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = i11 + 16;
 i6 = i9;
 i8 = HEAP32[i6 + 4 >> 2] | 0;
 i12 = i11;
 HEAP32[i12 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i12 + 4 >> 2] = i8;
 HEAP32[i11 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
 i9 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = i9 + 16;
 i11 = i3;
 i12 = HEAP32[i11 + 4 >> 2] | 0;
 i3 = i9;
 HEAP32[i3 >> 2] = HEAP32[i11 >> 2];
 HEAP32[i3 + 4 >> 2] = i12;
 HEAP32[i9 + 8 >> 2] = HEAP32[i4 >> 2];
 i3 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = i3 + 16;
 i9 = i2;
 i12 = HEAP32[i9 + 4 >> 2] | 0;
 i11 = i3;
 HEAP32[i11 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i11 + 4 >> 2] = i12;
 HEAP32[i3 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
 _luaD_call(i5, (HEAP32[i7 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i5 + 16 >> 2] | 0) + 18 | 0] & 1);
 i2 = HEAP32[i10 >> 2] | 0;
 i3 = HEAP32[i7 >> 2] | 0;
 i10 = i3 + -16 | 0;
 HEAP32[i7 >> 2] = i10;
 i11 = HEAP32[i10 + 4 >> 2] | 0;
 i12 = i2 + i13 | 0;
 HEAP32[i12 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i12 + 4 >> 2] = i11;
 HEAP32[i2 + (i13 + 8) >> 2] = HEAP32[i3 + -8 >> 2];
 i2 = HEAP32[i7 >> 2] | 0;
 i3 = HEAP32[i2 + 8 >> 2] | 0;
 if ((i3 | 0) != 0) {
  if ((i3 | 0) == 1) {
   i2 = (HEAP32[i2 >> 2] | 0) != 0;
  } else {
   i2 = 1;
  }
 } else {
  i2 = 0;
 }
 i13 = i2 & 1;
 STACKTOP = i1;
 return i13 | 0;
}
function ___udivmoddi4(i6, i8, i2, i4, i1) {
 i6 = i6 | 0;
 i8 = i8 | 0;
 i2 = i2 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i3 = 0, i5 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i5 = i6;
 i9 = i8;
 i7 = i9;
 i10 = i2;
 i3 = i4;
 i11 = i3;
 if ((i7 | 0) == 0) {
  i2 = (i1 | 0) != 0;
  if ((i11 | 0) == 0) {
   if (i2) {
    HEAP32[i1 >> 2] = (i5 >>> 0) % (i10 >>> 0);
    HEAP32[i1 + 4 >> 2] = 0;
   }
   i11 = 0;
   i12 = (i5 >>> 0) / (i10 >>> 0) >>> 0;
   return (tempRet0 = i11, i12) | 0;
  } else {
   if (!i2) {
    i11 = 0;
    i12 = 0;
    return (tempRet0 = i11, i12) | 0;
   }
   HEAP32[i1 >> 2] = i6 | 0;
   HEAP32[i1 + 4 >> 2] = i8 & 0;
   i11 = 0;
   i12 = 0;
   return (tempRet0 = i11, i12) | 0;
  }
 }
 i12 = (i11 | 0) == 0;
 do {
  if ((i10 | 0) != 0) {
   if (!i12) {
    i10 = (_llvm_ctlz_i32(i11 | 0) | 0) - (_llvm_ctlz_i32(i7 | 0) | 0) | 0;
    if (i10 >>> 0 <= 31) {
     i11 = i10 + 1 | 0;
     i12 = 31 - i10 | 0;
     i8 = i10 - 31 >> 31;
     i9 = i11;
     i6 = i5 >>> (i11 >>> 0) & i8 | i7 << i12;
     i8 = i7 >>> (i11 >>> 0) & i8;
     i11 = 0;
     i7 = i5 << i12;
     break;
    }
    if ((i1 | 0) == 0) {
     i11 = 0;
     i12 = 0;
     return (tempRet0 = i11, i12) | 0;
    }
    HEAP32[i1 >> 2] = i6 | 0;
    HEAP32[i1 + 4 >> 2] = i9 | i8 & 0;
    i11 = 0;
    i12 = 0;
    return (tempRet0 = i11, i12) | 0;
   }
   i11 = i10 - 1 | 0;
   if ((i11 & i10 | 0) != 0) {
    i12 = (_llvm_ctlz_i32(i10 | 0) | 0) + 33 - (_llvm_ctlz_i32(i7 | 0) | 0) | 0;
    i15 = 64 - i12 | 0;
    i10 = 32 - i12 | 0;
    i13 = i10 >> 31;
    i14 = i12 - 32 | 0;
    i8 = i14 >> 31;
    i9 = i12;
    i6 = i10 - 1 >> 31 & i7 >>> (i14 >>> 0) | (i7 << i10 | i5 >>> (i12 >>> 0)) & i8;
    i8 = i8 & i7 >>> (i12 >>> 0);
    i11 = i5 << i15 & i13;
    i7 = (i7 << i15 | i5 >>> (i14 >>> 0)) & i13 | i5 << i10 & i12 - 33 >> 31;
    break;
   }
   if ((i1 | 0) != 0) {
    HEAP32[i1 >> 2] = i11 & i5;
    HEAP32[i1 + 4 >> 2] = 0;
   }
   if ((i10 | 0) == 1) {
    i14 = i9 | i8 & 0;
    i15 = i6 | 0 | 0;
    return (tempRet0 = i14, i15) | 0;
   } else {
    i15 = _llvm_cttz_i32(i10 | 0) | 0;
    i14 = i7 >>> (i15 >>> 0) | 0;
    i15 = i7 << 32 - i15 | i5 >>> (i15 >>> 0) | 0;
    return (tempRet0 = i14, i15) | 0;
   }
  } else {
   if (i12) {
    if ((i1 | 0) != 0) {
     HEAP32[i1 >> 2] = (i7 >>> 0) % (i10 >>> 0);
     HEAP32[i1 + 4 >> 2] = 0;
    }
    i14 = 0;
    i15 = (i7 >>> 0) / (i10 >>> 0) >>> 0;
    return (tempRet0 = i14, i15) | 0;
   }
   if ((i5 | 0) == 0) {
    if ((i1 | 0) != 0) {
     HEAP32[i1 >> 2] = 0;
     HEAP32[i1 + 4 >> 2] = (i7 >>> 0) % (i11 >>> 0);
    }
    i14 = 0;
    i15 = (i7 >>> 0) / (i11 >>> 0) >>> 0;
    return (tempRet0 = i14, i15) | 0;
   }
   i10 = i11 - 1 | 0;
   if ((i10 & i11 | 0) == 0) {
    if ((i1 | 0) != 0) {
     HEAP32[i1 >> 2] = i6 | 0;
     HEAP32[i1 + 4 >> 2] = i10 & i7 | i8 & 0;
    }
    i14 = 0;
    i15 = i7 >>> ((_llvm_cttz_i32(i11 | 0) | 0) >>> 0);
    return (tempRet0 = i14, i15) | 0;
   }
   i10 = (_llvm_ctlz_i32(i11 | 0) | 0) - (_llvm_ctlz_i32(i7 | 0) | 0) | 0;
   if (i10 >>> 0 <= 30) {
    i8 = i10 + 1 | 0;
    i15 = 31 - i10 | 0;
    i9 = i8;
    i6 = i7 << i15 | i5 >>> (i8 >>> 0);
    i8 = i7 >>> (i8 >>> 0);
    i11 = 0;
    i7 = i5 << i15;
    break;
   }
   if ((i1 | 0) == 0) {
    i14 = 0;
    i15 = 0;
    return (tempRet0 = i14, i15) | 0;
   }
   HEAP32[i1 >> 2] = i6 | 0;
   HEAP32[i1 + 4 >> 2] = i9 | i8 & 0;
   i14 = 0;
   i15 = 0;
   return (tempRet0 = i14, i15) | 0;
  }
 } while (0);
 if ((i9 | 0) == 0) {
  i12 = i6;
  i2 = 0;
  i6 = 0;
 } else {
  i2 = i2 | 0 | 0;
  i3 = i3 | i4 & 0;
  i4 = _i64Add(i2, i3, -1, -1) | 0;
  i5 = tempRet0;
  i10 = i8;
  i12 = i6;
  i6 = 0;
  while (1) {
   i8 = i11 >>> 31 | i7 << 1;
   i11 = i6 | i11 << 1;
   i7 = i12 << 1 | i7 >>> 31 | 0;
   i10 = i12 >>> 31 | i10 << 1 | 0;
   _i64Subtract(i4, i5, i7, i10) | 0;
   i12 = tempRet0;
   i15 = i12 >> 31 | ((i12 | 0) < 0 ? -1 : 0) << 1;
   i6 = i15 & 1;
   i12 = _i64Subtract(i7, i10, i15 & i2, (((i12 | 0) < 0 ? -1 : 0) >> 31 | ((i12 | 0) < 0 ? -1 : 0) << 1) & i3) | 0;
   i10 = tempRet0;
   i9 = i9 - 1 | 0;
   if ((i9 | 0) == 0) {
    break;
   } else {
    i7 = i8;
   }
  }
  i7 = i8;
  i8 = i10;
  i2 = 0;
 }
 i3 = 0;
 if ((i1 | 0) != 0) {
  HEAP32[i1 >> 2] = i12;
  HEAP32[i1 + 4 >> 2] = i8;
 }
 i14 = (i11 | 0) >>> 31 | (i7 | i3) << 1 | (i3 << 1 | i11 >>> 31) & 0 | i2;
 i15 = (i11 << 1 | 0 >>> 31) & -2 | i6;
 return (tempRet0 = i14, i15) | 0;
}
function _leaveblock(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 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;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i3;
 i7 = i1 + 16 | 0;
 i4 = HEAP32[i7 >> 2] | 0;
 i2 = i1 + 12 | 0;
 i6 = HEAP32[i2 >> 2] | 0;
 if ((HEAP32[i4 >> 2] | 0) != 0 ? (HEAP8[i4 + 9 | 0] | 0) != 0 : 0) {
  i16 = _luaK_jump(i1) | 0;
  _luaK_patchclose(i1, i16, HEAPU8[i4 + 8 | 0] | 0);
  _luaK_patchtohere(i1, i16);
 }
 L5 : do {
  if ((HEAP8[i4 + 10 | 0] | 0) != 0) {
   i15 = i6 + 52 | 0;
   i14 = _luaS_new(HEAP32[i15 >> 2] | 0, 6304) | 0;
   i13 = i6 + 64 | 0;
   i16 = HEAP32[i13 >> 2] | 0;
   i10 = i16 + 24 | 0;
   i8 = i6 + 48 | 0;
   i11 = HEAP32[(HEAP32[i8 >> 2] | 0) + 20 >> 2] | 0;
   i12 = i16 + 28 | 0;
   i9 = HEAP32[i12 >> 2] | 0;
   i16 = i16 + 32 | 0;
   if ((i9 | 0) < (HEAP32[i16 >> 2] | 0)) {
    i15 = HEAP32[i10 >> 2] | 0;
   } else {
    i15 = _luaM_growaux_(HEAP32[i15 >> 2] | 0, HEAP32[i10 >> 2] | 0, i16, 16, 32767, 6312) | 0;
    HEAP32[i10 >> 2] = i15;
   }
   HEAP32[i15 + (i9 << 4) >> 2] = i14;
   i16 = HEAP32[i10 >> 2] | 0;
   HEAP32[i16 + (i9 << 4) + 8 >> 2] = 0;
   HEAP8[i16 + (i9 << 4) + 12 | 0] = HEAP8[(HEAP32[i8 >> 2] | 0) + 46 | 0] | 0;
   HEAP32[(HEAP32[i10 >> 2] | 0) + (i9 << 4) + 4 >> 2] = i11;
   HEAP32[i12 >> 2] = (HEAP32[i12 >> 2] | 0) + 1;
   i10 = HEAP32[i13 >> 2] | 0;
   i9 = (HEAP32[i10 + 24 >> 2] | 0) + (i9 << 4) | 0;
   i11 = HEAP16[(HEAP32[(HEAP32[i8 >> 2] | 0) + 16 >> 2] | 0) + 6 >> 1] | 0;
   i8 = i10 + 16 | 0;
   if ((i11 | 0) < (HEAP32[i8 >> 2] | 0)) {
    i10 = i10 + 12 | 0;
    do {
     while (1) {
      if ((_luaS_eqstr(HEAP32[(HEAP32[i10 >> 2] | 0) + (i11 << 4) >> 2] | 0, HEAP32[i9 >> 2] | 0) | 0) == 0) {
       break;
      }
      _closegoto(i6, i11, i9);
      if ((i11 | 0) >= (HEAP32[i8 >> 2] | 0)) {
       break L5;
      }
     }
     i11 = i11 + 1 | 0;
    } while ((i11 | 0) < (HEAP32[i8 >> 2] | 0));
   }
  }
 } while (0);
 HEAP32[i7 >> 2] = HEAP32[i4 >> 2];
 i7 = i4 + 8 | 0;
 i9 = HEAP8[i7] | 0;
 i10 = i1 + 46 | 0;
 i8 = (HEAP32[i2 >> 2] | 0) + 64 | 0;
 i14 = (HEAP32[i8 >> 2] | 0) + 4 | 0;
 HEAP32[i14 >> 2] = (i9 & 255) - (HEAPU8[i10] | 0) + (HEAP32[i14 >> 2] | 0);
 i14 = HEAP8[i10] | 0;
 if ((i14 & 255) > (i9 & 255)) {
  i13 = i1 + 20 | 0;
  i11 = i1 + 40 | 0;
  i12 = (HEAP32[i1 >> 2] | 0) + 24 | 0;
  do {
   i16 = HEAP32[i13 >> 2] | 0;
   i14 = i14 + -1 << 24 >> 24;
   HEAP8[i10] = i14;
   HEAP32[(HEAP32[i12 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[i8 >> 2] >> 2] | 0) + ((HEAP32[i11 >> 2] | 0) + (i14 & 255) << 1) >> 1] | 0) * 12 | 0) + 8 >> 2] = i16;
   i14 = HEAP8[i10] | 0;
  } while ((i14 & 255) > (i9 & 255));
 }
 HEAP8[i1 + 48 | 0] = i14;
 i10 = HEAP32[i6 + 64 >> 2] | 0;
 HEAP32[i10 + 28 >> 2] = HEAP16[i4 + 4 >> 1] | 0;
 i9 = HEAP16[i4 + 6 >> 1] | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  if ((i9 | 0) >= (HEAP32[i10 + 16 >> 2] | 0)) {
   STACKTOP = i3;
   return;
  }
  i10 = HEAP32[i10 + 12 >> 2] | 0;
  i11 = HEAP32[i10 + (i9 << 4) >> 2] | 0;
  if ((HEAP8[i11 + 4 | 0] | 0) != 4) {
   i16 = 6200;
   i15 = i6 + 52 | 0;
   i15 = HEAP32[i15 >> 2] | 0;
   i14 = i11 + 16 | 0;
   i13 = i10 + (i9 << 4) + 8 | 0;
   i13 = HEAP32[i13 >> 2] | 0;
   HEAP32[i5 >> 2] = i14;
   i14 = i5 + 4 | 0;
   HEAP32[i14 >> 2] = i13;
   i16 = _luaO_pushfstring(i15, i16, i5) | 0;
   _semerror(i6, i16);
  }
  i16 = (HEAP8[i11 + 6 | 0] | 0) != 0 ? 6160 : 6200;
  i15 = i6 + 52 | 0;
  i15 = HEAP32[i15 >> 2] | 0;
  i14 = i11 + 16 | 0;
  i13 = i10 + (i9 << 4) + 8 | 0;
  i13 = HEAP32[i13 >> 2] | 0;
  HEAP32[i5 >> 2] = i14;
  i14 = i5 + 4 | 0;
  HEAP32[i14 >> 2] = i13;
  i16 = _luaO_pushfstring(i15, i16, i5) | 0;
  _semerror(i6, i16);
 }
 i6 = HEAP32[i8 >> 2] | 0;
 i5 = i6 + 16 | 0;
 if ((i9 | 0) >= (HEAP32[i5 >> 2] | 0)) {
  STACKTOP = i3;
  return;
 }
 i6 = i6 + 12 | 0;
 i4 = i4 + 9 | 0;
 do {
  i10 = HEAP32[i6 >> 2] | 0;
  i8 = i10 + (i9 << 4) + 12 | 0;
  i11 = HEAP8[i7] | 0;
  i12 = i11 & 255;
  if ((HEAPU8[i8] | 0) > (i11 & 255)) {
   if ((HEAP8[i4] | 0) != 0) {
    _luaK_patchclose(i1, HEAP32[i10 + (i9 << 4) + 4 >> 2] | 0, i12);
    i11 = HEAP8[i7] | 0;
   }
   HEAP8[i8] = i11;
  }
  i9 = ((_findlabel(HEAP32[i2 >> 2] | 0, i9) | 0) == 0) + i9 | 0;
 } while ((i9 | 0) < (HEAP32[i5 >> 2] | 0));
 STACKTOP = i3;
 return;
}
function _getobjname(i3, i7, i9, i2) {
 i3 = i3 | 0;
 i7 = i7 | 0;
 i9 = i9 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 i4 = i3 + 12 | 0;
 L1 : while (1) {
  i13 = _luaF_getlocalname(i3, i9 + 1 | 0, i7) | 0;
  HEAP32[i2 >> 2] = i13;
  if ((i13 | 0) != 0) {
   i2 = 2040;
   i4 = 42;
   break;
  }
  if ((i7 | 0) <= 0) {
   i2 = 0;
   i4 = 42;
   break;
  }
  i6 = HEAP32[i4 >> 2] | 0;
  i8 = 0;
  i5 = -1;
  do {
   i12 = HEAP32[i6 + (i8 << 2) >> 2] | 0;
   i13 = i12 & 63;
   i11 = i12 >>> 6 & 255;
   switch (i13 | 0) {
   case 27:
    {
     i10 = i8;
     i5 = (i11 | 0) == (i9 | 0) ? i8 : i5;
     break;
    }
   case 30:
   case 29:
    {
     i10 = i8;
     i5 = (i11 | 0) > (i9 | 0) ? i5 : i8;
     break;
    }
   case 23:
    {
     i10 = (i12 >>> 14) + -131071 | 0;
     i13 = i8 + 1 + i10 | 0;
     i10 = ((i8 | 0) >= (i13 | 0) | (i13 | 0) > (i7 | 0) ? 0 : i10) + i8 | 0;
     break;
    }
   case 4:
    {
     if ((i11 | 0) > (i9 | 0)) {
      i10 = i8;
     } else {
      i10 = i8;
      i5 = (i11 + (i12 >>> 23) | 0) < (i9 | 0) ? i5 : i8;
     }
     break;
    }
   case 34:
    {
     i10 = i8;
     i5 = (i11 + 2 | 0) > (i9 | 0) ? i5 : i8;
     break;
    }
   default:
    {
     i10 = i8;
     i5 = (HEAP8[5584 + i13 | 0] & 64) != 0 & (i11 | 0) == (i9 | 0) ? i8 : i5;
    }
   }
   i8 = i10 + 1 | 0;
  } while ((i8 | 0) < (i7 | 0));
  if ((i5 | 0) == -1) {
   i2 = 0;
   i4 = 42;
   break;
  }
  i7 = HEAP32[i6 + (i5 << 2) >> 2] | 0;
  i9 = i7 & 63;
  switch (i9 | 0) {
  case 0:
   {
    break;
   }
  case 7:
  case 6:
   {
    i4 = 17;
    break L1;
   }
  case 5:
   {
    i4 = 29;
    break L1;
   }
  case 1:
   {
    i4 = 32;
    break L1;
   }
  case 2:
   {
    i4 = 33;
    break L1;
   }
  case 12:
   {
    i4 = 36;
    break L1;
   }
  default:
   {
    i2 = 0;
    i4 = 42;
    break L1;
   }
  }
  i9 = i7 >>> 23;
  if (i9 >>> 0 < (i7 >>> 6 & 255) >>> 0) {
   i7 = i5;
  } else {
   i2 = 0;
   i4 = 42;
   break;
  }
 }
 if ((i4 | 0) == 17) {
  i6 = i7 >>> 14;
  i8 = i6 & 511;
  i7 = i7 >>> 23;
  if ((i9 | 0) != 7) {
   i7 = HEAP32[(HEAP32[i3 + 28 >> 2] | 0) + (i7 << 3) >> 2] | 0;
   if ((i7 | 0) == 0) {
    i7 = 2104;
   } else {
    i7 = i7 + 16 | 0;
   }
  } else {
   i7 = _luaF_getlocalname(i3, i7 + 1 | 0, i5) | 0;
  }
  if ((i6 & 256 | 0) == 0) {
   i3 = _getobjname(i3, i5, i8, i2) | 0;
   if (!((i3 | 0) != 0 ? (HEAP8[i3] | 0) == 99 : 0)) {
    i4 = 26;
   }
  } else {
   i5 = i6 & 255;
   i3 = HEAP32[i3 + 8 >> 2] | 0;
   if ((HEAP32[i3 + (i5 << 4) + 8 >> 2] & 15 | 0) == 4) {
    HEAP32[i2 >> 2] = (HEAP32[i3 + (i5 << 4) >> 2] | 0) + 16;
   } else {
    i4 = 26;
   }
  }
  if ((i4 | 0) == 26) {
   HEAP32[i2 >> 2] = 2104;
  }
  if ((i7 | 0) == 0) {
   i13 = 2064;
   STACKTOP = i1;
   return i13 | 0;
  }
  i13 = (_strcmp(i7, 2048) | 0) == 0;
  i13 = i13 ? 2056 : 2064;
  STACKTOP = i1;
  return i13 | 0;
 } else if ((i4 | 0) == 29) {
  i3 = HEAP32[(HEAP32[i3 + 28 >> 2] | 0) + (i7 >>> 23 << 3) >> 2] | 0;
  if ((i3 | 0) == 0) {
   i3 = 2104;
  } else {
   i3 = i3 + 16 | 0;
  }
  HEAP32[i2 >> 2] = i3;
  i13 = 2072;
  STACKTOP = i1;
  return i13 | 0;
 } else if ((i4 | 0) == 32) {
  i5 = i7 >>> 14;
 } else if ((i4 | 0) == 33) {
  i5 = (HEAP32[i6 + (i5 + 1 << 2) >> 2] | 0) >>> 6;
 } else if ((i4 | 0) == 36) {
  i4 = i7 >>> 14;
  if ((i4 & 256 | 0) == 0) {
   i3 = _getobjname(i3, i5, i4 & 511, i2) | 0;
   if ((i3 | 0) != 0 ? (HEAP8[i3] | 0) == 99 : 0) {
    i13 = 2096;
    STACKTOP = i1;
    return i13 | 0;
   }
  } else {
   i4 = i4 & 255;
   i3 = HEAP32[i3 + 8 >> 2] | 0;
   if ((HEAP32[i3 + (i4 << 4) + 8 >> 2] & 15 | 0) == 4) {
    HEAP32[i2 >> 2] = (HEAP32[i3 + (i4 << 4) >> 2] | 0) + 16;
    i13 = 2096;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
  HEAP32[i2 >> 2] = 2104;
  i13 = 2096;
  STACKTOP = i1;
  return i13 | 0;
 } else if ((i4 | 0) == 42) {
  STACKTOP = i1;
  return i2 | 0;
 }
 i3 = HEAP32[i3 + 8 >> 2] | 0;
 if ((HEAP32[i3 + (i5 << 4) + 8 >> 2] & 15 | 0) != 4) {
  i13 = 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 HEAP32[i2 >> 2] = (HEAP32[i3 + (i5 << 4) >> 2] | 0) + 16;
 i13 = 2080;
 STACKTOP = i1;
 return i13 | 0;
}
function _assignment(i2, i16, i5) {
 i2 = i2 | 0;
 i16 = i16 | 0;
 i5 = i5 | 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, i15 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 80 | 0;
 i6 = i3 + 56 | 0;
 i1 = i3 + 32 | 0;
 i8 = i3;
 i4 = i16 + 8 | 0;
 if (!(((HEAP32[i4 >> 2] | 0) + -7 | 0) >>> 0 < 3)) {
  _luaX_syntaxerror(i2, 6344);
 }
 i13 = i2 + 16 | 0;
 i14 = HEAP32[i13 >> 2] | 0;
 do {
  if ((i14 | 0) == 44) {
   _luaX_next(i2);
   HEAP32[i8 >> 2] = i16;
   i14 = i8 + 8 | 0;
   _suffixedexp(i2, i14);
   i15 = i2 + 48 | 0;
   if ((HEAP32[i14 >> 2] | 0) != 9 ? (i10 = HEAP32[i15 >> 2] | 0, i11 = HEAP8[i10 + 48 | 0] | 0, i9 = i11 & 255, (i16 | 0) != 0) : 0) {
    i13 = i8 + 16 | 0;
    i12 = i11 & 255;
    i18 = 0;
    do {
     if ((HEAP32[i16 + 8 >> 2] | 0) == 9) {
      i17 = i16 + 16 | 0;
      i19 = i17 + 3 | 0;
      i20 = HEAPU8[i19] | 0;
      i21 = HEAP32[i14 >> 2] | 0;
      if ((i20 | 0) == (i21 | 0)) {
       i21 = i17 + 2 | 0;
       if ((HEAPU8[i21] | 0) == (HEAP32[i13 >> 2] | 0)) {
        HEAP8[i19] = 7;
        HEAP8[i21] = i11;
        i20 = HEAP32[i14 >> 2] | 0;
        i18 = 1;
       }
      } else {
       i20 = i21;
      }
      if ((i20 | 0) == 7 ? (HEAP16[i17 >> 1] | 0) == (HEAP32[i13 >> 2] | 0) : 0) {
       HEAP16[i17 >> 1] = i12;
       i18 = 1;
      }
     }
     i16 = HEAP32[i16 >> 2] | 0;
    } while ((i16 | 0) != 0);
    if ((i18 | 0) != 0) {
     _luaK_codeABC(i10, (HEAP32[i14 >> 2] | 0) == 7 ? 0 : 5, i9, HEAP32[i13 >> 2] | 0, 0) | 0;
     _luaK_reserveregs(i10, 1);
    }
   }
   i9 = HEAP32[i15 >> 2] | 0;
   if (((HEAPU16[(HEAP32[i2 + 52 >> 2] | 0) + 38 >> 1] | 0) + i5 | 0) <= 200) {
    _assignment(i2, i8, i5 + 1 | 0);
    i7 = i1;
    break;
   }
   i8 = i9 + 12 | 0;
   i5 = HEAP32[(HEAP32[i8 >> 2] | 0) + 52 >> 2] | 0;
   i9 = HEAP32[(HEAP32[i9 >> 2] | 0) + 64 >> 2] | 0;
   if ((i9 | 0) == 0) {
    i20 = 6552;
    HEAP32[i6 >> 2] = 6360;
    i21 = i6 + 4 | 0;
    HEAP32[i21 >> 2] = 200;
    i21 = i6 + 8 | 0;
    HEAP32[i21 >> 2] = i20;
    i21 = _luaO_pushfstring(i5, 6592, i6) | 0;
    i20 = HEAP32[i8 >> 2] | 0;
    _luaX_syntaxerror(i20, i21);
   }
   HEAP32[i6 >> 2] = i9;
   i20 = _luaO_pushfstring(i5, 6568, i6) | 0;
   HEAP32[i6 >> 2] = 6360;
   i21 = i6 + 4 | 0;
   HEAP32[i21 >> 2] = 200;
   i21 = i6 + 8 | 0;
   HEAP32[i21 >> 2] = i20;
   i21 = _luaO_pushfstring(i5, 6592, i6) | 0;
   i20 = HEAP32[i8 >> 2] | 0;
   _luaX_syntaxerror(i20, i21);
  } else if ((i14 | 0) == 61) {
   _luaX_next(i2);
   _subexpr(i2, i1, 0) | 0;
   i6 = i2 + 48 | 0;
   if ((HEAP32[i13 >> 2] | 0) == 44) {
    i9 = 1;
    do {
     _luaX_next(i2);
     _luaK_exp2nextreg(HEAP32[i6 >> 2] | 0, i1);
     _subexpr(i2, i1, 0) | 0;
     i9 = i9 + 1 | 0;
    } while ((HEAP32[i13 >> 2] | 0) == 44);
   } else {
    i9 = 1;
   }
   i8 = HEAP32[i6 >> 2] | 0;
   if ((i9 | 0) == (i5 | 0)) {
    _luaK_setoneret(i8, i1);
    _luaK_storevar(HEAP32[i6 >> 2] | 0, i4, i1);
    STACKTOP = i3;
    return;
   }
   i7 = i5 - i9 | 0;
   i10 = HEAP32[i1 >> 2] | 0;
   if ((i10 | 0) == 13 | (i10 | 0) == 12) {
    i10 = i7 + 1 | 0;
    i10 = (i10 | 0) < 0 ? 0 : i10;
    _luaK_setreturns(i8, i1, i10);
    if ((i10 | 0) > 1) {
     _luaK_reserveregs(i8, i10 + -1 | 0);
    }
   } else if ((i10 | 0) == 0) {
    i12 = 30;
   } else {
    _luaK_exp2nextreg(i8, i1);
    i12 = 30;
   }
   if ((i12 | 0) == 30 ? (i7 | 0) > 0 : 0) {
    i21 = HEAPU8[i8 + 48 | 0] | 0;
    _luaK_reserveregs(i8, i7);
    _luaK_nil(i8, i21, i7);
   }
   if ((i9 | 0) > (i5 | 0)) {
    i21 = (HEAP32[i6 >> 2] | 0) + 48 | 0;
    HEAP8[i21] = i7 + (HEAPU8[i21] | 0);
    i7 = i1;
   } else {
    i7 = i1;
   }
  } else {
   _error_expected(i2, 61);
  }
 } while (0);
 i21 = HEAP32[i2 + 48 >> 2] | 0;
 i20 = (HEAPU8[i21 + 48 | 0] | 0) + -1 | 0;
 HEAP32[i1 + 16 >> 2] = -1;
 HEAP32[i1 + 20 >> 2] = -1;
 HEAP32[i7 >> 2] = 6;
 HEAP32[i1 + 8 >> 2] = i20;
 _luaK_storevar(i21, i4, i1);
 STACKTOP = i3;
 return;
}
function _str_find_aux(i3, i7) {
 i3 = i3 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 288 | 0;
 i9 = i1 + 284 | 0;
 i5 = i1 + 280 | 0;
 i4 = i1;
 i2 = _luaL_checklstring(i3, 1, i9) | 0;
 i8 = _luaL_checklstring(i3, 2, i5) | 0;
 i12 = _luaL_optinteger(i3, 3, 1) | 0;
 i10 = HEAP32[i9 >> 2] | 0;
 if (!((i12 | 0) > -1)) {
  if (i10 >>> 0 < (0 - i12 | 0) >>> 0) {
   i12 = 1;
  } else {
   i12 = i12 + 1 + i10 | 0;
   i6 = 4;
  }
 } else {
  i6 = 4;
 }
 if ((i6 | 0) == 4) {
  if ((i12 | 0) != 0) {
   if (i12 >>> 0 > (i10 + 1 | 0) >>> 0) {
    _lua_pushnil(i3);
    i13 = 1;
    STACKTOP = i1;
    return i13 | 0;
   }
  } else {
   i12 = 1;
  }
 }
 i7 = (i7 | 0) != 0;
 L10 : do {
  if (i7) {
   i13 = (_lua_toboolean(i3, 4) | 0) == 0;
   i10 = HEAP32[i5 >> 2] | 0;
   if (i13) {
    i11 = 0;
    do {
     i13 = i8 + i11 | 0;
     if ((_strpbrk(i13, 7512) | 0) != 0) {
      i6 = 20;
      break L10;
     }
     i11 = i11 + 1 + (_strlen(i13 | 0) | 0) | 0;
    } while (!(i11 >>> 0 > i10 >>> 0));
   }
   i11 = i2 + (i12 + -1) | 0;
   i9 = (HEAP32[i9 >> 2] | 0) - i12 + 1 | 0;
   L17 : do {
    if ((i10 | 0) == 0) {
     if ((i11 | 0) == 0) {
      break L10;
     }
    } else {
     if (i10 >>> 0 > i9 >>> 0) {
      break L10;
     }
     i4 = i10 + -1 | 0;
     if ((i4 | 0) == (i9 | 0)) {
      break L10;
     }
     i7 = HEAP8[i8] | 0;
     i8 = i8 + 1 | 0;
     i9 = i9 - i4 | 0;
     i12 = i11;
     while (1) {
      i11 = _memchr(i12, i7, i9) | 0;
      if ((i11 | 0) == 0) {
       break L10;
      }
      i10 = i11 + 1 | 0;
      if ((_memcmp(i10, i8, i4) | 0) == 0) {
       break L17;
      }
      i11 = i10;
      i9 = i12 + i9 | 0;
      if ((i9 | 0) == (i11 | 0)) {
       break L10;
      } else {
       i9 = i9 - i11 | 0;
       i12 = i10;
      }
     }
    }
   } while (0);
   i13 = i11 - i2 | 0;
   _lua_pushinteger(i3, i13 + 1 | 0);
   _lua_pushinteger(i3, i13 + (HEAP32[i5 >> 2] | 0) | 0);
   i13 = 2;
   STACKTOP = i1;
   return i13 | 0;
  } else {
   i6 = 20;
  }
 } while (0);
 L28 : do {
  if ((i6 | 0) == 20) {
   i6 = i2 + (i12 + -1) | 0;
   i10 = (HEAP8[i8] | 0) == 94;
   if (i10) {
    i12 = (HEAP32[i5 >> 2] | 0) + -1 | 0;
    HEAP32[i5 >> 2] = i12;
    i8 = i8 + 1 | 0;
   } else {
    i12 = HEAP32[i5 >> 2] | 0;
   }
   i5 = i4 + 16 | 0;
   HEAP32[i5 >> 2] = i3;
   HEAP32[i4 >> 2] = 200;
   HEAP32[i4 + 4 >> 2] = i2;
   i11 = i4 + 8 | 0;
   HEAP32[i11 >> 2] = i2 + (HEAP32[i9 >> 2] | 0);
   HEAP32[i4 + 12 >> 2] = i8 + i12;
   i9 = i4 + 20 | 0;
   L34 : do {
    if (i10) {
     HEAP32[i9 >> 2] = 0;
     i8 = _match(i4, i6, i8) | 0;
     if ((i8 | 0) == 0) {
      break L28;
     }
    } else {
     while (1) {
      HEAP32[i9 >> 2] = 0;
      i10 = _match(i4, i6, i8) | 0;
      if ((i10 | 0) != 0) {
       i8 = i10;
       break L34;
      }
      if (!(i6 >>> 0 < (HEAP32[i11 >> 2] | 0) >>> 0)) {
       break L28;
      }
      i6 = i6 + 1 | 0;
     }
    }
   } while (0);
   if (i7) {
    _lua_pushinteger(i3, 1 - i2 + i6 | 0);
    _lua_pushinteger(i3, i8 - i2 | 0);
    i2 = HEAP32[i9 >> 2] | 0;
    _luaL_checkstack(HEAP32[i5 >> 2] | 0, i2, 7200);
    if ((i2 | 0) > 0) {
     i3 = 0;
     do {
      _push_onecapture(i4, i3, 0, 0);
      i3 = i3 + 1 | 0;
     } while ((i3 | 0) != (i2 | 0));
    }
    i13 = i2 + 2 | 0;
    STACKTOP = i1;
    return i13 | 0;
   } else {
    i3 = HEAP32[i9 >> 2] | 0;
    i2 = (i3 | 0) != 0 | (i6 | 0) == 0 ? i3 : 1;
    _luaL_checkstack(HEAP32[i5 >> 2] | 0, i2, 7200);
    if ((i2 | 0) > 0) {
     i3 = 0;
    } else {
     i13 = i3;
     STACKTOP = i1;
     return i13 | 0;
    }
    do {
     _push_onecapture(i4, i3, i6, i8);
     i3 = i3 + 1 | 0;
    } while ((i3 | 0) != (i2 | 0));
    STACKTOP = i1;
    return i2 | 0;
   }
  }
 } while (0);
 _lua_pushnil(i3);
 i13 = 1;
 STACKTOP = i1;
 return i13 | 0;
}
function _luaO_pushvfstring(i2, i13, i10) {
 i2 = i2 | 0;
 i13 = i13 | 0;
 i10 = i10 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i11 = 0, i12 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, d18 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i7 = i3;
 i9 = i3 + 32 | 0;
 i8 = i3 + 8 | 0;
 i14 = _strchr(i13, 37) | 0;
 i6 = i2 + 24 | 0;
 i4 = i2 + 8 | 0;
 i15 = HEAP32[i4 >> 2] | 0;
 i17 = (HEAP32[i6 >> 2] | 0) - i15 | 0;
 L1 : do {
  if ((i14 | 0) == 0) {
   i5 = i13;
   i11 = i17;
   i12 = i15;
   i1 = 0;
  } else {
   i16 = 0;
   L3 : while (1) {
    if ((i17 | 0) < 48) {
     _luaD_growstack(i2, 2);
     i15 = HEAP32[i4 >> 2] | 0;
    }
    HEAP32[i4 >> 2] = i15 + 16;
    i13 = _luaS_newlstr(i2, i13, i14 - i13 | 0) | 0;
    HEAP32[i15 >> 2] = i13;
    HEAP32[i15 + 8 >> 2] = HEAPU8[i13 + 4 | 0] | 64;
    i13 = HEAP8[i14 + 1 | 0] | 0;
    switch (i13 | 0) {
    case 115:
     {
      i17 = HEAP32[i10 >> 2] | 0;
      i13 = HEAP32[i17 >> 2] | 0;
      HEAP32[i10 >> 2] = i17 + 4;
      i13 = (i13 | 0) == 0 ? 5480 : i13;
      i15 = _strlen(i13 | 0) | 0;
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i15 = _luaS_newlstr(i2, i13, i15) | 0;
      HEAP32[i17 >> 2] = i15;
      HEAP32[i17 + 8 >> 2] = HEAPU8[i15 + 4 | 0] | 64;
      break;
     }
    case 100:
     {
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i13 = HEAP32[i10 >> 2] | 0;
      i15 = HEAP32[i13 >> 2] | 0;
      HEAP32[i10 >> 2] = i13 + 4;
      HEAPF64[i17 >> 3] = +(i15 | 0);
      HEAP32[i17 + 8 >> 2] = 3;
      break;
     }
    case 37:
     {
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i15 = _luaS_newlstr(i2, 5496, 1) | 0;
      HEAP32[i17 >> 2] = i15;
      HEAP32[i17 + 8 >> 2] = HEAPU8[i15 + 4 | 0] | 64;
      break;
     }
    case 99:
     {
      i15 = HEAP32[i10 >> 2] | 0;
      i17 = HEAP32[i15 >> 2] | 0;
      HEAP32[i10 >> 2] = i15 + 4;
      HEAP8[i9] = i17;
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i15 = _luaS_newlstr(i2, i9, 1) | 0;
      HEAP32[i17 >> 2] = i15;
      HEAP32[i17 + 8 >> 2] = HEAPU8[i15 + 4 | 0] | 64;
      break;
     }
    case 102:
     {
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i15 = HEAP32[i10 >> 2] | 0;
      d18 = +HEAPF64[i15 >> 3];
      HEAP32[i10 >> 2] = i15 + 8;
      HEAPF64[i17 >> 3] = d18;
      HEAP32[i17 + 8 >> 2] = 3;
      break;
     }
    case 112:
     {
      i17 = HEAP32[i10 >> 2] | 0;
      i15 = HEAP32[i17 >> 2] | 0;
      HEAP32[i10 >> 2] = i17 + 4;
      HEAP32[i7 >> 2] = i15;
      i15 = _sprintf(i8 | 0, 5488, i7 | 0) | 0;
      i17 = HEAP32[i4 >> 2] | 0;
      HEAP32[i4 >> 2] = i17 + 16;
      i15 = _luaS_newlstr(i2, i8, i15) | 0;
      HEAP32[i17 >> 2] = i15;
      HEAP32[i17 + 8 >> 2] = HEAPU8[i15 + 4 | 0] | 64;
      break;
     }
    default:
     {
      break L3;
     }
    }
    i16 = i16 + 2 | 0;
    i13 = i14 + 2 | 0;
    i14 = _strchr(i13, 37) | 0;
    i15 = HEAP32[i4 >> 2] | 0;
    i17 = (HEAP32[i6 >> 2] | 0) - i15 | 0;
    if ((i14 | 0) == 0) {
     i5 = i13;
     i11 = i17;
     i12 = i15;
     i1 = i16;
     break L1;
    }
   }
   HEAP32[i7 >> 2] = i13;
   _luaG_runerror(i2, 5504, i7);
  }
 } while (0);
 if ((i11 | 0) < 32) {
  _luaD_growstack(i2, 1);
  i12 = HEAP32[i4 >> 2] | 0;
 }
 i17 = _strlen(i5 | 0) | 0;
 HEAP32[i4 >> 2] = i12 + 16;
 i17 = _luaS_newlstr(i2, i5, i17) | 0;
 HEAP32[i12 >> 2] = i17;
 HEAP32[i12 + 8 >> 2] = HEAPU8[i17 + 4 | 0] | 64;
 if ((i1 | 0) <= 0) {
  i17 = HEAP32[i4 >> 2] | 0;
  i17 = i17 + -16 | 0;
  i17 = HEAP32[i17 >> 2] | 0;
  i17 = i17 + 16 | 0;
  STACKTOP = i3;
  return i17 | 0;
 }
 _luaV_concat(i2, i1 | 1);
 i17 = HEAP32[i4 >> 2] | 0;
 i17 = i17 + -16 | 0;
 i17 = HEAP32[i17 >> 2] | 0;
 i17 = i17 + 16 | 0;
 STACKTOP = i3;
 return i17 | 0;
}
function _luaH_getn(i6) {
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, d11 = 0.0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 i3 = i6 + 28 | 0;
 i12 = HEAP32[i3 >> 2] | 0;
 if ((i12 | 0) != 0 ? (i4 = HEAP32[i6 + 12 >> 2] | 0, (HEAP32[i4 + (i12 + -1 << 4) + 8 >> 2] | 0) == 0) : 0) {
  if (i12 >>> 0 > 1) {
   i10 = 0;
  } else {
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
  do {
   i2 = (i10 + i12 | 0) >>> 1;
   i3 = (HEAP32[i4 + (i2 + -1 << 4) + 8 >> 2] | 0) == 0;
   i12 = i3 ? i2 : i12;
   i10 = i3 ? i10 : i2;
  } while ((i12 - i10 | 0) >>> 0 > 1);
  STACKTOP = i1;
  return i10 | 0;
 }
 i4 = i6 + 16 | 0;
 if ((HEAP32[i4 >> 2] | 0) == 8016) {
  i13 = i12;
  STACKTOP = i1;
  return i13 | 0;
 }
 i5 = i6 + 12 | 0;
 i6 = i6 + 7 | 0;
 i9 = i2 + 4 | 0;
 i8 = i12 + 1 | 0;
 i13 = i12;
 i10 = i12;
 while (1) {
  i12 = i8 + -1 | 0;
  L15 : do {
   if (i12 >>> 0 < i13 >>> 0) {
    i12 = (HEAP32[i5 >> 2] | 0) + (i12 << 4) | 0;
   } else {
    d11 = +(i8 | 0);
    HEAPF64[i2 >> 3] = d11 + 1.0;
    i13 = (HEAP32[i9 >> 2] | 0) + (HEAP32[i2 >> 2] | 0) | 0;
    if ((i13 | 0) < 0) {
     i12 = 0 - i13 | 0;
     i13 = (i13 | 0) == (i12 | 0) ? 0 : i12;
    }
    i12 = (HEAP32[i4 >> 2] | 0) + (((i13 | 0) % ((1 << (HEAPU8[i6] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
    while (1) {
     if ((HEAP32[i12 + 24 >> 2] | 0) == 3 ? +HEAPF64[i12 + 16 >> 3] == d11 : 0) {
      break;
     }
     i12 = HEAP32[i12 + 28 >> 2] | 0;
     if ((i12 | 0) == 0) {
      i12 = 5192;
      break L15;
     }
    }
   }
  } while (0);
  if ((HEAP32[i12 + 8 >> 2] | 0) == 0) {
   break;
  }
  i10 = i8 << 1;
  if (i10 >>> 0 > 2147483645) {
   i7 = 21;
   break;
  }
  i12 = i8;
  i8 = i10;
  i13 = HEAP32[i3 >> 2] | 0;
  i10 = i12;
 }
 if ((i7 | 0) == 21) {
  i8 = i2 + 4 | 0;
  i7 = 1;
  while (1) {
   i10 = i7 + -1 | 0;
   L34 : do {
    if (i10 >>> 0 < (HEAP32[i3 >> 2] | 0) >>> 0) {
     i9 = (HEAP32[i5 >> 2] | 0) + (i10 << 4) | 0;
    } else {
     d11 = +(i7 | 0);
     HEAPF64[i2 >> 3] = d11 + 1.0;
     i9 = (HEAP32[i8 >> 2] | 0) + (HEAP32[i2 >> 2] | 0) | 0;
     if ((i9 | 0) < 0) {
      i12 = 0 - i9 | 0;
      i9 = (i9 | 0) == (i12 | 0) ? 0 : i12;
     }
     i9 = (HEAP32[i4 >> 2] | 0) + (((i9 | 0) % ((1 << (HEAPU8[i6] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
     while (1) {
      if ((HEAP32[i9 + 24 >> 2] | 0) == 3 ? +HEAPF64[i9 + 16 >> 3] == d11 : 0) {
       break;
      }
      i9 = HEAP32[i9 + 28 >> 2] | 0;
      if ((i9 | 0) == 0) {
       i9 = 5192;
       break L34;
      }
     }
    }
   } while (0);
   if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
    break;
   }
   i7 = i7 + 1 | 0;
  }
  STACKTOP = i1;
  return i10 | 0;
 }
 if (!((i8 - i10 | 0) >>> 0 > 1)) {
  i13 = i10;
  STACKTOP = i1;
  return i13 | 0;
 }
 i7 = i2 + 4 | 0;
 do {
  i9 = (i8 + i10 | 0) >>> 1;
  i12 = i9 + -1 | 0;
  L55 : do {
   if (i12 >>> 0 < (HEAP32[i3 >> 2] | 0) >>> 0) {
    i12 = (HEAP32[i5 >> 2] | 0) + (i12 << 4) | 0;
   } else {
    d11 = +(i9 | 0);
    HEAPF64[i2 >> 3] = d11 + 1.0;
    i13 = (HEAP32[i7 >> 2] | 0) + (HEAP32[i2 >> 2] | 0) | 0;
    if ((i13 | 0) < 0) {
     i12 = 0 - i13 | 0;
     i13 = (i13 | 0) == (i12 | 0) ? 0 : i12;
    }
    i12 = (HEAP32[i4 >> 2] | 0) + (((i13 | 0) % ((1 << (HEAPU8[i6] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
    while (1) {
     if ((HEAP32[i12 + 24 >> 2] | 0) == 3 ? +HEAPF64[i12 + 16 >> 3] == d11 : 0) {
      break;
     }
     i12 = HEAP32[i12 + 28 >> 2] | 0;
     if ((i12 | 0) == 0) {
      i12 = 5192;
      break L55;
     }
    }
   }
  } while (0);
  i12 = (HEAP32[i12 + 8 >> 2] | 0) == 0;
  i8 = i12 ? i9 : i8;
  i10 = i12 ? i10 : i9;
 } while ((i8 - i10 | 0) >>> 0 > 1);
 STACKTOP = i1;
 return i10 | 0;
}
function _lua_resume(i4, i3, i7) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 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 ((i3 | 0) == 0) {
  i5 = 1;
 } else {
  i5 = (HEAPU16[i3 + 38 >> 1] | 0) + 1 & 65535;
 }
 i3 = i4 + 38 | 0;
 HEAP16[i3 >> 1] = i5;
 i5 = i4 + 36 | 0;
 HEAP16[i5 >> 1] = 0;
 i6 = i4 + 8 | 0;
 i13 = _luaD_rawrunprotected(i4, 4, (HEAP32[i6 >> 2] | 0) + (0 - i7 << 4) | 0) | 0;
 if ((i13 | 0) == -1) {
  i18 = 2;
  HEAP16[i5 >> 1] = 1;
  i17 = HEAP16[i3 >> 1] | 0;
  i17 = i17 + -1 << 16 >> 16;
  HEAP16[i3 >> 1] = i17;
  STACKTOP = i1;
  return i18 | 0;
 }
 if (!(i13 >>> 0 > 1)) {
  i18 = i13;
  HEAP16[i5 >> 1] = 1;
  i17 = HEAP16[i3 >> 1] | 0;
  i17 = i17 + -1 << 16 >> 16;
  HEAP16[i3 >> 1] = i17;
  STACKTOP = i1;
  return i18 | 0;
 }
 i7 = i4 + 16 | 0;
 i12 = i4 + 28 | 0;
 i11 = i4 + 41 | 0;
 i10 = i4 + 68 | 0;
 i9 = i4 + 32 | 0;
 i8 = i4 + 12 | 0;
 L10 : while (1) {
  i15 = HEAP32[i7 >> 2] | 0;
  if ((i15 | 0) == 0) {
   break;
  }
  while (1) {
   i14 = i15 + 18 | 0;
   if (!((HEAP8[i14] & 16) == 0)) {
    break;
   }
   i15 = HEAP32[i15 + 8 >> 2] | 0;
   if ((i15 | 0) == 0) {
    break L10;
   }
  }
  i16 = HEAP32[i12 >> 2] | 0;
  i17 = HEAP32[i15 + 20 >> 2] | 0;
  i18 = i16 + i17 | 0;
  _luaF_close(i4, i18);
  if ((i13 | 0) == 4) {
   i19 = HEAP32[(HEAP32[i8 >> 2] | 0) + 180 >> 2] | 0;
   HEAP32[i18 >> 2] = i19;
   HEAP32[i16 + (i17 + 8) >> 2] = HEAPU8[i19 + 4 | 0] | 0 | 64;
  } else if ((i13 | 0) == 6) {
   i19 = _luaS_newlstr(i4, 2424, 23) | 0;
   HEAP32[i18 >> 2] = i19;
   HEAP32[i16 + (i17 + 8) >> 2] = HEAPU8[i19 + 4 | 0] | 0 | 64;
  } else {
   i19 = HEAP32[i6 >> 2] | 0;
   i21 = i19 + -16 | 0;
   i20 = HEAP32[i21 + 4 >> 2] | 0;
   HEAP32[i18 >> 2] = HEAP32[i21 >> 2];
   HEAP32[i18 + 4 >> 2] = i20;
   HEAP32[i16 + (i17 + 8) >> 2] = HEAP32[i19 + -8 >> 2];
  }
  i17 = i16 + (i17 + 16) | 0;
  HEAP32[i6 >> 2] = i17;
  HEAP32[i7 >> 2] = i15;
  HEAP8[i11] = HEAP8[i15 + 36 | 0] | 0;
  HEAP16[i5 >> 1] = 0;
  if ((i15 | 0) != 0) {
   i16 = i15;
   do {
    i18 = HEAP32[i16 + 4 >> 2] | 0;
    i17 = i17 >>> 0 < i18 >>> 0 ? i18 : i17;
    i16 = HEAP32[i16 + 8 >> 2] | 0;
   } while ((i16 | 0) != 0);
  }
  i16 = i17 - (HEAP32[i12 >> 2] | 0) | 0;
  i17 = (i16 >> 4) + 1 | 0;
  i17 = ((i17 | 0) / 8 | 0) + 10 + i17 | 0;
  i17 = (i17 | 0) > 1e6 ? 1e6 : i17;
  if ((i16 | 0) <= 15999984 ? (i17 | 0) < (HEAP32[i9 >> 2] | 0) : 0) {
   _luaD_reallocstack(i4, i17);
  }
  HEAP32[i10 >> 2] = HEAP32[i15 + 32 >> 2];
  HEAP8[i14] = HEAPU8[i14] | 0 | 32;
  HEAP8[i15 + 37 | 0] = i13;
  i13 = _luaD_rawrunprotected(i4, 5, 0) | 0;
  if (!(i13 >>> 0 > 1)) {
   i2 = 24;
   break;
  }
 }
 if ((i2 | 0) == 24) {
  HEAP16[i5 >> 1] = 1;
  i21 = HEAP16[i3 >> 1] | 0;
  i21 = i21 + -1 << 16 >> 16;
  HEAP16[i3 >> 1] = i21;
  STACKTOP = i1;
  return i13 | 0;
 }
 HEAP8[i4 + 6 | 0] = i13;
 i2 = HEAP32[i6 >> 2] | 0;
 if ((i13 | 0) == 4) {
  i21 = HEAP32[(HEAP32[i8 >> 2] | 0) + 180 >> 2] | 0;
  HEAP32[i2 >> 2] = i21;
  HEAP32[i2 + 8 >> 2] = HEAPU8[i21 + 4 | 0] | 0 | 64;
 } else if ((i13 | 0) == 6) {
  i21 = _luaS_newlstr(i4, 2424, 23) | 0;
  HEAP32[i2 >> 2] = i21;
  HEAP32[i2 + 8 >> 2] = HEAPU8[i21 + 4 | 0] | 0 | 64;
 } else {
  i19 = i2 + -16 | 0;
  i20 = HEAP32[i19 + 4 >> 2] | 0;
  i21 = i2;
  HEAP32[i21 >> 2] = HEAP32[i19 >> 2];
  HEAP32[i21 + 4 >> 2] = i20;
  HEAP32[i2 + 8 >> 2] = HEAP32[i2 + -8 >> 2];
 }
 i21 = i2 + 16 | 0;
 HEAP32[i6 >> 2] = i21;
 HEAP32[(HEAP32[i7 >> 2] | 0) + 4 >> 2] = i21;
 i21 = i13;
 HEAP16[i5 >> 1] = 1;
 i20 = HEAP16[i3 >> 1] | 0;
 i20 = i20 + -1 << 16 >> 16;
 HEAP16[i3 >> 1] = i20;
 STACKTOP = i1;
 return i21 | 0;
}
function _luaK_goiftrue(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i2 = STACKTOP;
 _luaK_dischargevars(i1, i3);
 i12 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i12 | 0) == 10) {
   i9 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
   i5 = i3 + 8 | 0;
   i8 = HEAP32[i5 >> 2] | 0;
   i7 = i9 + (i8 << 2) | 0;
   if (!((i8 | 0) > 0 ? (i10 = i9 + (i8 + -1 << 2) | 0, i6 = HEAP32[i10 >> 2] | 0, (HEAP8[5584 + (i6 & 63) | 0] | 0) < 0) : 0)) {
    i10 = i7;
    i6 = HEAP32[i7 >> 2] | 0;
   }
   HEAP32[i10 >> 2] = ((i6 & 16320 | 0) == 0) << 6 | i6 & -16321;
   i5 = HEAP32[i5 >> 2] | 0;
   i8 = 18;
  } else if (!((i12 | 0) == 2 | (i12 | 0) == 5 | (i12 | 0) == 4)) {
   i5 = i3 + 8 | 0;
   if ((i12 | 0) == 6) {
    i8 = 14;
   } else if ((i12 | 0) == 11 ? (i11 = HEAP32[(HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i5 >> 2] << 2) >> 2] | 0, (i11 & 63 | 0) == 20) : 0) {
    i5 = i1 + 20 | 0;
    HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + -1;
    i5 = _condjump(i1, 27, i11 >>> 23, 0, 1) | 0;
    i8 = 18;
    break;
   } else {
    i8 = 9;
   }
   if ((i8 | 0) == 9) {
    i12 = i1 + 48 | 0;
    i10 = HEAP8[i12] | 0;
    i11 = (i10 & 255) + 1 | 0;
    i6 = (HEAP32[i1 >> 2] | 0) + 78 | 0;
    do {
     if (i11 >>> 0 > (HEAPU8[i6] | 0) >>> 0) {
      if (i11 >>> 0 > 249) {
       _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10536);
      } else {
       HEAP8[i6] = i11;
       i9 = HEAP8[i12] | 0;
       break;
      }
     } else {
      i9 = i10;
     }
    } while (0);
    i11 = (i9 & 255) + 1 | 0;
    HEAP8[i12] = i11;
    _discharge2reg(i1, i3, (i11 & 255) + -1 | 0);
    if ((HEAP32[i3 >> 2] | 0) == 6) {
     i8 = 14;
    }
   }
   if (((i8 | 0) == 14 ? (i7 = HEAP32[i5 >> 2] | 0, (i7 & 256 | 0) == 0) : 0) ? (HEAPU8[i1 + 46 | 0] | 0) <= (i7 | 0) : 0) {
    i12 = i1 + 48 | 0;
    HEAP8[i12] = (HEAP8[i12] | 0) + -1 << 24 >> 24;
   }
   i5 = _condjump(i1, 28, 255, HEAP32[i5 >> 2] | 0, 0) | 0;
   i8 = 18;
  }
 } while (0);
 do {
  if ((i8 | 0) == 18 ? (i4 = i3 + 20 | 0, !((i5 | 0) == -1)) : 0) {
   i8 = HEAP32[i4 >> 2] | 0;
   if ((i8 | 0) == -1) {
    HEAP32[i4 >> 2] = i5;
    break;
   }
   i4 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
   while (1) {
    i7 = i4 + (i8 << 2) | 0;
    i6 = HEAP32[i7 >> 2] | 0;
    i9 = (i6 >>> 14) + -131071 | 0;
    if ((i9 | 0) == -1) {
     break;
    }
    i9 = i8 + 1 + i9 | 0;
    if ((i9 | 0) == -1) {
     break;
    } else {
     i8 = i9;
    }
   }
   i4 = i5 + ~i8 | 0;
   if ((((i4 | 0) > -1 ? i4 : 0 - i4 | 0) | 0) > 131071) {
    _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
   } else {
    HEAP32[i7 >> 2] = (i4 << 14) + 2147467264 | i6 & 16383;
    break;
   }
  }
 } while (0);
 i3 = i3 + 16 | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 HEAP32[i1 + 24 >> 2] = HEAP32[i1 + 20 >> 2];
 i5 = i1 + 28 | 0;
 if ((i4 | 0) == -1) {
  HEAP32[i3 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i8 = HEAP32[i5 >> 2] | 0;
 if ((i8 | 0) == -1) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i3 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 while (1) {
  i5 = i7 + (i8 << 2) | 0;
  i6 = HEAP32[i5 >> 2] | 0;
  i9 = (i6 >>> 14) + -131071 | 0;
  if ((i9 | 0) == -1) {
   break;
  }
  i9 = i8 + 1 + i9 | 0;
  if ((i9 | 0) == -1) {
   break;
  } else {
   i8 = i9;
  }
 }
 i4 = i4 + ~i8 | 0;
 if ((((i4 | 0) > -1 ? i4 : 0 - i4 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i5 >> 2] = (i4 << 14) + 2147467264 | i6 & 16383;
 HEAP32[i3 >> 2] = -1;
 STACKTOP = i2;
 return;
}
function _luaO_str2d(i1, i3, i5) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, d9 = 0.0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 if ((_strpbrk(i1, 5464) | 0) != 0) {
  i13 = 0;
  STACKTOP = i2;
  return i13 | 0;
 }
 do {
  if ((_strpbrk(i1, 5472) | 0) == 0) {
   d9 = +_strtod(i1, i4);
   i10 = HEAP32[i4 >> 2] | 0;
  } else {
   HEAP32[i4 >> 2] = i1;
   i8 = i1;
   while (1) {
    i6 = HEAP8[i8] | 0;
    i10 = i8 + 1 | 0;
    if ((HEAP8[(i6 & 255) + 10913 | 0] & 8) == 0) {
     break;
    } else {
     i8 = i10;
    }
   }
   if (i6 << 24 >> 24 == 43) {
    i6 = 0;
    i8 = i10;
   } else if (i6 << 24 >> 24 == 45) {
    i6 = 1;
    i8 = i10;
   } else {
    i6 = 0;
   }
   if ((HEAP8[i8] | 0) == 48 ? (i13 = HEAP8[i8 + 1 | 0] | 0, i13 << 24 >> 24 == 88 | i13 << 24 >> 24 == 120) : 0) {
    i10 = i8 + 2 | 0;
    i8 = HEAP8[i10] | 0;
    i12 = i8 & 255;
    i11 = HEAP8[i12 + 10913 | 0] | 0;
    if ((i11 & 16) == 0) {
     d9 = 0.0;
     i11 = i8;
     i8 = 0;
    } else {
     d9 = 0.0;
     i8 = 0;
     while (1) {
      if ((i11 & 2) == 0) {
       i11 = (i12 | 32) + -87 | 0;
      } else {
       i11 = i12 + -48 | 0;
      }
      d9 = d9 * 16.0 + +(i11 | 0);
      i8 = i8 + 1 | 0;
      i10 = i10 + 1 | 0;
      i13 = HEAP8[i10] | 0;
      i12 = i13 & 255;
      i11 = HEAP8[i12 + 10913 | 0] | 0;
      if ((i11 & 16) == 0) {
       i11 = i13;
       break;
      }
     }
    }
    if (i11 << 24 >> 24 == 46) {
     i10 = i10 + 1 | 0;
     i13 = HEAPU8[i10] | 0;
     i11 = HEAP8[i13 + 10913 | 0] | 0;
     if ((i11 & 16) == 0) {
      i12 = 0;
     } else {
      i12 = 0;
      do {
       if ((i11 & 2) == 0) {
        i11 = (i13 | 32) + -87 | 0;
       } else {
        i11 = i13 + -48 | 0;
       }
       d9 = d9 * 16.0 + +(i11 | 0);
       i12 = i12 + 1 | 0;
       i10 = i10 + 1 | 0;
       i13 = HEAPU8[i10] | 0;
       i11 = HEAP8[i13 + 10913 | 0] | 0;
      } while (!((i11 & 16) == 0));
     }
    } else {
     i12 = 0;
    }
    if ((i12 | i8 | 0) != 0) {
     i8 = Math_imul(i12, -4) | 0;
     HEAP32[i4 >> 2] = i10;
     i13 = HEAP8[i10] | 0;
     if (i13 << 24 >> 24 == 80 | i13 << 24 >> 24 == 112) {
      i13 = i10 + 1 | 0;
      i11 = HEAP8[i13] | 0;
      if (i11 << 24 >> 24 == 45) {
       i11 = 1;
       i13 = i10 + 2 | 0;
      } else if (i11 << 24 >> 24 == 43) {
       i11 = 0;
       i13 = i10 + 2 | 0;
      } else {
       i11 = 0;
      }
      i12 = HEAP8[i13] | 0;
      if (!((HEAP8[(i12 & 255) + 10913 | 0] & 2) == 0)) {
       i10 = i13;
       i7 = 0;
       do {
        i10 = i10 + 1 | 0;
        i7 = (i12 << 24 >> 24) + -48 + (i7 * 10 | 0) | 0;
        i12 = HEAP8[i10] | 0;
       } while (!((HEAP8[(i12 & 255) + 10913 | 0] & 2) == 0));
       i8 = ((i11 | 0) == 0 ? i7 : 0 - i7 | 0) + i8 | 0;
       i7 = 29;
      }
     } else {
      i7 = 29;
     }
     if ((i7 | 0) == 29) {
      HEAP32[i4 >> 2] = i10;
     }
     if ((i6 | 0) != 0) {
      d9 = -d9;
     }
     d9 = +_ldexp(d9, i8);
     break;
    }
   }
   HEAPF64[i5 >> 3] = 0.0;
   i13 = 0;
   STACKTOP = i2;
   return i13 | 0;
  }
 } while (0);
 HEAPF64[i5 >> 3] = d9;
 if ((i10 | 0) == (i1 | 0)) {
  i13 = 0;
  STACKTOP = i2;
  return i13 | 0;
 }
 if (!((HEAP8[(HEAPU8[i10] | 0) + 10913 | 0] & 8) == 0)) {
  do {
   i10 = i10 + 1 | 0;
  } while (!((HEAP8[(HEAPU8[i10] | 0) + 10913 | 0] & 8) == 0));
  HEAP32[i4 >> 2] = i10;
 }
 i13 = (i10 | 0) == (i1 + i3 | 0) | 0;
 STACKTOP = i2;
 return i13 | 0;
}
function _luaV_equalobj_(i2, i4, i5) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 i3 = i4 + 8 | 0;
 L1 : do {
  switch (HEAP32[i3 >> 2] & 63 | 0) {
  case 7:
   {
    i6 = HEAP32[i4 >> 2] | 0;
    i7 = HEAP32[i5 >> 2] | 0;
    if ((i6 | 0) == (i7 | 0)) {
     i7 = 1;
     STACKTOP = i1;
     return i7 | 0;
    }
    if ((i2 | 0) == 0) {
     i7 = 0;
     STACKTOP = i1;
     return i7 | 0;
    } else {
     i6 = _get_equalTM(i2, HEAP32[i6 + 8 >> 2] | 0, HEAP32[i7 + 8 >> 2] | 0) | 0;
     break L1;
    }
   }
  case 5:
   {
    i7 = HEAP32[i4 >> 2] | 0;
    i6 = HEAP32[i5 >> 2] | 0;
    if ((i7 | 0) == (i6 | 0)) {
     i7 = 1;
     STACKTOP = i1;
     return i7 | 0;
    }
    if ((i2 | 0) == 0) {
     i7 = 0;
     STACKTOP = i1;
     return i7 | 0;
    } else {
     i6 = _get_equalTM(i2, HEAP32[i7 + 8 >> 2] | 0, HEAP32[i6 + 8 >> 2] | 0) | 0;
     break L1;
    }
   }
  case 4:
   {
    i7 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 20:
   {
    i7 = _luaS_eqlngstr(HEAP32[i4 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 3:
   {
    i7 = +HEAPF64[i4 >> 3] == +HEAPF64[i5 >> 3] | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 1:
   {
    i7 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 22:
   {
    i7 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 2:
   {
    i7 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  case 0:
   {
    i7 = 1;
    STACKTOP = i1;
    return i7 | 0;
   }
  default:
   {
    i7 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0) | 0;
    STACKTOP = i1;
    return i7 | 0;
   }
  }
 } while (0);
 if ((i6 | 0) == 0) {
  i7 = 0;
  STACKTOP = i1;
  return i7 | 0;
 }
 i7 = i2 + 8 | 0;
 i10 = HEAP32[i7 >> 2] | 0;
 i9 = i2 + 28 | 0;
 i8 = i10 - (HEAP32[i9 >> 2] | 0) | 0;
 HEAP32[i7 >> 2] = i10 + 16;
 i13 = i6;
 i12 = HEAP32[i13 + 4 >> 2] | 0;
 i11 = i10;
 HEAP32[i11 >> 2] = HEAP32[i13 >> 2];
 HEAP32[i11 + 4 >> 2] = i12;
 HEAP32[i10 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
 i10 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = i10 + 16;
 i11 = i4;
 i4 = HEAP32[i11 + 4 >> 2] | 0;
 i6 = i10;
 HEAP32[i6 >> 2] = HEAP32[i11 >> 2];
 HEAP32[i6 + 4 >> 2] = i4;
 HEAP32[i10 + 8 >> 2] = HEAP32[i3 >> 2];
 i3 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = i3 + 16;
 i10 = i5;
 i6 = HEAP32[i10 + 4 >> 2] | 0;
 i4 = i3;
 HEAP32[i4 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i4 + 4 >> 2] = i6;
 HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 _luaD_call(i2, (HEAP32[i7 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i2 + 16 >> 2] | 0) + 18 | 0] & 1);
 i2 = HEAP32[i9 >> 2] | 0;
 i3 = HEAP32[i7 >> 2] | 0;
 i4 = i3 + -16 | 0;
 HEAP32[i7 >> 2] = i4;
 i5 = HEAP32[i4 + 4 >> 2] | 0;
 i6 = i2 + i8 | 0;
 HEAP32[i6 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i6 + 4 >> 2] = i5;
 HEAP32[i2 + (i8 + 8) >> 2] = HEAP32[i3 + -8 >> 2];
 i2 = HEAP32[i7 >> 2] | 0;
 i3 = HEAP32[i2 + 8 >> 2] | 0;
 if ((i3 | 0) != 0) {
  if ((i3 | 0) == 1) {
   i2 = (HEAP32[i2 >> 2] | 0) != 0;
  } else {
   i2 = 1;
  }
 } else {
  i2 = 0;
 }
 i13 = i2 & 1;
 STACKTOP = i1;
 return i13 | 0;
}
function _forbody(i1, i5, i6, i4, i9) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 i4 = i4 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 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, i21 = 0, i22 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i8 = i3 + 12 | 0;
 i19 = i3;
 i11 = i1 + 48 | 0;
 i7 = HEAP32[i11 >> 2] | 0;
 i18 = i7 + 46 | 0;
 i22 = (HEAPU8[i18] | 0) + 3 | 0;
 HEAP8[i18] = i22;
 i21 = i7 + 20 | 0;
 i17 = i7 + 12 | 0;
 i2 = i7 + 40 | 0;
 i20 = HEAP32[(HEAP32[i7 >> 2] | 0) + 24 >> 2] | 0;
 i10 = HEAP32[HEAP32[(HEAP32[i17 >> 2] | 0) + 64 >> 2] >> 2] | 0;
 HEAP32[i20 + ((HEAP16[i10 + ((i22 & 255) + -3 + (HEAP32[i2 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i21 >> 2];
 HEAP32[i20 + ((HEAP16[i10 + ((HEAPU8[i18] | 0) + -2 + (HEAP32[i2 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i21 >> 2];
 HEAP32[i20 + ((HEAP16[i10 + ((HEAPU8[i18] | 0) + -1 + (HEAP32[i2 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i21 >> 2];
 i2 = i1 + 16 | 0;
 if ((HEAP32[i2 >> 2] | 0) != 259) {
  _error_expected(i1, 259);
 }
 _luaX_next(i1);
 i10 = (i9 | 0) != 0;
 if (i10) {
  i9 = _luaK_codeABx(i7, 33, i5, 131070) | 0;
 } else {
  i9 = _luaK_jump(i7) | 0;
 }
 HEAP8[i19 + 10 | 0] = 0;
 HEAP8[i19 + 8 | 0] = HEAP8[i18] | 0;
 i17 = HEAP32[(HEAP32[i17 >> 2] | 0) + 64 >> 2] | 0;
 HEAP16[i19 + 4 >> 1] = HEAP32[i17 + 28 >> 2];
 HEAP16[i19 + 6 >> 1] = HEAP32[i17 + 16 >> 2];
 HEAP8[i19 + 9 | 0] = 0;
 i17 = i7 + 16 | 0;
 HEAP32[i19 >> 2] = HEAP32[i17 >> 2];
 HEAP32[i17 >> 2] = i19;
 i19 = HEAP32[i11 >> 2] | 0;
 i17 = i19 + 46 | 0;
 i18 = (HEAPU8[i17] | 0) + i4 | 0;
 HEAP8[i17] = i18;
 if ((i4 | 0) != 0 ? (i13 = i19 + 20 | 0, i12 = i19 + 40 | 0, i14 = HEAP32[(HEAP32[i19 >> 2] | 0) + 24 >> 2] | 0, i15 = HEAP32[HEAP32[(HEAP32[i19 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0, HEAP32[i14 + ((HEAP16[i15 + ((i18 & 255) - i4 + (HEAP32[i12 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i13 >> 2], i16 = i4 + -1 | 0, (i16 | 0) != 0) : 0) {
  do {
   HEAP32[i14 + ((HEAP16[i15 + ((HEAPU8[i17] | 0) - i16 + (HEAP32[i12 >> 2] | 0) << 1) >> 1] | 0) * 12 | 0) + 4 >> 2] = HEAP32[i13 >> 2];
   i16 = i16 + -1 | 0;
  } while ((i16 | 0) != 0);
 }
 _luaK_reserveregs(i7, i4);
 i11 = HEAP32[i11 >> 2] | 0;
 HEAP8[i8 + 10 | 0] = 0;
 HEAP8[i8 + 8 | 0] = HEAP8[i11 + 46 | 0] | 0;
 i22 = HEAP32[(HEAP32[i11 + 12 >> 2] | 0) + 64 >> 2] | 0;
 HEAP16[i8 + 4 >> 1] = HEAP32[i22 + 28 >> 2];
 HEAP16[i8 + 6 >> 1] = HEAP32[i22 + 16 >> 2];
 HEAP8[i8 + 9 | 0] = 0;
 i22 = i11 + 16 | 0;
 HEAP32[i8 >> 2] = HEAP32[i22 >> 2];
 HEAP32[i22 >> 2] = i8;
 L13 : do {
  i8 = HEAP32[i2 >> 2] | 0;
  switch (i8 | 0) {
  case 277:
  case 286:
  case 262:
  case 261:
  case 260:
   {
    break L13;
   }
  default:
   {}
  }
  _statement(i1);
 } while ((i8 | 0) != 274);
 _leaveblock(i11);
 _leaveblock(i7);
 _luaK_patchtohere(i7, i9);
 if (i10) {
  i21 = _luaK_codeABx(i7, 32, i5, 131070) | 0;
  i22 = i9 + 1 | 0;
  _luaK_patchlist(i7, i21, i22);
  _luaK_fixline(i7, i6);
  STACKTOP = i3;
  return;
 } else {
  _luaK_codeABC(i7, 34, i5, 0, i4) | 0;
  _luaK_fixline(i7, i6);
  i21 = _luaK_codeABx(i7, 35, i5 + 2 | 0, 131070) | 0;
  i22 = i9 + 1 | 0;
  _luaK_patchlist(i7, i21, i22);
  _luaK_fixline(i7, i6);
  STACKTOP = i3;
  return;
 }
}
function _dotty(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i6;
 i4 = i6 + 4 | 0;
 i2 = HEAP32[20] | 0;
 HEAP32[20] = 0;
 _lua_settop(i1, 0);
 if ((_pushline(i1, 1) | 0) == 0) {
  _lua_settop(i1, 0);
  i10 = HEAP32[_stdout >> 2] | 0;
  _fputc(10, i10 | 0) | 0;
  _fflush(i10 | 0) | 0;
  HEAP32[20] = i2;
  STACKTOP = i6;
  return;
 }
 i5 = HEAP32[_stderr >> 2] | 0;
 L4 : while (1) {
  i8 = _lua_tolstring(i1, 1, i4) | 0;
  i8 = _luaL_loadbufferx(i1, i8, HEAP32[i4 >> 2] | 0, 256, 0) | 0;
  L6 : do {
   if ((i8 | 0) == 3) {
    while (1) {
     i8 = _lua_tolstring(i1, -1, i3) | 0;
     i7 = HEAP32[i3 >> 2] | 0;
     if (!(i7 >>> 0 > 4)) {
      break;
     }
     if ((_strcmp(i8 + (i7 + -5) | 0, 264) | 0) != 0) {
      break;
     }
     _lua_settop(i1, -2);
     if ((_pushline(i1, 0) | 0) == 0) {
      i7 = 23;
      break L4;
     }
     _lua_pushlstring(i1, 184, 1) | 0;
     _lua_insert(i1, -2);
     _lua_concat(i1, 3);
     i8 = _lua_tolstring(i1, 1, i4) | 0;
     i8 = _luaL_loadbufferx(i1, i8, HEAP32[i4 >> 2] | 0, 256, 0) | 0;
     if ((i8 | 0) != 3) {
      i7 = 9;
      break L6;
     }
    }
    _lua_remove(i1, 1);
    i8 = 3;
    i7 = 10;
   } else {
    i7 = 9;
   }
  } while (0);
  do {
   if ((i7 | 0) == 9) {
    _lua_remove(i1, 1);
    if ((i8 | 0) == -1) {
     i7 = 23;
     break L4;
    } else if ((i8 | 0) != 0) {
     i7 = 10;
     break;
    }
    i9 = _lua_gettop(i1) | 0;
    _lua_pushcclosure(i1, 142, 0);
    _lua_insert(i1, i9);
    HEAP32[48] = i1;
    _signal(2, 1) | 0;
    i10 = _lua_pcallk(i1, 0, -1, i9, 0, 0) | 0;
    _signal(2, 0) | 0;
    _lua_remove(i1, i9);
    if ((i10 | 0) == 0) {
     i7 = 17;
    } else {
     i9 = 0;
     i7 = 12;
    }
   }
  } while (0);
  if ((i7 | 0) == 10) {
   i9 = (i8 | 0) == 0;
   i7 = 12;
  }
  do {
   if ((i7 | 0) == 12) {
    i7 = 0;
    if ((_lua_type(i1, -1) | 0) == 0) {
     if (i9) {
      i7 = 17;
      break;
     } else {
      break;
     }
    }
    i10 = _lua_tolstring(i1, -1, 0) | 0;
    i8 = HEAP32[20] | 0;
    if ((i8 | 0) != 0) {
     HEAP32[i3 >> 2] = i8;
     _fprintf(i5 | 0, 496, i3 | 0) | 0;
     _fflush(i5 | 0) | 0;
    }
    HEAP32[i3 >> 2] = (i10 | 0) == 0 ? 48 : i10;
    _fprintf(i5 | 0, 912, i3 | 0) | 0;
    _fflush(i5 | 0) | 0;
    _lua_settop(i1, -2);
    _lua_gc(i1, 2, 0) | 0;
    if (i9) {
     i7 = 17;
    }
   }
  } while (0);
  if (((i7 | 0) == 17 ? (0, (_lua_gettop(i1) | 0) > 0) : 0) ? (_luaL_checkstack(i1, 20, 112), _lua_getglobal(i1, 144), _lua_insert(i1, 1), (_lua_pcallk(i1, (_lua_gettop(i1) | 0) + -1 | 0, 0, 0, 0, 0) | 0) != 0) : 0) {
   i7 = HEAP32[20] | 0;
   HEAP32[i3 >> 2] = _lua_tolstring(i1, -1, 0) | 0;
   i8 = _lua_pushfstring(i1, 152, i3) | 0;
   if ((i7 | 0) != 0) {
    HEAP32[i3 >> 2] = i7;
    _fprintf(i5 | 0, 496, i3 | 0) | 0;
    _fflush(i5 | 0) | 0;
   }
   HEAP32[i3 >> 2] = i8;
   _fprintf(i5 | 0, 912, i3 | 0) | 0;
   _fflush(i5 | 0) | 0;
  }
  _lua_settop(i1, 0);
  if ((_pushline(i1, 1) | 0) == 0) {
   i7 = 23;
   break;
  }
 }
 if ((i7 | 0) == 23) {
  _lua_settop(i1, 0);
  i10 = HEAP32[_stdout >> 2] | 0;
  _fputc(10, i10 | 0) | 0;
  _fflush(i10 | 0) | 0;
  HEAP32[20] = i2;
  STACKTOP = i6;
  return;
 }
}
function _test_then_block(i5, i1) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i10 = i2 + 24 | 0;
 i9 = i2;
 i8 = i5 + 48 | 0;
 i4 = HEAP32[i8 >> 2] | 0;
 _luaX_next(i5);
 _subexpr(i5, i9, 0) | 0;
 i3 = i5 + 16 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 275) {
  _error_expected(i5, 275);
 }
 _luaX_next(i5);
 i14 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i14 | 0) == 258 | (i14 | 0) == 266) {
   _luaK_goiffalse(HEAP32[i8 >> 2] | 0, i9);
   HEAP8[i10 + 10 | 0] = 0;
   HEAP8[i10 + 8 | 0] = HEAP8[i4 + 46 | 0] | 0;
   i11 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 64 >> 2] | 0;
   HEAP16[i10 + 4 >> 1] = HEAP32[i11 + 28 >> 2];
   HEAP16[i10 + 6 >> 1] = HEAP32[i11 + 16 >> 2];
   HEAP8[i10 + 9 | 0] = 0;
   i11 = i4 + 16 | 0;
   HEAP32[i10 >> 2] = HEAP32[i11 >> 2];
   HEAP32[i11 >> 2] = i10;
   i11 = HEAP32[i9 + 16 >> 2] | 0;
   i10 = HEAP32[i5 + 4 >> 2] | 0;
   i14 = (HEAP32[i3 >> 2] | 0) == 266;
   _luaX_next(i5);
   do {
    if (i14) {
     if ((HEAP32[i3 >> 2] | 0) == 288) {
      i7 = HEAP32[i5 + 24 >> 2] | 0;
      _luaX_next(i5);
      break;
     } else {
      _error_expected(i5, 288);
     }
    } else {
     i7 = _luaS_new(HEAP32[i5 + 52 >> 2] | 0, 6304) | 0;
    }
   } while (0);
   i14 = HEAP32[i5 + 64 >> 2] | 0;
   i12 = i14 + 12 | 0;
   i13 = i14 + 16 | 0;
   i9 = HEAP32[i13 >> 2] | 0;
   i14 = i14 + 20 | 0;
   if ((i9 | 0) < (HEAP32[i14 >> 2] | 0)) {
    i14 = HEAP32[i12 >> 2] | 0;
   } else {
    i14 = _luaM_growaux_(HEAP32[i5 + 52 >> 2] | 0, HEAP32[i12 >> 2] | 0, i14, 16, 32767, 6312) | 0;
    HEAP32[i12 >> 2] = i14;
   }
   HEAP32[i14 + (i9 << 4) >> 2] = i7;
   i14 = HEAP32[i12 >> 2] | 0;
   HEAP32[i14 + (i9 << 4) + 8 >> 2] = i10;
   HEAP8[i14 + (i9 << 4) + 12 | 0] = HEAP8[(HEAP32[i8 >> 2] | 0) + 46 | 0] | 0;
   HEAP32[(HEAP32[i12 >> 2] | 0) + (i9 << 4) + 4 >> 2] = i11;
   HEAP32[i13 >> 2] = (HEAP32[i13 >> 2] | 0) + 1;
   _findlabel(i5, i9) | 0;
   L18 : while (1) {
    switch (HEAP32[i3 >> 2] | 0) {
    case 286:
    case 262:
    case 261:
    case 260:
     {
      break L18;
     }
    case 285:
    case 59:
     {
      break;
     }
    default:
     {
      i6 = 16;
      break L18;
     }
    }
    _statement(i5);
   }
   if ((i6 | 0) == 16) {
    i6 = _luaK_jump(i4) | 0;
    break;
   }
   _leaveblock(i4);
   STACKTOP = i2;
   return;
  } else {
   _luaK_goiftrue(HEAP32[i8 >> 2] | 0, i9);
   HEAP8[i10 + 10 | 0] = 0;
   HEAP8[i10 + 8 | 0] = HEAP8[i4 + 46 | 0] | 0;
   i6 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 64 >> 2] | 0;
   HEAP16[i10 + 4 >> 1] = HEAP32[i6 + 28 >> 2];
   HEAP16[i10 + 6 >> 1] = HEAP32[i6 + 16 >> 2];
   HEAP8[i10 + 9 | 0] = 0;
   i6 = i4 + 16 | 0;
   HEAP32[i10 >> 2] = HEAP32[i6 >> 2];
   HEAP32[i6 >> 2] = i10;
   i6 = HEAP32[i9 + 20 >> 2] | 0;
  }
 } while (0);
 L26 : do {
  i7 = HEAP32[i3 >> 2] | 0;
  switch (i7 | 0) {
  case 277:
  case 286:
  case 262:
  case 261:
  case 260:
   {
    break L26;
   }
  default:
   {}
  }
  _statement(i5);
 } while ((i7 | 0) != 274);
 _leaveblock(i4);
 if (((HEAP32[i3 >> 2] | 0) + -260 | 0) >>> 0 < 2) {
  _luaK_concat(i4, i1, _luaK_jump(i4) | 0);
 }
 _luaK_patchtohere(i4, i6);
 STACKTOP = i2;
 return;
}
function _luaL_gsub(i2, i13, i11, i10) {
 i2 = i2 | 0;
 i13 = i13 | 0;
 i11 = i11 | 0;
 i10 = i10 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i12 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i8 = i1;
 i4 = i1 + 8 | 0;
 i9 = _strlen(i11 | 0) | 0;
 i6 = i4 + 12 | 0;
 HEAP32[i6 >> 2] = i2;
 i3 = i4 + 16 | 0;
 HEAP32[i4 >> 2] = i3;
 i5 = i4 + 8 | 0;
 HEAP32[i5 >> 2] = 0;
 i7 = i4 + 4 | 0;
 HEAP32[i7 >> 2] = 1024;
 i12 = _strstr(i13, i11) | 0;
 if ((i12 | 0) == 0) {
  i14 = 0;
  i17 = 1024;
  i16 = i2;
 } else {
  i14 = 0;
  i17 = 1024;
  i16 = i2;
  do {
   i15 = i12 - i13 | 0;
   if ((i17 - i14 | 0) >>> 0 < i15 >>> 0) {
    i17 = i17 << 1;
    i17 = (i17 - i14 | 0) >>> 0 < i15 >>> 0 ? i14 + i15 | 0 : i17;
    if (i17 >>> 0 < i14 >>> 0 | (i17 - i14 | 0) >>> 0 < i15 >>> 0) {
     _luaL_error(i16, 1272, i8) | 0;
    }
    i14 = _lua_newuserdata(i16, i17) | 0;
    _memcpy(i14 | 0, HEAP32[i4 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
    if ((HEAP32[i4 >> 2] | 0) != (i3 | 0)) {
     _lua_remove(i16, -2);
    }
    HEAP32[i4 >> 2] = i14;
    HEAP32[i7 >> 2] = i17;
    i16 = i14;
    i14 = HEAP32[i5 >> 2] | 0;
   } else {
    i16 = HEAP32[i4 >> 2] | 0;
   }
   _memcpy(i16 + i14 | 0, i13 | 0, i15 | 0) | 0;
   i15 = (HEAP32[i5 >> 2] | 0) + i15 | 0;
   HEAP32[i5 >> 2] = i15;
   i13 = _strlen(i10 | 0) | 0;
   i14 = HEAP32[i6 >> 2] | 0;
   i16 = HEAP32[i7 >> 2] | 0;
   if ((i16 - i15 | 0) >>> 0 < i13 >>> 0) {
    i16 = i16 << 1;
    i16 = (i16 - i15 | 0) >>> 0 < i13 >>> 0 ? i15 + i13 | 0 : i16;
    if (i16 >>> 0 < i15 >>> 0 | (i16 - i15 | 0) >>> 0 < i13 >>> 0) {
     _luaL_error(i14, 1272, i8) | 0;
    }
    i15 = _lua_newuserdata(i14, i16) | 0;
    _memcpy(i15 | 0, HEAP32[i4 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
    if ((HEAP32[i4 >> 2] | 0) != (i3 | 0)) {
     _lua_remove(i14, -2);
    }
    HEAP32[i4 >> 2] = i15;
    HEAP32[i7 >> 2] = i16;
    i14 = i15;
    i15 = HEAP32[i5 >> 2] | 0;
   } else {
    i14 = HEAP32[i4 >> 2] | 0;
   }
   _memcpy(i14 + i15 | 0, i10 | 0, i13 | 0) | 0;
   i14 = (HEAP32[i5 >> 2] | 0) + i13 | 0;
   HEAP32[i5 >> 2] = i14;
   i13 = i12 + i9 | 0;
   i12 = _strstr(i13, i11) | 0;
   i16 = HEAP32[i6 >> 2] | 0;
   i17 = HEAP32[i7 >> 2] | 0;
  } while ((i12 | 0) != 0);
 }
 i9 = _strlen(i13 | 0) | 0;
 if ((i17 - i14 | 0) >>> 0 < i9 >>> 0) {
  i10 = i17 << 1;
  i10 = (i10 - i14 | 0) >>> 0 < i9 >>> 0 ? i14 + i9 | 0 : i10;
  if (i10 >>> 0 < i14 >>> 0 | (i10 - i14 | 0) >>> 0 < i9 >>> 0) {
   _luaL_error(i16, 1272, i8) | 0;
  }
  i8 = _lua_newuserdata(i16, i10) | 0;
  _memcpy(i8 | 0, HEAP32[i4 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
  if ((HEAP32[i4 >> 2] | 0) != (i3 | 0)) {
   _lua_remove(i16, -2);
  }
  HEAP32[i4 >> 2] = i8;
  HEAP32[i7 >> 2] = i10;
  i14 = HEAP32[i5 >> 2] | 0;
 } else {
  i8 = HEAP32[i4 >> 2] | 0;
 }
 _memcpy(i8 + i14 | 0, i13 | 0, i9 | 0) | 0;
 i17 = (HEAP32[i5 >> 2] | 0) + i9 | 0;
 HEAP32[i5 >> 2] = i17;
 i5 = HEAP32[i6 >> 2] | 0;
 _lua_pushlstring(i5, HEAP32[i4 >> 2] | 0, i17) | 0;
 if ((HEAP32[i4 >> 2] | 0) == (i3 | 0)) {
  i17 = _lua_tolstring(i2, -1, 0) | 0;
  STACKTOP = i1;
  return i17 | 0;
 }
 _lua_remove(i5, -2);
 i17 = _lua_tolstring(i2, -1, 0) | 0;
 STACKTOP = i1;
 return i17 | 0;
}
function _luaK_goiffalse(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i2 = STACKTOP;
 _luaK_dischargevars(i1, i3);
 i9 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i9 | 0) == 10) {
   i4 = HEAP32[i3 + 8 >> 2] | 0;
   i8 = 15;
  } else if (!((i9 | 0) == 3 | (i9 | 0) == 1)) {
   i4 = i3 + 8 | 0;
   if ((i9 | 0) == 6) {
    i8 = 11;
   } else if ((i9 | 0) == 11 ? (i10 = HEAP32[(HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i4 >> 2] << 2) >> 2] | 0, (i10 & 63 | 0) == 20) : 0) {
    i4 = i1 + 20 | 0;
    HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -1;
    i4 = _condjump(i1, 27, i10 >>> 23, 0, 0) | 0;
    i8 = 15;
    break;
   } else {
    i8 = 6;
   }
   if ((i8 | 0) == 6) {
    i9 = i1 + 48 | 0;
    i11 = HEAP8[i9] | 0;
    i10 = (i11 & 255) + 1 | 0;
    i12 = (HEAP32[i1 >> 2] | 0) + 78 | 0;
    do {
     if (i10 >>> 0 > (HEAPU8[i12] | 0) >>> 0) {
      if (i10 >>> 0 > 249) {
       _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10536);
      } else {
       HEAP8[i12] = i10;
       i7 = HEAP8[i9] | 0;
       break;
      }
     } else {
      i7 = i11;
     }
    } while (0);
    i12 = (i7 & 255) + 1 | 0;
    HEAP8[i9] = i12;
    _discharge2reg(i1, i3, (i12 & 255) + -1 | 0);
    if ((HEAP32[i3 >> 2] | 0) == 6) {
     i8 = 11;
    }
   }
   if (((i8 | 0) == 11 ? (i6 = HEAP32[i4 >> 2] | 0, (i6 & 256 | 0) == 0) : 0) ? (HEAPU8[i1 + 46 | 0] | 0 | 0) <= (i6 | 0) : 0) {
    i12 = i1 + 48 | 0;
    HEAP8[i12] = (HEAP8[i12] | 0) + -1 << 24 >> 24;
   }
   i4 = _condjump(i1, 28, 255, HEAP32[i4 >> 2] | 0, 1) | 0;
   i8 = 15;
  }
 } while (0);
 do {
  if ((i8 | 0) == 15 ? (i5 = i3 + 16 | 0, !((i4 | 0) == -1)) : 0) {
   i8 = HEAP32[i5 >> 2] | 0;
   if ((i8 | 0) == -1) {
    HEAP32[i5 >> 2] = i4;
    break;
   }
   i5 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
   while (1) {
    i7 = i5 + (i8 << 2) | 0;
    i6 = HEAP32[i7 >> 2] | 0;
    i9 = (i6 >>> 14) + -131071 | 0;
    if ((i9 | 0) == -1) {
     break;
    }
    i9 = i8 + 1 + i9 | 0;
    if ((i9 | 0) == -1) {
     break;
    } else {
     i8 = i9;
    }
   }
   i4 = i4 + ~i8 | 0;
   if ((((i4 | 0) > -1 ? i4 : 0 - i4 | 0) | 0) > 131071) {
    _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
   } else {
    HEAP32[i7 >> 2] = (i4 << 14) + 2147467264 | i6 & 16383;
    break;
   }
  }
 } while (0);
 i3 = i3 + 20 | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 HEAP32[i1 + 24 >> 2] = HEAP32[i1 + 20 >> 2];
 i5 = i1 + 28 | 0;
 if ((i4 | 0) == -1) {
  HEAP32[i3 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i8 = HEAP32[i5 >> 2] | 0;
 if ((i8 | 0) == -1) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i3 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 while (1) {
  i5 = i7 + (i8 << 2) | 0;
  i6 = HEAP32[i5 >> 2] | 0;
  i9 = (i6 >>> 14) + -131071 | 0;
  if ((i9 | 0) == -1) {
   break;
  }
  i9 = i8 + 1 + i9 | 0;
  if ((i9 | 0) == -1) {
   break;
  } else {
   i8 = i9;
  }
 }
 i4 = i4 + ~i8 | 0;
 if ((((i4 | 0) > -1 ? i4 : 0 - i4 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i5 >> 2] = (i4 << 14) + 2147467264 | i6 & 16383;
 HEAP32[i3 >> 2] = -1;
 STACKTOP = i2;
 return;
}
function _luaV_settable(i2, i11, i7, i9) {
 i2 = i2 | 0;
 i11 = i11 | 0;
 i7 = i7 | 0;
 i9 = i9 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i6;
 i4 = i2 + 12 | 0;
 i3 = i11;
 i13 = HEAP32[i11 + 8 >> 2] | 0;
 i12 = 0;
 while (1) {
  i11 = i3 + 8 | 0;
  if ((i13 | 0) != 69) {
   i14 = _luaT_gettmbyobj(i2, i3, 1) | 0;
   i13 = HEAP32[i14 + 8 >> 2] | 0;
   if ((i13 | 0) == 0) {
    i1 = 16;
    break;
   }
  } else {
   i8 = HEAP32[i3 >> 2] | 0;
   i13 = _luaH_get(i8, i7) | 0;
   if ((HEAP32[i13 + 8 >> 2] | 0) != 0) {
    i10 = i13;
    break;
   }
   i14 = HEAP32[i8 + 8 >> 2] | 0;
   if ((i14 | 0) == 0) {
    i1 = 9;
    break;
   }
   if (!((HEAP8[i14 + 6 | 0] & 2) == 0)) {
    i1 = 9;
    break;
   }
   i14 = _luaT_gettm(i14, 1, HEAP32[(HEAP32[i4 >> 2] | 0) + 188 >> 2] | 0) | 0;
   if ((i14 | 0) == 0) {
    i1 = 9;
    break;
   }
   i13 = HEAP32[i14 + 8 >> 2] | 0;
  }
  i12 = i12 + 1 | 0;
  if ((i13 & 15 | 0) == 6) {
   i1 = 18;
   break;
  }
  if ((i12 | 0) < 100) {
   i3 = i14;
  } else {
   i1 = 19;
   break;
  }
 }
 if ((i1 | 0) == 9) {
  if ((i13 | 0) == 5192) {
   i10 = _luaH_newkey(i2, i8, i7) | 0;
  } else {
   i10 = i13;
  }
 } else if ((i1 | 0) == 16) {
  _luaG_typeerror(i2, i3, 8944);
 } else if ((i1 | 0) == 18) {
  i13 = i2 + 8 | 0;
  i8 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i8 + 16;
  i5 = i14;
  i12 = HEAP32[i5 + 4 >> 2] | 0;
  i10 = i8;
  HEAP32[i10 >> 2] = HEAP32[i5 >> 2];
  HEAP32[i10 + 4 >> 2] = i12;
  HEAP32[i8 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
  i14 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i14 + 16;
  i8 = i3;
  i10 = HEAP32[i8 + 4 >> 2] | 0;
  i12 = i14;
  HEAP32[i12 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i12 + 4 >> 2] = i10;
  HEAP32[i14 + 8 >> 2] = HEAP32[i11 >> 2];
  i14 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i14 + 16;
  i12 = i7;
  i11 = HEAP32[i12 + 4 >> 2] | 0;
  i10 = i14;
  HEAP32[i10 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i10 + 4 >> 2] = i11;
  HEAP32[i14 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  i14 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i14 + 16;
  i10 = i9;
  i11 = HEAP32[i10 + 4 >> 2] | 0;
  i12 = i14;
  HEAP32[i12 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i12 + 4 >> 2] = i11;
  HEAP32[i14 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
  _luaD_call(i2, (HEAP32[i13 >> 2] | 0) + -64 | 0, 0, HEAP8[(HEAP32[i2 + 16 >> 2] | 0) + 18 | 0] & 1);
  STACKTOP = i6;
  return;
 } else if ((i1 | 0) == 19) {
  _luaG_runerror(i2, 8976, i5);
 }
 i12 = i9;
 i13 = HEAP32[i12 + 4 >> 2] | 0;
 i14 = i10;
 HEAP32[i14 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i14 + 4 >> 2] = i13;
 i14 = i9 + 8 | 0;
 HEAP32[i10 + 8 >> 2] = HEAP32[i14 >> 2];
 HEAP8[i8 + 6 | 0] = 0;
 if ((HEAP32[i14 >> 2] & 64 | 0) == 0) {
  STACKTOP = i6;
  return;
 }
 if ((HEAP8[(HEAP32[i9 >> 2] | 0) + 5 | 0] & 3) == 0) {
  STACKTOP = i6;
  return;
 }
 if ((HEAP8[i8 + 5 | 0] & 4) == 0) {
  STACKTOP = i6;
  return;
 }
 _luaC_barrierback_(i2, i8);
 STACKTOP = i6;
 return;
}
function _luaK_code(i4, i5) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 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;
 i2 = STACKTOP;
 i1 = HEAP32[i4 >> 2] | 0;
 i7 = i4 + 28 | 0;
 i15 = HEAP32[i7 >> 2] | 0;
 i3 = i4 + 20 | 0;
 i8 = HEAP32[i3 >> 2] | 0;
 do {
  if (!((i15 | 0) == -1)) {
   i11 = HEAP32[i1 + 12 >> 2] | 0;
   while (1) {
    i12 = i11 + (i15 << 2) | 0;
    i14 = HEAP32[i12 >> 2] | 0;
    i13 = (i14 >>> 14) + -131071 | 0;
    if ((i13 | 0) == -1) {
     i13 = -1;
    } else {
     i13 = i15 + 1 + i13 | 0;
    }
    if ((i15 | 0) > 0 ? (i9 = i11 + (i15 + -1 << 2) | 0, i10 = HEAP32[i9 >> 2] | 0, (HEAP8[5584 + (i10 & 63) | 0] | 0) < 0) : 0) {
     i17 = i9;
     i16 = i10;
    } else {
     i17 = i12;
     i16 = i14;
    }
    if ((i16 & 63 | 0) == 28) {
     HEAP32[i17 >> 2] = i16 & 8372224 | i16 >>> 23 << 6 | 27;
     i14 = i8 + ~i15 | 0;
     if ((((i14 | 0) > -1 ? i14 : 0 - i14 | 0) | 0) > 131071) {
      i8 = 10;
      break;
     }
     i14 = HEAP32[i12 >> 2] & 16383 | (i14 << 14) + 2147467264;
    } else {
     i15 = i8 + ~i15 | 0;
     if ((((i15 | 0) > -1 ? i15 : 0 - i15 | 0) | 0) > 131071) {
      i8 = 13;
      break;
     }
     i14 = (i15 << 14) + 2147467264 | i14 & 16383;
    }
    HEAP32[i12 >> 2] = i14;
    if ((i13 | 0) == -1) {
     i8 = 16;
     break;
    } else {
     i15 = i13;
    }
   }
   if ((i8 | 0) == 10) {
    _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
   } else if ((i8 | 0) == 13) {
    _luaX_syntaxerror(HEAP32[i4 + 12 >> 2] | 0, 10624);
   } else if ((i8 | 0) == 16) {
    i6 = HEAP32[i3 >> 2] | 0;
    break;
   }
  } else {
   i6 = i8;
  }
 } while (0);
 HEAP32[i7 >> 2] = -1;
 i7 = i1 + 48 | 0;
 if ((i6 | 0) < (HEAP32[i7 >> 2] | 0)) {
  i7 = i1 + 12 | 0;
 } else {
  i6 = i1 + 12 | 0;
  HEAP32[i6 >> 2] = _luaM_growaux_(HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 52 >> 2] | 0, HEAP32[i6 >> 2] | 0, i7, 4, 2147483645, 10616) | 0;
  i7 = i6;
  i6 = HEAP32[i3 >> 2] | 0;
 }
 HEAP32[(HEAP32[i7 >> 2] | 0) + (i6 << 2) >> 2] = i5;
 i5 = HEAP32[i3 >> 2] | 0;
 i6 = i1 + 52 | 0;
 i4 = i4 + 12 | 0;
 if ((i5 | 0) < (HEAP32[i6 >> 2] | 0)) {
  i15 = i1 + 20 | 0;
  i17 = i5;
  i16 = HEAP32[i4 >> 2] | 0;
  i16 = i16 + 8 | 0;
  i16 = HEAP32[i16 >> 2] | 0;
  i15 = HEAP32[i15 >> 2] | 0;
  i17 = i15 + (i17 << 2) | 0;
  HEAP32[i17 >> 2] = i16;
  i17 = HEAP32[i3 >> 2] | 0;
  i16 = i17 + 1 | 0;
  HEAP32[i3 >> 2] = i16;
  STACKTOP = i2;
  return i17 | 0;
 } else {
  i15 = i1 + 20 | 0;
  HEAP32[i15 >> 2] = _luaM_growaux_(HEAP32[(HEAP32[i4 >> 2] | 0) + 52 >> 2] | 0, HEAP32[i15 >> 2] | 0, i6, 4, 2147483645, 10616) | 0;
  i17 = HEAP32[i3 >> 2] | 0;
  i16 = HEAP32[i4 >> 2] | 0;
  i16 = i16 + 8 | 0;
  i16 = HEAP32[i16 >> 2] | 0;
  i15 = HEAP32[i15 >> 2] | 0;
  i17 = i15 + (i17 << 2) | 0;
  HEAP32[i17 >> 2] = i16;
  i17 = HEAP32[i3 >> 2] | 0;
  i16 = i17 + 1 | 0;
  HEAP32[i3 >> 2] = i16;
  STACKTOP = i2;
  return i17 | 0;
 }
 return 0;
}
function _luaH_next(i9, i5, i2) {
 i9 = i9 | 0;
 i5 = i5 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i8 = i1 + 8 | 0;
 i11 = i1;
 i3 = i2 + 8 | 0;
 i10 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i10 | 0) != 0) {
   if ((((i10 | 0) == 3 ? (d14 = +HEAPF64[i2 >> 3], HEAPF64[i11 >> 3] = d14 + 6755399441055744.0, i12 = HEAP32[i11 >> 2] | 0, +(i12 | 0) == d14) : 0) ? (i12 | 0) > 0 : 0) ? (i13 = HEAP32[i5 + 28 >> 2] | 0, (i12 | 0) <= (i13 | 0)) : 0) {
    i6 = i13;
    i7 = i12 + -1 | 0;
    break;
   }
   i10 = _mainposition(i5, i2) | 0;
   while (1) {
    i4 = i10 + 16 | 0;
    i11 = i10 + 24 | 0;
    i12 = HEAP32[i11 >> 2] | 0;
    if ((i12 | 0) == (HEAP32[i3 >> 2] | 0)) {
     if ((_luaV_equalobj_(0, i4, i2) | 0) != 0) {
      i4 = 15;
      break;
     }
     i12 = HEAP32[i11 >> 2] | 0;
    }
    if (((i12 | 0) == 11 ? (HEAP32[i3 >> 2] & 64 | 0) != 0 : 0) ? (HEAP32[i4 >> 2] | 0) == (HEAP32[i2 >> 2] | 0) : 0) {
     i4 = 15;
     break;
    }
    i10 = HEAP32[i10 + 28 >> 2] | 0;
    if ((i10 | 0) == 0) {
     i4 = 18;
     break;
    }
   }
   if ((i4 | 0) == 15) {
    i7 = HEAP32[i5 + 28 >> 2] | 0;
    i6 = i7;
    i7 = (i10 - (HEAP32[i5 + 16 >> 2] | 0) >> 5) + i7 | 0;
    break;
   } else if ((i4 | 0) == 18) {
    _luaG_runerror(i9, 8064, i8);
   }
  } else {
   i6 = HEAP32[i5 + 28 >> 2] | 0;
   i7 = -1;
  }
 } while (0);
 i8 = i5 + 12 | 0;
 while (1) {
  i9 = i7 + 1 | 0;
  if ((i9 | 0) >= (i6 | 0)) {
   break;
  }
  i11 = HEAP32[i8 >> 2] | 0;
  i10 = i11 + (i9 << 4) + 8 | 0;
  if ((HEAP32[i10 >> 2] | 0) == 0) {
   i7 = i9;
  } else {
   i4 = 21;
   break;
  }
 }
 if ((i4 | 0) == 21) {
  HEAPF64[i2 >> 3] = +(i7 + 2 | 0);
  HEAP32[i3 >> 2] = 3;
  i11 = i11 + (i9 << 4) | 0;
  i12 = HEAP32[i11 + 4 >> 2] | 0;
  i13 = i2 + 16 | 0;
  HEAP32[i13 >> 2] = HEAP32[i11 >> 2];
  HEAP32[i13 + 4 >> 2] = i12;
  HEAP32[i2 + 24 >> 2] = HEAP32[i10 >> 2];
  i13 = 1;
  STACKTOP = i1;
  return i13 | 0;
 }
 i8 = i9 - i6 | 0;
 i6 = 1 << (HEAPU8[i5 + 7 | 0] | 0);
 if ((i8 | 0) >= (i6 | 0)) {
  i13 = 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 i7 = i5 + 16 | 0;
 i5 = HEAP32[i7 >> 2] | 0;
 while (1) {
  i9 = i8 + 1 | 0;
  if ((HEAP32[i5 + (i8 << 5) + 8 >> 2] | 0) != 0) {
   break;
  }
  if ((i9 | 0) < (i6 | 0)) {
   i8 = i9;
  } else {
   i2 = 0;
   i4 = 27;
   break;
  }
 }
 if ((i4 | 0) == 27) {
  STACKTOP = i1;
  return i2 | 0;
 }
 i11 = i5 + (i8 << 5) + 16 | 0;
 i10 = HEAP32[i11 + 4 >> 2] | 0;
 i13 = i2;
 HEAP32[i13 >> 2] = HEAP32[i11 >> 2];
 HEAP32[i13 + 4 >> 2] = i10;
 HEAP32[i3 >> 2] = HEAP32[i5 + (i8 << 5) + 24 >> 2];
 i13 = HEAP32[i7 >> 2] | 0;
 i10 = i13 + (i8 << 5) | 0;
 i11 = HEAP32[i10 + 4 >> 2] | 0;
 i12 = i2 + 16 | 0;
 HEAP32[i12 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i12 + 4 >> 2] = i11;
 HEAP32[i2 + 24 >> 2] = HEAP32[i13 + (i8 << 5) + 8 >> 2];
 i13 = 1;
 STACKTOP = i1;
 return i13 | 0;
}
function _g_read(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i7 = i4 + 8 | 0;
 i9 = i4;
 i10 = _lua_gettop(i1) | 0;
 _clearerr(i3 | 0);
 L1 : do {
  if ((i10 | 0) == 1) {
   i11 = i2 + 1 | 0;
   i12 = _read_line(i1, i3, 1) | 0;
  } else {
   _luaL_checkstack(i1, i10 + 19 | 0, 3256);
   i6 = i7 + 8 | 0;
   i5 = i7 + 8 | 0;
   i10 = i10 + -2 | 0;
   i11 = i2;
   L4 : while (1) {
    do {
     if ((_lua_type(i1, i11) | 0) == 3) {
      i12 = _lua_tointegerx(i1, i11, 0) | 0;
      if ((i12 | 0) == 0) {
       i12 = _fgetc(i3 | 0) | 0;
       _ungetc(i12 | 0, i3 | 0) | 0;
       _lua_pushlstring(i1, 0, 0) | 0;
       i12 = (i12 | 0) != -1 | 0;
       break;
      } else {
       _luaL_buffinit(i1, i7);
       i12 = _fread(_luaL_prepbuffsize(i7, i12) | 0, 1, i12 | 0, i3 | 0) | 0;
       HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i12;
       _luaL_pushresult(i7);
       i12 = (i12 | 0) != 0 | 0;
       break;
      }
     } else {
      i12 = _lua_tolstring(i1, i11, 0) | 0;
      if (!((i12 | 0) != 0 ? (HEAP8[i12] | 0) == 42 : 0)) {
       _luaL_argerror(i1, i11, 3280) | 0;
      }
      i12 = HEAP8[i12 + 1 | 0] | 0;
      if ((i12 | 0) == 110) {
       HEAP32[i7 >> 2] = i9;
       if ((_fscanf(i3 | 0, 3312, i7 | 0) | 0) != 1) {
        i8 = 14;
        break L4;
       }
       _lua_pushnumber(i1, +HEAPF64[i9 >> 3]);
       i12 = 1;
       break;
      } else if ((i12 | 0) == 108) {
       i12 = _read_line(i1, i3, 1) | 0;
       break;
      } else if ((i12 | 0) == 76) {
       i12 = _read_line(i1, i3, 0) | 0;
       break;
      } else if ((i12 | 0) == 97) {
       _luaL_buffinit(i1, i7);
       i12 = _fread(_luaL_prepbuffsize(i7, 1024) | 0, 1, 1024, i3 | 0) | 0;
       HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + i12;
       if (!(i12 >>> 0 < 1024)) {
        i12 = 1024;
        do {
         i12 = i12 << (i12 >>> 0 < 1073741824);
         i13 = _fread(_luaL_prepbuffsize(i7, i12) | 0, 1, i12 | 0, i3 | 0) | 0;
         HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + i13;
        } while (!(i13 >>> 0 < i12 >>> 0));
       }
       _luaL_pushresult(i7);
       i12 = 1;
       break;
      } else {
       break L4;
      }
     }
    } while (0);
    i11 = i11 + 1 | 0;
    if ((i10 | 0) == 0 | (i12 | 0) == 0) {
     break L1;
    } else {
     i10 = i10 + -1 | 0;
    }
   }
   if ((i8 | 0) == 14) {
    _lua_pushnil(i1);
    i11 = i11 + 1 | 0;
    i12 = 0;
    break;
   }
   i13 = _luaL_argerror(i1, i11, 3296) | 0;
   STACKTOP = i4;
   return i13 | 0;
  }
 } while (0);
 if ((_ferror(i3 | 0) | 0) != 0) {
  i13 = _luaL_fileresult(i1, 0, 0) | 0;
  STACKTOP = i4;
  return i13 | 0;
 }
 if ((i12 | 0) == 0) {
  _lua_settop(i1, -2);
  _lua_pushnil(i1);
 }
 i13 = i11 - i2 | 0;
 STACKTOP = i4;
 return i13 | 0;
}
function _luaY_parser(i8, i12, i10, i11, i9, i13) {
 i8 = i8 | 0;
 i12 = i12 | 0;
 i10 = i10 | 0;
 i11 = i11 | 0;
 i9 = i9 | 0;
 i13 = i13 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i14 = 0, i15 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 176 | 0;
 i5 = i2 + 156 | 0;
 i7 = i2 + 80 | 0;
 i4 = i2;
 i6 = i2 + 104 | 0;
 i3 = _luaF_newLclosure(i8, 1) | 0;
 i15 = i8 + 8 | 0;
 i14 = HEAP32[i15 >> 2] | 0;
 HEAP32[i14 >> 2] = i3;
 HEAP32[i14 + 8 >> 2] = 70;
 i14 = (HEAP32[i15 >> 2] | 0) + 16 | 0;
 HEAP32[i15 >> 2] = i14;
 if (((HEAP32[i8 + 24 >> 2] | 0) - i14 | 0) < 16) {
  _luaD_growstack(i8, 0);
 }
 i14 = _luaF_newproto(i8) | 0;
 HEAP32[i3 + 12 >> 2] = i14;
 HEAP32[i6 >> 2] = i14;
 i9 = _luaS_new(i8, i9) | 0;
 HEAP32[(HEAP32[i6 >> 2] | 0) + 36 >> 2] = i9;
 HEAP32[i4 + 60 >> 2] = i10;
 i9 = i4 + 64 | 0;
 HEAP32[i9 >> 2] = i11;
 HEAP32[i11 + 28 >> 2] = 0;
 HEAP32[i11 + 16 >> 2] = 0;
 HEAP32[i11 + 4 >> 2] = 0;
 _luaX_setinput(i8, i4, i12, HEAP32[(HEAP32[i6 >> 2] | 0) + 36 >> 2] | 0, i13);
 i10 = HEAP32[i4 + 52 >> 2] | 0;
 i13 = i4 + 48 | 0;
 HEAP32[i6 + 8 >> 2] = HEAP32[i13 >> 2];
 i8 = i6 + 12 | 0;
 HEAP32[i8 >> 2] = i4;
 HEAP32[i13 >> 2] = i6;
 HEAP32[i6 + 20 >> 2] = 0;
 HEAP32[i6 + 24 >> 2] = 0;
 HEAP32[i6 + 28 >> 2] = -1;
 HEAP32[i6 + 32 >> 2] = 0;
 HEAP32[i6 + 36 >> 2] = 0;
 i13 = i6 + 44 | 0;
 HEAP32[i13 + 0 >> 2] = 0;
 HEAP8[i13 + 4 | 0] = 0;
 HEAP32[i6 + 40 >> 2] = HEAP32[(HEAP32[i9 >> 2] | 0) + 4 >> 2];
 i9 = i6 + 16 | 0;
 HEAP32[i9 >> 2] = 0;
 i13 = HEAP32[i6 >> 2] | 0;
 HEAP32[i13 + 36 >> 2] = HEAP32[i4 + 68 >> 2];
 HEAP8[i13 + 78 | 0] = 2;
 i13 = _luaH_new(i10) | 0;
 HEAP32[i6 + 4 >> 2] = i13;
 i14 = i10 + 8 | 0;
 i15 = HEAP32[i14 >> 2] | 0;
 HEAP32[i15 >> 2] = i13;
 HEAP32[i15 + 8 >> 2] = 69;
 i15 = (HEAP32[i14 >> 2] | 0) + 16 | 0;
 HEAP32[i14 >> 2] = i15;
 if (((HEAP32[i10 + 24 >> 2] | 0) - i15 | 0) < 16) {
  _luaD_growstack(i10, 0);
 }
 HEAP8[i5 + 10 | 0] = 0;
 HEAP8[i5 + 8 | 0] = HEAP8[i6 + 46 | 0] | 0;
 i15 = HEAP32[(HEAP32[i8 >> 2] | 0) + 64 >> 2] | 0;
 HEAP16[i5 + 4 >> 1] = HEAP32[i15 + 28 >> 2];
 HEAP16[i5 + 6 >> 1] = HEAP32[i15 + 16 >> 2];
 HEAP8[i5 + 9 | 0] = 0;
 HEAP32[i5 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i9 >> 2] = i5;
 HEAP8[(HEAP32[i6 >> 2] | 0) + 77 | 0] = 1;
 HEAP32[i7 + 16 >> 2] = -1;
 HEAP32[i7 + 20 >> 2] = -1;
 HEAP32[i7 >> 2] = 7;
 HEAP32[i7 + 8 >> 2] = 0;
 _newupvalue(i6, HEAP32[i4 + 72 >> 2] | 0, i7) | 0;
 _luaX_next(i4);
 i5 = i4 + 16 | 0;
 L7 : while (1) {
  i6 = HEAP32[i5 >> 2] | 0;
  switch (i6 | 0) {
  case 277:
  case 286:
  case 262:
  case 261:
  case 260:
   {
    break L7;
   }
  default:
   {}
  }
  _statement(i4);
  if ((i6 | 0) == 274) {
   i1 = 8;
   break;
  }
 }
 if ((i1 | 0) == 8) {
  i6 = HEAP32[i5 >> 2] | 0;
 }
 if ((i6 | 0) == 286) {
  _close_func(i4);
  STACKTOP = i2;
  return i3 | 0;
 } else {
  _error_expected(i4, 286);
 }
 return 0;
}
function _luaV_lessthan(i5, i4, i2) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 i6 = i4 + 8 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 if ((i7 | 0) == 3) {
  if ((HEAP32[i2 + 8 >> 2] | 0) == 3) {
   i9 = +HEAPF64[i4 >> 3] < +HEAPF64[i2 >> 3] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 } else {
  if ((i7 & 15 | 0) == 4 ? (HEAP32[i2 + 8 >> 2] & 15 | 0) == 4 : 0) {
   i6 = HEAP32[i4 >> 2] | 0;
   i4 = HEAP32[i2 >> 2] | 0;
   i3 = i6 + 16 | 0;
   i5 = i4 + 16 | 0;
   i7 = _strcmp(i3, i5) | 0;
   L8 : do {
    if ((i7 | 0) == 0) {
     i2 = HEAP32[i6 + 12 >> 2] | 0;
     i4 = HEAP32[i4 + 12 >> 2] | 0;
     while (1) {
      i7 = _strlen(i3 | 0) | 0;
      i6 = (i7 | 0) == (i2 | 0);
      if ((i7 | 0) == (i4 | 0)) {
       break;
      }
      if (i6) {
       i7 = -1;
       break L8;
      }
      i6 = i7 + 1 | 0;
      i3 = i3 + i6 | 0;
      i5 = i5 + i6 | 0;
      i7 = _strcmp(i3, i5) | 0;
      if ((i7 | 0) == 0) {
       i2 = i2 - i6 | 0;
       i4 = i4 - i6 | 0;
      } else {
       break L8;
      }
     }
     i7 = i6 & 1 ^ 1;
    }
   } while (0);
   i9 = i7 >>> 31;
   STACKTOP = i1;
   return i9 | 0;
  }
 }
 i8 = i5 + 8 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 i9 = _luaT_gettmbyobj(i5, i4, 13) | 0;
 if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
  i9 = _luaT_gettmbyobj(i5, i2, 13) | 0;
  if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
   _luaG_ordererror(i5, i4, i2);
  } else {
   i3 = i9;
  }
 } else {
  i3 = i9;
 }
 i10 = i5 + 28 | 0;
 i9 = i7 - (HEAP32[i10 >> 2] | 0) | 0;
 i11 = HEAP32[i8 >> 2] | 0;
 HEAP32[i8 >> 2] = i11 + 16;
 i13 = i3;
 i12 = HEAP32[i13 + 4 >> 2] | 0;
 i7 = i11;
 HEAP32[i7 >> 2] = HEAP32[i13 >> 2];
 HEAP32[i7 + 4 >> 2] = i12;
 HEAP32[i11 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 i3 = HEAP32[i8 >> 2] | 0;
 HEAP32[i8 >> 2] = i3 + 16;
 i11 = i4;
 i7 = HEAP32[i11 + 4 >> 2] | 0;
 i4 = i3;
 HEAP32[i4 >> 2] = HEAP32[i11 >> 2];
 HEAP32[i4 + 4 >> 2] = i7;
 HEAP32[i3 + 8 >> 2] = HEAP32[i6 >> 2];
 i3 = HEAP32[i8 >> 2] | 0;
 HEAP32[i8 >> 2] = i3 + 16;
 i4 = i2;
 i7 = HEAP32[i4 + 4 >> 2] | 0;
 i6 = i3;
 HEAP32[i6 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i6 + 4 >> 2] = i7;
 HEAP32[i3 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
 _luaD_call(i5, (HEAP32[i8 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i5 + 16 >> 2] | 0) + 18 | 0] & 1);
 i2 = HEAP32[i10 >> 2] | 0;
 i3 = HEAP32[i8 >> 2] | 0;
 i5 = i3 + -16 | 0;
 HEAP32[i8 >> 2] = i5;
 i6 = HEAP32[i5 + 4 >> 2] | 0;
 i7 = i2 + i9 | 0;
 HEAP32[i7 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i7 + 4 >> 2] = i6;
 HEAP32[i2 + (i9 + 8) >> 2] = HEAP32[i3 + -8 >> 2];
 i2 = HEAP32[i8 >> 2] | 0;
 i3 = HEAP32[i2 + 8 >> 2] | 0;
 if ((i3 | 0) != 0) {
  if ((i3 | 0) == 1) {
   i2 = (HEAP32[i2 >> 2] | 0) != 0;
  } else {
   i2 = 1;
  }
 } else {
  i2 = 0;
 }
 i13 = i2 & 1;
 STACKTOP = i1;
 return i13 | 0;
}
function _discharge2reg(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, d11 = 0.0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i9 = i2 + 16 | 0;
 i8 = i2;
 _luaK_dischargevars(i4, i3);
 i10 = HEAP32[i3 >> 2] | 0;
 L1 : do {
  switch (i10 | 0) {
  case 5:
   {
    d11 = +HEAPF64[i3 + 8 >> 3];
    HEAPF64[i9 >> 3] = d11;
    i5 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 52 >> 2] | 0;
    HEAPF64[i8 >> 3] = d11;
    HEAP32[i8 + 8 >> 2] = 3;
    if (d11 != d11 | 0.0 != 0.0 | d11 == 0.0) {
     i10 = i5 + 8 | 0;
     i7 = HEAP32[i10 >> 2] | 0;
     HEAP32[i10 >> 2] = i7 + 16;
     i5 = _luaS_newlstr(i5, i9, 8) | 0;
     HEAP32[i7 >> 2] = i5;
     HEAP32[i7 + 8 >> 2] = HEAPU8[i5 + 4 | 0] | 0 | 64;
     i5 = _addk(i4, (HEAP32[i10 >> 2] | 0) + -16 | 0, i8) | 0;
     HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + -16;
    } else {
     i5 = _addk(i4, i8, i8) | 0;
    }
    i6 = i1 << 6;
    if ((i5 | 0) < 262144) {
     _luaK_code(i4, i6 | i5 << 14 | 1) | 0;
     break L1;
    } else {
     _luaK_code(i4, i6 | 2) | 0;
     _luaK_code(i4, i5 << 6 | 39) | 0;
     break L1;
    }
   }
  case 2:
  case 3:
   {
    _luaK_code(i4, i1 << 6 | ((i10 | 0) == 2) << 23 | 3) | 0;
    break;
   }
  case 4:
   {
    i6 = HEAP32[i3 + 8 >> 2] | 0;
    i5 = i1 << 6;
    if ((i6 | 0) < 262144) {
     _luaK_code(i4, i5 | i6 << 14 | 1) | 0;
     break L1;
    } else {
     _luaK_code(i4, i5 | 2) | 0;
     _luaK_code(i4, i6 << 6 | 39) | 0;
     break L1;
    }
   }
  case 1:
   {
    i9 = i1 + 1 | 0;
    i8 = HEAP32[i4 + 20 >> 2] | 0;
    do {
     if ((i8 | 0) > (HEAP32[i4 + 24 >> 2] | 0) ? (i5 = (HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0) + (i8 + -1 << 2) | 0, i6 = HEAP32[i5 >> 2] | 0, (i6 & 63 | 0) == 4) : 0) {
      i10 = i6 >>> 6 & 255;
      i8 = i10 + (i6 >>> 23) | 0;
      if (!((i10 | 0) <= (i1 | 0) ? (i8 + 1 | 0) >= (i1 | 0) : 0)) {
       i7 = 6;
      }
      if ((i7 | 0) == 6 ? (i10 | 0) < (i1 | 0) | (i10 | 0) > (i9 | 0) : 0) {
       break;
      }
      i4 = (i10 | 0) < (i1 | 0) ? i10 : i1;
      HEAP32[i5 >> 2] = i4 << 6 & 16320 | i6 & 8372287 | ((i8 | 0) > (i1 | 0) ? i8 : i1) - i4 << 23;
      break L1;
     }
    } while (0);
    _luaK_code(i4, i1 << 6 | 4) | 0;
    break;
   }
  case 6:
   {
    i5 = HEAP32[i3 + 8 >> 2] | 0;
    if ((i5 | 0) != (i1 | 0)) {
     _luaK_code(i4, i5 << 23 | i1 << 6) | 0;
    }
    break;
   }
  case 11:
   {
    i10 = (HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i3 + 8 >> 2] << 2) | 0;
    HEAP32[i10 >> 2] = HEAP32[i10 >> 2] & -16321 | i1 << 6 & 16320;
    break;
   }
  default:
   {
    STACKTOP = i2;
    return;
   }
  }
 } while (0);
 HEAP32[i3 + 8 >> 2] = i1;
 HEAP32[i3 >> 2] = 6;
 STACKTOP = i2;
 return;
}
function _unroll(i3, i4) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 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;
 i9 = STACKTOP;
 i11 = i3 + 16 | 0;
 i13 = HEAP32[i11 >> 2] | 0;
 i5 = i3 + 72 | 0;
 if ((i13 | 0) == (i5 | 0)) {
  STACKTOP = i9;
  return;
 }
 i6 = i3 + 8 | 0;
 i10 = i3 + 40 | 0;
 i7 = i3 + 20 | 0;
 i8 = i3 + 28 | 0;
 i4 = i3 + 68 | 0;
 do {
  i12 = i13 + 18 | 0;
  i14 = HEAP8[i12] | 0;
  if ((i14 & 1) == 0) {
   i14 = i14 & 255;
   if ((i14 & 16 | 0) != 0) {
    HEAP8[i12] = i14 & 239;
    HEAP32[i4 >> 2] = HEAP32[i13 + 32 >> 2];
   }
   if ((HEAP16[i13 + 16 >> 1] | 0) == -1 ? (i2 = (HEAP32[i11 >> 2] | 0) + 4 | 0, i1 = HEAP32[i6 >> 2] | 0, (HEAP32[i2 >> 2] | 0) >>> 0 < i1 >>> 0) : 0) {
    HEAP32[i2 >> 2] = i1;
   }
   i14 = HEAP8[i12] | 0;
   if ((i14 & 32) == 0) {
    HEAP8[i13 + 37 | 0] = 1;
   }
   HEAP8[i12] = i14 & 199 | 8;
   i14 = FUNCTION_TABLE_ii[HEAP32[i13 + 28 >> 2] & 255](i3) | 0;
   i14 = (HEAP32[i6 >> 2] | 0) + (0 - i14 << 4) | 0;
   i13 = HEAP32[i11 >> 2] | 0;
   i12 = HEAPU8[i10] | 0;
   if ((i12 & 6 | 0) == 0) {
    i15 = i13 + 8 | 0;
   } else {
    if ((i12 & 2 | 0) != 0) {
     i14 = i14 - (HEAP32[i8 >> 2] | 0) | 0;
     _luaD_hook(i3, 1, -1);
     i14 = (HEAP32[i8 >> 2] | 0) + i14 | 0;
    }
    i15 = i13 + 8 | 0;
    HEAP32[i7 >> 2] = HEAP32[(HEAP32[i15 >> 2] | 0) + 28 >> 2];
   }
   i12 = HEAP32[i13 >> 2] | 0;
   i13 = HEAP16[i13 + 16 >> 1] | 0;
   HEAP32[i11 >> 2] = HEAP32[i15 >> 2];
   L25 : do {
    if (!(i13 << 16 >> 16 == 0)) {
     i15 = i13 << 16 >> 16;
     if (i14 >>> 0 < (HEAP32[i6 >> 2] | 0) >>> 0) {
      i13 = i14;
      i14 = i15;
      i15 = i12;
      while (1) {
       i12 = i15 + 16 | 0;
       i18 = i13;
       i17 = HEAP32[i18 + 4 >> 2] | 0;
       i16 = i15;
       HEAP32[i16 >> 2] = HEAP32[i18 >> 2];
       HEAP32[i16 + 4 >> 2] = i17;
       HEAP32[i15 + 8 >> 2] = HEAP32[i13 + 8 >> 2];
       i14 = i14 + -1 | 0;
       i13 = i13 + 16 | 0;
       if ((i14 | 0) == 0) {
        break L25;
       }
       if (i13 >>> 0 < (HEAP32[i6 >> 2] | 0) >>> 0) {
        i15 = i12;
       } else {
        i13 = i14;
        break;
       }
      }
     } else {
      i13 = i15;
     }
     if ((i13 | 0) > 0) {
      i14 = i13;
      i15 = i12;
      while (1) {
       i14 = i14 + -1 | 0;
       HEAP32[i15 + 8 >> 2] = 0;
       if ((i14 | 0) <= 0) {
        break;
       } else {
        i15 = i15 + 16 | 0;
       }
      }
      i12 = i12 + (i13 << 4) | 0;
     }
    }
   } while (0);
   HEAP32[i6 >> 2] = i12;
  } else {
   _luaV_finishOp(i3);
   _luaV_execute(i3);
  }
  i13 = HEAP32[i11 >> 2] | 0;
 } while ((i13 | 0) != (i5 | 0));
 STACKTOP = i9;
 return;
}
function _traverseephemeron(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 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;
 i3 = STACKTOP;
 i11 = i2 + 16 | 0;
 i9 = HEAP32[i11 >> 2] | 0;
 i5 = i9 + (1 << (HEAPU8[i2 + 7 | 0] | 0) << 5) | 0;
 i10 = i2 + 28 | 0;
 i13 = HEAP32[i10 >> 2] | 0;
 if ((i13 | 0) > 0) {
  i9 = i2 + 12 | 0;
  i12 = 0;
  i8 = 0;
  do {
   i14 = HEAP32[i9 >> 2] | 0;
   if ((HEAP32[i14 + (i12 << 4) + 8 >> 2] & 64 | 0) != 0 ? (i7 = HEAP32[i14 + (i12 << 4) >> 2] | 0, !((HEAP8[i7 + 5 | 0] & 3) == 0)) : 0) {
    _reallymarkobject(i1, i7);
    i13 = HEAP32[i10 >> 2] | 0;
    i8 = 1;
   }
   i12 = i12 + 1 | 0;
  } while ((i12 | 0) < (i13 | 0));
  i9 = HEAP32[i11 >> 2] | 0;
 } else {
  i8 = 0;
 }
 if (i9 >>> 0 < i5 >>> 0) {
  i7 = 0;
  i10 = 0;
  do {
   i11 = i9 + 8 | 0;
   i12 = HEAP32[i11 >> 2] | 0;
   i14 = i9 + 24 | 0;
   i13 = HEAP32[i14 >> 2] | 0;
   i15 = (i13 & 64 | 0) == 0;
   L14 : do {
    if ((i12 | 0) == 0) {
     if (!i15 ? !((HEAP8[(HEAP32[i9 + 16 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) {
      HEAP32[i14 >> 2] = 11;
     }
    } else {
     do {
      if (i15) {
       i6 = i12;
       i4 = 18;
      } else {
       i14 = HEAP32[i9 + 16 >> 2] | 0;
       if ((i13 & 15 | 0) == 4) {
        if ((i14 | 0) == 0) {
         i6 = i12;
         i4 = 18;
         break;
        }
        if ((HEAP8[i14 + 5 | 0] & 3) == 0) {
         i6 = i12;
         i4 = 18;
         break;
        }
        _reallymarkobject(i1, i14);
        i6 = HEAP32[i11 >> 2] | 0;
        i4 = 18;
        break;
       }
       i11 = (i12 & 64 | 0) == 0;
       if ((HEAP8[i14 + 5 | 0] & 3) == 0) {
        if (i11) {
         break L14;
        } else {
         break;
        }
       }
       if (i11) {
        i7 = 1;
        break L14;
       }
       i7 = 1;
       i10 = (HEAP8[(HEAP32[i9 >> 2] | 0) + 5 | 0] & 3) == 0 ? i10 : 1;
       break L14;
      }
     } while (0);
     if ((i4 | 0) == 18 ? (i4 = 0, (i6 & 64 | 0) == 0) : 0) {
      break;
     }
     i11 = HEAP32[i9 >> 2] | 0;
     if (!((HEAP8[i11 + 5 | 0] & 3) == 0)) {
      _reallymarkobject(i1, i11);
      i8 = 1;
     }
    }
   } while (0);
   i9 = i9 + 32 | 0;
  } while (i9 >>> 0 < i5 >>> 0);
  if ((i10 | 0) != 0) {
   i15 = i1 + 96 | 0;
   HEAP32[i2 + 24 >> 2] = HEAP32[i15 >> 2];
   HEAP32[i15 >> 2] = i2;
   i15 = i8;
   STACKTOP = i3;
   return i15 | 0;
  }
  if ((i7 | 0) != 0) {
   i15 = i1 + 100 | 0;
   HEAP32[i2 + 24 >> 2] = HEAP32[i15 >> 2];
   HEAP32[i15 >> 2] = i2;
   i15 = i8;
   STACKTOP = i3;
   return i15 | 0;
  }
 }
 i15 = i1 + 88 | 0;
 HEAP32[i2 + 24 >> 2] = HEAP32[i15 >> 2];
 HEAP32[i15 >> 2] = i2;
 i15 = i8;
 STACKTOP = i3;
 return i15 | 0;
}
function _luaV_gettable(i2, i7, i5, i1) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i6;
 i8 = i2 + 12 | 0;
 i3 = i7;
 i10 = HEAP32[i7 + 8 >> 2] | 0;
 i9 = 0;
 while (1) {
  i7 = i3 + 8 | 0;
  if ((i10 | 0) != 69) {
   i12 = _luaT_gettmbyobj(i2, i3, 0) | 0;
   i10 = HEAP32[i12 + 8 >> 2] | 0;
   if ((i10 | 0) == 0) {
    i8 = 11;
    break;
   }
  } else {
   i12 = HEAP32[i3 >> 2] | 0;
   i11 = _luaH_get(i12, i5) | 0;
   i10 = i11 + 8 | 0;
   if ((HEAP32[i10 >> 2] | 0) != 0) {
    i8 = 9;
    break;
   }
   i12 = HEAP32[i12 + 8 >> 2] | 0;
   if ((i12 | 0) == 0) {
    i8 = 9;
    break;
   }
   if (!((HEAP8[i12 + 6 | 0] & 1) == 0)) {
    i8 = 9;
    break;
   }
   i12 = _luaT_gettm(i12, 0, HEAP32[(HEAP32[i8 >> 2] | 0) + 184 >> 2] | 0) | 0;
   if ((i12 | 0) == 0) {
    i8 = 9;
    break;
   }
   i10 = HEAP32[i12 + 8 >> 2] | 0;
  }
  i9 = i9 + 1 | 0;
  if ((i10 & 15 | 0) == 6) {
   i8 = 13;
   break;
  }
  if ((i9 | 0) < 100) {
   i3 = i12;
  } else {
   i8 = 14;
   break;
  }
 }
 if ((i8 | 0) == 9) {
  i9 = i11;
  i11 = HEAP32[i9 + 4 >> 2] | 0;
  i12 = i1;
  HEAP32[i12 >> 2] = HEAP32[i9 >> 2];
  HEAP32[i12 + 4 >> 2] = i11;
  HEAP32[i1 + 8 >> 2] = HEAP32[i10 >> 2];
  STACKTOP = i6;
  return;
 } else if ((i8 | 0) == 11) {
  _luaG_typeerror(i2, i3, 8944);
 } else if ((i8 | 0) == 13) {
  i10 = i2 + 28 | 0;
  i11 = i1 - (HEAP32[i10 >> 2] | 0) | 0;
  i8 = i2 + 8 | 0;
  i9 = HEAP32[i8 >> 2] | 0;
  HEAP32[i8 >> 2] = i9 + 16;
  i13 = i12;
  i1 = HEAP32[i13 + 4 >> 2] | 0;
  i4 = i9;
  HEAP32[i4 >> 2] = HEAP32[i13 >> 2];
  HEAP32[i4 + 4 >> 2] = i1;
  HEAP32[i9 + 8 >> 2] = HEAP32[i12 + 8 >> 2];
  i12 = HEAP32[i8 >> 2] | 0;
  HEAP32[i8 >> 2] = i12 + 16;
  i9 = HEAP32[i3 + 4 >> 2] | 0;
  i4 = i12;
  HEAP32[i4 >> 2] = HEAP32[i3 >> 2];
  HEAP32[i4 + 4 >> 2] = i9;
  HEAP32[i12 + 8 >> 2] = HEAP32[i7 >> 2];
  i12 = HEAP32[i8 >> 2] | 0;
  HEAP32[i8 >> 2] = i12 + 16;
  i4 = i5;
  i9 = HEAP32[i4 + 4 >> 2] | 0;
  i7 = i12;
  HEAP32[i7 >> 2] = HEAP32[i4 >> 2];
  HEAP32[i7 + 4 >> 2] = i9;
  HEAP32[i12 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  _luaD_call(i2, (HEAP32[i8 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i2 + 16 >> 2] | 0) + 18 | 0] & 1);
  i12 = HEAP32[i10 >> 2] | 0;
  i10 = HEAP32[i8 >> 2] | 0;
  i7 = i10 + -16 | 0;
  HEAP32[i8 >> 2] = i7;
  i8 = HEAP32[i7 + 4 >> 2] | 0;
  i9 = i12 + i11 | 0;
  HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
  HEAP32[i9 + 4 >> 2] = i8;
  HEAP32[i12 + (i11 + 8) >> 2] = HEAP32[i10 + -8 >> 2];
  STACKTOP = i6;
  return;
 } else if ((i8 | 0) == 14) {
  _luaG_runerror(i2, 8952, i4);
 }
}
function _db_getinfo(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i3 = i2;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i4 = _lua_tothread(i1, 1) | 0;
  i7 = 1;
 } else {
  i4 = i1;
  i7 = 0;
 }
 i5 = i7 | 2;
 i6 = _luaL_optlstring(i1, i5, 11784, 0) | 0;
 i7 = i7 + 1 | 0;
 do {
  if ((_lua_isnumber(i1, i7) | 0) != 0) {
   if ((_lua_getstack(i4, _lua_tointegerx(i1, i7, 0) | 0, i3) | 0) == 0) {
    _lua_pushnil(i1);
    i7 = 1;
    STACKTOP = i2;
    return i7 | 0;
   }
  } else {
   if ((_lua_type(i1, i7) | 0) == 6) {
    HEAP32[i3 >> 2] = i6;
    _lua_pushfstring(i1, 11792, i3) | 0;
    i6 = _lua_tolstring(i1, -1, 0) | 0;
    _lua_pushvalue(i1, i7);
    _lua_xmove(i1, i4, 1);
    break;
   }
   i7 = _luaL_argerror(i1, i7, 11800) | 0;
   STACKTOP = i2;
   return i7 | 0;
  }
 } while (0);
 if ((_lua_getinfo(i4, i6, i3) | 0) == 0) {
  i7 = _luaL_argerror(i1, i5, 11832) | 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 _lua_createtable(i1, 0, 2);
 if ((_strchr(i6, 83) | 0) != 0) {
  _lua_pushstring(i1, HEAP32[i3 + 16 >> 2] | 0) | 0;
  _lua_setfield(i1, -2, 11848);
  _lua_pushstring(i1, i3 + 36 | 0) | 0;
  _lua_setfield(i1, -2, 11856);
  _lua_pushinteger(i1, HEAP32[i3 + 24 >> 2] | 0);
  _lua_setfield(i1, -2, 11872);
  _lua_pushinteger(i1, HEAP32[i3 + 28 >> 2] | 0);
  _lua_setfield(i1, -2, 11888);
  _lua_pushstring(i1, HEAP32[i3 + 12 >> 2] | 0) | 0;
  _lua_setfield(i1, -2, 11904);
 }
 if ((_strchr(i6, 108) | 0) != 0) {
  _lua_pushinteger(i1, HEAP32[i3 + 20 >> 2] | 0);
  _lua_setfield(i1, -2, 11912);
 }
 if ((_strchr(i6, 117) | 0) != 0) {
  _lua_pushinteger(i1, HEAPU8[i3 + 32 | 0] | 0);
  _lua_setfield(i1, -2, 11928);
  _lua_pushinteger(i1, HEAPU8[i3 + 33 | 0] | 0);
  _lua_setfield(i1, -2, 11936);
  _lua_pushboolean(i1, HEAP8[i3 + 34 | 0] | 0);
  _lua_setfield(i1, -2, 11944);
 }
 if ((_strchr(i6, 110) | 0) != 0) {
  _lua_pushstring(i1, HEAP32[i3 + 4 >> 2] | 0) | 0;
  _lua_setfield(i1, -2, 11960);
  _lua_pushstring(i1, HEAP32[i3 + 8 >> 2] | 0) | 0;
  _lua_setfield(i1, -2, 11968);
 }
 if ((_strchr(i6, 116) | 0) != 0) {
  _lua_pushboolean(i1, HEAP8[i3 + 35 | 0] | 0);
  _lua_setfield(i1, -2, 11984);
 }
 if ((_strchr(i6, 76) | 0) != 0) {
  if ((i4 | 0) == (i1 | 0)) {
   _lua_pushvalue(i1, -2);
   _lua_remove(i1, -3);
  } else {
   _lua_xmove(i4, i1, 1);
  }
  _lua_setfield(i1, -2, 12e3);
 }
 if ((_strchr(i6, 102) | 0) == 0) {
  i7 = 1;
  STACKTOP = i2;
  return i7 | 0;
 }
 if ((i4 | 0) == (i1 | 0)) {
  _lua_pushvalue(i1, -2);
  _lua_remove(i1, -3);
 } else {
  _lua_xmove(i4, i1, 1);
 }
 _lua_setfield(i1, -2, 12016);
 i7 = 1;
 STACKTOP = i2;
 return i7 | 0;
}
function _luaL_traceback(i4, i1, i9, i7) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i9 = i9 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 208 | 0;
 i6 = i3;
 i5 = i3 + 100 | 0;
 i2 = _lua_gettop(i4) | 0;
 i8 = 1;
 i10 = 1;
 while (1) {
  if ((_lua_getstack(i1, i8, i6) | 0) == 0) {
   break;
  } else {
   i10 = i8;
   i8 = i8 << 1;
  }
 }
 if ((i10 | 0) < (i8 | 0)) {
  while (1) {
   i11 = (i8 + i10 | 0) / 2 | 0;
   i12 = (_lua_getstack(i1, i11, i6) | 0) == 0;
   i8 = i12 ? i11 : i8;
   i10 = i12 ? i10 : i11 + 1 | 0;
   if ((i10 | 0) >= (i8 | 0)) {
    i10 = i8;
    break;
   }
  }
 } else {
  i10 = i8;
 }
 i8 = (i10 + -1 | 0) > 22 ? 12 : 0;
 if ((i9 | 0) != 0) {
  HEAP32[i6 >> 2] = i9;
  _lua_pushfstring(i4, 944, i6) | 0;
 }
 _lua_pushlstring(i4, 952, 16) | 0;
 if ((_lua_getstack(i1, i7, i5) | 0) == 0) {
  i17 = _lua_gettop(i4) | 0;
  i17 = i17 - i2 | 0;
  _lua_concat(i4, i17);
  STACKTOP = i3;
  return;
 }
 i10 = i10 + -11 | 0;
 i13 = i5 + 36 | 0;
 i9 = i5 + 20 | 0;
 i16 = i5 + 8 | 0;
 i12 = i5 + 12 | 0;
 i15 = i5 + 24 | 0;
 i14 = i5 + 35 | 0;
 i11 = i5 + 4 | 0;
 do {
  i7 = i7 + 1 | 0;
  if ((i7 | 0) == (i8 | 0)) {
   _lua_pushlstring(i4, 976, 5) | 0;
   i7 = i10;
  } else {
   _lua_getinfo(i1, 984, i5) | 0;
   HEAP32[i6 >> 2] = i13;
   _lua_pushfstring(i4, 992, i6) | 0;
   i17 = HEAP32[i9 >> 2] | 0;
   if ((i17 | 0) > 0) {
    HEAP32[i6 >> 2] = i17;
    _lua_pushfstring(i4, 1e3, i6) | 0;
   }
   _lua_pushlstring(i4, 1008, 4) | 0;
   do {
    if ((HEAP8[HEAP32[i16 >> 2] | 0] | 0) == 0) {
     i17 = HEAP8[HEAP32[i12 >> 2] | 0] | 0;
     if (i17 << 24 >> 24 == 109) {
      _lua_pushlstring(i4, 1800, 10) | 0;
      break;
     } else if (i17 << 24 >> 24 == 67) {
      if ((_pushglobalfuncname(i4, i5) | 0) == 0) {
       _lua_pushlstring(i4, 1112, 1) | 0;
       break;
      } else {
       HEAP32[i6 >> 2] = _lua_tolstring(i4, -1, 0) | 0;
       _lua_pushfstring(i4, 1784, i6) | 0;
       _lua_remove(i4, -2);
       break;
      }
     } else {
      i17 = HEAP32[i15 >> 2] | 0;
      HEAP32[i6 >> 2] = i13;
      HEAP32[i6 + 4 >> 2] = i17;
      _lua_pushfstring(i4, 1816, i6) | 0;
      break;
     }
    } else {
     HEAP32[i6 >> 2] = HEAP32[i11 >> 2];
     _lua_pushfstring(i4, 1784, i6) | 0;
    }
   } while (0);
   if ((HEAP8[i14] | 0) != 0) {
    _lua_pushlstring(i4, 1016, 20) | 0;
   }
   _lua_concat(i4, (_lua_gettop(i4) | 0) - i2 | 0);
  }
 } while ((_lua_getstack(i1, i7, i5) | 0) != 0);
 i17 = _lua_gettop(i4) | 0;
 i17 = i17 - i2 | 0;
 _lua_concat(i4, i17);
 STACKTOP = i3;
 return;
}
function _luaK_exp2RK(i3, i1) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, d11 = 0.0, i12 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i7 = i2 + 16 | 0;
 i6 = i2;
 i4 = i1 + 16 | 0;
 i5 = i1 + 20 | 0;
 i10 = (HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0);
 _luaK_dischargevars(i3, i1);
 do {
  if (!i10) {
   if ((HEAP32[i1 >> 2] | 0) == 6) {
    i10 = HEAP32[i1 + 8 >> 2] | 0;
    if ((HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0)) {
     break;
    }
    if ((i10 | 0) >= (HEAPU8[i3 + 46 | 0] | 0 | 0)) {
     _exp2reg(i3, i1, i10);
     break;
    }
   }
   _luaK_exp2nextreg(i3, i1);
  }
 } while (0);
 i10 = HEAP32[i1 >> 2] | 0;
 switch (i10 | 0) {
 case 4:
  {
   i8 = HEAP32[i1 + 8 >> 2] | 0;
   i9 = 18;
   break;
  }
 case 1:
 case 3:
 case 2:
  {
   if ((HEAP32[i3 + 32 >> 2] | 0) < 256) {
    if ((i10 | 0) == 1) {
     HEAP32[i6 + 8 >> 2] = 0;
     HEAP32[i7 >> 2] = HEAP32[i3 + 4 >> 2];
     HEAP32[i7 + 8 >> 2] = 69;
     i3 = _addk(i3, i7, i6) | 0;
    } else {
     HEAP32[i7 >> 2] = (i10 | 0) == 2;
     HEAP32[i7 + 8 >> 2] = 1;
     i3 = _addk(i3, i7, i7) | 0;
    }
    HEAP32[i1 + 8 >> 2] = i3;
    HEAP32[i1 >> 2] = 4;
    i10 = i3 | 256;
    STACKTOP = i2;
    return i10 | 0;
   }
   break;
  }
 case 5:
  {
   i9 = i1 + 8 | 0;
   d11 = +HEAPF64[i9 >> 3];
   HEAPF64[i7 >> 3] = d11;
   i8 = HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 52 >> 2] | 0;
   HEAPF64[i6 >> 3] = d11;
   HEAP32[i6 + 8 >> 2] = 3;
   if (d11 != d11 | 0.0 != 0.0 | d11 == 0.0) {
    i10 = i8 + 8 | 0;
    i12 = HEAP32[i10 >> 2] | 0;
    HEAP32[i10 >> 2] = i12 + 16;
    i8 = _luaS_newlstr(i8, i7, 8) | 0;
    HEAP32[i12 >> 2] = i8;
    HEAP32[i12 + 8 >> 2] = HEAPU8[i8 + 4 | 0] | 0 | 64;
    i8 = _addk(i3, (HEAP32[i10 >> 2] | 0) + -16 | 0, i6) | 0;
    HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + -16;
   } else {
    i8 = _addk(i3, i6, i6) | 0;
   }
   HEAP32[i9 >> 2] = i8;
   HEAP32[i1 >> 2] = 4;
   i9 = 18;
   break;
  }
 default:
  {}
 }
 if ((i9 | 0) == 18 ? (i8 | 0) < 256 : 0) {
  i12 = i8 | 256;
  STACKTOP = i2;
  return i12 | 0;
 }
 _luaK_dischargevars(i3, i1);
 if ((HEAP32[i1 >> 2] | 0) == 6) {
  i7 = i1 + 8 | 0;
  i6 = HEAP32[i7 >> 2] | 0;
  if ((HEAP32[i4 >> 2] | 0) == (HEAP32[i5 >> 2] | 0)) {
   i12 = i6;
   STACKTOP = i2;
   return i12 | 0;
  }
  if ((i6 | 0) >= (HEAPU8[i3 + 46 | 0] | 0 | 0)) {
   _exp2reg(i3, i1, i6);
   i12 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i2;
   return i12 | 0;
  }
 } else {
  i7 = i1 + 8 | 0;
 }
 _luaK_exp2nextreg(i3, i1);
 i12 = HEAP32[i7 >> 2] | 0;
 STACKTOP = i2;
 return i12 | 0;
}
function _os_date(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1264 | 0;
 i4 = i2;
 i7 = i2 + 1048 | 0;
 i6 = i2 + 1256 | 0;
 i3 = i2 + 8 | 0;
 i5 = i2 + 1056 | 0;
 i12 = _luaL_optlstring(i1, 1, 6064, 0) | 0;
 if ((_lua_type(i1, 2) | 0) < 1) {
  i8 = _time(0) | 0;
 } else {
  i8 = ~~+_luaL_checknumber(i1, 2);
 }
 HEAP32[i7 >> 2] = i8;
 if ((HEAP8[i12] | 0) == 33) {
  i12 = i12 + 1 | 0;
  i10 = _gmtime(i7 | 0) | 0;
 } else {
  i10 = _localtime(i7 | 0) | 0;
 }
 if ((i10 | 0) == 0) {
  _lua_pushnil(i1);
  STACKTOP = i2;
  return 1;
 }
 if ((_strcmp(i12, 6072) | 0) == 0) {
  _lua_createtable(i1, 0, 9);
  _lua_pushinteger(i1, HEAP32[i10 >> 2] | 0);
  _lua_setfield(i1, -2, 5864);
  _lua_pushinteger(i1, HEAP32[i10 + 4 >> 2] | 0);
  _lua_setfield(i1, -2, 5872);
  _lua_pushinteger(i1, HEAP32[i10 + 8 >> 2] | 0);
  _lua_setfield(i1, -2, 5880);
  _lua_pushinteger(i1, HEAP32[i10 + 12 >> 2] | 0);
  _lua_setfield(i1, -2, 5888);
  _lua_pushinteger(i1, (HEAP32[i10 + 16 >> 2] | 0) + 1 | 0);
  _lua_setfield(i1, -2, 5896);
  _lua_pushinteger(i1, (HEAP32[i10 + 20 >> 2] | 0) + 1900 | 0);
  _lua_setfield(i1, -2, 5904);
  _lua_pushinteger(i1, (HEAP32[i10 + 24 >> 2] | 0) + 1 | 0);
  _lua_setfield(i1, -2, 6080);
  _lua_pushinteger(i1, (HEAP32[i10 + 28 >> 2] | 0) + 1 | 0);
  _lua_setfield(i1, -2, 6088);
  i3 = HEAP32[i10 + 32 >> 2] | 0;
  if ((i3 | 0) < 0) {
   STACKTOP = i2;
   return 1;
  }
  _lua_pushboolean(i1, i3);
  _lua_setfield(i1, -2, 5912);
  STACKTOP = i2;
  return 1;
 }
 HEAP8[i6] = 37;
 _luaL_buffinit(i1, i3);
 i11 = i3 + 8 | 0;
 i9 = i3 + 4 | 0;
 i8 = i6 + 1 | 0;
 i7 = i6 + 2 | 0;
 while (1) {
  i14 = HEAP8[i12] | 0;
  if (i14 << 24 >> 24 == 0) {
   break;
  } else if (!(i14 << 24 >> 24 == 37)) {
   i13 = HEAP32[i11 >> 2] | 0;
   if (!(i13 >>> 0 < (HEAP32[i9 >> 2] | 0) >>> 0)) {
    _luaL_prepbuffsize(i3, 1) | 0;
    i13 = HEAP32[i11 >> 2] | 0;
    i14 = HEAP8[i12] | 0;
   }
   HEAP32[i11 >> 2] = i13 + 1;
   HEAP8[(HEAP32[i3 >> 2] | 0) + i13 | 0] = i14;
   i12 = i12 + 1 | 0;
   continue;
  }
  i13 = i12 + 1 | 0;
  i12 = i12 + 2 | 0;
  i14 = HEAP8[i13] | 0;
  if (!(i14 << 24 >> 24 == 0) ? (_memchr(6096, i14 << 24 >> 24, 23) | 0) != 0 : 0) {
   HEAP8[i8] = i14;
   HEAP8[i7] = 0;
  } else {
   HEAP32[i4 >> 2] = i13;
   _luaL_argerror(i1, 1, _lua_pushfstring(i1, 6120, i4) | 0) | 0;
   i12 = i13;
  }
  _luaL_addlstring(i3, i5, _strftime(i5 | 0, 200, i6 | 0, i10 | 0) | 0);
 }
 _luaL_pushresult(i3);
 STACKTOP = i2;
 return 1;
}
function _luaV_finishOp(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;
 i1 = STACKTOP;
 i8 = HEAP32[i3 + 16 >> 2] | 0;
 i7 = i8 + 24 | 0;
 i4 = HEAP32[i7 >> 2] | 0;
 i5 = i8 + 28 | 0;
 i2 = HEAP32[(HEAP32[i5 >> 2] | 0) + -4 >> 2] | 0;
 i6 = i2 & 63;
 switch (i6 | 0) {
 case 34:
  {
   HEAP32[i3 + 8 >> 2] = HEAP32[i8 + 4 >> 2];
   STACKTOP = i1;
   return;
  }
 case 24:
 case 25:
 case 26:
  {
   i7 = i3 + 8 | 0;
   i8 = HEAP32[i7 >> 2] | 0;
   i9 = HEAP32[i8 + -8 >> 2] | 0;
   if ((i9 | 0) != 0) {
    if ((i9 | 0) == 1) {
     i9 = (HEAP32[i8 + -16 >> 2] | 0) == 0;
    } else {
     i9 = 0;
    }
   } else {
    i9 = 1;
   }
   i9 = i9 & 1;
   i10 = i9 ^ 1;
   HEAP32[i7 >> 2] = i8 + -16;
   if ((i6 | 0) == 26) {
    i8 = (HEAP32[(_luaT_gettmbyobj(i3, i4 + (i2 >>> 23 << 4) | 0, 14) | 0) + 8 >> 2] | 0) == 0;
    i10 = i8 ? i9 : i10;
   }
   if ((i10 | 0) == (i2 >>> 6 & 255 | 0)) {
    STACKTOP = i1;
    return;
   }
   HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 4;
   STACKTOP = i1;
   return;
  }
 case 22:
  {
   i5 = i3 + 8 | 0;
   i10 = HEAP32[i5 >> 2] | 0;
   i6 = i10 + -32 | 0;
   i4 = i6 - (i4 + (i2 >>> 23 << 4)) | 0;
   i12 = i10 + -16 | 0;
   i11 = HEAP32[i12 + 4 >> 2] | 0;
   i9 = i10 + -48 | 0;
   HEAP32[i9 >> 2] = HEAP32[i12 >> 2];
   HEAP32[i9 + 4 >> 2] = i11;
   HEAP32[i10 + -40 >> 2] = HEAP32[i10 + -8 >> 2];
   if ((i4 | 0) > 16) {
    HEAP32[i5 >> 2] = i6;
    _luaV_concat(i3, i4 >> 4);
   }
   i10 = HEAP32[i5 >> 2] | 0;
   i11 = HEAP32[i7 >> 2] | 0;
   i12 = i2 >>> 6 & 255;
   i6 = i10 + -16 | 0;
   i7 = HEAP32[i6 + 4 >> 2] | 0;
   i9 = i11 + (i12 << 4) | 0;
   HEAP32[i9 >> 2] = HEAP32[i6 >> 2];
   HEAP32[i9 + 4 >> 2] = i7;
   HEAP32[i11 + (i12 << 4) + 8 >> 2] = HEAP32[i10 + -8 >> 2];
   HEAP32[i5 >> 2] = HEAP32[i8 + 4 >> 2];
   STACKTOP = i1;
   return;
  }
 case 12:
 case 7:
 case 6:
 case 21:
 case 19:
 case 18:
 case 17:
 case 16:
 case 15:
 case 14:
 case 13:
  {
   i12 = i3 + 8 | 0;
   i11 = HEAP32[i12 >> 2] | 0;
   i8 = i11 + -16 | 0;
   HEAP32[i12 >> 2] = i8;
   i12 = i2 >>> 6 & 255;
   i9 = HEAP32[i8 + 4 >> 2] | 0;
   i10 = i4 + (i12 << 4) | 0;
   HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
   HEAP32[i10 + 4 >> 2] = i9;
   HEAP32[i4 + (i12 << 4) + 8 >> 2] = HEAP32[i11 + -8 >> 2];
   STACKTOP = i1;
   return;
  }
 case 29:
  {
   if ((i2 & 8372224 | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   HEAP32[i3 + 8 >> 2] = HEAP32[i8 + 4 >> 2];
   STACKTOP = i1;
   return;
  }
 default:
  {
   STACKTOP = i1;
   return;
  }
 }
}
function _auxsort(i2, i4, i5) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 if ((i4 | 0) >= (i5 | 0)) {
  STACKTOP = i1;
  return;
 }
 while (1) {
  _lua_rawgeti(i2, 1, i4);
  _lua_rawgeti(i2, 1, i5);
  if ((_sort_comp(i2, -1, -2) | 0) == 0) {
   _lua_settop(i2, -3);
  } else {
   _lua_rawseti(i2, 1, i4);
   _lua_rawseti(i2, 1, i5);
  }
  i6 = i5 - i4 | 0;
  if ((i6 | 0) == 1) {
   i2 = 24;
   break;
  }
  i7 = (i5 + i4 | 0) / 2 | 0;
  _lua_rawgeti(i2, 1, i7);
  _lua_rawgeti(i2, 1, i4);
  do {
   if ((_sort_comp(i2, -2, -1) | 0) == 0) {
    _lua_settop(i2, -2);
    _lua_rawgeti(i2, 1, i5);
    if ((_sort_comp(i2, -1, -2) | 0) == 0) {
     _lua_settop(i2, -3);
     break;
    } else {
     _lua_rawseti(i2, 1, i7);
     _lua_rawseti(i2, 1, i5);
     break;
    }
   } else {
    _lua_rawseti(i2, 1, i7);
    _lua_rawseti(i2, 1, i4);
   }
  } while (0);
  if ((i6 | 0) == 2) {
   i2 = 24;
   break;
  }
  _lua_rawgeti(i2, 1, i7);
  _lua_pushvalue(i2, -1);
  i6 = i5 + -1 | 0;
  _lua_rawgeti(i2, 1, i6);
  _lua_rawseti(i2, 1, i7);
  _lua_rawseti(i2, 1, i6);
  i7 = i4;
  i9 = i6;
  while (1) {
   i8 = i7 + 1 | 0;
   _lua_rawgeti(i2, 1, i8);
   if ((_sort_comp(i2, -1, -2) | 0) != 0) {
    i7 = i8;
    while (1) {
     if ((i7 | 0) >= (i5 | 0)) {
      _luaL_error(i2, 8216, i3) | 0;
     }
     _lua_settop(i2, -2);
     i8 = i7 + 1 | 0;
     _lua_rawgeti(i2, 1, i8);
     if ((_sort_comp(i2, -1, -2) | 0) == 0) {
      break;
     } else {
      i7 = i8;
     }
    }
   }
   i10 = i9 + -1 | 0;
   _lua_rawgeti(i2, 1, i10);
   if ((_sort_comp(i2, -3, -1) | 0) != 0) {
    i9 = i10;
    while (1) {
     if ((i9 | 0) <= (i4 | 0)) {
      _luaL_error(i2, 8216, i3) | 0;
     }
     _lua_settop(i2, -2);
     i10 = i9 + -1 | 0;
     _lua_rawgeti(i2, 1, i10);
     if ((_sort_comp(i2, -3, -1) | 0) == 0) {
      break;
     } else {
      i9 = i10;
     }
    }
   }
   if ((i9 | 0) <= (i8 | 0)) {
    break;
   }
   _lua_rawseti(i2, 1, i8);
   _lua_rawseti(i2, 1, i10);
   i7 = i8;
   i9 = i10;
  }
  _lua_settop(i2, -4);
  _lua_rawgeti(i2, 1, i6);
  _lua_rawgeti(i2, 1, i8);
  _lua_rawseti(i2, 1, i6);
  _lua_rawseti(i2, 1, i8);
  i8 = (i8 - i4 | 0) < (i5 - i8 | 0);
  i9 = i7 + 2 | 0;
  i10 = i8 ? i9 : i4;
  i6 = i8 ? i5 : i7;
  _auxsort(i2, i8 ? i4 : i9, i8 ? i7 : i5);
  if ((i10 | 0) < (i6 | 0)) {
   i4 = i10;
   i5 = i6;
  } else {
   i2 = 24;
   break;
  }
 }
 if ((i2 | 0) == 24) {
  STACKTOP = i1;
  return;
 }
}
function _skip_sep(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;
 i1 = STACKTOP;
 i2 = HEAP32[i3 >> 2] | 0;
 i4 = i3 + 60 | 0;
 i10 = HEAP32[i4 >> 2] | 0;
 i8 = i10 + 4 | 0;
 i11 = HEAP32[i8 >> 2] | 0;
 i7 = i10 + 8 | 0;
 i5 = HEAP32[i7 >> 2] | 0;
 do {
  if ((i11 + 1 | 0) >>> 0 > i5 >>> 0) {
   if (i5 >>> 0 > 2147483645) {
    _lexerror(i3, 12368, 0);
   }
   i12 = i5 << 1;
   i11 = HEAP32[i3 + 52 >> 2] | 0;
   if ((i12 | 0) == -2) {
    _luaM_toobig(i11);
   } else {
    i9 = _luaM_realloc_(i11, HEAP32[i10 >> 2] | 0, i5, i12) | 0;
    HEAP32[i10 >> 2] = i9;
    HEAP32[i7 >> 2] = i12;
    i6 = HEAP32[i8 >> 2] | 0;
    break;
   }
  } else {
   i6 = i11;
   i9 = HEAP32[i10 >> 2] | 0;
  }
 } while (0);
 HEAP32[i8 >> 2] = i6 + 1;
 HEAP8[i9 + i6 | 0] = i2;
 i5 = i3 + 56 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 i13 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i13 + -1;
 if ((i13 | 0) == 0) {
  i6 = _luaZ_fill(i6) | 0;
 } else {
  i13 = i6 + 4 | 0;
  i6 = HEAP32[i13 >> 2] | 0;
  HEAP32[i13 >> 2] = i6 + 1;
  i6 = HEAPU8[i6] | 0;
 }
 HEAP32[i3 >> 2] = i6;
 if ((i6 | 0) != 61) {
  i12 = i6;
  i13 = 0;
  i12 = (i12 | 0) != (i2 | 0);
  i12 = i12 << 31 >> 31;
  i13 = i12 ^ i13;
  STACKTOP = i1;
  return i13 | 0;
 }
 i6 = i3 + 52 | 0;
 i7 = 0;
 while (1) {
  i9 = HEAP32[i4 >> 2] | 0;
  i8 = i9 + 4 | 0;
  i10 = HEAP32[i8 >> 2] | 0;
  i11 = i9 + 8 | 0;
  i12 = HEAP32[i11 >> 2] | 0;
  if ((i10 + 1 | 0) >>> 0 > i12 >>> 0) {
   if (i12 >>> 0 > 2147483645) {
    i4 = 16;
    break;
   }
   i13 = i12 << 1;
   i10 = HEAP32[i6 >> 2] | 0;
   if ((i13 | 0) == -2) {
    i4 = 18;
    break;
   }
   i12 = _luaM_realloc_(i10, HEAP32[i9 >> 2] | 0, i12, i13) | 0;
   HEAP32[i9 >> 2] = i12;
   HEAP32[i11 >> 2] = i13;
   i10 = HEAP32[i8 >> 2] | 0;
   i9 = i12;
  } else {
   i9 = HEAP32[i9 >> 2] | 0;
  }
  HEAP32[i8 >> 2] = i10 + 1;
  HEAP8[i9 + i10 | 0] = 61;
  i8 = HEAP32[i5 >> 2] | 0;
  i13 = HEAP32[i8 >> 2] | 0;
  HEAP32[i8 >> 2] = i13 + -1;
  if ((i13 | 0) == 0) {
   i8 = _luaZ_fill(i8) | 0;
  } else {
   i13 = i8 + 4 | 0;
   i8 = HEAP32[i13 >> 2] | 0;
   HEAP32[i13 >> 2] = i8 + 1;
   i8 = HEAPU8[i8] | 0;
  }
  HEAP32[i3 >> 2] = i8;
  i7 = i7 + 1 | 0;
  if ((i8 | 0) != 61) {
   i4 = 24;
   break;
  }
 }
 if ((i4 | 0) == 16) {
  _lexerror(i3, 12368, 0);
 } else if ((i4 | 0) == 18) {
  _luaM_toobig(i10);
 } else if ((i4 | 0) == 24) {
  i13 = (i8 | 0) != (i2 | 0);
  i13 = i13 << 31 >> 31;
  i13 = i13 ^ i7;
  STACKTOP = i1;
  return i13 | 0;
 }
 return 0;
}
function _luaV_arith(i8, i2, i3, i5, i4) {
 i8 = i8 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i6 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i9 = i1 + 24 | 0;
 i13 = i1 + 16 | 0;
 i12 = i1;
 i6 = i3 + 8 | 0;
 i11 = HEAP32[i6 >> 2] | 0;
 if ((i11 | 0) != 3) {
  if ((i11 & 15 | 0) == 4 ? (i11 = HEAP32[i3 >> 2] | 0, (_luaO_str2d(i11 + 16 | 0, HEAP32[i11 + 12 >> 2] | 0, i13) | 0) != 0) : 0) {
   HEAPF64[i12 >> 3] = +HEAPF64[i13 >> 3];
   HEAP32[i12 + 8 >> 2] = 3;
   i10 = 5;
  }
 } else {
  i12 = i3;
  i10 = 5;
 }
 do {
  if ((i10 | 0) == 5) {
   i10 = HEAP32[i5 + 8 >> 2] | 0;
   if ((i10 | 0) == 3) {
    if ((i5 | 0) == 0) {
     break;
    }
    d14 = +HEAPF64[i5 >> 3];
   } else {
    if ((i10 & 15 | 0) != 4) {
     break;
    }
    i13 = HEAP32[i5 >> 2] | 0;
    if ((_luaO_str2d(i13 + 16 | 0, HEAP32[i13 + 12 >> 2] | 0, i9) | 0) == 0) {
     break;
    }
    d14 = +HEAPF64[i9 >> 3];
   }
   HEAPF64[i2 >> 3] = +_luaO_arith(i4 + -6 | 0, +HEAPF64[i12 >> 3], d14);
   HEAP32[i2 + 8 >> 2] = 3;
   STACKTOP = i1;
   return;
  }
 } while (0);
 i9 = _luaT_gettmbyobj(i8, i3, i4) | 0;
 if ((HEAP32[i9 + 8 >> 2] | 0) == 0) {
  i4 = _luaT_gettmbyobj(i8, i5, i4) | 0;
  if ((HEAP32[i4 + 8 >> 2] | 0) == 0) {
   _luaG_aritherror(i8, i3, i5);
  } else {
   i7 = i4;
  }
 } else {
  i7 = i9;
 }
 i12 = i8 + 28 | 0;
 i13 = i2 - (HEAP32[i12 >> 2] | 0) | 0;
 i9 = i8 + 8 | 0;
 i11 = HEAP32[i9 >> 2] | 0;
 HEAP32[i9 >> 2] = i11 + 16;
 i2 = i7;
 i10 = HEAP32[i2 + 4 >> 2] | 0;
 i4 = i11;
 HEAP32[i4 >> 2] = HEAP32[i2 >> 2];
 HEAP32[i4 + 4 >> 2] = i10;
 HEAP32[i11 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 i11 = HEAP32[i9 >> 2] | 0;
 HEAP32[i9 >> 2] = i11 + 16;
 i4 = i3;
 i10 = HEAP32[i4 + 4 >> 2] | 0;
 i7 = i11;
 HEAP32[i7 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i7 + 4 >> 2] = i10;
 HEAP32[i11 + 8 >> 2] = HEAP32[i6 >> 2];
 i11 = HEAP32[i9 >> 2] | 0;
 HEAP32[i9 >> 2] = i11 + 16;
 i6 = i5;
 i7 = HEAP32[i6 + 4 >> 2] | 0;
 i10 = i11;
 HEAP32[i10 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i10 + 4 >> 2] = i7;
 HEAP32[i11 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 _luaD_call(i8, (HEAP32[i9 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i8 + 16 >> 2] | 0) + 18 | 0] & 1);
 i12 = HEAP32[i12 >> 2] | 0;
 i11 = HEAP32[i9 >> 2] | 0;
 i8 = i11 + -16 | 0;
 HEAP32[i9 >> 2] = i8;
 i9 = HEAP32[i8 + 4 >> 2] | 0;
 i10 = i12 + i13 | 0;
 HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
 HEAP32[i10 + 4 >> 2] = i9;
 HEAP32[i12 + (i13 + 8) >> 2] = HEAP32[i11 + -8 >> 2];
 STACKTOP = i1;
 return;
}
function _new_localvar(i1, i8) {
 i1 = i1 | 0;
 i8 = i8 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 i5 = HEAP32[i1 + 48 >> 2] | 0;
 i2 = HEAP32[i1 + 64 >> 2] | 0;
 i7 = HEAP32[i5 >> 2] | 0;
 i10 = i7 + 60 | 0;
 i11 = HEAP32[i10 >> 2] | 0;
 i6 = i5 + 44 | 0;
 if ((HEAP16[i6 >> 1] | 0) < (i11 | 0)) {
  i9 = i7 + 24 | 0;
  i10 = i11;
 } else {
  i9 = i7 + 24 | 0;
  HEAP32[i9 >> 2] = _luaM_growaux_(HEAP32[i1 + 52 >> 2] | 0, HEAP32[i9 >> 2] | 0, i10, 12, 32767, 6496) | 0;
  i10 = HEAP32[i10 >> 2] | 0;
 }
 if ((i11 | 0) < (i10 | 0)) {
  i12 = i11;
  while (1) {
   i11 = i12 + 1 | 0;
   HEAP32[(HEAP32[i9 >> 2] | 0) + (i12 * 12 | 0) >> 2] = 0;
   if ((i11 | 0) == (i10 | 0)) {
    break;
   } else {
    i12 = i11;
   }
  }
 }
 i10 = HEAP16[i6 >> 1] | 0;
 HEAP32[(HEAP32[i9 >> 2] | 0) + ((i10 << 16 >> 16) * 12 | 0) >> 2] = i8;
 if (!((HEAP8[i8 + 5 | 0] & 3) == 0) ? !((HEAP8[i7 + 5 | 0] & 4) == 0) : 0) {
  _luaC_barrier_(HEAP32[i1 + 52 >> 2] | 0, i7, i8);
  i7 = HEAP16[i6 >> 1] | 0;
 } else {
  i7 = i10;
 }
 HEAP16[i6 >> 1] = i7 + 1 << 16 >> 16;
 i6 = i2 + 4 | 0;
 i8 = HEAP32[i6 >> 2] | 0;
 if ((i8 + 1 - (HEAP32[i5 + 40 >> 2] | 0) | 0) > 200) {
  i10 = i5 + 12 | 0;
  i9 = HEAP32[(HEAP32[i10 >> 2] | 0) + 52 >> 2] | 0;
  i5 = HEAP32[(HEAP32[i5 >> 2] | 0) + 64 >> 2] | 0;
  if ((i5 | 0) == 0) {
   i11 = 6552;
   HEAP32[i4 >> 2] = 6496;
   i12 = i4 + 4 | 0;
   HEAP32[i12 >> 2] = 200;
   i12 = i4 + 8 | 0;
   HEAP32[i12 >> 2] = i11;
   i12 = _luaO_pushfstring(i9, 6592, i4) | 0;
   i11 = HEAP32[i10 >> 2] | 0;
   _luaX_syntaxerror(i11, i12);
  }
  HEAP32[i4 >> 2] = i5;
  i11 = _luaO_pushfstring(i9, 6568, i4) | 0;
  HEAP32[i4 >> 2] = 6496;
  i12 = i4 + 4 | 0;
  HEAP32[i12 >> 2] = 200;
  i12 = i4 + 8 | 0;
  HEAP32[i12 >> 2] = i11;
  i12 = _luaO_pushfstring(i9, 6592, i4) | 0;
  i11 = HEAP32[i10 >> 2] | 0;
  _luaX_syntaxerror(i11, i12);
 }
 i4 = i2 + 8 | 0;
 if ((i8 + 2 | 0) > (HEAP32[i4 >> 2] | 0)) {
  i11 = _luaM_growaux_(HEAP32[i1 + 52 >> 2] | 0, HEAP32[i2 >> 2] | 0, i4, 2, 2147483645, 6496) | 0;
  HEAP32[i2 >> 2] = i11;
  i12 = HEAP32[i6 >> 2] | 0;
  i10 = i12 + 1 | 0;
  HEAP32[i6 >> 2] = i10;
  i12 = i11 + (i12 << 1) | 0;
  HEAP16[i12 >> 1] = i7;
  STACKTOP = i3;
  return;
 } else {
  i12 = i8;
  i11 = HEAP32[i2 >> 2] | 0;
  i10 = i12 + 1 | 0;
  HEAP32[i6 >> 2] = i10;
  i12 = i11 + (i12 << 1) | 0;
  HEAP16[i12 >> 1] = i7;
  STACKTOP = i3;
  return;
 }
}
function _luaC_fullgc(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i2 = STACKTOP;
 i4 = i1 + 12 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 i6 = i3 + 62 | 0;
 i8 = HEAP8[i6] | 0;
 i5 = (i5 | 0) != 0;
 if (!i5) {
  HEAP8[i6] = 0;
  i9 = (HEAP32[i4 >> 2] | 0) + 104 | 0;
  i10 = HEAP32[i9 >> 2] | 0;
  if ((i10 | 0) != 0) {
   do {
    i11 = i10 + 5 | 0;
    HEAP8[i11] = HEAP8[i11] & 191;
    _GCTM(i1, 1);
    i10 = HEAP32[i9 >> 2] | 0;
   } while ((i10 | 0) != 0);
   if ((HEAP8[i6] | 0) == 2) {
    i9 = 7;
   } else {
    i9 = 6;
   }
  } else {
   i9 = 6;
  }
 } else {
  HEAP8[i6] = 1;
  i9 = 6;
 }
 if ((i9 | 0) == 6 ? (HEAPU8[i3 + 61 | 0] | 0) < 2 : 0) {
  i9 = 7;
 }
 if ((i9 | 0) == 7) {
  i9 = HEAP32[i4 >> 2] | 0;
  HEAP8[i9 + 61 | 0] = 2;
  HEAP32[i9 + 64 >> 2] = 0;
  i10 = i9 + 72 | 0;
  do {
   i11 = _sweeplist(i1, i10, 1) | 0;
  } while ((i11 | 0) == (i10 | 0));
  HEAP32[i9 + 80 >> 2] = i11;
  i11 = i9 + 68 | 0;
  do {
   i10 = _sweeplist(i1, i11, 1) | 0;
  } while ((i10 | 0) == (i11 | 0));
  HEAP32[i9 + 76 >> 2] = i10;
 }
 i11 = HEAP32[i4 >> 2] | 0;
 i9 = i11 + 61 | 0;
 if ((HEAP8[i9] | 0) == 5) {
  i9 = 5;
 } else {
  do {
   _singlestep(i1) | 0;
  } while ((HEAP8[i9] | 0) != 5);
  i9 = HEAP32[i4 >> 2] | 0;
  i11 = i9;
  i9 = HEAP8[i9 + 61 | 0] | 0;
 }
 i10 = i11 + 61 | 0;
 if ((1 << (i9 & 255) & -33 | 0) == 0) {
  do {
   _singlestep(i1) | 0;
  } while ((1 << HEAPU8[i10] & -33 | 0) == 0);
  i9 = HEAP32[i4 >> 2] | 0;
  i11 = i9;
  i9 = HEAP8[i9 + 61 | 0] | 0;
 }
 i10 = i11 + 61 | 0;
 if (!(i9 << 24 >> 24 == 5)) {
  do {
   _singlestep(i1) | 0;
  } while ((HEAP8[i10] | 0) != 5);
 }
 if (i8 << 24 >> 24 == 2 ? (i7 = (HEAP32[i4 >> 2] | 0) + 61 | 0, (HEAP8[i7] | 0) != 0) : 0) {
  do {
   _singlestep(i1) | 0;
  } while ((HEAP8[i7] | 0) != 0);
 }
 HEAP8[i6] = i8;
 i6 = HEAP32[i3 + 8 >> 2] | 0;
 i7 = HEAP32[i3 + 12 >> 2] | 0;
 i8 = (i7 + i6 | 0) / 100 | 0;
 i9 = HEAP32[i3 + 156 >> 2] | 0;
 if ((i9 | 0) < (2147483644 / (i8 | 0) | 0 | 0)) {
  i8 = Math_imul(i9, i8) | 0;
 } else {
  i8 = 2147483644;
 }
 _luaE_setdebt(i3, i6 - i8 + i7 | 0);
 if (i5) {
  STACKTOP = i2;
  return;
 }
 i3 = (HEAP32[i4 >> 2] | 0) + 104 | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 if ((i4 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 do {
  i11 = i4 + 5 | 0;
  HEAP8[i11] = HEAP8[i11] & 191;
  _GCTM(i1, 1);
  i4 = HEAP32[i3 >> 2] | 0;
 } while ((i4 | 0) != 0);
 STACKTOP = i2;
 return;
}
function _scanexp(i3, i6) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 i2 = i3 + 4 | 0;
 i5 = HEAP32[i2 >> 2] | 0;
 i4 = i3 + 100 | 0;
 if (i5 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0) {
  HEAP32[i2 >> 2] = i5 + 1;
  i8 = HEAPU8[i5] | 0;
 } else {
  i8 = ___shgetc(i3) | 0;
 }
 if ((i8 | 0) == 43 | (i8 | 0) == 45) {
  i5 = (i8 | 0) == 45 | 0;
  i7 = HEAP32[i2 >> 2] | 0;
  if (i7 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0) {
   HEAP32[i2 >> 2] = i7 + 1;
   i8 = HEAPU8[i7] | 0;
  } else {
   i8 = ___shgetc(i3) | 0;
  }
  if (!((i8 + -48 | 0) >>> 0 < 10 | (i6 | 0) == 0) ? (HEAP32[i4 >> 2] | 0) != 0 : 0) {
   HEAP32[i2 >> 2] = (HEAP32[i2 >> 2] | 0) + -1;
  }
 } else {
  i5 = 0;
 }
 if ((i8 + -48 | 0) >>> 0 > 9) {
  if ((HEAP32[i4 >> 2] | 0) == 0) {
   i7 = -2147483648;
   i8 = 0;
   tempRet0 = i7;
   STACKTOP = i1;
   return i8 | 0;
  }
  HEAP32[i2 >> 2] = (HEAP32[i2 >> 2] | 0) + -1;
  i7 = -2147483648;
  i8 = 0;
  tempRet0 = i7;
  STACKTOP = i1;
  return i8 | 0;
 } else {
  i6 = 0;
 }
 while (1) {
  i6 = i8 + -48 + i6 | 0;
  i7 = HEAP32[i2 >> 2] | 0;
  if (i7 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0) {
   HEAP32[i2 >> 2] = i7 + 1;
   i8 = HEAPU8[i7] | 0;
  } else {
   i8 = ___shgetc(i3) | 0;
  }
  if (!((i8 + -48 | 0) >>> 0 < 10 & (i6 | 0) < 214748364)) {
   break;
  }
  i6 = i6 * 10 | 0;
 }
 i7 = ((i6 | 0) < 0) << 31 >> 31;
 if ((i8 + -48 | 0) >>> 0 < 10) {
  do {
   i7 = ___muldi3(i6 | 0, i7 | 0, 10, 0) | 0;
   i6 = tempRet0;
   i8 = _i64Add(i8 | 0, ((i8 | 0) < 0) << 31 >> 31 | 0, -48, -1) | 0;
   i6 = _i64Add(i8 | 0, tempRet0 | 0, i7 | 0, i6 | 0) | 0;
   i7 = tempRet0;
   i8 = HEAP32[i2 >> 2] | 0;
   if (i8 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0) {
    HEAP32[i2 >> 2] = i8 + 1;
    i8 = HEAPU8[i8] | 0;
   } else {
    i8 = ___shgetc(i3) | 0;
   }
  } while ((i8 + -48 | 0) >>> 0 < 10 & ((i7 | 0) < 21474836 | (i7 | 0) == 21474836 & i6 >>> 0 < 2061584302));
 }
 if ((i8 + -48 | 0) >>> 0 < 10) {
  do {
   i8 = HEAP32[i2 >> 2] | 0;
   if (i8 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0) {
    HEAP32[i2 >> 2] = i8 + 1;
    i8 = HEAPU8[i8] | 0;
   } else {
    i8 = ___shgetc(i3) | 0;
   }
  } while ((i8 + -48 | 0) >>> 0 < 10);
 }
 if ((HEAP32[i4 >> 2] | 0) != 0) {
  HEAP32[i2 >> 2] = (HEAP32[i2 >> 2] | 0) + -1;
 }
 i3 = (i5 | 0) != 0;
 i2 = _i64Subtract(0, 0, i6 | 0, i7 | 0) | 0;
 i4 = i3 ? tempRet0 : i7;
 i8 = i3 ? i2 : i6;
 tempRet0 = i4;
 STACKTOP = i1;
 return i8 | 0;
}
function _sweeplist(i3, i8, i9) {
 i3 = i3 | 0;
 i8 = i8 | 0;
 i9 = i9 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i10 = 0, i11 = 0, i12 = 0;
 i1 = STACKTOP;
 i5 = i3 + 12 | 0;
 i7 = HEAP32[i5 >> 2] | 0;
 i6 = HEAPU8[i7 + 60 | 0] | 0;
 i2 = i6 ^ 3;
 i7 = (HEAP8[i7 + 62 | 0] | 0) == 2;
 i4 = i7 ? 255 : 184;
 i6 = i7 ? 64 : i6 & 3;
 i7 = i7 ? 64 : 0;
 i10 = HEAP32[i8 >> 2] | 0;
 L1 : do {
  if ((i10 | 0) == 0) {
   i10 = 0;
  } else {
   i11 = i9;
   L2 : while (1) {
    i9 = i11 + -1 | 0;
    if ((i11 | 0) == 0) {
     break L1;
    }
    i11 = i10 + 5 | 0;
    i12 = HEAPU8[i11] | 0;
    L5 : do {
     if (((i12 ^ 3) & i2 | 0) == 0) {
      HEAP32[i8 >> 2] = HEAP32[i10 >> 2];
      switch (HEAPU8[i10 + 4 | 0] | 0) {
      case 4:
       {
        i12 = (HEAP32[i5 >> 2] | 0) + 28 | 0;
        HEAP32[i12 >> 2] = (HEAP32[i12 >> 2] | 0) + -1;
        break;
       }
      case 38:
       {
        _luaM_realloc_(i3, i10, (HEAPU8[i10 + 6 | 0] << 4) + 16 | 0, 0) | 0;
        break L5;
       }
      case 6:
       {
        _luaM_realloc_(i3, i10, (HEAPU8[i10 + 6 | 0] << 2) + 16 | 0, 0) | 0;
        break L5;
       }
      case 20:
       {
        break;
       }
      case 5:
       {
        _luaH_free(i3, i10);
        break L5;
       }
      case 10:
       {
        _luaF_freeupval(i3, i10);
        break L5;
       }
      case 8:
       {
        _luaE_freethread(i3, i10);
        break L5;
       }
      case 9:
       {
        _luaF_freeproto(i3, i10);
        break L5;
       }
      case 7:
       {
        _luaM_realloc_(i3, i10, (HEAP32[i10 + 16 >> 2] | 0) + 24 | 0, 0) | 0;
        break L5;
       }
      default:
       {
        break L5;
       }
      }
      _luaM_realloc_(i3, i10, (HEAP32[i10 + 12 >> 2] | 0) + 17 | 0, 0) | 0;
     } else {
      if ((i12 & i7 | 0) != 0) {
       i2 = 0;
       break L2;
      }
      if (((HEAP8[i10 + 4 | 0] | 0) == 8 ? (HEAP32[i10 + 28 >> 2] | 0) != 0 : 0) ? (_sweeplist(i3, i10 + 56 | 0, -3) | 0, _luaE_freeCI(i10), (HEAP8[(HEAP32[i5 >> 2] | 0) + 62 | 0] | 0) != 1) : 0) {
       _luaD_shrinkstack(i10);
      }
      HEAP8[i11] = i12 & i4 | i6;
      i8 = i10;
     }
    } while (0);
    i10 = HEAP32[i8 >> 2] | 0;
    if ((i10 | 0) == 0) {
     i10 = 0;
     break L1;
    } else {
     i11 = i9;
    }
   }
   STACKTOP = i1;
   return i2 | 0;
  }
 } while (0);
 i12 = (i10 | 0) == 0 ? 0 : i8;
 STACKTOP = i1;
 return i12 | 0;
}
function _resume(i1, i6) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 i3 = i1 + 16 | 0;
 i5 = HEAP32[i3 >> 2] | 0;
 if ((HEAPU16[i1 + 38 >> 1] | 0) > 199) {
  _resume_error(i1, 2240, i6);
 }
 i4 = i1 + 6 | 0;
 i7 = HEAP8[i4] | 0;
 if (i7 << 24 >> 24 == 0) {
  if ((i5 | 0) != (i1 + 72 | 0)) {
   _resume_error(i1, 2448, i6);
  }
  if ((_luaD_precall(i1, i6 + -16 | 0, -1) | 0) != 0) {
   STACKTOP = i2;
   return;
  }
  _luaV_execute(i1);
  STACKTOP = i2;
  return;
 } else if (i7 << 24 >> 24 == 1) {
  HEAP8[i4] = 0;
  i4 = i1 + 28 | 0;
  HEAP32[i5 >> 2] = (HEAP32[i4 >> 2] | 0) + (HEAP32[i5 + 20 >> 2] | 0);
  i8 = i5 + 18 | 0;
  i7 = HEAP8[i8] | 0;
  if ((i7 & 1) == 0) {
   i9 = HEAP32[i5 + 28 >> 2] | 0;
   if ((i9 | 0) != 0) {
    HEAP8[i5 + 37 | 0] = 1;
    HEAP8[i8] = i7 & 255 | 8;
    i6 = FUNCTION_TABLE_ii[i9 & 255](i1) | 0;
    i6 = (HEAP32[i1 + 8 >> 2] | 0) + (0 - i6 << 4) | 0;
   }
   i5 = HEAP32[i3 >> 2] | 0;
   i7 = HEAPU8[i1 + 40 | 0] | 0;
   if ((i7 & 6 | 0) == 0) {
    i7 = i5 + 8 | 0;
   } else {
    if ((i7 & 2 | 0) != 0) {
     i6 = i6 - (HEAP32[i4 >> 2] | 0) | 0;
     _luaD_hook(i1, 1, -1);
     i6 = (HEAP32[i4 >> 2] | 0) + i6 | 0;
    }
    i7 = i5 + 8 | 0;
    HEAP32[i1 + 20 >> 2] = HEAP32[(HEAP32[i7 >> 2] | 0) + 28 >> 2];
   }
   i4 = HEAP32[i5 >> 2] | 0;
   i5 = HEAP16[i5 + 16 >> 1] | 0;
   HEAP32[i3 >> 2] = HEAP32[i7 >> 2];
   i3 = i1 + 8 | 0;
   L27 : do {
    if (!(i5 << 16 >> 16 == 0)) {
     i5 = i5 << 16 >> 16;
     while (1) {
      if (!(i6 >>> 0 < (HEAP32[i3 >> 2] | 0) >>> 0)) {
       break;
      }
      i7 = i4 + 16 | 0;
      i10 = i6;
      i8 = HEAP32[i10 + 4 >> 2] | 0;
      i9 = i4;
      HEAP32[i9 >> 2] = HEAP32[i10 >> 2];
      HEAP32[i9 + 4 >> 2] = i8;
      HEAP32[i4 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
      i5 = i5 + -1 | 0;
      if ((i5 | 0) == 0) {
       i4 = i7;
       break L27;
      }
      i6 = i6 + 16 | 0;
      i4 = i7;
     }
     if ((i5 | 0) > 0) {
      i7 = i5;
      i6 = i4;
      while (1) {
       i7 = i7 + -1 | 0;
       HEAP32[i6 + 8 >> 2] = 0;
       if ((i7 | 0) <= 0) {
        break;
       } else {
        i6 = i6 + 16 | 0;
       }
      }
      i4 = i4 + (i5 << 4) | 0;
     }
    }
   } while (0);
   HEAP32[i3 >> 2] = i4;
  } else {
   _luaV_execute(i1);
  }
  _unroll(i1, 0);
  STACKTOP = i2;
  return;
 } else {
  _resume_error(i1, 2488, i6);
 }
}
function _lua_setupvalue(i1, i5, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 i6 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i6 >> 2] | 0, (i5 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i4 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i4 = (HEAP32[i6 >> 2] | 0) + (i5 << 4) | 0;
   i5 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i4 = HEAP32[i5 + 8 >> 2] & 63;
 do {
  if ((i4 | 0) == 6) {
   i5 = HEAP32[i5 >> 2] | 0;
   i4 = HEAP32[i5 + 12 >> 2] | 0;
   if ((i3 | 0) <= 0) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   if ((HEAP32[i4 + 40 >> 2] | 0) < (i3 | 0)) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   i6 = i3 + -1 | 0;
   i3 = HEAP32[i5 + 16 + (i6 << 2) >> 2] | 0;
   i5 = HEAP32[i3 + 8 >> 2] | 0;
   i4 = HEAP32[(HEAP32[i4 + 28 >> 2] | 0) + (i6 << 3) >> 2] | 0;
   if ((i4 | 0) == 0) {
    i4 = 936;
   } else {
    i4 = i4 + 16 | 0;
   }
  } else if ((i4 | 0) == 38) {
   i6 = HEAP32[i5 >> 2] | 0;
   if ((i3 | 0) <= 0) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   if ((HEAPU8[i6 + 6 | 0] | 0 | 0) >= (i3 | 0)) {
    i4 = 936;
    i5 = i6 + (i3 + -1 << 4) + 16 | 0;
    i3 = i6;
    break;
   } else {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
  } else {
   i6 = 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 } while (0);
 i6 = i1 + 8 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 i10 = i7 + -16 | 0;
 HEAP32[i6 >> 2] = i10;
 i9 = HEAP32[i10 + 4 >> 2] | 0;
 i8 = i5;
 HEAP32[i8 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i8 + 4 >> 2] = i9;
 HEAP32[i5 + 8 >> 2] = HEAP32[i7 + -8 >> 2];
 i5 = HEAP32[i6 >> 2] | 0;
 if ((HEAP32[i5 + 8 >> 2] & 64 | 0) == 0) {
  i10 = i4;
  STACKTOP = i2;
  return i10 | 0;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 if ((HEAP8[i5 + 5 | 0] & 3) == 0) {
  i10 = i4;
  STACKTOP = i2;
  return i10 | 0;
 }
 if ((HEAP8[i3 + 5 | 0] & 4) == 0) {
  i10 = i4;
  STACKTOP = i2;
  return i10 | 0;
 }
 _luaC_barrier_(i1, i3, i5);
 i10 = i4;
 STACKTOP = i2;
 return i10 | 0;
}
function _luaC_forcestep(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i2 + 12 >> 2] | 0;
 do {
  if ((HEAP8[i3 + 62 | 0] | 0) == 2) {
   i4 = i3 + 20 | 0;
   i6 = HEAP32[i4 >> 2] | 0;
   do {
    if ((i6 | 0) != 0) {
     i5 = i3 + 61 | 0;
     if ((HEAP8[i5] | 0) != 5) {
      do {
       _singlestep(i2) | 0;
      } while ((HEAP8[i5] | 0) != 5);
     }
     HEAP8[i5] = 0;
     i5 = HEAP32[i3 + 8 >> 2] | 0;
     i7 = HEAP32[i3 + 12 >> 2] | 0;
     if ((i7 + i5 | 0) >>> 0 > (Math_imul(HEAP32[i3 + 160 >> 2] | 0, (i6 >>> 0) / 100 | 0) | 0) >>> 0) {
      HEAP32[i4 >> 2] = 0;
      break;
     } else {
      HEAP32[i4 >> 2] = i6;
      break;
     }
    } else {
     _luaC_fullgc(i2, 0);
     i5 = HEAP32[i3 + 8 >> 2] | 0;
     i7 = HEAP32[i3 + 12 >> 2] | 0;
     HEAP32[i4 >> 2] = i7 + i5;
    }
   } while (0);
   i4 = i5 + i7 | 0;
   i5 = (i4 | 0) / 100 | 0;
   i6 = HEAP32[i3 + 156 >> 2] | 0;
   if ((i6 | 0) < (2147483644 / (i5 | 0) | 0 | 0)) {
    i5 = Math_imul(i6, i5) | 0;
   } else {
    i5 = 2147483644;
   }
   _luaE_setdebt(i3, i4 - i5 | 0);
   i5 = i3 + 61 | 0;
  } else {
   i4 = i3 + 12 | 0;
   i5 = HEAP32[i3 + 164 >> 2] | 0;
   i7 = (i5 | 0) < 40 ? 40 : i5;
   i5 = ((HEAP32[i4 >> 2] | 0) / 200 | 0) + 1 | 0;
   if ((i5 | 0) < (2147483644 / (i7 | 0) | 0 | 0)) {
    i8 = Math_imul(i5, i7) | 0;
   } else {
    i8 = 2147483644;
   }
   i5 = i3 + 61 | 0;
   do {
    i8 = i8 - (_singlestep(i2) | 0) | 0;
    i9 = (HEAP8[i5] | 0) == 5;
    if (!((i8 | 0) > -1600)) {
     i6 = 17;
     break;
    }
   } while (!i9);
   if ((i6 | 0) == 17 ? !i9 : 0) {
    _luaE_setdebt(i3, ((i8 | 0) / (i7 | 0) | 0) * 200 | 0);
    break;
   }
   i6 = (HEAP32[i3 + 20 >> 2] | 0) / 100 | 0;
   i7 = HEAP32[i3 + 156 >> 2] | 0;
   if ((i7 | 0) < (2147483644 / (i6 | 0) | 0 | 0)) {
    i6 = Math_imul(i7, i6) | 0;
   } else {
    i6 = 2147483644;
   }
   _luaE_setdebt(i3, (HEAP32[i3 + 8 >> 2] | 0) - i6 + (HEAP32[i4 >> 2] | 0) | 0);
  }
 } while (0);
 i3 = i3 + 104 | 0;
 if ((HEAP32[i3 >> 2] | 0) == 0) {
  STACKTOP = i1;
  return;
 } else {
  i4 = 0;
 }
 while (1) {
  if ((i4 | 0) >= 4 ? (HEAP8[i5] | 0) != 5 : 0) {
   i6 = 26;
   break;
  }
  _GCTM(i2, 1);
  if ((HEAP32[i3 >> 2] | 0) == 0) {
   i6 = 26;
   break;
  } else {
   i4 = i4 + 1 | 0;
  }
 }
 if ((i6 | 0) == 26) {
  STACKTOP = i1;
  return;
 }
}
function _luaL_loadfilex(i1, i9, i7) {
 i1 = i1 | 0;
 i9 = i9 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i11 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i3 = i5;
 i6 = i5 + 16 | 0;
 i8 = i5 + 12 | 0;
 i2 = (_lua_gettop(i1) | 0) + 1 | 0;
 i4 = (i9 | 0) == 0;
 if (!i4) {
  HEAP32[i3 >> 2] = i9;
  _lua_pushfstring(i1, 1304, i3) | 0;
  i10 = _fopen(i9 | 0, 1312) | 0;
  HEAP32[i6 + 4 >> 2] = i10;
  if ((i10 | 0) == 0) {
   i10 = _strerror(HEAP32[(___errno_location() | 0) >> 2] | 0) | 0;
   i9 = (_lua_tolstring(i1, i2, 0) | 0) + 1 | 0;
   HEAP32[i3 >> 2] = 1320;
   HEAP32[i3 + 4 >> 2] = i9;
   HEAP32[i3 + 8 >> 2] = i10;
   _lua_pushfstring(i1, 1720, i3) | 0;
   _lua_remove(i1, i2);
   i10 = 7;
   STACKTOP = i5;
   return i10 | 0;
  }
 } else {
  _lua_pushlstring(i1, 1296, 6) | 0;
  HEAP32[i6 + 4 >> 2] = HEAP32[_stdin >> 2];
 }
 if ((_skipcomment(i6, i8) | 0) != 0) {
  i10 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i10 + 1;
  HEAP8[i6 + i10 + 8 | 0] = 10;
 }
 i10 = HEAP32[i8 >> 2] | 0;
 do {
  if (!((i10 | 0) != 27 | i4)) {
   i11 = i6 + 4 | 0;
   i10 = _freopen(i9 | 0, 1328, HEAP32[i11 >> 2] | 0) | 0;
   HEAP32[i11 >> 2] = i10;
   if ((i10 | 0) != 0) {
    _skipcomment(i6, i8) | 0;
    i10 = HEAP32[i8 >> 2] | 0;
    break;
   }
   i11 = _strerror(HEAP32[(___errno_location() | 0) >> 2] | 0) | 0;
   i10 = (_lua_tolstring(i1, i2, 0) | 0) + 1 | 0;
   HEAP32[i3 >> 2] = 1336;
   HEAP32[i3 + 4 >> 2] = i10;
   HEAP32[i3 + 8 >> 2] = i11;
   _lua_pushfstring(i1, 1720, i3) | 0;
   _lua_remove(i1, i2);
   i11 = 7;
   STACKTOP = i5;
   return i11 | 0;
  }
 } while (0);
 if (!((i10 | 0) == -1)) {
  i11 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i11 + 1;
  HEAP8[i6 + i11 + 8 | 0] = i10;
 }
 i7 = _lua_load(i1, 1, i6, _lua_tolstring(i1, -1, 0) | 0, i7) | 0;
 i8 = HEAP32[i6 + 4 >> 2] | 0;
 i6 = _ferror(i8 | 0) | 0;
 if (!i4) {
  _fclose(i8 | 0) | 0;
 }
 if ((i6 | 0) == 0) {
  _lua_remove(i1, i2);
  i11 = i7;
  STACKTOP = i5;
  return i11 | 0;
 } else {
  _lua_settop(i1, i2);
  i11 = _strerror(HEAP32[(___errno_location() | 0) >> 2] | 0) | 0;
  i10 = (_lua_tolstring(i1, i2, 0) | 0) + 1 | 0;
  HEAP32[i3 >> 2] = 1344;
  HEAP32[i3 + 4 >> 2] = i10;
  HEAP32[i3 + 8 >> 2] = i11;
  _lua_pushfstring(i1, 1720, i3) | 0;
  _lua_remove(i1, i2);
  i11 = 7;
  STACKTOP = i5;
  return i11 | 0;
 }
 return 0;
}
function _newupvalue(i3, i1, i2) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i12 = i4;
 i5 = HEAP32[i3 >> 2] | 0;
 i9 = i5 + 40 | 0;
 i7 = HEAP32[i9 >> 2] | 0;
 i6 = i3 + 47 | 0;
 i10 = HEAPU8[i6] | 0;
 if ((i10 + 1 | 0) >>> 0 > 255) {
  i11 = i3 + 12 | 0;
  i8 = HEAP32[(HEAP32[i11 >> 2] | 0) + 52 >> 2] | 0;
  i13 = HEAP32[i5 + 64 >> 2] | 0;
  if ((i13 | 0) == 0) {
   i15 = 6552;
   HEAP32[i12 >> 2] = 6880;
   i14 = i12 + 4 | 0;
   HEAP32[i14 >> 2] = 255;
   i14 = i12 + 8 | 0;
   HEAP32[i14 >> 2] = i15;
   i14 = _luaO_pushfstring(i8, 6592, i12) | 0;
   i15 = HEAP32[i11 >> 2] | 0;
   _luaX_syntaxerror(i15, i14);
  }
  HEAP32[i12 >> 2] = i13;
  i14 = _luaO_pushfstring(i8, 6568, i12) | 0;
  HEAP32[i12 >> 2] = 6880;
  i15 = i12 + 4 | 0;
  HEAP32[i15 >> 2] = 255;
  i15 = i12 + 8 | 0;
  HEAP32[i15 >> 2] = i14;
  i15 = _luaO_pushfstring(i8, 6592, i12) | 0;
  i14 = HEAP32[i11 >> 2] | 0;
  _luaX_syntaxerror(i14, i15);
 }
 if ((i10 | 0) < (i7 | 0)) {
  i8 = i7;
 } else {
  i8 = i5 + 28 | 0;
  HEAP32[i8 >> 2] = _luaM_growaux_(HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 52 >> 2] | 0, HEAP32[i8 >> 2] | 0, i9, 8, 255, 6880) | 0;
  i8 = HEAP32[i9 >> 2] | 0;
 }
 i9 = i5 + 28 | 0;
 if ((i7 | 0) < (i8 | 0)) {
  while (1) {
   i10 = i7 + 1 | 0;
   HEAP32[(HEAP32[i9 >> 2] | 0) + (i7 << 3) >> 2] = 0;
   if ((i10 | 0) < (i8 | 0)) {
    i7 = i10;
   } else {
    break;
   }
  }
 }
 HEAP8[(HEAP32[i9 >> 2] | 0) + ((HEAPU8[i6] | 0) << 3) + 4 | 0] = (HEAP32[i2 >> 2] | 0) == 7 | 0;
 HEAP8[(HEAP32[i9 >> 2] | 0) + ((HEAPU8[i6] | 0) << 3) + 5 | 0] = HEAP32[i2 + 8 >> 2];
 HEAP32[(HEAP32[i9 >> 2] | 0) + ((HEAPU8[i6] | 0) << 3) >> 2] = i1;
 if ((HEAP8[i1 + 5 | 0] & 3) == 0) {
  i15 = HEAP8[i6] | 0;
  i14 = i15 + 1 << 24 >> 24;
  HEAP8[i6] = i14;
  i15 = i15 & 255;
  STACKTOP = i4;
  return i15 | 0;
 }
 if ((HEAP8[i5 + 5 | 0] & 4) == 0) {
  i15 = HEAP8[i6] | 0;
  i14 = i15 + 1 << 24 >> 24;
  HEAP8[i6] = i14;
  i15 = i15 & 255;
  STACKTOP = i4;
  return i15 | 0;
 }
 _luaC_barrier_(HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 52 >> 2] | 0, i5, i1);
 i15 = HEAP8[i6] | 0;
 i14 = i15 + 1 << 24 >> 24;
 HEAP8[i6] = i14;
 i15 = i15 & 255;
 STACKTOP = i4;
 return i15 | 0;
}
function _close_func(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i6 = STACKTOP;
 i2 = HEAP32[i1 + 52 >> 2] | 0;
 i5 = i1 + 48 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 _luaK_ret(i4, 0, 0);
 _leaveblock(i4);
 i7 = i4 + 20 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i2);
 }
 i10 = i3 + 12 | 0;
 i9 = i3 + 48 | 0;
 HEAP32[i10 >> 2] = _luaM_realloc_(i2, HEAP32[i10 >> 2] | 0, HEAP32[i9 >> 2] << 2, i8 << 2) | 0;
 HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i2);
 }
 i9 = i3 + 20 | 0;
 i10 = i3 + 52 | 0;
 HEAP32[i9 >> 2] = _luaM_realloc_(i2, HEAP32[i9 >> 2] | 0, HEAP32[i10 >> 2] << 2, i8 << 2) | 0;
 HEAP32[i10 >> 2] = HEAP32[i7 >> 2];
 i8 = i4 + 32 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 if ((i7 + 1 | 0) >>> 0 > 268435455) {
  _luaM_toobig(i2);
 }
 i9 = i3 + 8 | 0;
 i10 = i3 + 44 | 0;
 HEAP32[i9 >> 2] = _luaM_realloc_(i2, HEAP32[i9 >> 2] | 0, HEAP32[i10 >> 2] << 4, i7 << 4) | 0;
 HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
 i8 = i4 + 36 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 if ((i7 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i2);
 }
 i9 = i3 + 16 | 0;
 i10 = i3 + 56 | 0;
 HEAP32[i9 >> 2] = _luaM_realloc_(i2, HEAP32[i9 >> 2] | 0, HEAP32[i10 >> 2] << 2, i7 << 2) | 0;
 HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
 i7 = i4 + 44 | 0;
 i8 = HEAP16[i7 >> 1] | 0;
 if ((i8 + 1 | 0) >>> 0 > 357913941) {
  _luaM_toobig(i2);
 }
 i10 = i3 + 24 | 0;
 i9 = i3 + 60 | 0;
 HEAP32[i10 >> 2] = _luaM_realloc_(i2, HEAP32[i10 >> 2] | 0, (HEAP32[i9 >> 2] | 0) * 12 | 0, i8 * 12 | 0) | 0;
 HEAP32[i9 >> 2] = HEAP16[i7 >> 1] | 0;
 i9 = i4 + 47 | 0;
 i8 = i3 + 28 | 0;
 i10 = i3 + 40 | 0;
 HEAP32[i8 >> 2] = _luaM_realloc_(i2, HEAP32[i8 >> 2] | 0, HEAP32[i10 >> 2] << 3, HEAPU8[i9] << 3) | 0;
 HEAP32[i10 >> 2] = HEAPU8[i9] | 0;
 HEAP32[i5 >> 2] = HEAP32[i4 + 8 >> 2];
 if (((HEAP32[i1 + 16 >> 2] | 0) + -288 | 0) >>> 0 < 2) {
  i10 = HEAP32[i1 + 24 >> 2] | 0;
  _luaX_newstring(i1, i10 + 16 | 0, HEAP32[i10 + 12 >> 2] | 0) | 0;
 }
 i10 = i2 + 8 | 0;
 HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + -16;
 if ((HEAP32[(HEAP32[i2 + 12 >> 2] | 0) + 12 >> 2] | 0) <= 0) {
  STACKTOP = i6;
  return;
 }
 _luaC_step(i2);
 STACKTOP = i6;
 return;
}
function _lua_topointer(i3, i6) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 i5 = (i6 | 0) > 0;
 do {
  if (!i5) {
   if (!((i6 | 0) < -1000999)) {
    i7 = (HEAP32[i3 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i7 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i8 = -1001e3 - i6 | 0;
   i9 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i9 + 8 >> 2] | 0) != 22 ? (i7 = HEAP32[i9 >> 2] | 0, (i8 | 0) <= (HEAPU8[i7 + 6 | 0] | 0 | 0)) : 0) {
    i7 = i7 + (i8 + -1 << 4) + 16 | 0;
   } else {
    i7 = 5192;
   }
  } else {
   i7 = (HEAP32[i4 >> 2] | 0) + (i6 << 4) | 0;
   i7 = i7 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i7 : 5192;
  }
 } while (0);
 switch (HEAP32[i7 + 8 >> 2] & 63 | 0) {
 case 22:
  {
   i9 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 case 2:
 case 7:
  {
   do {
    if (!i5) {
     if (!((i6 | 0) < -1000999)) {
      i2 = (HEAP32[i3 + 8 >> 2] | 0) + (i6 << 4) | 0;
      break;
     }
     if ((i6 | 0) == -1001e3) {
      i2 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
      break;
     }
     i3 = -1001e3 - i6 | 0;
     i4 = HEAP32[i4 >> 2] | 0;
     if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
      i2 = i2 + (i3 + -1 << 4) + 16 | 0;
     } else {
      i2 = 5192;
     }
    } else {
     i2 = (HEAP32[i4 >> 2] | 0) + (i6 << 4) | 0;
     i2 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
    }
   } while (0);
   i3 = HEAP32[i2 + 8 >> 2] & 15;
   if ((i3 | 0) == 7) {
    i9 = (HEAP32[i2 >> 2] | 0) + 24 | 0;
    STACKTOP = i1;
    return i9 | 0;
   } else if ((i3 | 0) == 2) {
    i9 = HEAP32[i2 >> 2] | 0;
    STACKTOP = i1;
    return i9 | 0;
   } else {
    i9 = 0;
    STACKTOP = i1;
    return i9 | 0;
   }
  }
 case 8:
  {
   i9 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 case 5:
  {
   i9 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 case 38:
  {
   i9 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 case 6:
  {
   i9 = HEAP32[i7 >> 2] | 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 default:
  {
   i9 = 0;
   STACKTOP = i1;
   return i9 | 0;
  }
 }
 return 0;
}
function _luaH_get(i4, i6) {
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, d5 = 0.0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, d11 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i8 = i3 + 8 | 0;
 i9 = i3;
 i7 = i6 + 8 | 0;
 i10 = HEAP32[i7 >> 2] & 63;
 if ((i10 | 0) == 4) {
  i6 = HEAP32[i6 >> 2] | 0;
  i7 = (HEAP32[i4 + 16 >> 2] | 0) + (((1 << (HEAPU8[i4 + 7 | 0] | 0)) + -1 & HEAP32[i6 + 8 >> 2]) << 5) | 0;
  while (1) {
   if ((HEAP32[i7 + 24 >> 2] | 0) == 68 ? (HEAP32[i7 + 16 >> 2] | 0) == (i6 | 0) : 0) {
    break;
   }
   i4 = HEAP32[i7 + 28 >> 2] | 0;
   if ((i4 | 0) == 0) {
    i2 = 5192;
    i1 = 22;
    break;
   } else {
    i7 = i4;
   }
  }
  if ((i1 | 0) == 22) {
   STACKTOP = i3;
   return i2 | 0;
  }
  i10 = i7;
  STACKTOP = i3;
  return i10 | 0;
 } else if ((i10 | 0) == 3) {
  d11 = +HEAPF64[i6 >> 3];
  HEAPF64[i9 >> 3] = d11 + 6755399441055744.0;
  i9 = HEAP32[i9 >> 2] | 0;
  d5 = +(i9 | 0);
  if (d5 == d11) {
   i6 = i9 + -1 | 0;
   if (i6 >>> 0 < (HEAP32[i4 + 28 >> 2] | 0) >>> 0) {
    i10 = (HEAP32[i4 + 12 >> 2] | 0) + (i6 << 4) | 0;
    STACKTOP = i3;
    return i10 | 0;
   }
   HEAPF64[i8 >> 3] = d5 + 1.0;
   i6 = (HEAP32[i8 + 4 >> 2] | 0) + (HEAP32[i8 >> 2] | 0) | 0;
   if ((i6 | 0) < 0) {
    i7 = 0 - i6 | 0;
    i6 = (i6 | 0) == (i7 | 0) ? 0 : i7;
   }
   i4 = (HEAP32[i4 + 16 >> 2] | 0) + (((i6 | 0) % ((1 << (HEAPU8[i4 + 7 | 0] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
   while (1) {
    if ((HEAP32[i4 + 24 >> 2] | 0) == 3 ? +HEAPF64[i4 + 16 >> 3] == d5 : 0) {
     break;
    }
    i6 = HEAP32[i4 + 28 >> 2] | 0;
    if ((i6 | 0) == 0) {
     i2 = 5192;
     i1 = 22;
     break;
    } else {
     i4 = i6;
    }
   }
   if ((i1 | 0) == 22) {
    STACKTOP = i3;
    return i2 | 0;
   }
   i10 = i4;
   STACKTOP = i3;
   return i10 | 0;
  }
 } else if ((i10 | 0) == 0) {
  i10 = 5192;
  STACKTOP = i3;
  return i10 | 0;
 }
 i8 = _mainposition(i4, i6) | 0;
 while (1) {
  if ((HEAP32[i8 + 24 >> 2] | 0) == (HEAP32[i7 >> 2] | 0) ? (_luaV_equalobj_(0, i8 + 16 | 0, i6) | 0) != 0 : 0) {
   break;
  }
  i4 = HEAP32[i8 + 28 >> 2] | 0;
  if ((i4 | 0) == 0) {
   i2 = 5192;
   i1 = 22;
   break;
  } else {
   i8 = i4;
  }
 }
 if ((i1 | 0) == 22) {
  STACKTOP = i3;
  return i2 | 0;
 }
 i10 = i8;
 STACKTOP = i3;
 return i10 | 0;
}
function _suffixedexp(i1, i8) {
 i1 = i1 | 0;
 i8 = i8 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 80 | 0;
 i10 = i2 + 48 | 0;
 i3 = i2 + 24 | 0;
 i6 = i2;
 i4 = i1 + 48 | 0;
 i9 = HEAP32[i4 >> 2] | 0;
 i5 = HEAP32[i1 + 4 >> 2] | 0;
 i7 = i1 + 16 | 0;
 i12 = HEAP32[i7 >> 2] | 0;
 if ((i12 | 0) == 40) {
  _luaX_next(i1);
  _subexpr(i1, i8, 0) | 0;
  _check_match(i1, 41, 40, i5);
  _luaK_dischargevars(HEAP32[i4 >> 2] | 0, i8);
  i11 = i1 + 24 | 0;
 } else if ((i12 | 0) == 288) {
  i11 = i1 + 24 | 0;
  i13 = HEAP32[i11 >> 2] | 0;
  _luaX_next(i1);
  i12 = HEAP32[i4 >> 2] | 0;
  if ((_singlevaraux(i12, i13, i8, 1) | 0) == 0) {
   _singlevaraux(i12, HEAP32[i1 + 72 >> 2] | 0, i8, 1) | 0;
   i13 = _luaK_stringK(HEAP32[i4 >> 2] | 0, i13) | 0;
   HEAP32[i10 + 16 >> 2] = -1;
   HEAP32[i10 + 20 >> 2] = -1;
   HEAP32[i10 >> 2] = 4;
   HEAP32[i10 + 8 >> 2] = i13;
   _luaK_indexed(i12, i8, i10);
  }
 } else {
  _luaX_syntaxerror(i1, 6656);
 }
 i10 = i6 + 16 | 0;
 i12 = i6 + 20 | 0;
 i13 = i6 + 8 | 0;
 L7 : while (1) {
  switch (HEAP32[i7 >> 2] | 0) {
  case 46:
   {
    _fieldsel(i1, i8);
    continue L7;
   }
  case 91:
   {
    _luaK_exp2anyregup(i9, i8);
    _luaX_next(i1);
    _subexpr(i1, i3, 0) | 0;
    _luaK_exp2val(HEAP32[i4 >> 2] | 0, i3);
    if ((HEAP32[i7 >> 2] | 0) != 93) {
     i3 = 10;
     break L7;
    }
    _luaX_next(i1);
    _luaK_indexed(i9, i8, i3);
    continue L7;
   }
  case 58:
   {
    _luaX_next(i1);
    if ((HEAP32[i7 >> 2] | 0) != 288) {
     i3 = 13;
     break L7;
    }
    i14 = HEAP32[i11 >> 2] | 0;
    _luaX_next(i1);
    i14 = _luaK_stringK(HEAP32[i4 >> 2] | 0, i14) | 0;
    HEAP32[i10 >> 2] = -1;
    HEAP32[i12 >> 2] = -1;
    HEAP32[i6 >> 2] = 4;
    HEAP32[i13 >> 2] = i14;
    _luaK_self(i9, i8, i6);
    _funcargs(i1, i8, i5);
    continue L7;
   }
  case 123:
  case 289:
  case 40:
   {
    _luaK_exp2nextreg(i9, i8);
    _funcargs(i1, i8, i5);
    continue L7;
   }
  default:
   {
    i3 = 16;
    break L7;
   }
  }
 }
 if ((i3 | 0) == 10) {
  _error_expected(i1, 93);
 } else if ((i3 | 0) == 13) {
  _error_expected(i1, 288);
 } else if ((i3 | 0) == 16) {
  STACKTOP = i2;
  return;
 }
}
function _luaK_patchlist(i2, i7, i3) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i2 + 20 >> 2] | 0) == (i3 | 0)) {
  HEAP32[i2 + 24 >> 2] = i3;
  i3 = i2 + 28 | 0;
  if ((i7 | 0) == -1) {
   STACKTOP = i1;
   return;
  }
  i6 = HEAP32[i3 >> 2] | 0;
  if ((i6 | 0) == -1) {
   HEAP32[i3 >> 2] = i7;
   STACKTOP = i1;
   return;
  }
  i5 = HEAP32[(HEAP32[i2 >> 2] | 0) + 12 >> 2] | 0;
  while (1) {
   i3 = i5 + (i6 << 2) | 0;
   i4 = HEAP32[i3 >> 2] | 0;
   i8 = (i4 >>> 14) + -131071 | 0;
   if ((i8 | 0) == -1) {
    break;
   }
   i8 = i6 + 1 + i8 | 0;
   if ((i8 | 0) == -1) {
    break;
   } else {
    i6 = i8;
   }
  }
  i5 = ~i6 + i7 | 0;
  if ((((i5 | 0) > -1 ? i5 : 0 - i5 | 0) | 0) > 131071) {
   _luaX_syntaxerror(HEAP32[i2 + 12 >> 2] | 0, 10624);
  }
  HEAP32[i3 >> 2] = (i5 << 14) + 2147467264 | i4 & 16383;
  STACKTOP = i1;
  return;
 }
 if ((i7 | 0) == -1) {
  STACKTOP = i1;
  return;
 }
 i6 = HEAP32[(HEAP32[i2 >> 2] | 0) + 12 >> 2] | 0;
 i10 = i7;
 while (1) {
  i7 = i6 + (i10 << 2) | 0;
  i9 = HEAP32[i7 >> 2] | 0;
  i8 = (i9 >>> 14) + -131071 | 0;
  if ((i8 | 0) == -1) {
   i8 = -1;
  } else {
   i8 = i10 + 1 + i8 | 0;
  }
  if ((i10 | 0) > 0 ? (i4 = i6 + (i10 + -1 << 2) | 0, i5 = HEAP32[i4 >> 2] | 0, (HEAP8[5584 + (i5 & 63) | 0] | 0) < 0) : 0) {
   i12 = i4;
   i11 = i5;
  } else {
   i12 = i7;
   i11 = i9;
  }
  if ((i11 & 63 | 0) == 28) {
   HEAP32[i12 >> 2] = i11 & 8372224 | i11 >>> 23 << 6 | 27;
   i9 = ~i10 + i3 | 0;
   if ((((i9 | 0) > -1 ? i9 : 0 - i9 | 0) | 0) > 131071) {
    i3 = 20;
    break;
   }
   i9 = HEAP32[i7 >> 2] & 16383 | (i9 << 14) + 2147467264;
  } else {
   i10 = ~i10 + i3 | 0;
   if ((((i10 | 0) > -1 ? i10 : 0 - i10 | 0) | 0) > 131071) {
    i3 = 23;
    break;
   }
   i9 = i9 & 16383 | (i10 << 14) + 2147467264;
  }
  HEAP32[i7 >> 2] = i9;
  if ((i8 | 0) == -1) {
   i3 = 26;
   break;
  } else {
   i10 = i8;
  }
 }
 if ((i3 | 0) == 20) {
  _luaX_syntaxerror(HEAP32[i2 + 12 >> 2] | 0, 10624);
 } else if ((i3 | 0) == 23) {
  _luaX_syntaxerror(HEAP32[i2 + 12 >> 2] | 0, 10624);
 } else if ((i3 | 0) == 26) {
  STACKTOP = i1;
  return;
 }
}
function _luaG_typeerror(i5, i6, i1) {
 i5 = i5 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i2;
 i2 = i2 + 16 | 0;
 i8 = HEAP32[i5 + 16 >> 2] | 0;
 HEAP32[i2 >> 2] = 0;
 i4 = HEAP32[8528 + ((HEAP32[i6 + 8 >> 2] & 15) + 1 << 2) >> 2] | 0;
 L1 : do {
  if (!((HEAP8[i8 + 18 | 0] & 1) == 0)) {
   i7 = HEAP32[HEAP32[i8 >> 2] >> 2] | 0;
   i10 = HEAP8[i7 + 6 | 0] | 0;
   L3 : do {
    if (!(i10 << 24 >> 24 == 0)) {
     i9 = i7 + 16 | 0;
     i11 = i10 & 255;
     i10 = 0;
     while (1) {
      i12 = i10 + 1 | 0;
      if ((HEAP32[(HEAP32[i9 + (i10 << 2) >> 2] | 0) + 8 >> 2] | 0) == (i6 | 0)) {
       break;
      }
      if ((i12 | 0) < (i11 | 0)) {
       i10 = i12;
      } else {
       break L3;
      }
     }
     i9 = HEAP32[(HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 28 >> 2] | 0) + (i10 << 3) >> 2] | 0;
     if ((i9 | 0) == 0) {
      i9 = 2104;
     } else {
      i9 = i9 + 16 | 0;
     }
     HEAP32[i2 >> 2] = i9;
     i11 = i9;
     i10 = 2072;
     HEAP32[i3 >> 2] = i1;
     i12 = i3 + 4 | 0;
     HEAP32[i12 >> 2] = i10;
     i12 = i3 + 8 | 0;
     HEAP32[i12 >> 2] = i11;
     i12 = i3 + 12 | 0;
     HEAP32[i12 >> 2] = i4;
     _luaG_runerror(i5, 1840, i3);
    }
   } while (0);
   i9 = HEAP32[i8 + 24 >> 2] | 0;
   i10 = HEAP32[i8 + 4 >> 2] | 0;
   if (i9 >>> 0 < i10 >>> 0) {
    i12 = i9;
    while (1) {
     i11 = i12 + 16 | 0;
     if ((i12 | 0) == (i6 | 0)) {
      break;
     }
     if (i11 >>> 0 < i10 >>> 0) {
      i12 = i11;
     } else {
      break L1;
     }
    }
    i12 = HEAP32[i7 + 12 >> 2] | 0;
    i6 = _getobjname(i12, ((HEAP32[i8 + 28 >> 2] | 0) - (HEAP32[i12 + 12 >> 2] | 0) >> 2) + -1 | 0, i6 - i9 >> 4, i2) | 0;
    if ((i6 | 0) != 0) {
     i11 = HEAP32[i2 >> 2] | 0;
     i10 = i6;
     HEAP32[i3 >> 2] = i1;
     i12 = i3 + 4 | 0;
     HEAP32[i12 >> 2] = i10;
     i12 = i3 + 8 | 0;
     HEAP32[i12 >> 2] = i11;
     i12 = i3 + 12 | 0;
     HEAP32[i12 >> 2] = i4;
     _luaG_runerror(i5, 1840, i3);
    }
   }
  }
 } while (0);
 HEAP32[i3 >> 2] = i1;
 HEAP32[i3 + 4 >> 2] = i4;
 _luaG_runerror(i5, 1880, i3);
}
function _lua_setmetatable(i1, i7) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0;
 i4 = STACKTOP;
 i6 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i7 | 0) <= 0) {
   if (!((i7 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i7 << 4) | 0;
    break;
   }
   if ((i7 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i7 = -1001e3 - i7 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i5 = HEAP32[i6 >> 2] | 0, (i7 | 0) <= (HEAPU8[i5 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i5 + (i7 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i5 = (HEAP32[i6 >> 2] | 0) + (i7 << 4) | 0;
   i5 = i5 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i5 : 5192;
  }
 } while (0);
 i6 = i1 + 8 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 if ((HEAP32[i7 + -8 >> 2] | 0) == 0) {
  i7 = 0;
 } else {
  i7 = HEAP32[i7 + -16 >> 2] | 0;
 }
 i8 = HEAP32[i5 + 8 >> 2] & 15;
 if ((i8 | 0) == 5) {
  HEAP32[(HEAP32[i5 >> 2] | 0) + 8 >> 2] = i7;
  if ((i7 | 0) == 0) {
   i8 = HEAP32[i6 >> 2] | 0;
   i8 = i8 + -16 | 0;
   HEAP32[i6 >> 2] = i8;
   STACKTOP = i4;
   return 1;
  }
  if (!((HEAP8[i7 + 5 | 0] & 3) == 0) ? (i2 = HEAP32[i5 >> 2] | 0, !((HEAP8[i2 + 5 | 0] & 4) == 0)) : 0) {
   _luaC_barrierback_(i1, i2);
  }
  _luaC_checkfinalizer(i1, HEAP32[i5 >> 2] | 0, i7);
  i8 = HEAP32[i6 >> 2] | 0;
  i8 = i8 + -16 | 0;
  HEAP32[i6 >> 2] = i8;
  STACKTOP = i4;
  return 1;
 } else if ((i8 | 0) == 7) {
  HEAP32[(HEAP32[i5 >> 2] | 0) + 8 >> 2] = i7;
  if ((i7 | 0) == 0) {
   i8 = HEAP32[i6 >> 2] | 0;
   i8 = i8 + -16 | 0;
   HEAP32[i6 >> 2] = i8;
   STACKTOP = i4;
   return 1;
  }
  if (!((HEAP8[i7 + 5 | 0] & 3) == 0) ? (i3 = HEAP32[i5 >> 2] | 0, !((HEAP8[i3 + 5 | 0] & 4) == 0)) : 0) {
   _luaC_barrier_(i1, i3, i7);
  }
  _luaC_checkfinalizer(i1, HEAP32[i5 >> 2] | 0, i7);
  i8 = HEAP32[i6 >> 2] | 0;
  i8 = i8 + -16 | 0;
  HEAP32[i6 >> 2] = i8;
  STACKTOP = i4;
  return 1;
 } else {
  HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + (i8 << 2) + 252 >> 2] = i7;
  i8 = HEAP32[i6 >> 2] | 0;
  i8 = i8 + -16 | 0;
  HEAP32[i6 >> 2] = i8;
  STACKTOP = i4;
  return 1;
 }
 return 0;
}
function _recfield(i2, i10) {
 i2 = i2 | 0;
 i10 = i10 | 0;
 var i1 = 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;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i9 = i1 + 48 | 0;
 i6 = i1 + 24 | 0;
 i3 = i1;
 i13 = i2 + 48 | 0;
 i8 = HEAP32[i13 >> 2] | 0;
 i5 = i8 + 48 | 0;
 i4 = HEAP8[i5] | 0;
 i7 = i2 + 16 | 0;
 do {
  if ((HEAP32[i7 >> 2] | 0) != 288) {
   _luaX_next(i2);
   _subexpr(i2, i6, 0) | 0;
   _luaK_exp2val(HEAP32[i13 >> 2] | 0, i6);
   if ((HEAP32[i7 >> 2] | 0) == 93) {
    _luaX_next(i2);
    i11 = i10 + 28 | 0;
    break;
   } else {
    _error_expected(i2, 93);
   }
  } else {
   i12 = i10 + 28 | 0;
   if ((HEAP32[i12 >> 2] | 0) <= 2147483645) {
    i11 = HEAP32[i2 + 24 >> 2] | 0;
    _luaX_next(i2);
    i11 = _luaK_stringK(HEAP32[i13 >> 2] | 0, i11) | 0;
    HEAP32[i6 + 16 >> 2] = -1;
    HEAP32[i6 + 20 >> 2] = -1;
    HEAP32[i6 >> 2] = 4;
    HEAP32[i6 + 8 >> 2] = i11;
    i11 = i12;
    break;
   }
   i14 = i8 + 12 | 0;
   i13 = HEAP32[(HEAP32[i14 >> 2] | 0) + 52 >> 2] | 0;
   i12 = HEAP32[(HEAP32[i8 >> 2] | 0) + 64 >> 2] | 0;
   if ((i12 | 0) == 0) {
    i16 = 6552;
    HEAP32[i9 >> 2] = 6528;
    i15 = i9 + 4 | 0;
    HEAP32[i15 >> 2] = 2147483645;
    i15 = i9 + 8 | 0;
    HEAP32[i15 >> 2] = i16;
    i15 = _luaO_pushfstring(i13, 6592, i9) | 0;
    i16 = HEAP32[i14 >> 2] | 0;
    _luaX_syntaxerror(i16, i15);
   }
   HEAP32[i9 >> 2] = i12;
   i15 = _luaO_pushfstring(i13, 6568, i9) | 0;
   HEAP32[i9 >> 2] = 6528;
   i16 = i9 + 4 | 0;
   HEAP32[i16 >> 2] = 2147483645;
   i16 = i9 + 8 | 0;
   HEAP32[i16 >> 2] = i15;
   i16 = _luaO_pushfstring(i13, 6592, i9) | 0;
   i15 = HEAP32[i14 >> 2] | 0;
   _luaX_syntaxerror(i15, i16);
  }
 } while (0);
 HEAP32[i11 >> 2] = (HEAP32[i11 >> 2] | 0) + 1;
 if ((HEAP32[i7 >> 2] | 0) == 61) {
  _luaX_next(i2);
  i16 = _luaK_exp2RK(i8, i6) | 0;
  _subexpr(i2, i3, 0) | 0;
  i15 = HEAP32[(HEAP32[i10 + 24 >> 2] | 0) + 8 >> 2] | 0;
  _luaK_codeABC(i8, 10, i15, i16, _luaK_exp2RK(i8, i3) | 0) | 0;
  HEAP8[i5] = i4;
  STACKTOP = i1;
  return;
 } else {
  _error_expected(i2, 61);
 }
}
function _lua_newstate(i3, i6) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i5 = i1 + 8 | 0;
 i4 = i1;
 i2 = FUNCTION_TABLE_iiiii[i3 & 3](i6, 0, 8, 400) | 0;
 if ((i2 | 0) == 0) {
  i6 = 0;
  STACKTOP = i1;
  return i6 | 0;
 }
 i7 = i2 + 112 | 0;
 HEAP32[i2 >> 2] = 0;
 HEAP8[i2 + 4 | 0] = 8;
 HEAP8[i2 + 172 | 0] = 33;
 HEAP8[i2 + 5 | 0] = 1;
 HEAP8[i2 + 174 | 0] = 0;
 HEAP32[i2 + 12 >> 2] = i7;
 HEAP32[i2 + 28 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 HEAP32[i2 + 32 >> 2] = 0;
 HEAP32[i2 + 64 >> 2] = 0;
 HEAP16[i2 + 38 >> 1] = 0;
 HEAP32[i2 + 52 >> 2] = 0;
 HEAP8[i2 + 40 | 0] = 0;
 HEAP32[i2 + 44 >> 2] = 0;
 HEAP8[i2 + 41 | 0] = 1;
 HEAP32[i2 + 48 >> 2] = 0;
 HEAP32[i2 + 56 >> 2] = 0;
 HEAP16[i2 + 36 >> 1] = 1;
 HEAP8[i2 + 6 | 0] = 0;
 HEAP32[i2 + 68 >> 2] = 0;
 HEAP32[i7 >> 2] = i3;
 HEAP32[i2 + 116 >> 2] = i6;
 HEAP32[i2 + 284 >> 2] = i2;
 i3 = _time(0) | 0;
 HEAP32[i4 >> 2] = i3;
 HEAP32[i5 >> 2] = i2;
 HEAP32[i5 + 4 >> 2] = i4;
 HEAP32[i5 + 8 >> 2] = 5192;
 HEAP32[i5 + 12 >> 2] = 1;
 HEAP32[i2 + 168 >> 2] = _luaS_hash(i5, 16, i3) | 0;
 i4 = i2 + 224 | 0;
 HEAP32[i2 + 240 >> 2] = i4;
 HEAP32[i2 + 244 >> 2] = i4;
 HEAP8[i2 + 175 | 0] = 0;
 i4 = i2 + 132 | 0;
 HEAP32[i2 + 160 >> 2] = 0;
 HEAP32[i2 + 256 >> 2] = 0;
 HEAP32[i2 + 264 >> 2] = 0;
 HEAP32[i2 + 280 >> 2] = 0;
 HEAP32[i4 + 0 >> 2] = 0;
 HEAP32[i4 + 4 >> 2] = 0;
 HEAP32[i4 + 8 >> 2] = 0;
 HEAP32[i4 + 12 >> 2] = 0;
 HEAP32[i2 + 288 >> 2] = _lua_version(0) | 0;
 HEAP8[i2 + 173 | 0] = 5;
 i4 = i2 + 120 | 0;
 i5 = i2 + 180 | 0;
 i3 = i5 + 40 | 0;
 do {
  HEAP32[i5 >> 2] = 0;
  i5 = i5 + 4 | 0;
 } while ((i5 | 0) < (i3 | 0));
 HEAP32[i4 >> 2] = 400;
 HEAP32[i2 + 124 >> 2] = 0;
 HEAP32[i2 + 268 >> 2] = 200;
 HEAP32[i2 + 272 >> 2] = 200;
 HEAP32[i2 + 276 >> 2] = 200;
 i5 = i2 + 364 | 0;
 i3 = i5 + 36 | 0;
 do {
  HEAP32[i5 >> 2] = 0;
  i5 = i5 + 4 | 0;
 } while ((i5 | 0) < (i3 | 0));
 if ((_luaD_rawrunprotected(i2, 8, 0) | 0) == 0) {
  i7 = i2;
  STACKTOP = i1;
  return i7 | 0;
 }
 _close_state(i2);
 i7 = 0;
 STACKTOP = i1;
 return i7 | 0;
}
function _luaU_undump(i1, i7, i8, i9) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i8 = i8 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i4 = i2 + 16 | 0;
 i5 = i2 + 34 | 0;
 i3 = i2;
 i6 = HEAP8[i9] | 0;
 if (i6 << 24 >> 24 == 27) {
  HEAP32[i3 + 12 >> 2] = 8800;
 } else if (i6 << 24 >> 24 == 61 | i6 << 24 >> 24 == 64) {
  HEAP32[i3 + 12 >> 2] = i9 + 1;
 } else {
  HEAP32[i3 + 12 >> 2] = i9;
 }
 HEAP32[i3 >> 2] = i1;
 HEAP32[i3 + 4 >> 2] = i7;
 HEAP32[i3 + 8 >> 2] = i8;
 HEAP32[i4 >> 2] = 1635077147;
 HEAP8[i4 + 4 | 0] = 82;
 HEAP8[i4 + 5 | 0] = 0;
 HEAP8[i4 + 6 | 0] = 1;
 HEAP8[i4 + 7 | 0] = 4;
 HEAP8[i4 + 8 | 0] = 4;
 HEAP8[i4 + 9 | 0] = 4;
 HEAP8[i4 + 10 | 0] = 8;
 i9 = i4 + 12 | 0;
 HEAP8[i4 + 11 | 0] = 0;
 HEAP8[i9 + 0 | 0] = HEAP8[8816 | 0] | 0;
 HEAP8[i9 + 1 | 0] = HEAP8[8817 | 0] | 0;
 HEAP8[i9 + 2 | 0] = HEAP8[8818 | 0] | 0;
 HEAP8[i9 + 3 | 0] = HEAP8[8819 | 0] | 0;
 HEAP8[i9 + 4 | 0] = HEAP8[8820 | 0] | 0;
 HEAP8[i9 + 5 | 0] = HEAP8[8821 | 0] | 0;
 HEAP8[i5] = 27;
 if ((_luaZ_read(i7, i5 + 1 | 0, 17) | 0) != 0) {
  _error(i3, 8824);
 }
 if ((_memcmp(i4, i5, 18) | 0) == 0) {
  i4 = _luaF_newLclosure(i1, 1) | 0;
  i5 = i1 + 8 | 0;
  i9 = HEAP32[i5 >> 2] | 0;
  HEAP32[i9 >> 2] = i4;
  HEAP32[i9 + 8 >> 2] = 70;
  i9 = (HEAP32[i5 >> 2] | 0) + 16 | 0;
  HEAP32[i5 >> 2] = i9;
  if (((HEAP32[i1 + 24 >> 2] | 0) - i9 | 0) < 16) {
   _luaD_growstack(i1, 0);
  }
  i9 = _luaF_newproto(i1) | 0;
  i6 = i4 + 12 | 0;
  HEAP32[i6 >> 2] = i9;
  _LoadFunction(i3, i9);
  i6 = HEAP32[i6 >> 2] | 0;
  i3 = HEAP32[i6 + 40 >> 2] | 0;
  if ((i3 | 0) == 1) {
   i9 = i4;
   STACKTOP = i2;
   return i9 | 0;
  }
  i9 = _luaF_newLclosure(i1, i3) | 0;
  HEAP32[i9 + 12 >> 2] = i6;
  i8 = HEAP32[i5 >> 2] | 0;
  HEAP32[i8 + -16 >> 2] = i9;
  HEAP32[i8 + -8 >> 2] = 70;
  STACKTOP = i2;
  return i9 | 0;
 }
 if ((_memcmp(i4, i5, 4) | 0) != 0) {
  _error(i3, 8888);
 }
 if ((_memcmp(i4, i5, 6) | 0) != 0) {
  _error(i3, 8896);
 }
 if ((_memcmp(i4, i5, 12) | 0) == 0) {
  _error(i3, 8872);
 } else {
  _error(i3, 8920);
 }
 return 0;
}
function _lua_compare(i2, i7, i5, i3) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i6 = 0, i8 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i7 | 0) <= 0) {
   if (!((i7 | 0) < -1000999)) {
    i6 = (HEAP32[i2 + 8 >> 2] | 0) + (i7 << 4) | 0;
    break;
   }
   if ((i7 | 0) == -1001e3) {
    i6 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i7 = -1001e3 - i7 | 0;
   i8 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i8 + 8 >> 2] | 0) != 22 ? (i6 = HEAP32[i8 >> 2] | 0, (i7 | 0) <= (HEAPU8[i6 + 6 | 0] | 0 | 0)) : 0) {
    i6 = i6 + (i7 + -1 << 4) + 16 | 0;
   } else {
    i6 = 5192;
   }
  } else {
   i6 = (HEAP32[i4 >> 2] | 0) + (i7 << 4) | 0;
   i6 = i6 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i6 : 5192;
  }
 } while (0);
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i4 = (HEAP32[i2 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i4 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) == 22) {
    i8 = 0;
    STACKTOP = i1;
    return i8 | 0;
   }
   i4 = HEAP32[i4 >> 2] | 0;
   if ((i5 | 0) > (HEAPU8[i4 + 6 | 0] | 0 | 0)) {
    i8 = 0;
    STACKTOP = i1;
    return i8 | 0;
   } else {
    i4 = i4 + (i5 + -1 << 4) + 16 | 0;
    break;
   }
  } else {
   i4 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 if ((i6 | 0) == 5192 | (i4 | 0) == 5192) {
  i8 = 0;
  STACKTOP = i1;
  return i8 | 0;
 }
 if ((i3 | 0) == 1) {
  i8 = _luaV_lessthan(i2, i6, i4) | 0;
  STACKTOP = i1;
  return i8 | 0;
 } else if ((i3 | 0) == 2) {
  i8 = _luaV_lessequal(i2, i6, i4) | 0;
  STACKTOP = i1;
  return i8 | 0;
 } else if ((i3 | 0) == 0) {
  if ((HEAP32[i6 + 8 >> 2] | 0) == (HEAP32[i4 + 8 >> 2] | 0)) {
   i2 = (_luaV_equalobj_(i2, i6, i4) | 0) != 0;
  } else {
   i2 = 0;
  }
  i8 = i2 & 1;
  STACKTOP = i1;
  return i8 | 0;
 } else {
  i8 = 0;
  STACKTOP = i1;
  return i8 | 0;
 }
 return 0;
}
function _lexerror(i7, i3, i8) {
 i7 = i7 | 0;
 i3 = i3 | 0;
 i8 = i8 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i12 = STACKTOP;
 STACKTOP = STACKTOP + 80 | 0;
 i2 = i12;
 i12 = i12 + 12 | 0;
 _luaO_chunkid(i12, (HEAP32[i7 + 68 >> 2] | 0) + 16 | 0, 60);
 i1 = i7 + 52 | 0;
 i4 = HEAP32[i1 >> 2] | 0;
 i13 = HEAP32[i7 + 4 >> 2] | 0;
 HEAP32[i2 >> 2] = i12;
 HEAP32[i2 + 4 >> 2] = i13;
 HEAP32[i2 + 8 >> 2] = i3;
 i4 = _luaO_pushfstring(i4, 12592, i2) | 0;
 if ((i8 | 0) == 0) {
  i13 = HEAP32[i1 >> 2] | 0;
  _luaD_throw(i13, 3);
 }
 i3 = HEAP32[i1 >> 2] | 0;
 do {
  if (!((i8 + -287 | 0) >>> 0 < 3)) {
   if ((i8 | 0) >= 257) {
    i5 = HEAP32[12096 + (i8 + -257 << 2) >> 2] | 0;
    if ((i8 | 0) >= 286) {
     break;
    }
    HEAP32[i2 >> 2] = i5;
    i5 = _luaO_pushfstring(i3, 12256, i2) | 0;
    break;
   }
   if ((HEAP8[i8 + 10913 | 0] & 4) == 0) {
    HEAP32[i2 >> 2] = i8;
    i5 = _luaO_pushfstring(i3, 12240, i2) | 0;
    break;
   } else {
    HEAP32[i2 >> 2] = i8;
    i5 = _luaO_pushfstring(i3, 12232, i2) | 0;
    break;
   }
  } else {
   i11 = i7 + 60 | 0;
   i12 = HEAP32[i11 >> 2] | 0;
   i10 = i12 + 4 | 0;
   i13 = HEAP32[i10 >> 2] | 0;
   i8 = i12 + 8 | 0;
   i9 = HEAP32[i8 >> 2] | 0;
   do {
    if ((i13 + 1 | 0) >>> 0 > i9 >>> 0) {
     if (i9 >>> 0 > 2147483645) {
      _lexerror(i7, 12368, 0);
     }
     i7 = i9 << 1;
     if ((i7 | 0) == -2) {
      _luaM_toobig(i3);
     } else {
      i6 = _luaM_realloc_(i3, HEAP32[i12 >> 2] | 0, i9, i7) | 0;
      HEAP32[i12 >> 2] = i6;
      HEAP32[i8 >> 2] = i7;
      i5 = HEAP32[i10 >> 2] | 0;
      break;
     }
    } else {
     i5 = i13;
     i6 = HEAP32[i12 >> 2] | 0;
    }
   } while (0);
   HEAP32[i10 >> 2] = i5 + 1;
   HEAP8[i6 + i5 | 0] = 0;
   i5 = HEAP32[i1 >> 2] | 0;
   HEAP32[i2 >> 2] = HEAP32[HEAP32[i11 >> 2] >> 2];
   i5 = _luaO_pushfstring(i5, 12256, i2) | 0;
  }
 } while (0);
 HEAP32[i2 >> 2] = i4;
 HEAP32[i2 + 4 >> 2] = i5;
 _luaO_pushfstring(i3, 12608, i2) | 0;
 i13 = HEAP32[i1 >> 2] | 0;
 _luaD_throw(i13, 3);
}
function _luaV_objlen(i2, i5, i1) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0;
 i3 = STACKTOP;
 i4 = i1 + 8 | 0;
 i8 = HEAP32[i4 >> 2] & 15;
 do {
  if ((i8 | 0) == 5) {
   i7 = HEAP32[i1 >> 2] | 0;
   i8 = HEAP32[i7 + 8 >> 2] | 0;
   if (((i8 | 0) != 0 ? (HEAP8[i8 + 6 | 0] & 16) == 0 : 0) ? (i6 = _luaT_gettm(i8, 4, HEAP32[(HEAP32[i2 + 12 >> 2] | 0) + 200 >> 2] | 0) | 0, (i6 | 0) != 0) : 0) {
    i7 = i6;
    break;
   }
   HEAPF64[i5 >> 3] = +(_luaH_getn(i7) | 0);
   HEAP32[i5 + 8 >> 2] = 3;
   STACKTOP = i3;
   return;
  } else if ((i8 | 0) != 4) {
   i6 = _luaT_gettmbyobj(i2, i1, 4) | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) == 0) {
    _luaG_typeerror(i2, i1, 9024);
   } else {
    i7 = i6;
   }
  } else {
   HEAPF64[i5 >> 3] = +((HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0) >>> 0);
   HEAP32[i5 + 8 >> 2] = 3;
   STACKTOP = i3;
   return;
  }
 } while (0);
 i6 = i2 + 28 | 0;
 i8 = i5 - (HEAP32[i6 >> 2] | 0) | 0;
 i5 = i2 + 8 | 0;
 i11 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i11 + 16;
 i12 = i7;
 i10 = HEAP32[i12 + 4 >> 2] | 0;
 i9 = i11;
 HEAP32[i9 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i9 + 4 >> 2] = i10;
 HEAP32[i11 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 i7 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i7 + 16;
 i11 = i1;
 i9 = HEAP32[i11 + 4 >> 2] | 0;
 i10 = i7;
 HEAP32[i10 >> 2] = HEAP32[i11 >> 2];
 HEAP32[i10 + 4 >> 2] = i9;
 HEAP32[i7 + 8 >> 2] = HEAP32[i4 >> 2];
 i7 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i7 + 16;
 i10 = i1;
 i9 = HEAP32[i10 + 4 >> 2] | 0;
 i1 = i7;
 HEAP32[i1 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i1 + 4 >> 2] = i9;
 HEAP32[i7 + 8 >> 2] = HEAP32[i4 >> 2];
 _luaD_call(i2, (HEAP32[i5 >> 2] | 0) + -48 | 0, 1, HEAP8[(HEAP32[i2 + 16 >> 2] | 0) + 18 | 0] & 1);
 i7 = HEAP32[i6 >> 2] | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 i2 = i6 + -16 | 0;
 HEAP32[i5 >> 2] = i2;
 i4 = HEAP32[i2 + 4 >> 2] | 0;
 i5 = i7 + i8 | 0;
 HEAP32[i5 >> 2] = HEAP32[i2 >> 2];
 HEAP32[i5 + 4 >> 2] = i4;
 HEAP32[i7 + (i8 + 8) >> 2] = HEAP32[i6 + -8 >> 2];
 STACKTOP = i3;
 return;
}
function _get_equalTM(i6, i5, i4) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i7 = 0;
 i1 = STACKTOP;
 L1 : do {
  if (((i5 | 0) != 0 ? (HEAP8[i5 + 6 | 0] & 32) == 0 : 0) ? (i7 = i6 + 12 | 0, i2 = _luaT_gettm(i5, 5, HEAP32[(HEAP32[i7 >> 2] | 0) + 204 >> 2] | 0) | 0, (i2 | 0) != 0) : 0) {
   if ((i5 | 0) != (i4 | 0)) {
    if (((i4 | 0) != 0 ? (HEAP8[i4 + 6 | 0] & 32) == 0 : 0) ? (i3 = _luaT_gettm(i4, 5, HEAP32[(HEAP32[i7 >> 2] | 0) + 204 >> 2] | 0) | 0, (i3 | 0) != 0) : 0) {
     i4 = HEAP32[i2 + 8 >> 2] | 0;
     L9 : do {
      if ((i4 | 0) == (HEAP32[i3 + 8 >> 2] | 0)) {
       switch (i4 & 63 | 0) {
       case 3:
        {
         i3 = +HEAPF64[i2 >> 3] == +HEAPF64[i3 >> 3] | 0;
         break;
        }
       case 22:
        {
         i3 = (HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0) | 0;
         break;
        }
       case 5:
        {
         if ((HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0)) {
          break L1;
         } else {
          break L9;
         }
        }
       case 1:
        {
         i3 = (HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0) | 0;
         break;
        }
       case 4:
        {
         i3 = (HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0) | 0;
         break;
        }
       case 0:
        {
         break L1;
        }
       case 7:
        {
         if ((HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0)) {
          break L1;
         } else {
          break L9;
         }
        }
       case 2:
        {
         i3 = (HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0) | 0;
         break;
        }
       case 20:
        {
         i3 = _luaS_eqlngstr(HEAP32[i2 >> 2] | 0, HEAP32[i3 >> 2] | 0) | 0;
         break;
        }
       default:
        {
         i3 = (HEAP32[i2 >> 2] | 0) == (HEAP32[i3 >> 2] | 0) | 0;
        }
       }
       if ((i3 | 0) != 0) {
        break L1;
       }
      }
     } while (0);
     i2 = 0;
    } else {
     i2 = 0;
    }
   }
  } else {
   i2 = 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _luaS_newlstr(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 if (!(i3 >>> 0 < 41)) {
  if ((i3 + 1 | 0) >>> 0 > 4294967277) {
   _luaM_toobig(i2);
  }
  i10 = HEAP32[(HEAP32[i2 + 12 >> 2] | 0) + 56 >> 2] | 0;
  i11 = _luaC_newobj(i2, 20, i3 + 17 | 0, 0, 0) | 0;
  HEAP32[i11 + 12 >> 2] = i3;
  HEAP32[i11 + 8 >> 2] = i10;
  HEAP8[i11 + 6 | 0] = 0;
  i10 = i11 + 16 | 0;
  _memcpy(i10 | 0, i4 | 0, i3 | 0) | 0;
  HEAP8[i10 + i3 | 0] = 0;
  STACKTOP = i1;
  return i11 | 0;
 }
 i5 = HEAP32[i2 + 12 >> 2] | 0;
 i6 = HEAP32[i5 + 56 >> 2] ^ i3;
 i7 = (i3 >>> 5) + 1 | 0;
 if (!(i7 >>> 0 > i3 >>> 0)) {
  i8 = i3;
  do {
   i6 = (i6 << 5) + (i6 >>> 2) + (HEAPU8[i4 + (i8 + -1) | 0] | 0) ^ i6;
   i8 = i8 - i7 | 0;
  } while (!(i8 >>> 0 < i7 >>> 0));
 }
 i10 = i5 + 32 | 0;
 i9 = HEAP32[i10 >> 2] | 0;
 i7 = i5 + 24 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i11 = HEAP32[i8 + ((i9 + -1 & i6) << 2) >> 2] | 0;
 L12 : do {
  if ((i11 | 0) != 0) {
   while (1) {
    if (((i6 | 0) == (HEAP32[i11 + 8 >> 2] | 0) ? (HEAP32[i11 + 12 >> 2] | 0) == (i3 | 0) : 0) ? (_memcmp(i4, i11 + 16 | 0, i3) | 0) == 0 : 0) {
     break;
    }
    i11 = HEAP32[i11 >> 2] | 0;
    if ((i11 | 0) == 0) {
     break L12;
    }
   }
   i2 = i11 + 5 | 0;
   i3 = (HEAPU8[i2] | 0) ^ 3;
   if ((((HEAPU8[i5 + 60 | 0] | 0) ^ 3) & i3 | 0) != 0) {
    STACKTOP = i1;
    return i11 | 0;
   }
   HEAP8[i2] = i3;
   STACKTOP = i1;
   return i11 | 0;
  }
 } while (0);
 i5 = i5 + 28 | 0;
 if ((HEAP32[i5 >> 2] | 0) >>> 0 >= i9 >>> 0 & (i9 | 0) < 1073741823) {
  _luaS_resize(i2, i9 << 1);
  i9 = HEAP32[i10 >> 2] | 0;
  i8 = HEAP32[i7 >> 2] | 0;
 }
 i11 = _luaC_newobj(i2, 4, i3 + 17 | 0, i8 + ((i9 + -1 & i6) << 2) | 0, 0) | 0;
 HEAP32[i11 + 12 >> 2] = i3;
 HEAP32[i11 + 8 >> 2] = i6;
 HEAP8[i11 + 6 | 0] = 0;
 i10 = i11 + 16 | 0;
 _memcpy(i10 | 0, i4 | 0, i3 | 0) | 0;
 HEAP8[i10 + i3 | 0] = 0;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
 STACKTOP = i1;
 return i11 | 0;
}
function _lua_pcallk(i3, i7, i2, i9, i6, i5) {
 i3 = i3 | 0;
 i7 = i7 | 0;
 i2 = i2 | 0;
 i9 = i9 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i1 = 0, i4 = 0, i8 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i1;
 if ((i9 | 0) == 0) {
  i9 = 0;
 } else {
  i10 = HEAP32[i3 + 16 >> 2] | 0;
  do {
   if ((i9 | 0) <= 0) {
    if (!((i9 | 0) < -1000999)) {
     i8 = (HEAP32[i3 + 8 >> 2] | 0) + (i9 << 4) | 0;
     break;
    }
    if ((i9 | 0) == -1001e3) {
     i8 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
     break;
    }
    i9 = -1001e3 - i9 | 0;
    i10 = HEAP32[i10 >> 2] | 0;
    if ((HEAP32[i10 + 8 >> 2] | 0) != 22 ? (i8 = HEAP32[i10 >> 2] | 0, (i9 | 0) <= (HEAPU8[i8 + 6 | 0] | 0)) : 0) {
     i8 = i8 + (i9 + -1 << 4) + 16 | 0;
    } else {
     i8 = 5192;
    }
   } else {
    i8 = (HEAP32[i10 >> 2] | 0) + (i9 << 4) | 0;
    i8 = i8 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i8 : 5192;
   }
  } while (0);
  i9 = i8 - (HEAP32[i3 + 28 >> 2] | 0) | 0;
 }
 i8 = i3 + 8 | 0;
 i7 = (HEAP32[i8 >> 2] | 0) + (~i7 << 4) | 0;
 HEAP32[i4 >> 2] = i7;
 if ((i5 | 0) != 0 ? (HEAP16[i3 + 36 >> 1] | 0) == 0 : 0) {
  i11 = HEAP32[i3 + 16 >> 2] | 0;
  HEAP32[i11 + 28 >> 2] = i5;
  HEAP32[i11 + 24 >> 2] = i6;
  HEAP32[i11 + 20 >> 2] = (HEAP32[i4 >> 2] | 0) - (HEAP32[i3 + 28 >> 2] | 0);
  HEAP8[i11 + 36 | 0] = HEAP8[i3 + 41 | 0] | 0;
  i10 = i3 + 68 | 0;
  i7 = i11 + 32 | 0;
  HEAP32[i7 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i10 >> 2] = i9;
  i9 = i11 + 18 | 0;
  HEAP8[i9] = HEAPU8[i9] | 16;
  _luaD_call(i3, HEAP32[i4 >> 2] | 0, i2, 1);
  HEAP8[i9] = HEAP8[i9] & 239;
  HEAP32[i10 >> 2] = HEAP32[i7 >> 2];
  i4 = 0;
 } else {
  HEAP32[i4 + 4 >> 2] = i2;
  i4 = _luaD_pcall(i3, 3, i4, i7 - (HEAP32[i3 + 28 >> 2] | 0) | 0, i9) | 0;
 }
 if (!((i2 | 0) == -1)) {
  STACKTOP = i1;
  return i4 | 0;
 }
 i2 = (HEAP32[i3 + 16 >> 2] | 0) + 4 | 0;
 i3 = HEAP32[i8 >> 2] | 0;
 if (!((HEAP32[i2 >> 2] | 0) >>> 0 < i3 >>> 0)) {
  STACKTOP = i1;
  return i4 | 0;
 }
 HEAP32[i2 >> 2] = i3;
 STACKTOP = i1;
 return i4 | 0;
}
function _lua_getupvalue(i1, i6, i3) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i4 = (HEAP32[i1 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i4 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i5 = HEAP32[i4 + 8 >> 2] & 63;
 do {
  if ((i5 | 0) == 38) {
   i5 = HEAP32[i4 >> 2] | 0;
   if ((i3 | 0) <= 0) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   if ((HEAPU8[i5 + 6 | 0] | 0 | 0) < (i3 | 0)) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   } else {
    i4 = 936;
    i3 = i5 + (i3 + -1 << 4) + 16 | 0;
    break;
   }
  } else if ((i5 | 0) == 6) {
   i5 = HEAP32[i4 >> 2] | 0;
   i4 = HEAP32[i5 + 12 >> 2] | 0;
   if ((i3 | 0) <= 0) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   if ((HEAP32[i4 + 40 >> 2] | 0) < (i3 | 0)) {
    i6 = 0;
    STACKTOP = i2;
    return i6 | 0;
   }
   i6 = i3 + -1 | 0;
   i3 = HEAP32[(HEAP32[i5 + 16 + (i6 << 2) >> 2] | 0) + 8 >> 2] | 0;
   i4 = HEAP32[(HEAP32[i4 + 28 >> 2] | 0) + (i6 << 3) >> 2] | 0;
   if ((i4 | 0) == 0) {
    i4 = 936;
   } else {
    i4 = i4 + 16 | 0;
   }
  } else {
   i6 = 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 } while (0);
 i6 = i1 + 8 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 i8 = i3;
 i7 = HEAP32[i8 + 4 >> 2] | 0;
 i1 = i5;
 HEAP32[i1 >> 2] = HEAP32[i8 >> 2];
 HEAP32[i1 + 4 >> 2] = i7;
 HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 16;
 i6 = i4;
 STACKTOP = i2;
 return i6 | 0;
}
function _lua_copy(i1, i8, i4) {
 i1 = i1 | 0;
 i8 = i8 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i9 = 0;
 i2 = STACKTOP;
 i3 = i1 + 16 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 do {
  if ((i8 | 0) <= 0) {
   if (!((i8 | 0) < -1000999)) {
    i7 = (HEAP32[i1 + 8 >> 2] | 0) + (i8 << 4) | 0;
    break;
   }
   if ((i8 | 0) == -1001e3) {
    i7 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i8 = -1001e3 - i8 | 0;
   i9 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i9 + 8 >> 2] | 0) != 22 ? (i7 = HEAP32[i9 >> 2] | 0, (i8 | 0) <= (HEAPU8[i7 + 6 | 0] | 0 | 0)) : 0) {
    i7 = i7 + (i8 + -1 << 4) + 16 | 0;
   } else {
    i7 = 5192;
   }
  } else {
   i7 = (HEAP32[i6 >> 2] | 0) + (i8 << 4) | 0;
   i7 = i7 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i7 : 5192;
  }
 } while (0);
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i8 = -1001e3 - i4 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i5 = HEAP32[i6 >> 2] | 0, (i8 | 0) <= (HEAPU8[i5 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i5 + (i8 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i5 = (HEAP32[i6 >> 2] | 0) + (i4 << 4) | 0;
   i5 = i5 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i5 : 5192;
  }
 } while (0);
 i8 = i7;
 i9 = HEAP32[i8 + 4 >> 2] | 0;
 i6 = i5;
 HEAP32[i6 >> 2] = HEAP32[i8 >> 2];
 HEAP32[i6 + 4 >> 2] = i9;
 i6 = i7 + 8 | 0;
 HEAP32[i5 + 8 >> 2] = HEAP32[i6 >> 2];
 if (!((i4 | 0) < -1001e3)) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i6 >> 2] & 64 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i4 = HEAP32[i7 >> 2] | 0;
 if ((HEAP8[i4 + 5 | 0] & 3) == 0) {
  STACKTOP = i2;
  return;
 }
 i3 = HEAP32[HEAP32[HEAP32[i3 >> 2] >> 2] >> 2] | 0;
 if ((HEAP8[i3 + 5 | 0] & 4) == 0) {
  STACKTOP = i2;
  return;
 }
 _luaC_barrier_(i1, i3, i4);
 STACKTOP = i2;
 return;
}
function _lua_tolstring(i4, i5, i1) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 i7 = i4 + 16 | 0;
 i10 = HEAP32[i7 >> 2] | 0;
 i6 = (i5 | 0) > 0;
 do {
  if (!i6) {
   if (!((i5 | 0) < -1000999)) {
    i8 = (HEAP32[i4 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i8 = (HEAP32[i4 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i9 = -1001e3 - i5 | 0;
   i10 = HEAP32[i10 >> 2] | 0;
   if ((HEAP32[i10 + 8 >> 2] | 0) != 22 ? (i8 = HEAP32[i10 >> 2] | 0, (i9 | 0) <= (HEAPU8[i8 + 6 | 0] | 0 | 0)) : 0) {
    i8 = i8 + (i9 + -1 << 4) + 16 | 0;
   } else {
    i8 = 5192;
   }
  } else {
   i8 = (HEAP32[i10 >> 2] | 0) + (i5 << 4) | 0;
   i8 = i8 >>> 0 < (HEAP32[i4 + 8 >> 2] | 0) >>> 0 ? i8 : 5192;
  }
 } while (0);
 do {
  if ((HEAP32[i8 + 8 >> 2] & 15 | 0) != 4) {
   if ((_luaV_tostring(i4, i8) | 0) == 0) {
    if ((i1 | 0) == 0) {
     i10 = 0;
     STACKTOP = i2;
     return i10 | 0;
    }
    HEAP32[i1 >> 2] = 0;
    i10 = 0;
    STACKTOP = i2;
    return i10 | 0;
   }
   i8 = i4 + 12 | 0;
   if ((HEAP32[(HEAP32[i8 >> 2] | 0) + 12 >> 2] | 0) > 0) {
    _luaC_step(i4);
   }
   i7 = HEAP32[i7 >> 2] | 0;
   if (i6) {
    i3 = (HEAP32[i7 >> 2] | 0) + (i5 << 4) | 0;
    i8 = i3 >>> 0 < (HEAP32[i4 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
    break;
   }
   if (!((i5 | 0) < -1000999)) {
    i8 = (HEAP32[i4 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i8 = (HEAP32[i8 >> 2] | 0) + 40 | 0;
    break;
   }
   i4 = -1001e3 - i5 | 0;
   i5 = HEAP32[i7 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i5 >> 2] | 0, (i4 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i8 = i3 + (i4 + -1 << 4) + 16 | 0;
   } else {
    i8 = 5192;
   }
  }
 } while (0);
 i3 = HEAP32[i8 >> 2] | 0;
 if ((i1 | 0) != 0) {
  HEAP32[i1 >> 2] = HEAP32[i3 + 12 >> 2];
 }
 i10 = i3 + 16 | 0;
 STACKTOP = i2;
 return i10 | 0;
}
function _luaD_pcall(i3, i6, i5, i13, i14) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 i13 = i13 | 0;
 i14 = i14 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0;
 i1 = STACKTOP;
 i10 = i3 + 16 | 0;
 i11 = HEAP32[i10 >> 2] | 0;
 i12 = i3 + 41 | 0;
 i7 = HEAP8[i12] | 0;
 i9 = i3 + 36 | 0;
 i8 = HEAP16[i9 >> 1] | 0;
 i4 = i3 + 68 | 0;
 i2 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = i14;
 i5 = _luaD_rawrunprotected(i3, i6, i5) | 0;
 if ((i5 | 0) == 0) {
  HEAP32[i4 >> 2] = i2;
  STACKTOP = i1;
  return i5 | 0;
 }
 i6 = i3 + 28 | 0;
 i14 = HEAP32[i6 >> 2] | 0;
 i15 = i14 + i13 | 0;
 _luaF_close(i3, i15);
 if ((i5 | 0) == 6) {
  i16 = _luaS_newlstr(i3, 2424, 23) | 0;
  HEAP32[i15 >> 2] = i16;
  HEAP32[i14 + (i13 + 8) >> 2] = HEAPU8[i16 + 4 | 0] | 0 | 64;
 } else if ((i5 | 0) == 4) {
  i16 = HEAP32[(HEAP32[i3 + 12 >> 2] | 0) + 180 >> 2] | 0;
  HEAP32[i15 >> 2] = i16;
  HEAP32[i14 + (i13 + 8) >> 2] = HEAPU8[i16 + 4 | 0] | 0 | 64;
 } else {
  i16 = HEAP32[i3 + 8 >> 2] | 0;
  i18 = i16 + -16 | 0;
  i17 = HEAP32[i18 + 4 >> 2] | 0;
  HEAP32[i15 >> 2] = HEAP32[i18 >> 2];
  HEAP32[i15 + 4 >> 2] = i17;
  HEAP32[i14 + (i13 + 8) >> 2] = HEAP32[i16 + -8 >> 2];
 }
 i13 = i14 + (i13 + 16) | 0;
 HEAP32[i3 + 8 >> 2] = i13;
 HEAP32[i10 >> 2] = i11;
 HEAP8[i12] = i7;
 HEAP16[i9 >> 1] = i8;
 if ((i11 | 0) != 0) {
  do {
   i7 = HEAP32[i11 + 4 >> 2] | 0;
   i13 = i13 >>> 0 < i7 >>> 0 ? i7 : i13;
   i11 = HEAP32[i11 + 8 >> 2] | 0;
  } while ((i11 | 0) != 0);
 }
 i6 = i13 - (HEAP32[i6 >> 2] | 0) | 0;
 i7 = (i6 >> 4) + 1 | 0;
 i7 = ((i7 | 0) / 8 | 0) + 10 + i7 | 0;
 i7 = (i7 | 0) > 1e6 ? 1e6 : i7;
 if ((i6 | 0) > 15999984) {
  HEAP32[i4 >> 2] = i2;
  STACKTOP = i1;
  return i5 | 0;
 }
 if ((i7 | 0) >= (HEAP32[i3 + 32 >> 2] | 0)) {
  HEAP32[i4 >> 2] = i2;
  STACKTOP = i1;
  return i5 | 0;
 }
 _luaD_reallocstack(i3, i7);
 HEAP32[i4 >> 2] = i2;
 STACKTOP = i1;
 return i5 | 0;
}
function _luaH_resize(i1, i4, i6, i9) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0;
 i3 = STACKTOP;
 i8 = i4 + 28 | 0;
 i5 = HEAP32[i8 >> 2] | 0;
 i7 = HEAPU8[i4 + 7 | 0] | 0;
 i2 = HEAP32[i4 + 16 >> 2] | 0;
 if ((i5 | 0) < (i6 | 0)) {
  if ((i6 + 1 | 0) >>> 0 > 268435455) {
   _luaM_toobig(i1);
  }
  i11 = i4 + 12 | 0;
  i10 = _luaM_realloc_(i1, HEAP32[i11 >> 2] | 0, i5 << 4, i6 << 4) | 0;
  HEAP32[i11 >> 2] = i10;
  i11 = HEAP32[i8 >> 2] | 0;
  if ((i11 | 0) < (i6 | 0)) {
   do {
    HEAP32[i10 + (i11 << 4) + 8 >> 2] = 0;
    i11 = i11 + 1 | 0;
   } while ((i11 | 0) != (i6 | 0));
  }
  HEAP32[i8 >> 2] = i6;
 }
 _setnodevector(i1, i4, i9);
 do {
  if ((i5 | 0) > (i6 | 0)) {
   HEAP32[i8 >> 2] = i6;
   i8 = i4 + 12 | 0;
   i9 = i6;
   do {
    i10 = HEAP32[i8 >> 2] | 0;
    if ((HEAP32[i10 + (i9 << 4) + 8 >> 2] | 0) == 0) {
     i9 = i9 + 1 | 0;
    } else {
     i11 = i9 + 1 | 0;
     _luaH_setint(i1, i4, i11, i10 + (i9 << 4) | 0);
     i9 = i11;
    }
   } while ((i9 | 0) != (i5 | 0));
   if ((i6 + 1 | 0) >>> 0 > 268435455) {
    _luaM_toobig(i1);
   } else {
    i11 = i4 + 12 | 0;
    HEAP32[i11 >> 2] = _luaM_realloc_(i1, HEAP32[i11 >> 2] | 0, i5 << 4, i6 << 4) | 0;
    break;
   }
  }
 } while (0);
 i5 = 1 << i7;
 if ((i5 | 0) > 0) {
  i6 = i5;
  do {
   i6 = i6 + -1 | 0;
   i7 = i2 + (i6 << 5) + 8 | 0;
   if ((HEAP32[i7 >> 2] | 0) != 0) {
    i8 = i2 + (i6 << 5) + 16 | 0;
    i9 = _luaH_get(i4, i8) | 0;
    if ((i9 | 0) == 5192) {
     i9 = _luaH_newkey(i1, i4, i8) | 0;
    }
    i8 = i2 + (i6 << 5) | 0;
    i10 = HEAP32[i8 + 4 >> 2] | 0;
    i11 = i9;
    HEAP32[i11 >> 2] = HEAP32[i8 >> 2];
    HEAP32[i11 + 4 >> 2] = i10;
    HEAP32[i9 + 8 >> 2] = HEAP32[i7 >> 2];
   }
  } while ((i6 | 0) > 0);
 }
 if ((i2 | 0) == 8016) {
  STACKTOP = i3;
  return;
 }
 _luaM_realloc_(i1, i2, i5 << 5, 0) | 0;
 STACKTOP = i3;
 return;
}
function _codearith(i4, i3, i2, i6, i5) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i1 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, d13 = 0.0;
 i7 = STACKTOP;
 if (((((((HEAP32[i2 >> 2] | 0) == 5 ? (HEAP32[i2 + 16 >> 2] | 0) == -1 : 0) ? (HEAP32[i2 + 20 >> 2] | 0) == -1 : 0) ? (HEAP32[i6 >> 2] | 0) == 5 : 0) ? (HEAP32[i6 + 16 >> 2] | 0) == -1 : 0) ? (HEAP32[i6 + 20 >> 2] | 0) == -1 : 0) ? (d13 = +HEAPF64[i6 + 8 >> 3], !((i3 & -2 | 0) == 16 & d13 == 0.0)) : 0) {
  i12 = i2 + 8 | 0;
  HEAPF64[i12 >> 3] = +_luaO_arith(i3 + -13 | 0, +HEAPF64[i12 >> 3], d13);
  STACKTOP = i7;
  return;
 }
 if ((i3 | 0) == 19 | (i3 | 0) == 21) {
  i11 = 0;
 } else {
  i11 = _luaK_exp2RK(i4, i6) | 0;
 }
 i12 = _luaK_exp2RK(i4, i2) | 0;
 if ((i12 | 0) > (i11 | 0)) {
  if (((HEAP32[i2 >> 2] | 0) == 6 ? (i8 = HEAP32[i2 + 8 >> 2] | 0, (i8 & 256 | 0) == 0) : 0) ? (HEAPU8[i4 + 46 | 0] | 0 | 0) <= (i8 | 0) : 0) {
   i10 = i4 + 48 | 0;
   HEAP8[i10] = (HEAP8[i10] | 0) + -1 << 24 >> 24;
  }
  if (((HEAP32[i6 >> 2] | 0) == 6 ? (i1 = HEAP32[i6 + 8 >> 2] | 0, (i1 & 256 | 0) == 0) : 0) ? (HEAPU8[i4 + 46 | 0] | 0 | 0) <= (i1 | 0) : 0) {
   i10 = i4 + 48 | 0;
   HEAP8[i10] = (HEAP8[i10] | 0) + -1 << 24 >> 24;
  }
 } else {
  if (((HEAP32[i6 >> 2] | 0) == 6 ? (i10 = HEAP32[i6 + 8 >> 2] | 0, (i10 & 256 | 0) == 0) : 0) ? (HEAPU8[i4 + 46 | 0] | 0 | 0) <= (i10 | 0) : 0) {
   i10 = i4 + 48 | 0;
   HEAP8[i10] = (HEAP8[i10] | 0) + -1 << 24 >> 24;
  }
  if (((HEAP32[i2 >> 2] | 0) == 6 ? (i9 = HEAP32[i2 + 8 >> 2] | 0, (i9 & 256 | 0) == 0) : 0) ? (HEAPU8[i4 + 46 | 0] | 0 | 0) <= (i9 | 0) : 0) {
   i10 = i4 + 48 | 0;
   HEAP8[i10] = (HEAP8[i10] | 0) + -1 << 24 >> 24;
  }
 }
 HEAP32[i2 + 8 >> 2] = _luaK_code(i4, i11 << 14 | i3 | i12 << 23) | 0;
 HEAP32[i2 >> 2] = 11;
 HEAP32[(HEAP32[(HEAP32[i4 >> 2] | 0) + 20 >> 2] | 0) + ((HEAP32[i4 + 20 >> 2] | 0) + -1 << 2) >> 2] = i5;
 STACKTOP = i7;
 return;
}
function _GCTM(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var 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;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i2 = i4 + 16 | 0;
 i5 = i4;
 i6 = HEAP32[i1 + 12 >> 2] | 0;
 i9 = i6 + 104 | 0;
 i8 = HEAP32[i9 >> 2] | 0;
 HEAP32[i9 >> 2] = HEAP32[i8 >> 2];
 i9 = i6 + 68 | 0;
 HEAP32[i8 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i9 >> 2] = i8;
 i9 = i8 + 5 | 0;
 i7 = HEAPU8[i9] | 0;
 HEAP8[i9] = i7 & 239;
 if ((HEAPU8[i6 + 61 | 0] | 0) >= 2) {
  HEAP8[i9] = HEAP8[i6 + 60 | 0] & 3 | i7 & 168;
 }
 HEAP32[i5 >> 2] = i8;
 i7 = i5 + 8 | 0;
 HEAP32[i7 >> 2] = HEAPU8[i8 + 4 | 0] | 0 | 64;
 i8 = _luaT_gettmbyobj(i1, i5, 2) | 0;
 if ((i8 | 0) == 0) {
  STACKTOP = i4;
  return;
 }
 i9 = i8 + 8 | 0;
 if ((HEAP32[i9 >> 2] & 15 | 0) != 6) {
  STACKTOP = i4;
  return;
 }
 i12 = i1 + 41 | 0;
 i13 = HEAP8[i12] | 0;
 i10 = i6 + 63 | 0;
 i11 = HEAP8[i10] | 0;
 HEAP8[i12] = 0;
 HEAP8[i10] = 0;
 i6 = i1 + 8 | 0;
 i14 = HEAP32[i6 >> 2] | 0;
 i16 = i8;
 i15 = HEAP32[i16 + 4 >> 2] | 0;
 i8 = i14;
 HEAP32[i8 >> 2] = HEAP32[i16 >> 2];
 HEAP32[i8 + 4 >> 2] = i15;
 HEAP32[i14 + 8 >> 2] = HEAP32[i9 >> 2];
 i9 = HEAP32[i6 >> 2] | 0;
 i14 = i5;
 i8 = HEAP32[i14 + 4 >> 2] | 0;
 i5 = i9 + 16 | 0;
 HEAP32[i5 >> 2] = HEAP32[i14 >> 2];
 HEAP32[i5 + 4 >> 2] = i8;
 HEAP32[i9 + 24 >> 2] = HEAP32[i7 >> 2];
 i5 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i5 + 32;
 i5 = _luaD_pcall(i1, 7, 0, i5 - (HEAP32[i1 + 28 >> 2] | 0) | 0, 0) | 0;
 HEAP8[i12] = i13;
 HEAP8[i10] = i11;
 if ((i5 | 0) == 0 | (i3 | 0) == 0) {
  STACKTOP = i4;
  return;
 }
 if ((i5 | 0) != 2) {
  i16 = i5;
  _luaD_throw(i1, i16);
 }
 i3 = HEAP32[i6 >> 2] | 0;
 if ((HEAP32[i3 + -8 >> 2] & 15 | 0) == 4) {
  i3 = (HEAP32[i3 + -16 >> 2] | 0) + 16 | 0;
 } else {
  i3 = 2528;
 }
 HEAP32[i2 >> 2] = i3;
 _luaO_pushfstring(i1, 2544, i2) | 0;
 i16 = 5;
 _luaD_throw(i1, i16);
}
function _lua_gc(i3, i5, i4) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0;
 i1 = STACKTOP;
 i2 = HEAP32[i3 + 12 >> 2] | 0;
 L1 : do {
  switch (i5 | 0) {
  case 8:
   {
    i5 = i2 + 160 | 0;
    i2 = HEAP32[i5 >> 2] | 0;
    HEAP32[i5 >> 2] = i4;
    break;
   }
  case 11:
   {
    _luaC_changemode(i3, 0);
    i2 = 0;
    break;
   }
  case 2:
   {
    _luaC_fullgc(i3, 0);
    i2 = 0;
    break;
   }
  case 5:
   {
    if ((HEAP8[i2 + 62 | 0] | 0) == 2) {
     i2 = (HEAP32[i2 + 20 >> 2] | 0) == 0 | 0;
     _luaC_forcestep(i3);
     break L1;
    }
    i4 = (i4 << 10) + -1600 | 0;
    if ((HEAP8[i2 + 63 | 0] | 0) == 0) {
     i5 = i4;
     _luaE_setdebt(i2, i5);
     _luaC_forcestep(i3);
     i5 = i2 + 61 | 0;
     i5 = HEAP8[i5] | 0;
     i5 = i5 << 24 >> 24 == 5;
     i5 = i5 & 1;
     STACKTOP = i1;
     return i5 | 0;
    }
    i5 = (HEAP32[i2 + 12 >> 2] | 0) + i4 | 0;
    _luaE_setdebt(i2, i5);
    _luaC_forcestep(i3);
    i5 = i2 + 61 | 0;
    i5 = HEAP8[i5] | 0;
    i5 = i5 << 24 >> 24 == 5;
    i5 = i5 & 1;
    STACKTOP = i1;
    return i5 | 0;
   }
  case 4:
   {
    i2 = (HEAP32[i2 + 12 >> 2] | 0) + (HEAP32[i2 + 8 >> 2] | 0) & 1023;
    break;
   }
  case 1:
   {
    _luaE_setdebt(i2, 0);
    HEAP8[i2 + 63 | 0] = 1;
    i2 = 0;
    break;
   }
  case 3:
   {
    i2 = ((HEAP32[i2 + 12 >> 2] | 0) + (HEAP32[i2 + 8 >> 2] | 0) | 0) >>> 10;
    break;
   }
  case 7:
   {
    i5 = i2 + 164 | 0;
    i2 = HEAP32[i5 >> 2] | 0;
    HEAP32[i5 >> 2] = i4;
    break;
   }
  case 0:
   {
    HEAP8[i2 + 63 | 0] = 0;
    i2 = 0;
    break;
   }
  case 6:
   {
    i5 = i2 + 156 | 0;
    i2 = HEAP32[i5 >> 2] | 0;
    HEAP32[i5 >> 2] = i4;
    break;
   }
  case 9:
   {
    i2 = HEAPU8[i2 + 63 | 0] | 0;
    break;
   }
  case 10:
   {
    _luaC_changemode(i3, 2);
    i2 = 0;
    break;
   }
  default:
   {
    i2 = -1;
   }
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _os_time(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i4 = i2;
 i5 = i2 + 48 | 0;
 i3 = i2 + 4 | 0;
 if ((_lua_type(i1, 1) | 0) < 1) {
  i3 = _time(0) | 0;
 } else {
  _luaL_checktype(i1, 1, 5);
  _lua_settop(i1, 1);
  _lua_getfield(i1, -1, 5864);
  i6 = _lua_tointegerx(i1, -1, i4) | 0;
  i6 = (HEAP32[i4 >> 2] | 0) == 0 ? 0 : i6;
  _lua_settop(i1, -2);
  HEAP32[i3 >> 2] = i6;
  _lua_getfield(i1, -1, 5872);
  i6 = _lua_tointegerx(i1, -1, i4) | 0;
  i6 = (HEAP32[i4 >> 2] | 0) == 0 ? 0 : i6;
  _lua_settop(i1, -2);
  HEAP32[i3 + 4 >> 2] = i6;
  _lua_getfield(i1, -1, 5880);
  i6 = _lua_tointegerx(i1, -1, i4) | 0;
  i6 = (HEAP32[i4 >> 2] | 0) == 0 ? 12 : i6;
  _lua_settop(i1, -2);
  HEAP32[i3 + 8 >> 2] = i6;
  _lua_getfield(i1, -1, 5888);
  i6 = _lua_tointegerx(i1, -1, i5) | 0;
  if ((HEAP32[i5 >> 2] | 0) == 0) {
   HEAP32[i4 >> 2] = 5888;
   i6 = _luaL_error(i1, 5920, i4) | 0;
  } else {
   _lua_settop(i1, -2);
  }
  HEAP32[i3 + 12 >> 2] = i6;
  _lua_getfield(i1, -1, 5896);
  i6 = _lua_tointegerx(i1, -1, i5) | 0;
  if ((HEAP32[i5 >> 2] | 0) == 0) {
   HEAP32[i4 >> 2] = 5896;
   i6 = _luaL_error(i1, 5920, i4) | 0;
  } else {
   _lua_settop(i1, -2);
  }
  HEAP32[i3 + 16 >> 2] = i6 + -1;
  _lua_getfield(i1, -1, 5904);
  i6 = _lua_tointegerx(i1, -1, i5) | 0;
  if ((HEAP32[i5 >> 2] | 0) == 0) {
   HEAP32[i4 >> 2] = 5904;
   i6 = _luaL_error(i1, 5920, i4) | 0;
  } else {
   _lua_settop(i1, -2);
  }
  HEAP32[i3 + 20 >> 2] = i6 + -1900;
  _lua_getfield(i1, -1, 5912);
  if ((_lua_type(i1, -1) | 0) == 0) {
   i4 = -1;
  } else {
   i4 = _lua_toboolean(i1, -1) | 0;
  }
  _lua_settop(i1, -2);
  HEAP32[i3 + 32 >> 2] = i4;
  i3 = _mktime(i3 | 0) | 0;
 }
 if ((i3 | 0) == -1) {
  _lua_pushnil(i1);
  STACKTOP = i2;
  return 1;
 } else {
  _lua_pushnumber(i1, +(i3 | 0));
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _addk(i6, i4, i3) {
 i6 = i6 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i10 = i1;
 i2 = HEAP32[(HEAP32[i6 + 12 >> 2] | 0) + 52 >> 2] | 0;
 i8 = _luaH_set(i2, HEAP32[i6 + 4 >> 2] | 0, i4) | 0;
 i4 = HEAP32[i6 >> 2] | 0;
 i9 = i8 + 8 | 0;
 if (((HEAP32[i9 >> 2] | 0) == 3 ? (HEAPF64[i10 >> 3] = +HEAPF64[i8 >> 3] + 6755399441055744.0, i7 = HEAP32[i10 >> 2] | 0, i5 = HEAP32[i4 + 8 >> 2] | 0, (HEAP32[i5 + (i7 << 4) + 8 >> 2] | 0) == (HEAP32[i3 + 8 >> 2] | 0)) : 0) ? (_luaV_equalobj_(0, i5 + (i7 << 4) | 0, i3) | 0) != 0 : 0) {
  i10 = i7;
  STACKTOP = i1;
  return i10 | 0;
 }
 i5 = i4 + 44 | 0;
 i10 = HEAP32[i5 >> 2] | 0;
 i7 = i6 + 32 | 0;
 i6 = HEAP32[i7 >> 2] | 0;
 HEAPF64[i8 >> 3] = +(i6 | 0);
 HEAP32[i9 >> 2] = 3;
 i9 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) >= (i9 | 0)) {
  i9 = i4 + 8 | 0;
  HEAP32[i9 >> 2] = _luaM_growaux_(i2, HEAP32[i9 >> 2] | 0, i5, 16, 67108863, 10600) | 0;
  i9 = HEAP32[i5 >> 2] | 0;
 }
 i8 = HEAP32[i4 + 8 >> 2] | 0;
 if ((i10 | 0) < (i9 | 0)) {
  while (1) {
   i9 = i10 + 1 | 0;
   HEAP32[i8 + (i10 << 4) + 8 >> 2] = 0;
   if ((i9 | 0) < (HEAP32[i5 >> 2] | 0)) {
    i10 = i9;
   } else {
    break;
   }
  }
 }
 i5 = i3;
 i9 = HEAP32[i5 + 4 >> 2] | 0;
 i10 = i8 + (i6 << 4) | 0;
 HEAP32[i10 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i10 + 4 >> 2] = i9;
 i10 = i3 + 8 | 0;
 HEAP32[i8 + (i6 << 4) + 8 >> 2] = HEAP32[i10 >> 2];
 HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + 1;
 if ((HEAP32[i10 >> 2] & 64 | 0) == 0) {
  i10 = i6;
  STACKTOP = i1;
  return i10 | 0;
 }
 i3 = HEAP32[i3 >> 2] | 0;
 if ((HEAP8[i3 + 5 | 0] & 3) == 0) {
  i10 = i6;
  STACKTOP = i1;
  return i10 | 0;
 }
 if ((HEAP8[i4 + 5 | 0] & 4) == 0) {
  i10 = i6;
  STACKTOP = i1;
  return i10 | 0;
 }
 _luaC_barrier_(i2, i4, i3);
 i10 = i6;
 STACKTOP = i1;
 return i10 | 0;
}
function _singlevaraux(i5, i4, i2, i11) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i11 = i11 | 0;
 var i1 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 if ((i5 | 0) == 0) {
  i11 = 0;
  STACKTOP = i1;
  return i11 | 0;
 }
 i7 = i5 + 12 | 0;
 i8 = i5 + 40 | 0;
 i9 = HEAPU8[i5 + 46 | 0] | 0;
 while (1) {
  i6 = i9 + -1 | 0;
  i10 = HEAP32[i5 >> 2] | 0;
  if ((i9 | 0) <= 0) {
   break;
  }
  if ((_luaS_eqstr(i4, HEAP32[(HEAP32[i10 + 24 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[(HEAP32[i7 >> 2] | 0) + 64 >> 2] >> 2] | 0) + ((HEAP32[i8 >> 2] | 0) + i6 << 1) >> 1] | 0) * 12 | 0) >> 2] | 0) | 0) == 0) {
   i9 = i6;
  } else {
   i3 = 5;
   break;
  }
 }
 if ((i3 | 0) == 5) {
  HEAP32[i2 + 16 >> 2] = -1;
  HEAP32[i2 + 20 >> 2] = -1;
  HEAP32[i2 >> 2] = 7;
  HEAP32[i2 + 8 >> 2] = i6;
  if ((i11 | 0) != 0) {
   i11 = 7;
   STACKTOP = i1;
   return i11 | 0;
  }
  i2 = i5 + 16 | 0;
  do {
   i2 = HEAP32[i2 >> 2] | 0;
  } while ((HEAPU8[i2 + 8 | 0] | 0) > (i6 | 0));
  HEAP8[i2 + 9 | 0] = 1;
  i11 = 7;
  STACKTOP = i1;
  return i11 | 0;
 }
 i7 = HEAP32[i10 + 28 >> 2] | 0;
 i6 = i5 + 47 | 0;
 L17 : do {
  if ((HEAP8[i6] | 0) != 0) {
   i8 = 0;
   while (1) {
    i9 = i8 + 1 | 0;
    if ((_luaS_eqstr(HEAP32[i7 + (i8 << 3) >> 2] | 0, i4) | 0) != 0) {
     break;
    }
    if ((i9 | 0) < (HEAPU8[i6] | 0)) {
     i8 = i9;
    } else {
     i3 = 13;
     break L17;
    }
   }
   if ((i8 | 0) < 0) {
    i3 = 13;
   }
  } else {
   i3 = 13;
  }
 } while (0);
 do {
  if ((i3 | 0) == 13) {
   if ((_singlevaraux(HEAP32[i5 + 8 >> 2] | 0, i4, i2, 0) | 0) == 0) {
    i11 = 0;
    STACKTOP = i1;
    return i11 | 0;
   } else {
    i8 = _newupvalue(i5, i4, i2) | 0;
    break;
   }
  }
 } while (0);
 HEAP32[i2 + 16 >> 2] = -1;
 HEAP32[i2 + 20 >> 2] = -1;
 HEAP32[i2 >> 2] = 8;
 HEAP32[i2 + 8 >> 2] = i8;
 i11 = 8;
 STACKTOP = i1;
 return i11 | 0;
}
function _mainposition(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 switch (HEAP32[i3 + 8 >> 2] & 63 | 0) {
 case 3:
  {
   HEAPF64[i4 >> 3] = +HEAPF64[i3 >> 3] + 1.0;
   i3 = (HEAP32[i4 + 4 >> 2] | 0) + (HEAP32[i4 >> 2] | 0) | 0;
   if ((i3 | 0) < 0) {
    i4 = 0 - i3 | 0;
    i3 = (i3 | 0) == (i4 | 0) ? 0 : i4;
   }
   i5 = (HEAP32[i1 + 16 >> 2] | 0) + (((i3 | 0) % ((1 << HEAPU8[i1 + 7 | 0]) + -1 | 1 | 0) | 0) << 5) | 0;
   STACKTOP = i2;
   return i5 | 0;
  }
 case 2:
  {
   i5 = (HEAP32[i1 + 16 >> 2] | 0) + ((((HEAP32[i3 >> 2] | 0) >>> 0) % (((1 << HEAPU8[i1 + 7 | 0]) + -1 | 1) >>> 0) | 0) << 5) | 0;
   STACKTOP = i2;
   return i5 | 0;
  }
 case 20:
  {
   i5 = HEAP32[i3 >> 2] | 0;
   i4 = i5 + 6 | 0;
   if ((HEAP8[i4] | 0) == 0) {
    i6 = i5 + 8 | 0;
    HEAP32[i6 >> 2] = _luaS_hash(i5 + 16 | 0, HEAP32[i5 + 12 >> 2] | 0, HEAP32[i6 >> 2] | 0) | 0;
    HEAP8[i4] = 1;
    i5 = HEAP32[i3 >> 2] | 0;
   }
   i6 = (HEAP32[i1 + 16 >> 2] | 0) + (((1 << HEAPU8[i1 + 7 | 0]) + -1 & HEAP32[i5 + 8 >> 2]) << 5) | 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 case 22:
  {
   i6 = (HEAP32[i1 + 16 >> 2] | 0) + ((((HEAP32[i3 >> 2] | 0) >>> 0) % (((1 << HEAPU8[i1 + 7 | 0]) + -1 | 1) >>> 0) | 0) << 5) | 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 case 4:
  {
   i6 = (HEAP32[i1 + 16 >> 2] | 0) + (((1 << HEAPU8[i1 + 7 | 0]) + -1 & HEAP32[(HEAP32[i3 >> 2] | 0) + 8 >> 2]) << 5) | 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 case 1:
  {
   i6 = (HEAP32[i1 + 16 >> 2] | 0) + (((1 << HEAPU8[i1 + 7 | 0]) + -1 & HEAP32[i3 >> 2]) << 5) | 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 default:
  {
   i6 = (HEAP32[i1 + 16 >> 2] | 0) + ((((HEAP32[i3 >> 2] | 0) >>> 0) % (((1 << HEAPU8[i1 + 7 | 0]) + -1 | 1) >>> 0) | 0) << 5) | 0;
   STACKTOP = i2;
   return i6 | 0;
  }
 }
 return 0;
}
function _clearvalues(i2, i5, i1) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i4 = STACKTOP;
 if ((i5 | 0) == (i1 | 0)) {
  STACKTOP = i4;
  return;
 }
 do {
  i7 = i5 + 16 | 0;
  i9 = HEAP32[i7 >> 2] | 0;
  i6 = i9 + (1 << (HEAPU8[i5 + 7 | 0] | 0) << 5) | 0;
  i8 = i5 + 28 | 0;
  if ((HEAP32[i8 >> 2] | 0) > 0) {
   i11 = i5 + 12 | 0;
   i12 = 0;
   do {
    i13 = HEAP32[i11 >> 2] | 0;
    i10 = i13 + (i12 << 4) + 8 | 0;
    i9 = HEAP32[i10 >> 2] | 0;
    do {
     if ((i9 & 64 | 0) != 0) {
      i13 = HEAP32[i13 + (i12 << 4) >> 2] | 0;
      if ((i9 & 15 | 0) != 4) {
       if ((HEAP8[i13 + 5 | 0] & 3) == 0) {
        break;
       }
       HEAP32[i10 >> 2] = 0;
       break;
      }
      if ((i13 | 0) != 0 ? !((HEAP8[i13 + 5 | 0] & 3) == 0) : 0) {
       _reallymarkobject(i2, i13);
      }
     }
    } while (0);
    i12 = i12 + 1 | 0;
   } while ((i12 | 0) < (HEAP32[i8 >> 2] | 0));
   i7 = HEAP32[i7 >> 2] | 0;
  } else {
   i7 = i9;
  }
  if (i7 >>> 0 < i6 >>> 0) {
   do {
    i8 = i7 + 8 | 0;
    i9 = HEAP32[i8 >> 2] | 0;
    do {
     if (!((i9 | 0) == 0 | (i9 & 64 | 0) == 0)) {
      i10 = HEAP32[i7 >> 2] | 0;
      if ((i9 & 15 | 0) == 4) {
       if ((i10 | 0) == 0) {
        break;
       }
       if ((HEAP8[i10 + 5 | 0] & 3) == 0) {
        break;
       }
       _reallymarkobject(i2, i10);
       break;
      }
      if ((!((HEAP8[i10 + 5 | 0] & 3) == 0) ? (HEAP32[i8 >> 2] = 0, i3 = i7 + 24 | 0, (HEAP32[i3 >> 2] & 64 | 0) != 0) : 0) ? !((HEAP8[(HEAP32[i7 + 16 >> 2] | 0) + 5 | 0] & 3) == 0) : 0) {
       HEAP32[i3 >> 2] = 11;
      }
     }
    } while (0);
    i7 = i7 + 32 | 0;
   } while (i7 >>> 0 < i6 >>> 0);
  }
  i5 = HEAP32[i5 + 24 >> 2] | 0;
 } while ((i5 | 0) != (i1 | 0));
 STACKTOP = i4;
 return;
}
function _reallymarkobject(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0;
 i3 = STACKTOP;
 i2 = i4 + 5 | 0;
 HEAP8[i2] = HEAP8[i2] & 252;
 switch (HEAPU8[i4 + 4 | 0] | 0 | 0) {
 case 6:
  {
   i7 = i1 + 84 | 0;
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i4;
   STACKTOP = i3;
   return;
  }
 case 20:
 case 4:
  {
   i4 = (HEAP32[i4 + 12 >> 2] | 0) + 17 | 0;
   break;
  }
 case 7:
  {
   i5 = HEAP32[i4 + 8 >> 2] | 0;
   if ((i5 | 0) != 0 ? !((HEAP8[i5 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i1, i5);
   }
   i5 = HEAP32[i4 + 12 >> 2] | 0;
   if ((i5 | 0) != 0 ? !((HEAP8[i5 + 5 | 0] & 3) == 0) : 0) {
    _reallymarkobject(i1, i5);
   }
   i4 = (HEAP32[i4 + 16 >> 2] | 0) + 24 | 0;
   break;
  }
 case 8:
  {
   i7 = i1 + 84 | 0;
   HEAP32[i4 + 60 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i4;
   STACKTOP = i3;
   return;
  }
 case 10:
  {
   i6 = i4 + 8 | 0;
   i7 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i7 + 8 >> 2] & 64 | 0) != 0 ? (i5 = HEAP32[i7 >> 2] | 0, !((HEAP8[i5 + 5 | 0] & 3) == 0)) : 0) {
    _reallymarkobject(i1, i5);
    i7 = HEAP32[i6 >> 2] | 0;
   }
   if ((i7 | 0) == (i4 + 16 | 0)) {
    i4 = 32;
   } else {
    STACKTOP = i3;
    return;
   }
   break;
  }
 case 5:
  {
   i7 = i1 + 84 | 0;
   HEAP32[i4 + 24 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i4;
   STACKTOP = i3;
   return;
  }
 case 38:
  {
   i7 = i1 + 84 | 0;
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i4;
   STACKTOP = i3;
   return;
  }
 case 9:
  {
   i7 = i1 + 84 | 0;
   HEAP32[i4 + 72 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i4;
   STACKTOP = i3;
   return;
  }
 default:
  {
   STACKTOP = i3;
   return;
  }
 }
 HEAP8[i2] = HEAPU8[i2] | 0 | 4;
 i7 = i1 + 16 | 0;
 HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + i4;
 STACKTOP = i3;
 return;
}
function _lua_upvaluejoin(i1, i9, i7, i6, i3) {
 i1 = i1 | 0;
 i9 = i9 | 0;
 i7 = i7 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i8 = 0, i10 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i9 | 0) <= 0) {
   if (!((i9 | 0) < -1000999)) {
    i8 = (HEAP32[i1 + 8 >> 2] | 0) + (i9 << 4) | 0;
    break;
   }
   if ((i9 | 0) == -1001e3) {
    i8 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i10 = -1001e3 - i9 | 0;
   i9 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i9 + 8 >> 2] | 0) != 22 ? (i8 = HEAP32[i9 >> 2] | 0, (i10 | 0) <= (HEAPU8[i8 + 6 | 0] | 0 | 0)) : 0) {
    i8 = i8 + (i10 + -1 << 4) + 16 | 0;
   } else {
    i8 = 5192;
   }
  } else {
   i8 = (HEAP32[i5 >> 2] | 0) + (i9 << 4) | 0;
   i8 = i8 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i8 : 5192;
  }
 } while (0);
 i8 = HEAP32[i8 >> 2] | 0;
 i7 = i8 + 16 + (i7 + -1 << 2) | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i4 = (HEAP32[i1 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i4 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i3 = (HEAP32[i4 >> 2] | 0) + 16 + (i3 + -1 << 2) | 0;
 HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
 i3 = HEAP32[i3 >> 2] | 0;
 if ((HEAP8[i3 + 5 | 0] & 3) == 0) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP8[i8 + 5 | 0] & 4) == 0) {
  STACKTOP = i2;
  return;
 }
 _luaC_barrier_(i1, i8, i3);
 STACKTOP = i2;
 return;
}
function _lua_upvalueid(i5, i7, i1) {
 i5 = i5 | 0;
 i7 = i7 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i5 + 16 >> 2] | 0;
 i6 = (i7 | 0) > 0;
 do {
  if (!i6) {
   if (!((i7 | 0) < -1000999)) {
    i8 = (HEAP32[i5 + 8 >> 2] | 0) + (i7 << 4) | 0;
    break;
   }
   if ((i7 | 0) == -1001e3) {
    i8 = (HEAP32[i5 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i10 = -1001e3 - i7 | 0;
   i9 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i9 + 8 >> 2] | 0) != 22 ? (i8 = HEAP32[i9 >> 2] | 0, (i10 | 0) <= (HEAPU8[i8 + 6 | 0] | 0 | 0)) : 0) {
    i8 = i8 + (i10 + -1 << 4) + 16 | 0;
   } else {
    i8 = 5192;
   }
  } else {
   i8 = (HEAP32[i4 >> 2] | 0) + (i7 << 4) | 0;
   i8 = i8 >>> 0 < (HEAP32[i5 + 8 >> 2] | 0) >>> 0 ? i8 : 5192;
  }
 } while (0);
 i9 = HEAP32[i8 + 8 >> 2] & 63;
 if ((i9 | 0) == 38) {
  i10 = (HEAP32[i8 >> 2] | 0) + (i1 + -1 << 4) + 16 | 0;
  STACKTOP = i2;
  return i10 | 0;
 } else if ((i9 | 0) == 6) {
  do {
   if (!i6) {
    if (!((i7 | 0) < -1000999)) {
     i3 = (HEAP32[i5 + 8 >> 2] | 0) + (i7 << 4) | 0;
     break;
    }
    if ((i7 | 0) == -1001e3) {
     i3 = (HEAP32[i5 + 12 >> 2] | 0) + 40 | 0;
     break;
    }
    i5 = -1001e3 - i7 | 0;
    i4 = HEAP32[i4 >> 2] | 0;
    if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
     i3 = i3 + (i5 + -1 << 4) + 16 | 0;
    } else {
     i3 = 5192;
    }
   } else {
    i3 = (HEAP32[i4 >> 2] | 0) + (i7 << 4) | 0;
    i3 = i3 >>> 0 < (HEAP32[i5 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
   }
  } while (0);
  i10 = HEAP32[(HEAP32[i3 >> 2] | 0) + 16 + (i1 + -1 << 2) >> 2] | 0;
  STACKTOP = i2;
  return i10 | 0;
 } else {
  i10 = 0;
  STACKTOP = i2;
  return i10 | 0;
 }
 return 0;
}
function _lua_rawequal(i2, i6, i4) {
 i2 = i2 | 0;
 i6 = i6 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0, i5 = 0, i7 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i5 = (HEAP32[i2 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i5 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i7 = -1001e3 - i6 | 0;
   i6 = HEAP32[i3 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i5 = HEAP32[i6 >> 2] | 0, (i7 | 0) <= (HEAPU8[i5 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i5 + (i7 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i5 = (HEAP32[i3 >> 2] | 0) + (i6 << 4) | 0;
   i5 = i5 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i5 : 5192;
  }
 } while (0);
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i2 = (HEAP32[i2 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i2 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i2 = -1001e3 - i4 | 0;
   i3 = HEAP32[i3 >> 2] | 0;
   if ((HEAP32[i3 + 8 >> 2] | 0) == 22) {
    i7 = 0;
    STACKTOP = i1;
    return i7 | 0;
   }
   i3 = HEAP32[i3 >> 2] | 0;
   if ((i2 | 0) > (HEAPU8[i3 + 6 | 0] | 0 | 0)) {
    i7 = 0;
    STACKTOP = i1;
    return i7 | 0;
   } else {
    i2 = i3 + (i2 + -1 << 4) + 16 | 0;
    break;
   }
  } else {
   i3 = (HEAP32[i3 >> 2] | 0) + (i4 << 4) | 0;
   i2 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 if ((i5 | 0) == 5192 | (i2 | 0) == 5192) {
  i7 = 0;
  STACKTOP = i1;
  return i7 | 0;
 }
 if ((HEAP32[i5 + 8 >> 2] | 0) == (HEAP32[i2 + 8 >> 2] | 0)) {
  i2 = (_luaV_equalobj_(0, i5, i2) | 0) != 0;
 } else {
  i2 = 0;
 }
 i7 = i2 & 1;
 STACKTOP = i1;
 return i7 | 0;
}
function _luaO_chunkid(i1, i4, i6) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 i3 = _strlen(i4 | 0) | 0;
 i5 = HEAP8[i4] | 0;
 if (i5 << 24 >> 24 == 64) {
  if (i3 >>> 0 > i6 >>> 0) {
   HEAP8[i1 + 0 | 0] = HEAP8[5552 | 0] | 0;
   HEAP8[i1 + 1 | 0] = HEAP8[5553 | 0] | 0;
   HEAP8[i1 + 2 | 0] = HEAP8[5554 | 0] | 0;
   _memcpy(i1 + 3 | 0, i4 + (4 - i6 + i3) | 0, i6 + -3 | 0) | 0;
   STACKTOP = i2;
   return;
  } else {
   _memcpy(i1 | 0, i4 + 1 | 0, i3 | 0) | 0;
   STACKTOP = i2;
   return;
  }
 } else if (i5 << 24 >> 24 == 61) {
  i4 = i4 + 1 | 0;
  if (i3 >>> 0 > i6 >>> 0) {
   i9 = i6 + -1 | 0;
   _memcpy(i1 | 0, i4 | 0, i9 | 0) | 0;
   HEAP8[i1 + i9 | 0] = 0;
   STACKTOP = i2;
   return;
  } else {
   _memcpy(i1 | 0, i4 | 0, i3 | 0) | 0;
   STACKTOP = i2;
   return;
  }
 } else {
  i5 = _strchr(i4, 10) | 0;
  i9 = i1 + 0 | 0;
  i8 = 5560 | 0;
  i7 = i9 + 9 | 0;
  do {
   HEAP8[i9] = HEAP8[i8] | 0;
   i9 = i9 + 1 | 0;
   i8 = i8 + 1 | 0;
  } while ((i9 | 0) < (i7 | 0));
  i7 = i1 + 9 | 0;
  i6 = i6 + -15 | 0;
  i8 = (i5 | 0) == 0;
  if (i3 >>> 0 < i6 >>> 0 & i8) {
   _memcpy(i7 | 0, i4 | 0, i3 | 0) | 0;
   i3 = i3 + 9 | 0;
  } else {
   if (!i8) {
    i3 = i5 - i4 | 0;
   }
   i3 = i3 >>> 0 > i6 >>> 0 ? i6 : i3;
   _memcpy(i7 | 0, i4 | 0, i3 | 0) | 0;
   i9 = i1 + (i3 + 9) | 0;
   HEAP8[i9 + 0 | 0] = HEAP8[5552 | 0] | 0;
   HEAP8[i9 + 1 | 0] = HEAP8[5553 | 0] | 0;
   HEAP8[i9 + 2 | 0] = HEAP8[5554 | 0] | 0;
   i3 = i3 + 12 | 0;
  }
  i9 = i1 + i3 | 0;
  HEAP8[i9 + 0 | 0] = HEAP8[5576 | 0] | 0;
  HEAP8[i9 + 1 | 0] = HEAP8[5577 | 0] | 0;
  HEAP8[i9 + 2 | 0] = HEAP8[5578 | 0] | 0;
  STACKTOP = i2;
  return;
 }
}
function _luaS_resize(i4, i1) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i3 = STACKTOP;
 i5 = HEAP32[i4 + 12 >> 2] | 0;
 i2 = i5 + 24 | 0;
 _luaC_runtilstate(i4, -5);
 i5 = i5 + 32 | 0;
 i8 = HEAP32[i5 >> 2] | 0;
 L1 : do {
  if ((i8 | 0) < (i1 | 0)) {
   if ((i1 + 1 | 0) >>> 0 > 1073741823) {
    _luaM_toobig(i4);
   }
   i7 = _luaM_realloc_(i4, HEAP32[i2 >> 2] | 0, i8 << 2, i1 << 2) | 0;
   HEAP32[i2 >> 2] = i7;
   i6 = HEAP32[i5 >> 2] | 0;
   if ((i6 | 0) < (i1 | 0)) {
    i8 = i6;
    while (1) {
     HEAP32[i7 + (i8 << 2) >> 2] = 0;
     i8 = i8 + 1 | 0;
     if ((i8 | 0) == (i1 | 0)) {
      i8 = i6;
      break L1;
     }
     i7 = HEAP32[i2 >> 2] | 0;
    }
   } else {
    i8 = i6;
   }
  }
 } while (0);
 if ((i8 | 0) > 0) {
  i6 = i1 + -1 | 0;
  i7 = 0;
  do {
   i10 = (HEAP32[i2 >> 2] | 0) + (i7 << 2) | 0;
   i9 = HEAP32[i10 >> 2] | 0;
   HEAP32[i10 >> 2] = 0;
   if ((i9 | 0) != 0) {
    while (1) {
     i8 = HEAP32[i9 >> 2] | 0;
     i10 = HEAP32[i9 + 8 >> 2] & i6;
     HEAP32[i9 >> 2] = HEAP32[(HEAP32[i2 >> 2] | 0) + (i10 << 2) >> 2];
     HEAP32[(HEAP32[i2 >> 2] | 0) + (i10 << 2) >> 2] = i9;
     i10 = i9 + 5 | 0;
     HEAP8[i10] = HEAP8[i10] & 191;
     if ((i8 | 0) == 0) {
      break;
     } else {
      i9 = i8;
     }
    }
    i8 = HEAP32[i5 >> 2] | 0;
   }
   i7 = i7 + 1 | 0;
  } while ((i7 | 0) < (i8 | 0));
 }
 if ((i8 | 0) <= (i1 | 0)) {
  HEAP32[i5 >> 2] = i1;
  STACKTOP = i3;
  return;
 }
 if ((i1 + 1 | 0) >>> 0 > 1073741823) {
  _luaM_toobig(i4);
 }
 HEAP32[i2 >> 2] = _luaM_realloc_(i4, HEAP32[i2 >> 2] | 0, i8 << 2, i1 << 2) | 0;
 HEAP32[i5 >> 2] = i1;
 STACKTOP = i3;
 return;
}
function _luaD_poscall(i6, i7) {
 i6 = i6 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 i4 = i6 + 16 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 i5 = HEAPU8[i6 + 40 | 0] | 0;
 if ((i5 & 6 | 0) == 0) {
  i8 = i3 + 8 | 0;
 } else {
  if ((i5 & 2 | 0) != 0) {
   i8 = i6 + 28 | 0;
   i7 = i7 - (HEAP32[i8 >> 2] | 0) | 0;
   _luaD_hook(i6, 1, -1);
   i7 = (HEAP32[i8 >> 2] | 0) + i7 | 0;
  }
  i8 = i3 + 8 | 0;
  HEAP32[i6 + 20 >> 2] = HEAP32[(HEAP32[i8 >> 2] | 0) + 28 >> 2];
 }
 i5 = HEAP32[i3 >> 2] | 0;
 i9 = HEAP16[i3 + 16 >> 1] | 0;
 i3 = i9 << 16 >> 16;
 HEAP32[i4 >> 2] = HEAP32[i8 >> 2];
 i4 = i6 + 8 | 0;
 if (i9 << 16 >> 16 == 0) {
  i9 = i5;
  HEAP32[i4 >> 2] = i9;
  i9 = i3 + 1 | 0;
  STACKTOP = i1;
  return i9 | 0;
 } else {
  i6 = i3;
 }
 while (1) {
  if (!(i7 >>> 0 < (HEAP32[i4 >> 2] | 0) >>> 0)) {
   break;
  }
  i8 = i5 + 16 | 0;
  i11 = i7;
  i10 = HEAP32[i11 + 4 >> 2] | 0;
  i9 = i5;
  HEAP32[i9 >> 2] = HEAP32[i11 >> 2];
  HEAP32[i9 + 4 >> 2] = i10;
  HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  i6 = i6 + -1 | 0;
  if ((i6 | 0) == 0) {
   i2 = 12;
   break;
  } else {
   i7 = i7 + 16 | 0;
   i5 = i8;
  }
 }
 if ((i2 | 0) == 12) {
  HEAP32[i4 >> 2] = i8;
  i11 = i3 + 1 | 0;
  STACKTOP = i1;
  return i11 | 0;
 }
 if ((i6 | 0) > 0) {
  i2 = i6;
  i7 = i5;
 } else {
  i11 = i5;
  HEAP32[i4 >> 2] = i11;
  i11 = i3 + 1 | 0;
  STACKTOP = i1;
  return i11 | 0;
 }
 while (1) {
  i2 = i2 + -1 | 0;
  HEAP32[i7 + 8 >> 2] = 0;
  if ((i2 | 0) <= 0) {
   break;
  } else {
   i7 = i7 + 16 | 0;
  }
 }
 i11 = i5 + (i6 << 4) | 0;
 HEAP32[i4 >> 2] = i11;
 i11 = i3 + 1 | 0;
 STACKTOP = i1;
 return i11 | 0;
}
function _lua_rawset(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i4 = -1001e3 - i4 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i5 >> 2] | 0, (i4 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i3 + (i4 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i3 = (HEAP32[i5 >> 2] | 0) + (i4 << 4) | 0;
   i5 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i4 = i1 + 8 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 i3 = _luaH_set(i1, HEAP32[i5 >> 2] | 0, i6 + -32 | 0) | 0;
 i9 = i6 + -16 | 0;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i3;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 HEAP32[i3 + 8 >> 2] = HEAP32[i6 + -8 >> 2];
 HEAP8[(HEAP32[i5 >> 2] | 0) + 6 | 0] = 0;
 i3 = HEAP32[i4 >> 2] | 0;
 if ((HEAP32[i3 + -8 >> 2] & 64 | 0) == 0) {
  i9 = i3;
  i9 = i9 + -32 | 0;
  HEAP32[i4 >> 2] = i9;
  STACKTOP = i2;
  return;
 }
 if ((HEAP8[(HEAP32[i3 + -16 >> 2] | 0) + 5 | 0] & 3) == 0) {
  i9 = i3;
  i9 = i9 + -32 | 0;
  HEAP32[i4 >> 2] = i9;
  STACKTOP = i2;
  return;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 if ((HEAP8[i5 + 5 | 0] & 4) == 0) {
  i9 = i3;
  i9 = i9 + -32 | 0;
  HEAP32[i4 >> 2] = i9;
  STACKTOP = i2;
  return;
 }
 _luaC_barrierback_(i1, i5);
 i9 = HEAP32[i4 >> 2] | 0;
 i9 = i9 + -32 | 0;
 HEAP32[i4 >> 2] = i9;
 STACKTOP = i2;
 return;
}
function _saveSetjmp(i4, i3, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0;
 setjmpId = setjmpId + 1 | 0;
 HEAP32[i4 >> 2] = setjmpId;
 while ((i2 | 0) < 40) {
  if ((HEAP32[i1 + (i2 << 2) >> 2] | 0) == 0) {
   HEAP32[i1 + (i2 << 2) >> 2] = setjmpId;
   HEAP32[i1 + ((i2 << 2) + 4) >> 2] = i3;
   HEAP32[i1 + ((i2 << 2) + 8) >> 2] = 0;
   return 0;
  }
  i2 = i2 + 2 | 0;
 }
 _putchar(116);
 _putchar(111);
 _putchar(111);
 _putchar(32);
 _putchar(109);
 _putchar(97);
 _putchar(110);
 _putchar(121);
 _putchar(32);
 _putchar(115);
 _putchar(101);
 _putchar(116);
 _putchar(106);
 _putchar(109);
 _putchar(112);
 _putchar(115);
 _putchar(32);
 _putchar(105);
 _putchar(110);
 _putchar(32);
 _putchar(97);
 _putchar(32);
 _putchar(102);
 _putchar(117);
 _putchar(110);
 _putchar(99);
 _putchar(116);
 _putchar(105);
 _putchar(111);
 _putchar(110);
 _putchar(32);
 _putchar(99);
 _putchar(97);
 _putchar(108);
 _putchar(108);
 _putchar(44);
 _putchar(32);
 _putchar(98);
 _putchar(117);
 _putchar(105);
 _putchar(108);
 _putchar(100);
 _putchar(32);
 _putchar(119);
 _putchar(105);
 _putchar(116);
 _putchar(104);
 _putchar(32);
 _putchar(97);
 _putchar(32);
 _putchar(104);
 _putchar(105);
 _putchar(103);
 _putchar(104);
 _putchar(101);
 _putchar(114);
 _putchar(32);
 _putchar(118);
 _putchar(97);
 _putchar(108);
 _putchar(117);
 _putchar(101);
 _putchar(32);
 _putchar(102);
 _putchar(111);
 _putchar(114);
 _putchar(32);
 _putchar(77);
 _putchar(65);
 _putchar(88);
 _putchar(95);
 _putchar(83);
 _putchar(69);
 _putchar(84);
 _putchar(74);
 _putchar(77);
 _putchar(80);
 _putchar(83);
 _putchar(10);
 abort(0);
 return 0;
}
function _lua_newthread(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 i3 = i5 + 12 | 0;
 if ((HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i5);
 }
 i2 = _luaC_newobj(i5, 8, 112, 0, 0) | 0;
 i6 = i5 + 8 | 0;
 i4 = HEAP32[i6 >> 2] | 0;
 HEAP32[i4 >> 2] = i2;
 HEAP32[i4 + 8 >> 2] = 72;
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 16;
 HEAP32[i2 + 12 >> 2] = HEAP32[i3 >> 2];
 i6 = i2 + 28 | 0;
 HEAP32[i6 >> 2] = 0;
 i4 = i2 + 16 | 0;
 HEAP32[i4 >> 2] = 0;
 i3 = i2 + 32 | 0;
 HEAP32[i3 >> 2] = 0;
 HEAP32[i2 + 64 >> 2] = 0;
 HEAP16[i2 + 38 >> 1] = 0;
 i9 = i2 + 52 | 0;
 HEAP32[i9 >> 2] = 0;
 i8 = i2 + 40 | 0;
 HEAP8[i8] = 0;
 i10 = i2 + 44 | 0;
 HEAP32[i10 >> 2] = 0;
 HEAP8[i2 + 41 | 0] = 1;
 i7 = i2 + 48 | 0;
 HEAP32[i7 >> 2] = 0;
 HEAP32[i2 + 56 >> 2] = 0;
 HEAP16[i2 + 36 >> 1] = 1;
 HEAP8[i2 + 6 | 0] = 0;
 HEAP32[i2 + 68 >> 2] = 0;
 HEAP8[i8] = HEAP8[i5 + 40 | 0] | 0;
 i8 = HEAP32[i5 + 44 >> 2] | 0;
 HEAP32[i10 >> 2] = i8;
 HEAP32[i9 >> 2] = HEAP32[i5 + 52 >> 2];
 HEAP32[i7 >> 2] = i8;
 i5 = _luaM_realloc_(i5, 0, 0, 640) | 0;
 HEAP32[i6 >> 2] = i5;
 HEAP32[i3 >> 2] = 40;
 i6 = 0;
 do {
  HEAP32[i5 + (i6 << 4) + 8 >> 2] = 0;
  i6 = i6 + 1 | 0;
 } while ((i6 | 0) != 40);
 HEAP32[i2 + 24 >> 2] = i5 + ((HEAP32[i3 >> 2] | 0) + -5 << 4);
 i10 = i2 + 72 | 0;
 HEAP32[i2 + 80 >> 2] = 0;
 HEAP32[i2 + 84 >> 2] = 0;
 HEAP8[i2 + 90 | 0] = 0;
 HEAP32[i10 >> 2] = i5;
 HEAP32[i2 + 8 >> 2] = i5 + 16;
 HEAP32[i5 + 8 >> 2] = 0;
 HEAP32[i2 + 76 >> 2] = i5 + 336;
 HEAP32[i4 >> 2] = i10;
 STACKTOP = i1;
 return i2 | 0;
}
function _luaK_self(i2, i5, i3) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 _luaK_dischargevars(i2, i5);
 if ((HEAP32[i5 >> 2] | 0) == 6) {
  i6 = i5 + 8 | 0;
  i8 = HEAP32[i6 >> 2] | 0;
  if ((HEAP32[i5 + 16 >> 2] | 0) != (HEAP32[i5 + 20 >> 2] | 0)) {
   if ((i8 | 0) < (HEAPU8[i2 + 46 | 0] | 0 | 0)) {
    i7 = 6;
   } else {
    _exp2reg(i2, i5, i8);
   }
  }
 } else {
  i6 = i5 + 8 | 0;
  i7 = 6;
 }
 if ((i7 | 0) == 6) {
  _luaK_exp2nextreg(i2, i5);
 }
 i8 = HEAP32[i6 >> 2] | 0;
 if (((HEAP32[i5 >> 2] | 0) == 6 ? (i8 & 256 | 0) == 0 : 0) ? (HEAPU8[i2 + 46 | 0] | 0 | 0) <= (i8 | 0) : 0) {
  i10 = i2 + 48 | 0;
  HEAP8[i10] = (HEAP8[i10] | 0) + -1 << 24 >> 24;
 }
 i7 = i2 + 48 | 0;
 HEAP32[i6 >> 2] = HEAPU8[i7] | 0;
 HEAP32[i5 >> 2] = 6;
 i10 = HEAP8[i7] | 0;
 i5 = (i10 & 255) + 2 | 0;
 i9 = (HEAP32[i2 >> 2] | 0) + 78 | 0;
 do {
  if (i5 >>> 0 > (HEAPU8[i9] | 0) >>> 0) {
   if (i5 >>> 0 > 249) {
    _luaX_syntaxerror(HEAP32[i2 + 12 >> 2] | 0, 10536);
   } else {
    HEAP8[i9] = i5;
    i4 = HEAP8[i7] | 0;
    break;
   }
  } else {
   i4 = i10;
  }
 } while (0);
 HEAP8[i7] = (i4 & 255) + 2;
 i10 = HEAP32[i6 >> 2] | 0;
 _luaK_code(i2, i8 << 23 | i10 << 6 | (_luaK_exp2RK(i2, i3) | 0) << 14 | 12) | 0;
 if ((HEAP32[i3 >> 2] | 0) != 6) {
  STACKTOP = i1;
  return;
 }
 i3 = HEAP32[i3 + 8 >> 2] | 0;
 if ((i3 & 256 | 0) != 0) {
  STACKTOP = i1;
  return;
 }
 if ((HEAPU8[i2 + 46 | 0] | 0 | 0) > (i3 | 0)) {
  STACKTOP = i1;
  return;
 }
 HEAP8[i7] = (HEAP8[i7] | 0) + -1 << 24 >> 24;
 STACKTOP = i1;
 return;
}
function _luaD_rawrunprotected(i10, i9, i11) {
 i10 = i10 | 0;
 i9 = i9 | 0;
 i11 = i11 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i12 = 0, i13 = 0;
 i7 = STACKTOP;
 STACKTOP = STACKTOP + 176 | 0;
 i8 = STACKTOP;
 STACKTOP = STACKTOP + 168 | 0;
 HEAP32[i8 >> 2] = 0;
 i6 = i7;
 i5 = i10 + 38 | 0;
 i4 = HEAP16[i5 >> 1] | 0;
 i1 = i6 + 160 | 0;
 HEAP32[i1 >> 2] = 0;
 i3 = i10 + 64 | 0;
 HEAP32[i6 >> 2] = HEAP32[i3 >> 2];
 HEAP32[i3 >> 2] = i6;
 _saveSetjmp(i6 + 4 | 0, 1, i8 | 0) | 0;
 __THREW__ = 0;
 i13 = __THREW__;
 __THREW__ = 0;
 if ((i13 | 0) != 0 & (threwValue | 0) != 0) {
  i12 = _testSetjmp(HEAP32[i13 >> 2] | 0, i8) | 0;
  if ((i12 | 0) == 0) {
   _longjmp(i13 | 0, threwValue | 0);
  }
  tempRet0 = threwValue;
 } else {
  i12 = -1;
 }
 if ((i12 | 0) == 1) {
  i12 = tempRet0;
 } else {
  i12 = 0;
 }
 while (1) {
  if ((i12 | 0) != 0) {
   i2 = 6;
   break;
  }
  __THREW__ = 0;
  invoke_vii(i9 | 0, i10 | 0, i11 | 0);
  i13 = __THREW__;
  __THREW__ = 0;
  if ((i13 | 0) != 0 & (threwValue | 0) != 0) {
   i12 = _testSetjmp(HEAP32[i13 >> 2] | 0, i8) | 0;
   if ((i12 | 0) == 0) {
    _longjmp(i13 | 0, threwValue | 0);
   }
   tempRet0 = threwValue;
  } else {
   i12 = -1;
  }
  if ((i12 | 0) == 1) {
   i12 = tempRet0;
  } else {
   break;
  }
 }
 if ((i2 | 0) == 6) {
  i13 = HEAP32[i6 >> 2] | 0;
  HEAP32[i3 >> 2] = i13;
  HEAP16[i5 >> 1] = i4;
  i13 = HEAP32[i1 >> 2] | 0;
  STACKTOP = i7;
  return i13 | 0;
 }
 i13 = HEAP32[i6 >> 2] | 0;
 HEAP32[i3 >> 2] = i13;
 HEAP16[i5 >> 1] = i4;
 i13 = HEAP32[i1 >> 2] | 0;
 STACKTOP = i7;
 return i13 | 0;
}
function _luaB_tonumber(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = 0.0, i7 = 0, d8 = 0.0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2 + 4 | 0;
 i4 = i2;
 do {
  if ((_lua_type(i1, 2) | 0) >= 1) {
   i9 = _luaL_checklstring(i1, 1, i4) | 0;
   i3 = i9 + (HEAP32[i4 >> 2] | 0) | 0;
   i5 = _luaL_checkinteger(i1, 2) | 0;
   if (!((i5 + -2 | 0) >>> 0 < 35)) {
    _luaL_argerror(i1, 2, 9648) | 0;
   }
   i10 = _strspn(i9, 9672) | 0;
   i7 = i9 + i10 | 0;
   i4 = HEAP8[i7] | 0;
   if (i4 << 24 >> 24 == 43) {
    i4 = 0;
    i7 = i9 + (i10 + 1) | 0;
   } else if (i4 << 24 >> 24 == 45) {
    i4 = 1;
    i7 = i9 + (i10 + 1) | 0;
   } else {
    i4 = 0;
   }
   if ((_isalnum(HEAPU8[i7] | 0 | 0) | 0) != 0) {
    d6 = +(i5 | 0);
    d8 = 0.0;
    do {
     i9 = HEAP8[i7] | 0;
     i10 = i9 & 255;
     if ((i10 + -48 | 0) >>> 0 < 10) {
      i9 = (i9 << 24 >> 24) + -48 | 0;
     } else {
      i9 = (_toupper(i10 | 0) | 0) + -55 | 0;
     }
     if ((i9 | 0) >= (i5 | 0)) {
      break;
     }
     d8 = d6 * d8 + +(i9 | 0);
     i7 = i7 + 1 | 0;
    } while ((_isalnum(HEAPU8[i7] | 0 | 0) | 0) != 0);
    if ((i7 + (_strspn(i7, 9672) | 0) | 0) == (i3 | 0)) {
     if ((i4 | 0) != 0) {
      d8 = -d8;
     }
     _lua_pushnumber(i1, d8);
     STACKTOP = i2;
     return 1;
    }
   }
  } else {
   d6 = +_lua_tonumberx(i1, 1, i3);
   if ((HEAP32[i3 >> 2] | 0) == 0) {
    _luaL_checkany(i1, 1);
    break;
   }
   _lua_pushnumber(i1, d6);
   STACKTOP = i2;
   return 1;
  }
 } while (0);
 _lua_pushnil(i1);
 STACKTOP = i2;
 return 1;
}
function _luaK_storevar(i1, i5, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 i7 = HEAP32[i5 >> 2] | 0;
 if ((i7 | 0) == 7) {
  if (((HEAP32[i3 >> 2] | 0) == 6 ? (i6 = HEAP32[i3 + 8 >> 2] | 0, (i6 & 256 | 0) == 0) : 0) ? (HEAPU8[i1 + 46 | 0] | 0) <= (i6 | 0) : 0) {
   i7 = i1 + 48 | 0;
   HEAP8[i7] = (HEAP8[i7] | 0) + -1 << 24 >> 24;
  }
  _exp2reg(i1, i3, HEAP32[i5 + 8 >> 2] | 0);
  STACKTOP = i2;
  return;
 } else if ((i7 | 0) == 9) {
  i4 = i5 + 8 | 0;
  i7 = (HEAP8[i4 + 3 | 0] | 0) == 7 ? 10 : 8;
  i6 = _luaK_exp2RK(i1, i3) | 0;
  _luaK_code(i1, i6 << 14 | i7 | HEAPU8[i4 + 2 | 0] << 6 | HEAPU16[i4 >> 1] << 23) | 0;
 } else if ((i7 | 0) == 8) {
  _luaK_dischargevars(i1, i3);
  if ((HEAP32[i3 >> 2] | 0) == 6) {
   i6 = i3 + 8 | 0;
   i7 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i3 + 16 >> 2] | 0) != (HEAP32[i3 + 20 >> 2] | 0)) {
    if ((i7 | 0) < (HEAPU8[i1 + 46 | 0] | 0)) {
     i4 = 12;
    } else {
     _exp2reg(i1, i3, i7);
     i7 = HEAP32[i6 >> 2] | 0;
    }
   }
  } else {
   i6 = i3 + 8 | 0;
   i4 = 12;
  }
  if ((i4 | 0) == 12) {
   _luaK_exp2nextreg(i1, i3);
   i7 = HEAP32[i6 >> 2] | 0;
  }
  _luaK_code(i1, i7 << 6 | HEAP32[i5 + 8 >> 2] << 23 | 9) | 0;
 }
 if ((HEAP32[i3 >> 2] | 0) != 6) {
  STACKTOP = i2;
  return;
 }
 i3 = HEAP32[i3 + 8 >> 2] | 0;
 if ((i3 & 256 | 0) != 0) {
  STACKTOP = i2;
  return;
 }
 if ((HEAPU8[i1 + 46 | 0] | 0) > (i3 | 0)) {
  STACKTOP = i2;
  return;
 }
 i7 = i1 + 48 | 0;
 HEAP8[i7] = (HEAP8[i7] | 0) + -1 << 24 >> 24;
 STACKTOP = i2;
 return;
}
function _closegoto(i10, i3, i9) {
 i10 = i10 | 0;
 i3 = i3 | 0;
 i9 = i9 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i11 = 0, i12 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i7 = i1;
 i4 = HEAP32[i10 + 48 >> 2] | 0;
 i6 = HEAP32[i10 + 64 >> 2] | 0;
 i2 = i6 + 12 | 0;
 i5 = HEAP32[i2 >> 2] | 0;
 i8 = HEAP8[i5 + (i3 << 4) + 12 | 0] | 0;
 if ((i8 & 255) < (HEAPU8[i9 + 12 | 0] | 0)) {
  i11 = HEAP32[i10 + 52 >> 2] | 0;
  i12 = HEAP32[i5 + (i3 << 4) + 8 >> 2] | 0;
  i8 = (HEAP32[(HEAP32[(HEAP32[i4 >> 2] | 0) + 24 >> 2] | 0) + ((HEAP16[(HEAP32[HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 64 >> 2] >> 2] | 0) + ((HEAP32[i4 + 40 >> 2] | 0) + (i8 & 255) << 1) >> 1] | 0) * 12 | 0) >> 2] | 0) + 16 | 0;
  HEAP32[i7 >> 2] = (HEAP32[i5 + (i3 << 4) >> 2] | 0) + 16;
  HEAP32[i7 + 4 >> 2] = i12;
  HEAP32[i7 + 8 >> 2] = i8;
  _semerror(i10, _luaO_pushfstring(i11, 6248, i7) | 0);
 }
 _luaK_patchlist(i4, HEAP32[i5 + (i3 << 4) + 4 >> 2] | 0, HEAP32[i9 + 4 >> 2] | 0);
 i4 = i6 + 16 | 0;
 i5 = (HEAP32[i4 >> 2] | 0) + -1 | 0;
 if ((i5 | 0) <= (i3 | 0)) {
  i12 = i5;
  HEAP32[i4 >> 2] = i12;
  STACKTOP = i1;
  return;
 }
 do {
  i12 = HEAP32[i2 >> 2] | 0;
  i5 = i12 + (i3 << 4) | 0;
  i3 = i3 + 1 | 0;
  i12 = i12 + (i3 << 4) | 0;
  HEAP32[i5 + 0 >> 2] = HEAP32[i12 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i12 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i12 + 8 >> 2];
  HEAP32[i5 + 12 >> 2] = HEAP32[i12 + 12 >> 2];
  i5 = (HEAP32[i4 >> 2] | 0) + -1 | 0;
 } while ((i3 | 0) < (i5 | 0));
 HEAP32[i4 >> 2] = i5;
 STACKTOP = i1;
 return;
}
function _luaM_growaux_(i4, i5, i1, i7, i8, i9) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 i7 = i7 | 0;
 i8 = i8 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i10 = 0, i11 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i10 = i2;
 i6 = HEAP32[i1 >> 2] | 0;
 if ((i6 | 0) >= ((i8 | 0) / 2 | 0 | 0)) {
  if ((i6 | 0) < (i8 | 0)) {
   i3 = i8;
  } else {
   HEAP32[i10 >> 2] = i9;
   HEAP32[i10 + 4 >> 2] = i8;
   _luaG_runerror(i4, 4112, i10);
  }
 } else {
  i3 = i6 << 1;
  i3 = (i3 | 0) < 4 ? 4 : i3;
 }
 if ((i3 + 1 | 0) >>> 0 > (4294967293 / (i7 >>> 0) | 0) >>> 0) {
  _luaM_toobig(i4);
 }
 i6 = Math_imul(i6, i7) | 0;
 i8 = Math_imul(i3, i7) | 0;
 i9 = HEAP32[i4 + 12 >> 2] | 0;
 i7 = (i5 | 0) != 0;
 i11 = i9 + 4 | 0;
 i10 = FUNCTION_TABLE_iiiii[HEAP32[i9 >> 2] & 3](HEAP32[i11 >> 2] | 0, i5, i6, i8) | 0;
 if ((i10 | 0) != 0 | (i8 | 0) == 0) {
  i5 = i9 + 12 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i6 = 0 - i6 | 0;
  i11 = i7 ? i6 : 0;
  i11 = i11 + i8 | 0;
  i11 = i11 + i4 | 0;
  HEAP32[i5 >> 2] = i11;
  HEAP32[i1 >> 2] = i3;
  STACKTOP = i2;
  return i10 | 0;
 }
 if ((HEAP8[i9 + 63 | 0] | 0) == 0) {
  _luaD_throw(i4, 4);
 }
 _luaC_fullgc(i4, 1);
 i10 = FUNCTION_TABLE_iiiii[HEAP32[i9 >> 2] & 3](HEAP32[i11 >> 2] | 0, i5, i6, i8) | 0;
 if ((i10 | 0) == 0) {
  _luaD_throw(i4, 4);
 } else {
  i5 = i9 + 12 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i6 = 0 - i6 | 0;
  i11 = i7 ? i6 : 0;
  i11 = i11 + i8 | 0;
  i11 = i11 + i4 | 0;
  HEAP32[i5 >> 2] = i11;
  HEAP32[i1 >> 2] = i3;
  STACKTOP = i2;
  return i10 | 0;
 }
 return 0;
}
function _luaD_hook(i5, i14, i13) {
 i5 = i5 | 0;
 i14 = i14 | 0;
 i13 = i13 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i15 = 0, i16 = 0;
 i11 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i11;
 i3 = HEAP32[i5 + 52 >> 2] | 0;
 if ((i3 | 0) == 0) {
  STACKTOP = i11;
  return;
 }
 i8 = i5 + 41 | 0;
 if ((HEAP8[i8] | 0) == 0) {
  STACKTOP = i11;
  return;
 }
 i10 = HEAP32[i5 + 16 >> 2] | 0;
 i6 = i5 + 8 | 0;
 i15 = HEAP32[i6 >> 2] | 0;
 i1 = i5 + 28 | 0;
 i16 = i15;
 i12 = HEAP32[i1 >> 2] | 0;
 i7 = i16 - i12 | 0;
 i9 = i10 + 4 | 0;
 i12 = (HEAP32[i9 >> 2] | 0) - i12 | 0;
 HEAP32[i4 >> 2] = i14;
 HEAP32[i4 + 20 >> 2] = i13;
 HEAP32[i4 + 96 >> 2] = i10;
 do {
  if (((HEAP32[i5 + 24 >> 2] | 0) - i16 | 0) < 336) {
   i14 = HEAP32[i5 + 32 >> 2] | 0;
   if ((i14 | 0) > 1e6) {
    _luaD_throw(i5, 6);
   }
   i13 = (i7 >> 4) + 25 | 0;
   i14 = i14 << 1;
   i14 = (i14 | 0) > 1e6 ? 1e6 : i14;
   i13 = (i14 | 0) < (i13 | 0) ? i13 : i14;
   if ((i13 | 0) > 1e6) {
    _luaD_reallocstack(i5, 1000200);
    _luaG_runerror(i5, 2224, i4);
   } else {
    _luaD_reallocstack(i5, i13);
    i2 = HEAP32[i6 >> 2] | 0;
    break;
   }
  } else {
   i2 = i15;
  }
 } while (0);
 HEAP32[i9 >> 2] = i2 + 320;
 HEAP8[i8] = 0;
 i16 = i10 + 18 | 0;
 HEAP8[i16] = HEAPU8[i16] | 2;
 FUNCTION_TABLE_vii[i3 & 15](i5, i4);
 HEAP8[i8] = 1;
 HEAP32[i9 >> 2] = (HEAP32[i1 >> 2] | 0) + i12;
 HEAP32[i6 >> 2] = (HEAP32[i1 >> 2] | 0) + i7;
 HEAP8[i16] = HEAP8[i16] & 253;
 STACKTOP = i11;
 return;
}
function _funcargs(i10, i2, i1) {
 i10 = i10 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i6 = i3;
 i9 = i10 + 48 | 0;
 i5 = HEAP32[i9 >> 2] | 0;
 i7 = i10 + 16 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 | 0) == 289) {
  i9 = _luaK_stringK(i5, HEAP32[i10 + 24 >> 2] | 0) | 0;
  HEAP32[i6 + 16 >> 2] = -1;
  HEAP32[i6 + 20 >> 2] = -1;
  HEAP32[i6 >> 2] = 4;
  HEAP32[i6 + 8 >> 2] = i9;
  _luaX_next(i10);
 } else if ((i8 | 0) == 40) {
  _luaX_next(i10);
  if ((HEAP32[i7 >> 2] | 0) == 41) {
   HEAP32[i6 >> 2] = 0;
  } else {
   _subexpr(i10, i6, 0) | 0;
   if ((HEAP32[i7 >> 2] | 0) == 44) {
    do {
     _luaX_next(i10);
     _luaK_exp2nextreg(HEAP32[i9 >> 2] | 0, i6);
     _subexpr(i10, i6, 0) | 0;
    } while ((HEAP32[i7 >> 2] | 0) == 44);
   }
   _luaK_setreturns(i5, i6, -1);
  }
  _check_match(i10, 41, 40, i1);
 } else if ((i8 | 0) == 123) {
  _constructor(i10, i6);
 } else {
  _luaX_syntaxerror(i10, 6624);
 }
 i8 = i2 + 8 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 i9 = HEAP32[i6 >> 2] | 0;
 if ((i9 | 0) == 0) {
  i4 = 13;
 } else if ((i9 | 0) == 13 | (i9 | 0) == 12) {
  i6 = 0;
 } else {
  _luaK_exp2nextreg(i5, i6);
  i4 = 13;
 }
 if ((i4 | 0) == 13) {
  i6 = (HEAPU8[i5 + 48 | 0] | 0) - i7 | 0;
 }
 i10 = _luaK_codeABC(i5, 29, i7, i6, 2) | 0;
 HEAP32[i2 + 16 >> 2] = -1;
 HEAP32[i2 + 20 >> 2] = -1;
 HEAP32[i2 >> 2] = 12;
 HEAP32[i8 >> 2] = i10;
 _luaK_fixline(i5, i1);
 HEAP8[i5 + 48 | 0] = i7 + 1;
 STACKTOP = i3;
 return;
}
function _luaD_reallocstack(i3, i6) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 i2 = i3 + 28 | 0;
 i8 = HEAP32[i2 >> 2] | 0;
 i7 = i3 + 32 | 0;
 i9 = HEAP32[i7 >> 2] | 0;
 if ((i6 + 1 | 0) >>> 0 > 268435455) {
  _luaM_toobig(i3);
 }
 i5 = _luaM_realloc_(i3, i8, i9 << 4, i6 << 4) | 0;
 HEAP32[i2 >> 2] = i5;
 if ((i9 | 0) < (i6 | 0)) {
  do {
   HEAP32[i5 + (i9 << 4) + 8 >> 2] = 0;
   i9 = i9 + 1 | 0;
  } while ((i9 | 0) != (i6 | 0));
 }
 HEAP32[i7 >> 2] = i6;
 HEAP32[i3 + 24 >> 2] = i5 + (i6 + -5 << 4);
 i6 = i3 + 8 | 0;
 HEAP32[i6 >> 2] = i5 + ((HEAP32[i6 >> 2] | 0) - i8 >> 4 << 4);
 i6 = HEAP32[i3 + 56 >> 2] | 0;
 if ((i6 | 0) != 0 ? (i4 = i6 + 8 | 0, HEAP32[i4 >> 2] = i5 + ((HEAP32[i4 >> 2] | 0) - i8 >> 4 << 4), i4 = HEAP32[i6 >> 2] | 0, (i4 | 0) != 0) : 0) {
  do {
   i9 = i4 + 8 | 0;
   HEAP32[i9 >> 2] = (HEAP32[i2 >> 2] | 0) + ((HEAP32[i9 >> 2] | 0) - i8 >> 4 << 4);
   i4 = HEAP32[i4 >> 2] | 0;
  } while ((i4 | 0) != 0);
 }
 i3 = HEAP32[i3 + 16 >> 2] | 0;
 if ((i3 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 do {
  i9 = i3 + 4 | 0;
  HEAP32[i9 >> 2] = (HEAP32[i2 >> 2] | 0) + ((HEAP32[i9 >> 2] | 0) - i8 >> 4 << 4);
  HEAP32[i3 >> 2] = (HEAP32[i2 >> 2] | 0) + ((HEAP32[i3 >> 2] | 0) - i8 >> 4 << 4);
  if (!((HEAP8[i3 + 18 | 0] & 1) == 0)) {
   i9 = i3 + 24 | 0;
   HEAP32[i9 >> 2] = (HEAP32[i2 >> 2] | 0) + ((HEAP32[i9 >> 2] | 0) - i8 >> 4 << 4);
  }
  i3 = HEAP32[i3 + 8 >> 2] | 0;
 } while ((i3 | 0) != 0);
 STACKTOP = i1;
 return;
}
function _luaF_close(i7, i6) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i7 + 12 >> 2] | 0;
 i3 = i7 + 56 | 0;
 i8 = HEAP32[i3 >> 2] | 0;
 if ((i8 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 i5 = i4 + 60 | 0;
 i2 = i4 + 68 | 0;
 while (1) {
  i9 = i8 + 8 | 0;
  if ((HEAP32[i9 >> 2] | 0) >>> 0 < i6 >>> 0) {
   i2 = 10;
   break;
  }
  HEAP32[i3 >> 2] = HEAP32[i8 >> 2];
  if ((((HEAPU8[i5] | 0) ^ 3) & ((HEAPU8[i8 + 5 | 0] | 0) ^ 3) | 0) == 0) {
   if ((HEAP32[i9 >> 2] | 0) != (i8 + 16 | 0)) {
    i9 = i8 + 16 | 0;
    i10 = i9 + 4 | 0;
    HEAP32[(HEAP32[i10 >> 2] | 0) + 16 >> 2] = HEAP32[i9 >> 2];
    HEAP32[(HEAP32[i9 >> 2] | 0) + 20 >> 2] = HEAP32[i10 >> 2];
   }
   _luaM_realloc_(i7, i8, 32, 0) | 0;
  } else {
   i11 = i8 + 16 | 0;
   i10 = i11 + 4 | 0;
   HEAP32[(HEAP32[i10 >> 2] | 0) + 16 >> 2] = HEAP32[i11 >> 2];
   HEAP32[(HEAP32[i11 >> 2] | 0) + 20 >> 2] = HEAP32[i10 >> 2];
   i11 = HEAP32[i9 >> 2] | 0;
   i10 = i8 + 16 | 0;
   i14 = i11;
   i13 = HEAP32[i14 + 4 >> 2] | 0;
   i12 = i10;
   HEAP32[i12 >> 2] = HEAP32[i14 >> 2];
   HEAP32[i12 + 4 >> 2] = i13;
   HEAP32[i8 + 24 >> 2] = HEAP32[i11 + 8 >> 2];
   HEAP32[i9 >> 2] = i10;
   HEAP32[i8 >> 2] = HEAP32[i2 >> 2];
   HEAP32[i2 >> 2] = i8;
   _luaC_checkupvalcolor(i4, i8);
  }
  i8 = HEAP32[i3 >> 2] | 0;
  if ((i8 | 0) == 0) {
   i2 = 10;
   break;
  }
 }
 if ((i2 | 0) == 10) {
  STACKTOP = i1;
  return;
 }
}
function _luaK_dischargevars(i3, i1) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 switch (HEAP32[i1 >> 2] | 0) {
 case 12:
  {
   HEAP32[i1 >> 2] = 6;
   i6 = i1 + 8 | 0;
   HEAP32[i6 >> 2] = (HEAP32[(HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i6 >> 2] << 2) >> 2] | 0) >>> 6 & 255;
   STACKTOP = i2;
   return;
  }
 case 13:
  {
   i6 = (HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i1 + 8 >> 2] << 2) | 0;
   HEAP32[i6 >> 2] = HEAP32[i6 >> 2] & 8388607 | 16777216;
   HEAP32[i1 >> 2] = 11;
   STACKTOP = i2;
   return;
  }
 case 9:
  {
   i4 = i1 + 8 | 0;
   i5 = HEAP16[i4 >> 1] | 0;
   if ((i5 & 256 | 0) == 0 ? (HEAPU8[i3 + 46 | 0] | 0) <= (i5 | 0) : 0) {
    i6 = i3 + 48 | 0;
    HEAP8[i6] = (HEAP8[i6] | 0) + -1 << 24 >> 24;
   }
   i5 = i4 + 2 | 0;
   if ((HEAP8[i4 + 3 | 0] | 0) == 7) {
    if ((HEAPU8[i3 + 46 | 0] | 0) > (HEAPU8[i5] | 0)) {
     i6 = 7;
    } else {
     i6 = i3 + 48 | 0;
     HEAP8[i6] = (HEAP8[i6] | 0) + -1 << 24 >> 24;
     i6 = 7;
    }
   } else {
    i6 = 6;
   }
   HEAP32[i4 >> 2] = _luaK_code(i3, HEAPU8[i5] << 23 | i6 | HEAP16[i4 >> 1] << 14) | 0;
   HEAP32[i1 >> 2] = 11;
   STACKTOP = i2;
   return;
  }
 case 7:
  {
   HEAP32[i1 >> 2] = 6;
   STACKTOP = i2;
   return;
  }
 case 8:
  {
   i6 = i1 + 8 | 0;
   HEAP32[i6 >> 2] = _luaK_code(i3, HEAP32[i6 >> 2] << 23 | 5) | 0;
   HEAP32[i1 >> 2] = 11;
   STACKTOP = i2;
   return;
  }
 default:
  {
   STACKTOP = i2;
   return;
  }
 }
}
function _gmatch_aux(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;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 288 | 0;
 i2 = i1 + 8 | 0;
 i12 = i1 + 4 | 0;
 i3 = i1;
 i8 = _lua_tolstring(i10, -1001001, i12) | 0;
 i7 = _lua_tolstring(i10, -1001002, i3) | 0;
 i5 = i2 + 16 | 0;
 HEAP32[i5 >> 2] = i10;
 HEAP32[i2 >> 2] = 200;
 HEAP32[i2 + 4 >> 2] = i8;
 i9 = i2 + 8 | 0;
 HEAP32[i9 >> 2] = i8 + (HEAP32[i12 >> 2] | 0);
 HEAP32[i2 + 12 >> 2] = i7 + (HEAP32[i3 >> 2] | 0);
 i3 = i8 + (_lua_tointegerx(i10, -1001003, 0) | 0) | 0;
 if (i3 >>> 0 > (HEAP32[i9 >> 2] | 0) >>> 0) {
  i12 = 0;
  STACKTOP = i1;
  return i12 | 0;
 }
 i11 = i2 + 20 | 0;
 while (1) {
  HEAP32[i11 >> 2] = 0;
  i4 = _match(i2, i3, i7) | 0;
  i12 = i3 + 1 | 0;
  if ((i4 | 0) != 0) {
   break;
  }
  if (i12 >>> 0 > (HEAP32[i9 >> 2] | 0) >>> 0) {
   i2 = 0;
   i6 = 7;
   break;
  } else {
   i3 = i12;
  }
 }
 if ((i6 | 0) == 7) {
  STACKTOP = i1;
  return i2 | 0;
 }
 _lua_pushinteger(i10, i4 - i8 + ((i4 | 0) == (i3 | 0)) | 0);
 _lua_replace(i10, -1001003);
 i7 = HEAP32[i11 >> 2] | 0;
 i6 = (i7 | 0) != 0 | (i3 | 0) == 0 ? i7 : 1;
 _luaL_checkstack(HEAP32[i5 >> 2] | 0, i6, 7200);
 if ((i6 | 0) > 0) {
  i5 = 0;
 } else {
  i12 = i7;
  STACKTOP = i1;
  return i12 | 0;
 }
 while (1) {
  _push_onecapture(i2, i5, i3, i4);
  i5 = i5 + 1 | 0;
  if ((i5 | 0) == (i6 | 0)) {
   i2 = i6;
   break;
  }
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _lua_rawseti(i1, i5, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i6 = 0;
 i2 = STACKTOP;
 i6 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i6 >> 2] | 0, (i5 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i4 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i4 = (HEAP32[i6 >> 2] | 0) + (i5 << 4) | 0;
   i5 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i4 = i1 + 8 | 0;
 _luaH_setint(i1, HEAP32[i5 >> 2] | 0, i3, (HEAP32[i4 >> 2] | 0) + -16 | 0);
 i3 = HEAP32[i4 >> 2] | 0;
 if ((HEAP32[i3 + -8 >> 2] & 64 | 0) == 0) {
  i6 = i3;
  i6 = i6 + -16 | 0;
  HEAP32[i4 >> 2] = i6;
  STACKTOP = i2;
  return;
 }
 if ((HEAP8[(HEAP32[i3 + -16 >> 2] | 0) + 5 | 0] & 3) == 0) {
  i6 = i3;
  i6 = i6 + -16 | 0;
  HEAP32[i4 >> 2] = i6;
  STACKTOP = i2;
  return;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 if ((HEAP8[i5 + 5 | 0] & 4) == 0) {
  i6 = i3;
  i6 = i6 + -16 | 0;
  HEAP32[i4 >> 2] = i6;
  STACKTOP = i2;
  return;
 }
 _luaC_barrierback_(i1, i5);
 i6 = HEAP32[i4 >> 2] | 0;
 i6 = i6 + -16 | 0;
 HEAP32[i4 >> 2] = i6;
 STACKTOP = i2;
 return;
}
function _ll_require(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i5 = i2;
 i4 = i2 + 8 | 0;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 _lua_settop(i1, 1);
 _lua_getfield(i1, -1001e3, 4576);
 _lua_getfield(i1, 2, i3);
 if ((_lua_toboolean(i1, -1) | 0) != 0) {
  STACKTOP = i2;
  return 1;
 }
 _lua_settop(i1, -2);
 _luaL_buffinit(i1, i4);
 _lua_getfield(i1, -1001001, 4240);
 if ((_lua_type(i1, 3) | 0) == 5) {
  i6 = 1;
 } else {
  _luaL_error(i1, 4656, i5) | 0;
  i6 = 1;
 }
 while (1) {
  _lua_rawgeti(i1, 3, i6);
  if ((_lua_type(i1, -1) | 0) == 0) {
   _lua_settop(i1, -2);
   _luaL_pushresult(i4);
   i7 = _lua_tolstring(i1, -1, 0) | 0;
   HEAP32[i5 >> 2] = i3;
   HEAP32[i5 + 4 >> 2] = i7;
   _luaL_error(i1, 4696, i5) | 0;
  }
  _lua_pushstring(i1, i3) | 0;
  _lua_callk(i1, 1, 2, 0, 0);
  if ((_lua_type(i1, -2) | 0) == 6) {
   break;
  }
  if ((_lua_isstring(i1, -2) | 0) == 0) {
   _lua_settop(i1, -3);
  } else {
   _lua_settop(i1, -2);
   _luaL_addvalue(i4);
  }
  i6 = i6 + 1 | 0;
 }
 _lua_pushstring(i1, i3) | 0;
 _lua_insert(i1, -2);
 _lua_callk(i1, 2, 1, 0, 0);
 if ((_lua_type(i1, -1) | 0) != 0) {
  _lua_setfield(i1, 2, i3);
 }
 _lua_getfield(i1, 2, i3);
 if ((_lua_type(i1, -1) | 0) != 0) {
  STACKTOP = i2;
  return 1;
 }
 _lua_pushboolean(i1, 1);
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, 2, i3);
 STACKTOP = i2;
 return 1;
}
function _f_parser(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i5 = HEAP32[i3 >> 2] | 0;
 i8 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i8 + -1;
 if ((i8 | 0) == 0) {
  i6 = _luaZ_fill(i5) | 0;
 } else {
  i8 = i5 + 4 | 0;
  i6 = HEAP32[i8 >> 2] | 0;
  HEAP32[i8 >> 2] = i6 + 1;
  i6 = HEAPU8[i6] | 0;
 }
 i5 = HEAP32[i3 + 52 >> 2] | 0;
 i7 = (i5 | 0) == 0;
 if ((i6 | 0) == 27) {
  if (!i7 ? (_strchr(i5, 98) | 0) == 0 : 0) {
   HEAP32[i4 >> 2] = 2360;
   HEAP32[i4 + 4 >> 2] = i5;
   _luaO_pushfstring(i1, 2376, i4) | 0;
   _luaD_throw(i1, 3);
  }
  i8 = _luaU_undump(i1, HEAP32[i3 >> 2] | 0, i3 + 4 | 0, HEAP32[i3 + 56 >> 2] | 0) | 0;
 } else {
  if (!i7 ? (_strchr(i5, 116) | 0) == 0 : 0) {
   HEAP32[i4 >> 2] = 2368;
   HEAP32[i4 + 4 >> 2] = i5;
   _luaO_pushfstring(i1, 2376, i4) | 0;
   _luaD_throw(i1, 3);
  }
  i8 = _luaY_parser(i1, HEAP32[i3 >> 2] | 0, i3 + 4 | 0, i3 + 16 | 0, HEAP32[i3 + 56 >> 2] | 0, i6) | 0;
 }
 i7 = i8 + 6 | 0;
 if ((HEAP8[i7] | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i5 = i8 + 16 | 0;
 i6 = i8 + 5 | 0;
 i4 = 0;
 do {
  i3 = _luaF_newupval(i1) | 0;
  HEAP32[i5 + (i4 << 2) >> 2] = i3;
  if (!((HEAP8[i3 + 5 | 0] & 3) == 0) ? !((HEAP8[i6] & 4) == 0) : 0) {
   _luaC_barrier_(i1, i8, i3);
  }
  i4 = i4 + 1 | 0;
 } while ((i4 | 0) < (HEAPU8[i7] | 0));
 STACKTOP = i2;
 return;
}
function _str_rep(i9) {
 i9 = i9 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i4 = i6;
 i2 = i6 + 1044 | 0;
 i3 = i6 + 1040 | 0;
 i1 = _luaL_checklstring(i9, 1, i2) | 0;
 i8 = _luaL_checkinteger(i9, 2) | 0;
 i5 = _luaL_optlstring(i9, 3, 7040, i3) | 0;
 if ((i8 | 0) < 1) {
  _lua_pushlstring(i9, 7040, 0) | 0;
  i12 = 1;
  STACKTOP = i6;
  return i12 | 0;
 }
 i7 = HEAP32[i2 >> 2] | 0;
 i10 = HEAP32[i3 >> 2] | 0;
 i11 = i10 + i7 | 0;
 if (!(i11 >>> 0 < i7 >>> 0) ? i11 >>> 0 < (2147483647 / (i8 >>> 0) | 0) >>> 0 : 0) {
  i7 = (Math_imul(i10, i8 + -1 | 0) | 0) + (Math_imul(i7, i8) | 0) | 0;
  i11 = _luaL_buffinitsize(i9, i4, i7) | 0;
  _memcpy(i11 | 0, i1 | 0, HEAP32[i2 >> 2] | 0) | 0;
  if ((i8 | 0) > 1) {
   while (1) {
    i8 = i8 + -1 | 0;
    i9 = HEAP32[i2 >> 2] | 0;
    i10 = i11 + i9 | 0;
    i12 = HEAP32[i3 >> 2] | 0;
    if ((i12 | 0) == 0) {
     i12 = i9;
    } else {
     _memcpy(i10 | 0, i5 | 0, i12 | 0) | 0;
     i12 = HEAP32[i2 >> 2] | 0;
     i10 = i11 + ((HEAP32[i3 >> 2] | 0) + i9) | 0;
    }
    _memcpy(i10 | 0, i1 | 0, i12 | 0) | 0;
    if ((i8 | 0) <= 1) {
     break;
    } else {
     i11 = i10;
    }
   }
  }
  _luaL_pushresultsize(i4, i7);
  i12 = 1;
  STACKTOP = i6;
  return i12 | 0;
 }
 i12 = _luaL_error(i9, 7168, i4) | 0;
 STACKTOP = i6;
 return i12 | 0;
}
function ___strchrnul(i6, i2) {
 i6 = i6 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0;
 i1 = STACKTOP;
 i3 = i2 & 255;
 if ((i3 | 0) == 0) {
  i7 = i6 + (_strlen(i6 | 0) | 0) | 0;
  STACKTOP = i1;
  return i7 | 0;
 }
 L5 : do {
  if ((i6 & 3 | 0) != 0) {
   i4 = i2 & 255;
   while (1) {
    i5 = HEAP8[i6] | 0;
    if (i5 << 24 >> 24 == 0) {
     i4 = i6;
     i5 = 13;
     break;
    }
    i7 = i6 + 1 | 0;
    if (i5 << 24 >> 24 == i4 << 24 >> 24) {
     i4 = i6;
     i5 = 13;
     break;
    }
    if ((i7 & 3 | 0) == 0) {
     i4 = i7;
     break L5;
    } else {
     i6 = i7;
    }
   }
   if ((i5 | 0) == 13) {
    STACKTOP = i1;
    return i4 | 0;
   }
  } else {
   i4 = i6;
  }
 } while (0);
 i3 = Math_imul(i3, 16843009) | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 L15 : do {
  if (((i6 & -2139062144 ^ -2139062144) & i6 + -16843009 | 0) == 0) {
   while (1) {
    i7 = i6 ^ i3;
    i5 = i4 + 4 | 0;
    if (((i7 & -2139062144 ^ -2139062144) & i7 + -16843009 | 0) != 0) {
     break L15;
    }
    i6 = HEAP32[i5 >> 2] | 0;
    if (((i6 & -2139062144 ^ -2139062144) & i6 + -16843009 | 0) == 0) {
     i4 = i5;
    } else {
     i4 = i5;
     break;
    }
   }
  }
 } while (0);
 i2 = i2 & 255;
 while (1) {
  i7 = HEAP8[i4] | 0;
  if (i7 << 24 >> 24 == 0 | i7 << 24 >> 24 == i2 << 24 >> 24) {
   break;
  } else {
   i4 = i4 + 1 | 0;
  }
 }
 STACKTOP = i1;
 return i4 | 0;
}
function _lua_replace(i2, i6) {
 i2 = i2 | 0;
 i6 = i6 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i3 = STACKTOP;
 i7 = i2 + 8 | 0;
 i9 = HEAP32[i7 >> 2] | 0;
 i5 = i9 + -16 | 0;
 i4 = i2 + 16 | 0;
 i12 = HEAP32[i4 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i10 = i9 + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i10 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i11 = -1001e3 - i6 | 0;
   i12 = HEAP32[i12 >> 2] | 0;
   if ((HEAP32[i12 + 8 >> 2] | 0) != 22 ? (i10 = HEAP32[i12 >> 2] | 0, (i11 | 0) <= (HEAPU8[i10 + 6 | 0] | 0 | 0)) : 0) {
    i10 = i10 + (i11 + -1 << 4) + 16 | 0;
   } else {
    i10 = 5192;
   }
  } else {
   i10 = (HEAP32[i12 >> 2] | 0) + (i6 << 4) | 0;
   i10 = i10 >>> 0 < i9 >>> 0 ? i10 : 5192;
  }
 } while (0);
 i13 = i5;
 i11 = HEAP32[i13 + 4 >> 2] | 0;
 i12 = i10;
 HEAP32[i12 >> 2] = HEAP32[i13 >> 2];
 HEAP32[i12 + 4 >> 2] = i11;
 i9 = i9 + -8 | 0;
 HEAP32[i10 + 8 >> 2] = HEAP32[i9 >> 2];
 if ((((i6 | 0) < -1001e3 ? (HEAP32[i9 >> 2] & 64 | 0) != 0 : 0) ? (i1 = HEAP32[i5 >> 2] | 0, !((HEAP8[i1 + 5 | 0] & 3) == 0)) : 0) ? (i8 = HEAP32[HEAP32[HEAP32[i4 >> 2] >> 2] >> 2] | 0, !((HEAP8[i8 + 5 | 0] & 4) == 0)) : 0) {
  _luaC_barrier_(i2, i8, i1);
 }
 HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + -16;
 STACKTOP = i3;
 return;
}
function _memchr(i4, i3, i6) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i7 = 0;
 i1 = STACKTOP;
 i2 = i3 & 255;
 i7 = (i6 | 0) == 0;
 L1 : do {
  if ((i4 & 3 | 0) == 0 | i7) {
   i5 = i6;
   i6 = 5;
  } else {
   i5 = i3 & 255;
   while (1) {
    if ((HEAP8[i4] | 0) == i5 << 24 >> 24) {
     i5 = i6;
     i6 = 6;
     break L1;
    }
    i4 = i4 + 1 | 0;
    i6 = i6 + -1 | 0;
    i7 = (i6 | 0) == 0;
    if ((i4 & 3 | 0) == 0 | i7) {
     i5 = i6;
     i6 = 5;
     break;
    }
   }
  }
 } while (0);
 if ((i6 | 0) == 5) {
  if (i7) {
   i5 = 0;
  } else {
   i6 = 6;
  }
 }
 L8 : do {
  if ((i6 | 0) == 6) {
   i3 = i3 & 255;
   if (!((HEAP8[i4] | 0) == i3 << 24 >> 24)) {
    i2 = Math_imul(i2, 16843009) | 0;
    L11 : do {
     if (i5 >>> 0 > 3) {
      do {
       i7 = HEAP32[i4 >> 2] ^ i2;
       if (((i7 & -2139062144 ^ -2139062144) & i7 + -16843009 | 0) != 0) {
        break L11;
       }
       i4 = i4 + 4 | 0;
       i5 = i5 + -4 | 0;
      } while (i5 >>> 0 > 3);
     }
    } while (0);
    if ((i5 | 0) == 0) {
     i5 = 0;
    } else {
     while (1) {
      if ((HEAP8[i4] | 0) == i3 << 24 >> 24) {
       break L8;
      }
      i4 = i4 + 1 | 0;
      i5 = i5 + -1 | 0;
      if ((i5 | 0) == 0) {
       i5 = 0;
       break;
      }
     }
    }
   }
  }
 } while (0);
 STACKTOP = i1;
 return ((i5 | 0) != 0 ? i4 : 0) | 0;
}
function _lua_insert(i2, i5) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i2 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i2 = i2 + 8 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if (i4 >>> 0 > i3 >>> 0) {
  while (1) {
   i5 = i4 + -16 | 0;
   i8 = i5;
   i7 = HEAP32[i8 + 4 >> 2] | 0;
   i6 = i4;
   HEAP32[i6 >> 2] = HEAP32[i8 >> 2];
   HEAP32[i6 + 4 >> 2] = i7;
   HEAP32[i4 + 8 >> 2] = HEAP32[i4 + -8 >> 2];
   if (i5 >>> 0 > i3 >>> 0) {
    i4 = i5;
   } else {
    break;
   }
  }
  i4 = HEAP32[i2 >> 2] | 0;
 }
 i6 = i4;
 i7 = HEAP32[i6 + 4 >> 2] | 0;
 i8 = i3;
 HEAP32[i8 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i8 + 4 >> 2] = i7;
 HEAP32[i3 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
 STACKTOP = i1;
 return;
}
function _findlocal(i6, i4, i1, i2) {
 i6 = i6 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i5 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 do {
  if ((HEAP8[i4 + 18 | 0] & 1) == 0) {
   i7 = (HEAP32[i4 >> 2] | 0) + 16 | 0;
   i5 = 7;
  } else {
   if ((i1 | 0) >= 0) {
    i8 = HEAP32[i4 + 24 >> 2] | 0;
    i7 = HEAP32[(HEAP32[HEAP32[i4 >> 2] >> 2] | 0) + 12 >> 2] | 0;
    i7 = _luaF_getlocalname(i7, i1, ((HEAP32[i4 + 28 >> 2] | 0) - (HEAP32[i7 + 12 >> 2] | 0) >> 2) + -1 | 0) | 0;
    if ((i7 | 0) == 0) {
     i7 = i8;
     i5 = 7;
     break;
    } else {
     break;
    }
   }
   i5 = HEAP32[i4 >> 2] | 0;
   i6 = HEAPU8[(HEAP32[(HEAP32[i5 >> 2] | 0) + 12 >> 2] | 0) + 76 | 0] | 0;
   if ((((HEAP32[i4 + 24 >> 2] | 0) - i5 >> 4) - i6 | 0) <= (0 - i1 | 0)) {
    i8 = 0;
    STACKTOP = i3;
    return i8 | 0;
   }
   HEAP32[i2 >> 2] = i5 + (i6 - i1 << 4);
   i8 = 2208;
   STACKTOP = i3;
   return i8 | 0;
  }
 } while (0);
 if ((i5 | 0) == 7) {
  if ((HEAP32[i6 + 16 >> 2] | 0) == (i4 | 0)) {
   i4 = i6 + 8 | 0;
  } else {
   i4 = HEAP32[i4 + 12 >> 2] | 0;
  }
  if (((HEAP32[i4 >> 2] | 0) - i7 >> 4 | 0) >= (i1 | 0) & (i1 | 0) > 0) {
   i8 = i7;
   i7 = 2192;
  } else {
   i8 = 0;
   STACKTOP = i3;
   return i8 | 0;
  }
 }
 HEAP32[i2 >> 2] = i8 + (i1 + -1 << 4);
 i8 = i7;
 STACKTOP = i3;
 return i8 | 0;
}
function _luaH_setint(i4, i5, i6, i1) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, d7 = 0.0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i8 = i2 + 16 | 0;
 i3 = i2;
 i9 = i6 + -1 | 0;
 L1 : do {
  if (i9 >>> 0 < (HEAP32[i5 + 28 >> 2] | 0) >>> 0) {
   i9 = (HEAP32[i5 + 12 >> 2] | 0) + (i9 << 4) | 0;
   i8 = 10;
  } else {
   d7 = +(i6 | 0);
   HEAPF64[i8 >> 3] = d7 + 1.0;
   i8 = (HEAP32[i8 + 4 >> 2] | 0) + (HEAP32[i8 >> 2] | 0) | 0;
   if ((i8 | 0) < 0) {
    i9 = 0 - i8 | 0;
    i8 = (i8 | 0) == (i9 | 0) ? 0 : i9;
   }
   i9 = (HEAP32[i5 + 16 >> 2] | 0) + (((i8 | 0) % ((1 << (HEAPU8[i5 + 7 | 0] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
   while (1) {
    if ((HEAP32[i9 + 24 >> 2] | 0) == 3 ? +HEAPF64[i9 + 16 >> 3] == d7 : 0) {
     break;
    }
    i9 = HEAP32[i9 + 28 >> 2] | 0;
    if ((i9 | 0) == 0) {
     i8 = 12;
     break L1;
    }
   }
   i8 = 10;
  }
 } while (0);
 if ((i8 | 0) == 10) {
  if ((i9 | 0) == 5192) {
   d7 = +(i6 | 0);
   i8 = 12;
  }
 }
 if ((i8 | 0) == 12) {
  HEAPF64[i3 >> 3] = d7;
  HEAP32[i3 + 8 >> 2] = 3;
  i9 = _luaH_newkey(i4, i5, i3) | 0;
 }
 i5 = i1;
 i6 = HEAP32[i5 + 4 >> 2] | 0;
 i8 = i9;
 HEAP32[i8 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i8 + 4 >> 2] = i6;
 HEAP32[i9 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
 STACKTOP = i2;
 return;
}
function _lua_tounsignedx(i6, i8, i1) {
 i6 = i6 | 0;
 i8 = i8 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i4 = i2 + 8 | 0;
 i3 = i2;
 i7 = HEAP32[i6 + 16 >> 2] | 0;
 do {
  if ((i8 | 0) <= 0) {
   if (!((i8 | 0) < -1000999)) {
    i5 = (HEAP32[i6 + 8 >> 2] | 0) + (i8 << 4) | 0;
    break;
   }
   if ((i8 | 0) == -1001e3) {
    i5 = (HEAP32[i6 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i8 | 0;
   i7 = HEAP32[i7 >> 2] | 0;
   if ((HEAP32[i7 + 8 >> 2] | 0) != 22 ? (i5 = HEAP32[i7 >> 2] | 0, (i6 | 0) <= (HEAPU8[i5 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i5 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i5 = (HEAP32[i7 >> 2] | 0) + (i8 << 4) | 0;
   i5 = i5 >>> 0 < (HEAP32[i6 + 8 >> 2] | 0) >>> 0 ? i5 : 5192;
  }
 } while (0);
 if ((HEAP32[i5 + 8 >> 2] | 0) != 3) {
  i5 = _luaV_tonumber(i5, i4) | 0;
  if ((i5 | 0) == 0) {
   if ((i1 | 0) == 0) {
    i8 = 0;
    STACKTOP = i2;
    return i8 | 0;
   }
   HEAP32[i1 >> 2] = 0;
   i8 = 0;
   STACKTOP = i2;
   return i8 | 0;
  }
 }
 HEAPF64[i3 >> 3] = +HEAPF64[i5 >> 3] + 6755399441055744.0;
 i3 = HEAP32[i3 >> 2] | 0;
 if ((i1 | 0) == 0) {
  i8 = i3;
  STACKTOP = i2;
  return i8 | 0;
 }
 HEAP32[i1 >> 2] = 1;
 i8 = i3;
 STACKTOP = i2;
 return i8 | 0;
}
function _luaC_freeallobjects(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i5 = i1 + 12 | 0;
 i3 = HEAP32[i5 >> 2] | 0;
 i7 = i3 + 104 | 0;
 while (1) {
  i4 = HEAP32[i7 >> 2] | 0;
  if ((i4 | 0) == 0) {
   break;
  } else {
   i7 = i4;
  }
 }
 i4 = i3 + 72 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 if ((i6 | 0) == 0) {
  i5 = i3;
 } else {
  while (1) {
   i8 = i6 + 5 | 0;
   HEAP8[i8] = HEAPU8[i8] | 0 | 8;
   HEAP32[i4 >> 2] = HEAP32[i6 >> 2];
   HEAP32[i6 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i7 >> 2] = i6;
   i7 = HEAP32[i4 >> 2] | 0;
   if ((i7 | 0) == 0) {
    break;
   } else {
    i8 = i6;
    i6 = i7;
    i7 = i8;
   }
  }
  i5 = HEAP32[i5 >> 2] | 0;
 }
 i5 = i5 + 104 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) != 0) {
  do {
   i8 = i6 + 5 | 0;
   HEAP8[i8] = HEAP8[i8] & 191;
   _GCTM(i1, 0);
   i6 = HEAP32[i5 >> 2] | 0;
  } while ((i6 | 0) != 0);
 }
 HEAP8[i3 + 60 | 0] = 3;
 HEAP8[i3 + 62 | 0] = 0;
 _sweeplist(i1, i4, -3) | 0;
 _sweeplist(i1, i3 + 68 | 0, -3) | 0;
 i4 = i3 + 32 | 0;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i2;
  return;
 }
 i3 = i3 + 24 | 0;
 i5 = 0;
 do {
  _sweeplist(i1, (HEAP32[i3 >> 2] | 0) + (i5 << 2) | 0, -3) | 0;
  i5 = i5 + 1 | 0;
 } while ((i5 | 0) < (HEAP32[i4 >> 2] | 0));
 STACKTOP = i2;
 return;
}
function _strspn(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i2;
 HEAP32[i3 + 0 >> 2] = 0;
 HEAP32[i3 + 4 >> 2] = 0;
 HEAP32[i3 + 8 >> 2] = 0;
 HEAP32[i3 + 12 >> 2] = 0;
 HEAP32[i3 + 16 >> 2] = 0;
 HEAP32[i3 + 20 >> 2] = 0;
 HEAP32[i3 + 24 >> 2] = 0;
 HEAP32[i3 + 28 >> 2] = 0;
 i4 = HEAP8[i5] | 0;
 if (i4 << 24 >> 24 == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 if ((HEAP8[i5 + 1 | 0] | 0) == 0) {
  i3 = i1;
  while (1) {
   if ((HEAP8[i3] | 0) == i4 << 24 >> 24) {
    i3 = i3 + 1 | 0;
   } else {
    break;
   }
  }
  i6 = i3 - i1 | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 do {
  i7 = i4 & 255;
  i6 = i3 + (i7 >>> 5 << 2) | 0;
  HEAP32[i6 >> 2] = HEAP32[i6 >> 2] | 1 << (i7 & 31);
  i5 = i5 + 1 | 0;
  i4 = HEAP8[i5] | 0;
 } while (!(i4 << 24 >> 24 == 0));
 i5 = HEAP8[i1] | 0;
 L12 : do {
  if (i5 << 24 >> 24 == 0) {
   i4 = i1;
  } else {
   i4 = i1;
   while (1) {
    i7 = i5 & 255;
    i6 = i4 + 1 | 0;
    if ((HEAP32[i3 + (i7 >>> 5 << 2) >> 2] & 1 << (i7 & 31) | 0) == 0) {
     break L12;
    }
    i5 = HEAP8[i6] | 0;
    if (i5 << 24 >> 24 == 0) {
     i4 = i6;
     break;
    } else {
     i4 = i6;
    }
   }
  }
 } while (0);
 i7 = i4 - i1 | 0;
 STACKTOP = i2;
 return i7 | 0;
}
function _lua_remove(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i5 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i3 = (HEAP32[i2 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i3 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i4 = -1001e3 - i4 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i5 >> 2] | 0, (i4 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i4 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i5 >> 2] | 0) + (i4 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i4 = i3 + 16 | 0;
 i2 = i2 + 8 | 0;
 i5 = HEAP32[i2 >> 2] | 0;
 if (!(i4 >>> 0 < i5 >>> 0)) {
  i5 = i5 + -16 | 0;
  HEAP32[i2 >> 2] = i5;
  STACKTOP = i1;
  return;
 }
 while (1) {
  i7 = i4;
  i6 = HEAP32[i7 + 4 >> 2] | 0;
  i5 = i3;
  HEAP32[i5 >> 2] = HEAP32[i7 >> 2];
  HEAP32[i5 + 4 >> 2] = i6;
  HEAP32[i3 + 8 >> 2] = HEAP32[i3 + 24 >> 2];
  i5 = i4 + 16 | 0;
  i3 = HEAP32[i2 >> 2] | 0;
  if (i5 >>> 0 < i3 >>> 0) {
   i3 = i4;
   i4 = i5;
  } else {
   break;
  }
 }
 i7 = i3 + -16 | 0;
 HEAP32[i2 >> 2] = i7;
 STACKTOP = i1;
 return;
}
function _luaD_protectedparser(i1, i4, i3, i2) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i13 = i5;
 i6 = i1 + 36 | 0;
 HEAP16[i6 >> 1] = (HEAP16[i6 >> 1] | 0) + 1 << 16 >> 16;
 HEAP32[i13 >> 2] = i4;
 HEAP32[i13 + 56 >> 2] = i3;
 HEAP32[i13 + 52 >> 2] = i2;
 i10 = i13 + 16 | 0;
 HEAP32[i10 >> 2] = 0;
 i9 = i13 + 24 | 0;
 HEAP32[i9 >> 2] = 0;
 i8 = i13 + 28 | 0;
 HEAP32[i8 >> 2] = 0;
 i7 = i13 + 36 | 0;
 HEAP32[i7 >> 2] = 0;
 i2 = i13 + 40 | 0;
 HEAP32[i2 >> 2] = 0;
 i3 = i13 + 48 | 0;
 HEAP32[i3 >> 2] = 0;
 i12 = i13 + 4 | 0;
 HEAP32[i12 >> 2] = 0;
 i11 = i13 + 12 | 0;
 HEAP32[i11 >> 2] = 0;
 i4 = _luaD_pcall(i1, 6, i13, (HEAP32[i1 + 8 >> 2] | 0) - (HEAP32[i1 + 28 >> 2] | 0) | 0, HEAP32[i1 + 68 >> 2] | 0) | 0;
 HEAP32[i12 >> 2] = _luaM_realloc_(i1, HEAP32[i12 >> 2] | 0, HEAP32[i11 >> 2] | 0, 0) | 0;
 HEAP32[i11 >> 2] = 0;
 _luaM_realloc_(i1, HEAP32[i10 >> 2] | 0, HEAP32[i9 >> 2] << 1, 0) | 0;
 _luaM_realloc_(i1, HEAP32[i8 >> 2] | 0, HEAP32[i7 >> 2] << 4, 0) | 0;
 _luaM_realloc_(i1, HEAP32[i2 >> 2] | 0, HEAP32[i3 >> 2] << 4, 0) | 0;
 HEAP16[i6 >> 1] = (HEAP16[i6 >> 1] | 0) + -1 << 16 >> 16;
 STACKTOP = i5;
 return i4 | 0;
}
function _markmt(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 252 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 256 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 260 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 264 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 268 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 272 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 276 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 280 >> 2] | 0;
 if ((i3 | 0) != 0 ? !((HEAP8[i3 + 5 | 0] & 3) == 0) : 0) {
  _reallymarkobject(i1, i3);
 }
 i3 = HEAP32[i1 + 284 >> 2] | 0;
 if ((i3 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP8[i3 + 5 | 0] & 3) == 0) {
  STACKTOP = i2;
  return;
 }
 _reallymarkobject(i1, i3);
 STACKTOP = i2;
 return;
}
function _findlabel(i9, i2) {
 i9 = i9 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i1 = STACKTOP;
 i3 = i9 + 48 | 0;
 i7 = HEAP32[(HEAP32[i3 >> 2] | 0) + 16 >> 2] | 0;
 i10 = HEAP32[i9 + 64 >> 2] | 0;
 i4 = HEAP32[i10 + 12 >> 2] | 0;
 i6 = i7 + 4 | 0;
 i13 = HEAP16[i6 >> 1] | 0;
 i5 = i10 + 28 | 0;
 if ((i13 | 0) >= (HEAP32[i5 >> 2] | 0)) {
  i15 = 0;
  STACKTOP = i1;
  return i15 | 0;
 }
 i10 = i10 + 24 | 0;
 i11 = i4 + (i2 << 4) | 0;
 while (1) {
  i14 = HEAP32[i10 >> 2] | 0;
  i12 = i14 + (i13 << 4) | 0;
  i15 = i13 + 1 | 0;
  if ((_luaS_eqstr(HEAP32[i12 >> 2] | 0, HEAP32[i11 >> 2] | 0) | 0) != 0) {
   break;
  }
  if ((i15 | 0) < (HEAP32[i5 >> 2] | 0)) {
   i13 = i15;
  } else {
   i2 = 0;
   i8 = 10;
   break;
  }
 }
 if ((i8 | 0) == 10) {
  STACKTOP = i1;
  return i2 | 0;
 }
 i8 = HEAP8[i14 + (i13 << 4) + 12 | 0] | 0;
 do {
  if ((HEAPU8[i4 + (i2 << 4) + 12 | 0] | 0) > (i8 & 255)) {
   if ((HEAP8[i7 + 9 | 0] | 0) == 0 ? (HEAP32[i5 >> 2] | 0) <= (HEAP16[i6 >> 1] | 0) : 0) {
    break;
   }
   _luaK_patchclose(HEAP32[i3 >> 2] | 0, HEAP32[i4 + (i2 << 4) + 4 >> 2] | 0, i8 & 255);
  }
 } while (0);
 _closegoto(i9, i2, i12);
 i15 = 1;
 STACKTOP = i1;
 return i15 | 0;
}
function _lua_getmetatable(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i4 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i4 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i4 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i3 = HEAP32[i4 + 8 >> 2] & 15;
 if ((i3 | 0) == 7) {
  i3 = HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] | 0;
 } else if ((i3 | 0) == 5) {
  i3 = HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] | 0;
 } else {
  i3 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + (i3 << 2) + 252 >> 2] | 0;
 }
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i2;
  return i5 | 0;
 }
 i5 = i1 + 8 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 HEAP32[i4 >> 2] = i3;
 HEAP32[i4 + 8 >> 2] = 69;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 16;
 i5 = 1;
 STACKTOP = i2;
 return i5 | 0;
}
function _str_byte(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i6 = i1;
 i4 = i1 + 4 | 0;
 i3 = _luaL_checklstring(i2, 1, i4) | 0;
 i5 = _luaL_optinteger(i2, 2, 1) | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 if (!((i5 | 0) > -1)) {
  if (i7 >>> 0 < (0 - i5 | 0) >>> 0) {
   i5 = 0;
  } else {
   i5 = i5 + 1 + i7 | 0;
  }
 }
 i8 = _luaL_optinteger(i2, 3, i5) | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 if (!((i8 | 0) > -1)) {
  if (i7 >>> 0 < (0 - i8 | 0) >>> 0) {
   i8 = 0;
  } else {
   i8 = i8 + 1 + i7 | 0;
  }
 }
 i9 = (i5 | 0) == 0 ? 1 : i5;
 i10 = i8 >>> 0 > i7 >>> 0 ? i7 : i8;
 if (i9 >>> 0 > i10 >>> 0) {
  i10 = 0;
  STACKTOP = i1;
  return i10 | 0;
 }
 i4 = i10 - i9 + 1 | 0;
 if ((i10 | 0) == -1) {
  i10 = _luaL_error(i2, 7944, i6) | 0;
  STACKTOP = i1;
  return i10 | 0;
 }
 _luaL_checkstack(i2, i4, 7944);
 if ((i4 | 0) <= 0) {
  i10 = i4;
  STACKTOP = i1;
  return i10 | 0;
 }
 i6 = i9 + -1 | 0;
 i8 = ~i8;
 i7 = ~i7;
 i5 = 0 - (i8 >>> 0 > i7 >>> 0 ? i8 : i7) - (i5 >>> 0 > 1 ? i5 : 1) | 0;
 i7 = 0;
 do {
  _lua_pushinteger(i2, HEAPU8[i3 + (i6 + i7) | 0] | 0);
  i7 = i7 + 1 | 0;
 } while ((i7 | 0) != (i5 | 0));
 STACKTOP = i1;
 return i4 | 0;
}
function _lua_setuservalue(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i3 = STACKTOP;
 i6 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i5 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i5 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i6 >> 2] | 0, (i5 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i5 = i4 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i5 = 5192;
   }
  } else {
   i4 = (HEAP32[i6 >> 2] | 0) + (i5 << 4) | 0;
   i5 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i4 = i1 + 8 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 if ((HEAP32[i6 + -8 >> 2] | 0) != 0) {
  HEAP32[(HEAP32[i5 >> 2] | 0) + 12 >> 2] = HEAP32[i6 + -16 >> 2];
  i6 = HEAP32[(HEAP32[i4 >> 2] | 0) + -16 >> 2] | 0;
  if (!((HEAP8[i6 + 5 | 0] & 3) == 0) ? (i2 = HEAP32[i5 >> 2] | 0, !((HEAP8[i2 + 5 | 0] & 4) == 0)) : 0) {
   _luaC_barrier_(i1, i2, i6);
  }
 } else {
  HEAP32[(HEAP32[i5 >> 2] | 0) + 12 >> 2] = 0;
 }
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -16;
 STACKTOP = i3;
 return;
}
function _f_luaopen(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i6;
 i4 = HEAP32[i1 + 12 >> 2] | 0;
 i2 = _luaM_realloc_(i1, 0, 0, 640) | 0;
 HEAP32[i1 + 28 >> 2] = i2;
 i3 = i1 + 32 | 0;
 HEAP32[i3 >> 2] = 40;
 i7 = 0;
 do {
  HEAP32[i2 + (i7 << 4) + 8 >> 2] = 0;
  i7 = i7 + 1 | 0;
 } while ((i7 | 0) != 40);
 HEAP32[i1 + 24 >> 2] = i2 + ((HEAP32[i3 >> 2] | 0) + -5 << 4);
 i7 = i1 + 72 | 0;
 HEAP32[i1 + 80 >> 2] = 0;
 HEAP32[i1 + 84 >> 2] = 0;
 HEAP8[i1 + 90 | 0] = 0;
 HEAP32[i7 >> 2] = i2;
 HEAP32[i1 + 8 >> 2] = i2 + 16;
 HEAP32[i2 + 8 >> 2] = 0;
 HEAP32[i1 + 76 >> 2] = i2 + 336;
 HEAP32[i1 + 16 >> 2] = i7;
 i7 = _luaH_new(i1) | 0;
 HEAP32[i4 + 40 >> 2] = i7;
 HEAP32[i4 + 48 >> 2] = 69;
 _luaH_resize(i1, i7, 2, 0);
 HEAP32[i5 >> 2] = i1;
 i3 = i5 + 8 | 0;
 HEAP32[i3 >> 2] = 72;
 _luaH_setint(i1, i7, 1, i5);
 HEAP32[i5 >> 2] = _luaH_new(i1) | 0;
 HEAP32[i3 >> 2] = 69;
 _luaH_setint(i1, i7, 2, i5);
 _luaS_resize(i1, 32);
 _luaT_init(i1);
 _luaX_init(i1);
 i7 = _luaS_newlstr(i1, 6896, 17) | 0;
 HEAP32[i4 + 180 >> 2] = i7;
 i7 = i7 + 5 | 0;
 HEAP8[i7] = HEAPU8[i7] | 0 | 32;
 HEAP8[i4 + 63 | 0] = 1;
 STACKTOP = i6;
 return;
}
function _lua_tointegerx(i6, i7, i1) {
 i6 = i6 | 0;
 i7 = i7 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i5 = HEAP32[i6 + 16 >> 2] | 0;
 do {
  if ((i7 | 0) <= 0) {
   if (!((i7 | 0) < -1000999)) {
    i4 = (HEAP32[i6 + 8 >> 2] | 0) + (i7 << 4) | 0;
    break;
   }
   if ((i7 | 0) == -1001e3) {
    i4 = (HEAP32[i6 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i7 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i7 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i6 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 if ((HEAP32[i4 + 8 >> 2] | 0) != 3) {
  i4 = _luaV_tonumber(i4, i3) | 0;
  if ((i4 | 0) == 0) {
   if ((i1 | 0) == 0) {
    i7 = 0;
    STACKTOP = i2;
    return i7 | 0;
   }
   HEAP32[i1 >> 2] = 0;
   i7 = 0;
   STACKTOP = i2;
   return i7 | 0;
  }
 }
 i3 = ~~+HEAPF64[i4 >> 3];
 if ((i1 | 0) == 0) {
  i7 = i3;
  STACKTOP = i2;
  return i7 | 0;
 }
 HEAP32[i1 >> 2] = 1;
 i7 = i3;
 STACKTOP = i2;
 return i7 | 0;
}
function _close_state(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 i6 = i1 + 12 | 0;
 i3 = HEAP32[i6 >> 2] | 0;
 i4 = i1 + 28 | 0;
 _luaF_close(i1, HEAP32[i4 >> 2] | 0);
 _luaC_freeallobjects(i1);
 i6 = HEAP32[i6 >> 2] | 0;
 _luaM_realloc_(i1, HEAP32[i6 + 24 >> 2] | 0, HEAP32[i6 + 32 >> 2] << 2, 0) | 0;
 i6 = i3 + 144 | 0;
 i5 = i3 + 152 | 0;
 HEAP32[i6 >> 2] = _luaM_realloc_(i1, HEAP32[i6 >> 2] | 0, HEAP32[i5 >> 2] | 0, 0) | 0;
 HEAP32[i5 >> 2] = 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 0) {
  i5 = HEAP32[i3 >> 2] | 0;
  i6 = i3 + 4 | 0;
  i6 = HEAP32[i6 >> 2] | 0;
  FUNCTION_TABLE_iiiii[i5 & 3](i6, i1, 400, 0) | 0;
  STACKTOP = i2;
  return;
 }
 HEAP32[i1 + 16 >> 2] = i1 + 72;
 i7 = i1 + 84 | 0;
 i6 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = 0;
 if ((i6 | 0) != 0) {
  while (1) {
   i5 = HEAP32[i6 + 12 >> 2] | 0;
   _luaM_realloc_(i1, i6, 40, 0) | 0;
   if ((i5 | 0) == 0) {
    break;
   } else {
    i6 = i5;
   }
  }
  i5 = HEAP32[i4 >> 2] | 0;
 }
 _luaM_realloc_(i1, i5, HEAP32[i1 + 32 >> 2] << 4, 0) | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i7 = i3 + 4 | 0;
 i7 = HEAP32[i7 >> 2] | 0;
 FUNCTION_TABLE_iiiii[i6 & 3](i7, i1, 400, 0) | 0;
 STACKTOP = i2;
 return;
}
function _ll_module(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i2;
 i5 = i2 + 4 | 0;
 i6 = _luaL_checklstring(i1, 1, 0) | 0;
 i3 = _lua_gettop(i1) | 0;
 _luaL_pushmodule(i1, i6, 1);
 _lua_getfield(i1, -1, 4728);
 i7 = (_lua_type(i1, -1) | 0) == 0;
 _lua_settop(i1, -2);
 if (i7) {
  _lua_pushvalue(i1, -1);
  _lua_setfield(i1, -2, 4784);
  _lua_pushstring(i1, i6) | 0;
  _lua_setfield(i1, -2, 4728);
  i7 = _strrchr(i6, 46) | 0;
  _lua_pushlstring(i1, i6, ((i7 | 0) == 0 ? i6 : i7 + 1 | 0) - i6 | 0) | 0;
  _lua_setfield(i1, -2, 4792);
 }
 _lua_pushvalue(i1, -1);
 if (!(((_lua_getstack(i1, 1, i5) | 0) != 0 ? (_lua_getinfo(i1, 4736, i5) | 0) != 0 : 0) ? (_lua_iscfunction(i1, -1) | 0) == 0 : 0)) {
  _luaL_error(i1, 4744, i4) | 0;
 }
 _lua_pushvalue(i1, -2);
 _lua_setupvalue(i1, -2, 1) | 0;
 _lua_settop(i1, -2);
 if ((i3 | 0) < 2) {
  STACKTOP = i2;
  return 1;
 } else {
  i4 = 2;
 }
 while (1) {
  if ((_lua_type(i1, i4) | 0) == 6) {
   _lua_pushvalue(i1, i4);
   _lua_pushvalue(i1, -2);
   _lua_callk(i1, 1, 0, 0, 0);
  }
  if ((i4 | 0) == (i3 | 0)) {
   break;
  } else {
   i4 = i4 + 1 | 0;
  }
 }
 STACKTOP = i2;
 return 1;
}
function _strcspn(i2, i5) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i1;
 i4 = HEAP8[i5] | 0;
 if (!(i4 << 24 >> 24 == 0) ? (HEAP8[i5 + 1 | 0] | 0) != 0 : 0) {
  HEAP32[i3 + 0 >> 2] = 0;
  HEAP32[i3 + 4 >> 2] = 0;
  HEAP32[i3 + 8 >> 2] = 0;
  HEAP32[i3 + 12 >> 2] = 0;
  HEAP32[i3 + 16 >> 2] = 0;
  HEAP32[i3 + 20 >> 2] = 0;
  HEAP32[i3 + 24 >> 2] = 0;
  HEAP32[i3 + 28 >> 2] = 0;
  do {
   i7 = i4 & 255;
   i6 = i3 + (i7 >>> 5 << 2) | 0;
   HEAP32[i6 >> 2] = HEAP32[i6 >> 2] | 1 << (i7 & 31);
   i5 = i5 + 1 | 0;
   i4 = HEAP8[i5] | 0;
  } while (!(i4 << 24 >> 24 == 0));
  i5 = HEAP8[i2] | 0;
  L7 : do {
   if (i5 << 24 >> 24 == 0) {
    i4 = i2;
   } else {
    i4 = i2;
    while (1) {
     i7 = i5 & 255;
     i6 = i4 + 1 | 0;
     if ((HEAP32[i3 + (i7 >>> 5 << 2) >> 2] & 1 << (i7 & 31) | 0) != 0) {
      break L7;
     }
     i5 = HEAP8[i6] | 0;
     if (i5 << 24 >> 24 == 0) {
      i4 = i6;
      break;
     } else {
      i4 = i6;
     }
    }
   }
  } while (0);
  i7 = i4 - i2 | 0;
  STACKTOP = i1;
  return i7 | 0;
 }
 i7 = (___strchrnul(i2, i4 << 24 >> 24) | 0) - i2 | 0;
 STACKTOP = i1;
 return i7 | 0;
}
function _main(i4, i5) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 i3 = _luaL_newstate() | 0;
 if ((i3 | 0) == 0) {
  i4 = HEAP32[i5 >> 2] | 0;
  i3 = HEAP32[_stderr >> 2] | 0;
  if ((i4 | 0) != 0) {
   HEAP32[i2 >> 2] = i4;
   _fprintf(i3 | 0, 496, i2 | 0) | 0;
   _fflush(i3 | 0) | 0;
  }
  HEAP32[i2 >> 2] = 8;
  _fprintf(i3 | 0, 912, i2 | 0) | 0;
  _fflush(i3 | 0) | 0;
  i8 = 1;
  STACKTOP = i1;
  return i8 | 0;
 }
 _lua_pushcclosure(i3, 141, 0);
 _lua_pushinteger(i3, i4);
 _lua_pushlightuserdata(i3, i5);
 i6 = _lua_pcallk(i3, 2, 1, 0, 0, 0) | 0;
 i7 = _lua_toboolean(i3, -1) | 0;
 i6 = (i6 | 0) == 0;
 if (!i6) {
  if ((_lua_type(i3, -1) | 0) == 4) {
   i8 = _lua_tolstring(i3, -1, 0) | 0;
  } else {
   i8 = 0;
  }
  i4 = HEAP32[20] | 0;
  i5 = HEAP32[_stderr >> 2] | 0;
  if ((i4 | 0) != 0) {
   HEAP32[i2 >> 2] = i4;
   _fprintf(i5 | 0, 496, i2 | 0) | 0;
   _fflush(i5 | 0) | 0;
  }
  HEAP32[i2 >> 2] = (i8 | 0) == 0 ? 48 : i8;
  _fprintf(i5 | 0, 912, i2 | 0) | 0;
  _fflush(i5 | 0) | 0;
  _lua_settop(i3, -2);
 }
 _lua_close(i3);
 i8 = i6 & (i7 | 0) != 0 & 1 ^ 1;
 STACKTOP = i1;
 return i8 | 0;
}
function _db_sethook(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i4 = STACKTOP;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i2 = _lua_tothread(i1, 1) | 0;
  i5 = 1;
 } else {
  i2 = i1;
  i5 = 0;
 }
 i3 = i5 + 1 | 0;
 if ((_lua_type(i1, i3) | 0) < 1) {
  _lua_settop(i1, i3);
  i6 = 0;
  i7 = 0;
  i5 = 0;
 } else {
  i6 = _luaL_checklstring(i1, i5 | 2, 0) | 0;
  _luaL_checktype(i1, i3, 6);
  i5 = _luaL_optinteger(i1, i5 + 3 | 0, 0) | 0;
  i7 = (_strchr(i6, 99) | 0) != 0 | 0;
  i8 = (_strchr(i6, 114) | 0) == 0;
  i7 = i8 ? i7 : i7 | 2;
  i8 = (_strchr(i6, 108) | 0) == 0;
  i8 = i8 ? i7 : i7 | 4;
  i6 = i5;
  i7 = 9;
  i5 = (i5 | 0) > 0 ? i8 | 8 : i8;
 }
 if ((_luaL_getsubtable(i1, -1001e3, 11584) | 0) != 0) {
  _lua_pushthread(i2) | 0;
  _lua_xmove(i2, i1, 1);
  _lua_pushvalue(i1, i3);
  _lua_rawset(i1, -3);
  _lua_sethook(i2, i7, i5, i6) | 0;
  STACKTOP = i4;
  return 0;
 }
 _lua_pushstring(i1, 11592) | 0;
 _lua_setfield(i1, -2, 11600);
 _lua_pushvalue(i1, -1);
 _lua_setmetatable(i1, -2) | 0;
 _lua_pushthread(i2) | 0;
 _lua_xmove(i2, i1, 1);
 _lua_pushvalue(i1, i3);
 _lua_rawset(i1, -3);
 _lua_sethook(i2, i7, i5, i6) | 0;
 STACKTOP = i4;
 return 0;
}
function _tconcat(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i6 = i3;
 i2 = i3 + 16 | 0;
 i5 = i3 + 8 | 0;
 i4 = _luaL_optlstring(i1, 2, 8208, i5) | 0;
 _luaL_checktype(i1, 1, 5);
 i8 = _luaL_optinteger(i1, 3, 1) | 0;
 if ((_lua_type(i1, 4) | 0) < 1) {
  i7 = _luaL_len(i1, 1) | 0;
 } else {
  i7 = _luaL_checkinteger(i1, 4) | 0;
 }
 _luaL_buffinit(i1, i2);
 if ((i8 | 0) >= (i7 | 0)) {
  if ((i8 | 0) != (i7 | 0)) {
   _luaL_pushresult(i2);
   STACKTOP = i3;
   return 1;
  }
 } else {
  do {
   _lua_rawgeti(i1, 1, i8);
   if ((_lua_isstring(i1, -1) | 0) == 0) {
    HEAP32[i6 >> 2] = _lua_typename(i1, _lua_type(i1, -1) | 0) | 0;
    HEAP32[i6 + 4 >> 2] = i8;
    _luaL_error(i1, 8360, i6) | 0;
   }
   _luaL_addvalue(i2);
   _luaL_addlstring(i2, i4, HEAP32[i5 >> 2] | 0);
   i8 = i8 + 1 | 0;
  } while ((i8 | 0) != (i7 | 0));
 }
 _lua_rawgeti(i1, 1, i7);
 if ((_lua_isstring(i1, -1) | 0) == 0) {
  HEAP32[i6 >> 2] = _lua_typename(i1, _lua_type(i1, -1) | 0) | 0;
  HEAP32[i6 + 4 >> 2] = i7;
  _luaL_error(i1, 8360, i6) | 0;
 }
 _luaL_addvalue(i2);
 _luaL_pushresult(i2);
 STACKTOP = i3;
 return 1;
}
function _searcher_Croot(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i4 = _luaL_checklstring(i1, 1, 0) | 0;
 i5 = _strchr(i4, 46) | 0;
 if ((i5 | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 _lua_pushlstring(i1, i4, i5 - i4 | 0) | 0;
 i5 = _lua_tolstring(i1, -1, 0) | 0;
 _lua_getfield(i1, -1001001, 4440);
 i6 = _lua_tolstring(i1, -1, 0) | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i3 >> 2] = 4440;
  _luaL_error(i1, 5032, i3) | 0;
 }
 i5 = _searchpath(i1, i5, i6, 4936, 4848) | 0;
 if ((i5 | 0) == 0) {
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 }
 i6 = _loadfunc(i1, i5, i4) | 0;
 if ((i6 | 0) == 2) {
  HEAP32[i3 >> 2] = i4;
  HEAP32[i3 + 4 >> 2] = i5;
  _lua_pushfstring(i1, 4856, i3) | 0;
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 } else if ((i6 | 0) == 0) {
  _lua_pushstring(i1, i5) | 0;
  i6 = 2;
  STACKTOP = i2;
  return i6 | 0;
 } else {
  i4 = _lua_tolstring(i1, 1, 0) | 0;
  i6 = _lua_tolstring(i1, -1, 0) | 0;
  HEAP32[i3 >> 2] = i4;
  HEAP32[i3 + 4 >> 2] = i5;
  HEAP32[i3 + 8 >> 2] = i6;
  i6 = _luaL_error(i1, 4888, i3) | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 return 0;
}
function _lua_tonumberx(i5, i7, i1) {
 i5 = i5 | 0;
 i7 = i7 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, d8 = 0.0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i6 = HEAP32[i5 + 16 >> 2] | 0;
 do {
  if ((i7 | 0) <= 0) {
   if (!((i7 | 0) < -1000999)) {
    i4 = (HEAP32[i5 + 8 >> 2] | 0) + (i7 << 4) | 0;
    break;
   }
   if ((i7 | 0) == -1001e3) {
    i4 = (HEAP32[i5 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i7 | 0;
   i6 = HEAP32[i6 >> 2] | 0;
   if ((HEAP32[i6 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i6 >> 2] | 0, (i5 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i6 >> 2] | 0) + (i7 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i5 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 if ((HEAP32[i4 + 8 >> 2] | 0) != 3) {
  i4 = _luaV_tonumber(i4, i3) | 0;
  if ((i4 | 0) == 0) {
   if ((i1 | 0) == 0) {
    d8 = 0.0;
    STACKTOP = i2;
    return +d8;
   }
   HEAP32[i1 >> 2] = 0;
   d8 = 0.0;
   STACKTOP = i2;
   return +d8;
  }
 }
 if ((i1 | 0) != 0) {
  HEAP32[i1 >> 2] = 1;
 }
 d8 = +HEAPF64[i4 >> 3];
 STACKTOP = i2;
 return +d8;
}
function _luaopen_package(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_getsubtable(i1, -1001e3, 4184) | 0;
 _lua_createtable(i1, 0, 1);
 _lua_pushcclosure(i1, 158, 0);
 _lua_setfield(i1, -2, 4192);
 _lua_setmetatable(i1, -2) | 0;
 _lua_createtable(i1, 0, 3);
 _luaL_setfuncs(i1, 4200, 0);
 _lua_createtable(i1, 4, 0);
 _lua_pushvalue(i1, -2);
 _lua_pushcclosure(i1, 159, 1);
 _lua_rawseti(i1, -2, 1);
 _lua_pushvalue(i1, -2);
 _lua_pushcclosure(i1, 160, 1);
 _lua_rawseti(i1, -2, 2);
 _lua_pushvalue(i1, -2);
 _lua_pushcclosure(i1, 161, 1);
 _lua_rawseti(i1, -2, 3);
 _lua_pushvalue(i1, -2);
 _lua_pushcclosure(i1, 162, 1);
 _lua_rawseti(i1, -2, 4);
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -3, 4232);
 _lua_setfield(i1, -2, 4240);
 _setpath(i1, 4256, 4264, 4280, 4296);
 _setpath(i1, 4440, 4448, 4464, 4480);
 _lua_pushlstring(i1, 4552, 10) | 0;
 _lua_setfield(i1, -2, 4568);
 _luaL_getsubtable(i1, -1001e3, 4576) | 0;
 _lua_setfield(i1, -2, 4584);
 _luaL_getsubtable(i1, -1001e3, 4592) | 0;
 _lua_setfield(i1, -2, 4608);
 _lua_rawgeti(i1, -1001e3, 2);
 _lua_pushvalue(i1, -2);
 _luaL_setfuncs(i1, 4616, 1);
 _lua_settop(i1, -2);
 STACKTOP = i2;
 return 1;
}
function _lua_rawlen(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i2 = (HEAP32[i3 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i2 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i3 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
    i2 = i2 + (i3 + -1 << 4) + 16 | 0;
   } else {
    i2 = 5192;
   }
  } else {
   i2 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i2 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
  }
 } while (0);
 i3 = HEAP32[i2 + 8 >> 2] & 15;
 if ((i3 | 0) == 5) {
  i5 = _luaH_getn(HEAP32[i2 >> 2] | 0) | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else if ((i3 | 0) == 4) {
  i5 = HEAP32[(HEAP32[i2 >> 2] | 0) + 12 >> 2] | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else if ((i3 | 0) == 7) {
  i5 = HEAP32[(HEAP32[i2 >> 2] | 0) + 16 >> 2] | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else {
  i5 = 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 return 0;
}
function _searchpath(i3, i5, i6, i7, i8) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 i7 = i7 | 0;
 i8 = i8 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i4 = i2;
 i1 = i2 + 8 | 0;
 _luaL_buffinit(i3, i1);
 if ((HEAP8[i7] | 0) != 0) {
  i5 = _luaL_gsub(i3, i5, i7, i8) | 0;
 }
 while (1) {
  i7 = HEAP8[i6] | 0;
  if (i7 << 24 >> 24 == 59) {
   i6 = i6 + 1 | 0;
   continue;
  } else if (i7 << 24 >> 24 == 0) {
   i3 = 12;
   break;
  }
  i8 = _strchr(i6, 59) | 0;
  if ((i8 | 0) == 0) {
   i8 = i6 + (_strlen(i6 | 0) | 0) | 0;
  }
  _lua_pushlstring(i3, i6, i8 - i6 | 0) | 0;
  if ((i8 | 0) == 0) {
   i3 = 12;
   break;
  }
  i6 = _luaL_gsub(i3, _lua_tolstring(i3, -1, 0) | 0, 5064, i5) | 0;
  _lua_remove(i3, -2);
  i7 = _fopen(i6 | 0, 5088) | 0;
  if ((i7 | 0) != 0) {
   i3 = 10;
   break;
  }
  HEAP32[i4 >> 2] = i6;
  _lua_pushfstring(i3, 5072, i4) | 0;
  _lua_remove(i3, -2);
  _luaL_addvalue(i1);
  i6 = i8;
 }
 if ((i3 | 0) == 10) {
  _fclose(i7 | 0) | 0;
  i8 = i6;
  STACKTOP = i2;
  return i8 | 0;
 } else if ((i3 | 0) == 12) {
  _luaL_pushresult(i1);
  i8 = 0;
  STACKTOP = i2;
  return i8 | 0;
 }
 return 0;
}
function _io_readline(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i4 = _lua_touserdata(i1, -1001001) | 0;
 i5 = _lua_tointegerx(i1, -1001002, 0) | 0;
 if ((HEAP32[i4 + 4 >> 2] | 0) == 0) {
  i6 = _luaL_error(i1, 3344, i3) | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 _lua_settop(i1, 1);
 if ((i5 | 0) >= 1) {
  i6 = 1;
  while (1) {
   _lua_pushvalue(i1, -1001003 - i6 | 0);
   if ((i6 | 0) == (i5 | 0)) {
    break;
   } else {
    i6 = i6 + 1 | 0;
   }
  }
 }
 i4 = _g_read(i1, HEAP32[i4 >> 2] | 0, 2) | 0;
 if ((_lua_type(i1, 0 - i4 | 0) | 0) != 0) {
  i6 = i4;
  STACKTOP = i2;
  return i6 | 0;
 }
 if ((i4 | 0) > 1) {
  HEAP32[i3 >> 2] = _lua_tolstring(i1, 1 - i4 | 0, 0) | 0;
  i6 = _luaL_error(i1, 3368, i3) | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 if ((_lua_toboolean(i1, -1001003) | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 _lua_settop(i1, 0);
 _lua_pushvalue(i1, -1001001);
 i5 = (_luaL_checkudata(i1, 1, 2832) | 0) + 4 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = 0;
 FUNCTION_TABLE_ii[i6 & 255](i1) | 0;
 i6 = 0;
 STACKTOP = i2;
 return i6 | 0;
}
function _luaK_setreturns(i3, i5, i6) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i5 >> 2] | 0;
 if ((i4 | 0) == 13) {
  i7 = i5 + 8 | 0;
  i8 = HEAP32[i3 >> 2] | 0;
  i4 = HEAP32[i8 + 12 >> 2] | 0;
  i5 = i4 + (HEAP32[i7 >> 2] << 2) | 0;
  HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & 8388607 | (i6 << 23) + 8388608;
  i7 = i4 + (HEAP32[i7 >> 2] << 2) | 0;
  i4 = i3 + 48 | 0;
  HEAP32[i7 >> 2] = (HEAPU8[i4] | 0) << 6 | HEAP32[i7 >> 2] & -16321;
  i7 = HEAP8[i4] | 0;
  i5 = (i7 & 255) + 1 | 0;
  i6 = i8 + 78 | 0;
  do {
   if (i5 >>> 0 > (HEAPU8[i6] | 0) >>> 0) {
    if (i5 >>> 0 > 249) {
     _luaX_syntaxerror(HEAP32[i3 + 12 >> 2] | 0, 10536);
    } else {
     HEAP8[i6] = i5;
     i1 = HEAP8[i4] | 0;
     break;
    }
   } else {
    i1 = i7;
   }
  } while (0);
  HEAP8[i4] = (i1 & 255) + 1;
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 12) {
  i8 = (HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i5 + 8 >> 2] << 2) | 0;
  HEAP32[i8 >> 2] = HEAP32[i8 >> 2] & -8372225 | (i6 << 14) + 16384 & 8372224;
  STACKTOP = i2;
  return;
 } else {
  STACKTOP = i2;
  return;
 }
}
function _luaZ_read(i2, i9, i8) {
 i2 = i2 | 0;
 i9 = i9 | 0;
 i8 = i8 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 if ((i8 | 0) == 0) {
  i11 = 0;
  STACKTOP = i1;
  return i11 | 0;
 }
 i7 = i2 + 16 | 0;
 i6 = i2 + 8 | 0;
 i4 = i2 + 12 | 0;
 i5 = i2 + 4 | 0;
 i11 = HEAP32[i2 >> 2] | 0;
 while (1) {
  if ((i11 | 0) == 0) {
   i10 = FUNCTION_TABLE_iiii[HEAP32[i6 >> 2] & 3](HEAP32[i7 >> 2] | 0, HEAP32[i4 >> 2] | 0, i3) | 0;
   if ((i10 | 0) == 0) {
    i2 = 9;
    break;
   }
   i11 = HEAP32[i3 >> 2] | 0;
   if ((i11 | 0) == 0) {
    i2 = 9;
    break;
   }
   HEAP32[i2 >> 2] = i11;
   HEAP32[i5 >> 2] = i10;
  } else {
   i10 = HEAP32[i5 >> 2] | 0;
  }
  i11 = i8 >>> 0 > i11 >>> 0 ? i11 : i8;
  _memcpy(i9 | 0, i10 | 0, i11 | 0) | 0;
  i10 = (HEAP32[i2 >> 2] | 0) - i11 | 0;
  HEAP32[i2 >> 2] = i10;
  HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + i11;
  if ((i8 | 0) == (i11 | 0)) {
   i8 = 0;
   i2 = 9;
   break;
  } else {
   i8 = i8 - i11 | 0;
   i9 = i9 + i11 | 0;
   i11 = i10;
  }
 }
 if ((i2 | 0) == 9) {
  STACKTOP = i1;
  return i8 | 0;
 }
 return 0;
}
function _lua_load(i1, i5, i4, i3, i6) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i2 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i7 = i2;
 _luaZ_init(i1, i7, i5, i4);
 i3 = _luaD_protectedparser(i1, i7, (i3 | 0) == 0 ? 928 : i3, i6) | 0;
 if ((i3 | 0) != 0) {
  STACKTOP = i2;
  return i3 | 0;
 }
 i4 = HEAP32[(HEAP32[i1 + 8 >> 2] | 0) + -16 >> 2] | 0;
 if ((HEAP8[i4 + 6 | 0] | 0) != 1) {
  STACKTOP = i2;
  return i3 | 0;
 }
 i5 = _luaH_getint(HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 40 >> 2] | 0, 2) | 0;
 i4 = i4 + 16 | 0;
 i6 = HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] | 0;
 i9 = i5;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i6;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 i7 = i5 + 8 | 0;
 HEAP32[i6 + 8 >> 2] = HEAP32[i7 >> 2];
 if ((HEAP32[i7 >> 2] & 64 | 0) == 0) {
  STACKTOP = i2;
  return i3 | 0;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 if ((HEAP8[i5 + 5 | 0] & 3) == 0) {
  STACKTOP = i2;
  return i3 | 0;
 }
 i4 = HEAP32[i4 >> 2] | 0;
 if ((HEAP8[i4 + 5 | 0] & 4) == 0) {
  STACKTOP = i2;
  return i3 | 0;
 }
 _luaC_barrier_(i1, i4, i5);
 STACKTOP = i2;
 return i3 | 0;
}
function _g_write(i1, i4, i8) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i8 = i8 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i9 = 0, d10 = 0.0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i5;
 i3 = i5 + 8 | 0;
 i7 = _lua_gettop(i1) | 0;
 if ((i7 | 0) == (i8 | 0)) {
  i9 = 1;
  STACKTOP = i5;
  return i9 | 0;
 }
 i6 = i8;
 i7 = i7 - i8 | 0;
 i9 = 1;
 while (1) {
  i7 = i7 + -1 | 0;
  if ((_lua_type(i1, i6) | 0) == 3) {
   if ((i9 | 0) == 0) {
    i8 = 0;
   } else {
    d10 = +_lua_tonumberx(i1, i6, 0);
    HEAPF64[tempDoublePtr >> 3] = d10;
    HEAP32[i2 >> 2] = HEAP32[tempDoublePtr >> 2];
    HEAP32[i2 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
    i8 = (_fprintf(i4 | 0, 3072, i2 | 0) | 0) > 0;
   }
  } else {
   i8 = _luaL_checklstring(i1, i6, i3) | 0;
   if ((i9 | 0) == 0) {
    i8 = 0;
   } else {
    i8 = _fwrite(i8 | 0, 1, HEAP32[i3 >> 2] | 0, i4 | 0) | 0;
    i8 = (i8 | 0) == (HEAP32[i3 >> 2] | 0);
   }
  }
  if ((i7 | 0) == 0) {
   break;
  } else {
   i6 = i6 + 1 | 0;
   i9 = i8 & 1;
  }
 }
 if (i8) {
  i9 = 1;
  STACKTOP = i5;
  return i9 | 0;
 }
 i9 = _luaL_fileresult(i1, 0, 0) | 0;
 STACKTOP = i5;
 return i9 | 0;
}
function _lua_getuservalue(i2, i5) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i2 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i3 = HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0;
 i2 = i2 + 8 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((i3 | 0) == 0) {
  HEAP32[i4 + 8 >> 2] = 0;
  i5 = i4;
  i5 = i5 + 16 | 0;
  HEAP32[i2 >> 2] = i5;
  STACKTOP = i1;
  return;
 } else {
  HEAP32[i4 >> 2] = i3;
  HEAP32[i4 + 8 >> 2] = 69;
  i5 = HEAP32[i2 >> 2] | 0;
  i5 = i5 + 16 | 0;
  HEAP32[i2 >> 2] = i5;
  STACKTOP = i1;
  return;
 }
}
function _luaL_addlstring(i7, i6, i1) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i8 = 0, i9 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = HEAP32[i7 + 12 >> 2] | 0;
 i3 = i7 + 4 | 0;
 i9 = HEAP32[i3 >> 2] | 0;
 i2 = i7 + 8 | 0;
 i8 = HEAP32[i2 >> 2] | 0;
 if (!((i9 - i8 | 0) >>> 0 < i1 >>> 0)) {
  i7 = HEAP32[i7 >> 2] | 0;
  i9 = i8;
  i9 = i7 + i9 | 0;
  _memcpy(i9 | 0, i6 | 0, i1 | 0) | 0;
  i9 = HEAP32[i2 >> 2] | 0;
  i9 = i9 + i1 | 0;
  HEAP32[i2 >> 2] = i9;
  STACKTOP = i5;
  return;
 }
 i9 = i9 << 1;
 i9 = (i9 - i8 | 0) >>> 0 < i1 >>> 0 ? i8 + i1 | 0 : i9;
 if (i9 >>> 0 < i8 >>> 0 | (i9 - i8 | 0) >>> 0 < i1 >>> 0) {
  _luaL_error(i4, 1272, i5) | 0;
 }
 i8 = _lua_newuserdata(i4, i9) | 0;
 _memcpy(i8 | 0, HEAP32[i7 >> 2] | 0, HEAP32[i2 >> 2] | 0) | 0;
 if ((HEAP32[i7 >> 2] | 0) != (i7 + 16 | 0)) {
  _lua_remove(i4, -2);
 }
 HEAP32[i7 >> 2] = i8;
 HEAP32[i3 >> 2] = i9;
 i9 = HEAP32[i2 >> 2] | 0;
 i9 = i8 + i9 | 0;
 _memcpy(i9 | 0, i6 | 0, i1 | 0) | 0;
 i9 = HEAP32[i2 >> 2] | 0;
 i9 = i9 + i1 | 0;
 HEAP32[i2 >> 2] = i9;
 STACKTOP = i5;
 return;
}
function _lua_rawgeti(i3, i6, i1) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i7 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i4 = (HEAP32[i3 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i4 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i4 = _luaH_getint(HEAP32[i4 >> 2] | 0, i1) | 0;
 i6 = i3 + 8 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 i7 = i4;
 i1 = HEAP32[i7 + 4 >> 2] | 0;
 i3 = i5;
 HEAP32[i3 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i3 + 4 >> 2] = i1;
 HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 16;
 STACKTOP = i2;
 return;
}
function _lua_setfield(i1, i6, i3) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i4 = (HEAP32[i1 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i4 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i6 = i1 + 8 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i5 + 16;
 i3 = _luaS_new(i1, i3) | 0;
 HEAP32[i5 >> 2] = i3;
 HEAP32[i5 + 8 >> 2] = HEAPU8[i3 + 4 | 0] | 0 | 64;
 i5 = HEAP32[i6 >> 2] | 0;
 _luaV_settable(i1, i4, i5 + -16 | 0, i5 + -32 | 0);
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + -32;
 STACKTOP = i2;
 return;
}
function _luaopen_io(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 11);
 _luaL_setfuncs(i1, 2680, 0);
 _luaL_newmetatable(i1, 2832) | 0;
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -2, 2872);
 _luaL_setfuncs(i1, 2880, 0);
 _lua_settop(i1, -2);
 i5 = HEAP32[_stdin >> 2] | 0;
 i4 = _lua_newuserdata(i1, 8) | 0;
 i3 = i4 + 4 | 0;
 HEAP32[i3 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 HEAP32[i4 >> 2] = i5;
 HEAP32[i3 >> 2] = 154;
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -1001e3, 2776);
 _lua_setfield(i1, -2, 2792);
 i3 = HEAP32[_stdout >> 2] | 0;
 i4 = _lua_newuserdata(i1, 8) | 0;
 i5 = i4 + 4 | 0;
 HEAP32[i5 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 HEAP32[i4 >> 2] = i3;
 HEAP32[i5 >> 2] = 154;
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -1001e3, 2800);
 _lua_setfield(i1, -2, 2816);
 i5 = HEAP32[_stderr >> 2] | 0;
 i4 = _lua_newuserdata(i1, 8) | 0;
 i3 = i4 + 4 | 0;
 HEAP32[i3 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 HEAP32[i4 >> 2] = i5;
 HEAP32[i3 >> 2] = 154;
 _lua_setfield(i1, -2, 2824);
 STACKTOP = i2;
 return 1;
}
function _lua_pushcclosure(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 if ((i5 | 0) == 0) {
  i6 = HEAP32[i1 + 8 >> 2] | 0;
  HEAP32[i6 >> 2] = i4;
  HEAP32[i6 + 8 >> 2] = 22;
  i6 = i1 + 8 | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  i5 = i5 + 16 | 0;
  HEAP32[i6 >> 2] = i5;
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i3 = _luaF_newCclosure(i1, i5) | 0;
 HEAP32[i3 + 12 >> 2] = i4;
 i4 = i1 + 8 | 0;
 i6 = (HEAP32[i4 >> 2] | 0) + (0 - i5 << 4) | 0;
 HEAP32[i4 >> 2] = i6;
 do {
  i5 = i5 + -1 | 0;
  i9 = i6 + (i5 << 4) | 0;
  i8 = HEAP32[i9 + 4 >> 2] | 0;
  i7 = i3 + (i5 << 4) + 16 | 0;
  HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
  HEAP32[i7 + 4 >> 2] = i8;
  HEAP32[i3 + (i5 << 4) + 24 >> 2] = HEAP32[i6 + (i5 << 4) + 8 >> 2];
  i6 = HEAP32[i4 >> 2] | 0;
 } while ((i5 | 0) != 0);
 HEAP32[i6 >> 2] = i3;
 HEAP32[i6 + 8 >> 2] = 102;
 i9 = i1 + 8 | 0;
 i8 = HEAP32[i9 >> 2] | 0;
 i8 = i8 + 16 | 0;
 HEAP32[i9 >> 2] = i8;
 STACKTOP = i2;
 return;
}
function _luaF_findupval(i3, i4) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i2 = HEAP32[i3 + 12 >> 2] | 0;
 i6 = i3 + 56 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 L1 : do {
  if ((i5 | 0) == 0) {
   i5 = i6;
  } else {
   while (1) {
    i7 = HEAP32[i5 + 8 >> 2] | 0;
    if (i7 >>> 0 < i4 >>> 0) {
     i5 = i6;
     break L1;
    }
    if ((i7 | 0) == (i4 | 0)) {
     break;
    }
    i6 = HEAP32[i5 >> 2] | 0;
    if ((i6 | 0) == 0) {
     break L1;
    } else {
     i7 = i5;
     i5 = i6;
     i6 = i7;
    }
   }
   i4 = i5 + 5 | 0;
   i3 = (HEAPU8[i4] | 0) ^ 3;
   if ((((HEAPU8[i2 + 60 | 0] | 0) ^ 3) & i3 | 0) != 0) {
    i7 = i5;
    STACKTOP = i1;
    return i7 | 0;
   }
   HEAP8[i4] = i3;
   i7 = i5;
   STACKTOP = i1;
   return i7 | 0;
  }
 } while (0);
 i7 = _luaC_newobj(i3, 10, 32, i5, 0) | 0;
 HEAP32[i7 + 8 >> 2] = i4;
 i4 = i7 + 16 | 0;
 HEAP32[i4 >> 2] = i2 + 112;
 i6 = i2 + 132 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 HEAP32[i4 + 4 >> 2] = i5;
 HEAP32[i5 + 16 >> 2] = i7;
 HEAP32[i6 >> 2] = i7;
 STACKTOP = i1;
 return i7 | 0;
}
function _luaC_checkfinalizer(i5, i4, i6) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 i1 = HEAP32[i5 + 12 >> 2] | 0;
 i2 = i4 + 5 | 0;
 if ((HEAP8[i2] & 24) != 0 | (i6 | 0) == 0) {
  STACKTOP = i3;
  return;
 }
 if (!((HEAP8[i6 + 6 | 0] & 4) == 0)) {
  STACKTOP = i3;
  return;
 }
 if ((_luaT_gettm(i6, 2, HEAP32[i1 + 192 >> 2] | 0) | 0) == 0) {
  STACKTOP = i3;
  return;
 }
 i7 = i1 + 76 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 | 0) == (i4 | 0)) {
  do {
   i6 = _sweeplist(i5, i8, 1) | 0;
  } while ((i6 | 0) == (i8 | 0));
  HEAP32[i7 >> 2] = i6;
 }
 i5 = i1 + 68 | 0;
 while (1) {
  i6 = HEAP32[i5 >> 2] | 0;
  if ((i6 | 0) == (i4 | 0)) {
   break;
  } else {
   i5 = i6;
  }
 }
 HEAP32[i5 >> 2] = HEAP32[i4 >> 2];
 i8 = i1 + 72 | 0;
 HEAP32[i4 >> 2] = HEAP32[i8 >> 2];
 HEAP32[i8 >> 2] = i4;
 i4 = HEAPU8[i2] | 0 | 16;
 HEAP8[i2] = i4;
 if ((HEAPU8[i1 + 61 | 0] | 0) < 2) {
  HEAP8[i2] = i4 & 191;
  STACKTOP = i3;
  return;
 } else {
  HEAP8[i2] = HEAP8[i1 + 60 | 0] & 3 | i4 & 184;
  STACKTOP = i3;
  return;
 }
}
function _io_lines(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((_lua_type(i1, 1) | 0) == -1) {
  _lua_pushnil(i1);
 }
 if ((_lua_type(i1, 1) | 0) == 0) {
  _lua_getfield(i1, -1001e3, 2776);
  _lua_replace(i1, 1);
  if ((HEAP32[(_luaL_checkudata(i1, 1, 2832) | 0) + 4 >> 2] | 0) != 0) {
   i4 = 0;
   _aux_lines(i1, i4);
   STACKTOP = i2;
   return 1;
  }
  _luaL_error(i1, 3080, i3) | 0;
  i4 = 0;
  _aux_lines(i1, i4);
  STACKTOP = i2;
  return 1;
 } else {
  i4 = _luaL_checklstring(i1, 1, 0) | 0;
  i6 = _lua_newuserdata(i1, 8) | 0;
  i5 = i6 + 4 | 0;
  HEAP32[i5 >> 2] = 0;
  _luaL_setmetatable(i1, 2832);
  HEAP32[i6 >> 2] = 0;
  HEAP32[i5 >> 2] = 156;
  i5 = _fopen(i4 | 0, 3480) | 0;
  HEAP32[i6 >> 2] = i5;
  if ((i5 | 0) == 0) {
   i6 = _strerror(HEAP32[(___errno_location() | 0) >> 2] | 0) | 0;
   HEAP32[i3 >> 2] = i4;
   HEAP32[i3 + 4 >> 2] = i6;
   _luaL_error(i1, 3520, i3) | 0;
  }
  _lua_replace(i1, 1);
  i6 = 1;
  _aux_lines(i1, i6);
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _luaC_changemode(i2, i6) {
 i2 = i2 | 0;
 i6 = i6 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0;
 i1 = STACKTOP;
 i3 = i2 + 12 | 0;
 i5 = HEAP32[i3 >> 2] | 0;
 i4 = i5 + 62 | 0;
 if ((HEAPU8[i4] | 0) == (i6 | 0)) {
  STACKTOP = i1;
  return;
 }
 if ((i6 | 0) == 2) {
  i3 = i5 + 61 | 0;
  if ((HEAP8[i3] | 0) != 0) {
   do {
    _singlestep(i2) | 0;
   } while ((HEAP8[i3] | 0) != 0);
  }
  HEAP32[i5 + 20 >> 2] = (HEAP32[i5 + 12 >> 2] | 0) + (HEAP32[i5 + 8 >> 2] | 0);
  HEAP8[i4] = 2;
  STACKTOP = i1;
  return;
 }
 HEAP8[i4] = 0;
 i4 = HEAP32[i3 >> 2] | 0;
 HEAP8[i4 + 61 | 0] = 2;
 HEAP32[i4 + 64 >> 2] = 0;
 i5 = i4 + 72 | 0;
 do {
  i6 = _sweeplist(i2, i5, 1) | 0;
 } while ((i6 | 0) == (i5 | 0));
 HEAP32[i4 + 80 >> 2] = i6;
 i5 = i4 + 68 | 0;
 do {
  i6 = _sweeplist(i2, i5, 1) | 0;
 } while ((i6 | 0) == (i5 | 0));
 HEAP32[i4 + 76 >> 2] = i6;
 i3 = (HEAP32[i3 >> 2] | 0) + 61 | 0;
 if ((1 << HEAPU8[i3] & -29 | 0) != 0) {
  STACKTOP = i1;
  return;
 }
 do {
  _singlestep(i2) | 0;
 } while ((1 << HEAPU8[i3] & -29 | 0) == 0);
 STACKTOP = i1;
 return;
}
function _lua_rawget(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i5 = i1 + 8 | 0;
 i4 = _luaH_get(HEAP32[i3 >> 2] | 0, (HEAP32[i5 >> 2] | 0) + -16 | 0) | 0;
 i5 = HEAP32[i5 >> 2] | 0;
 i6 = i4;
 i1 = HEAP32[i6 + 4 >> 2] | 0;
 i3 = i5 + -16 | 0;
 HEAP32[i3 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i3 + 4 >> 2] = i1;
 HEAP32[i5 + -8 >> 2] = HEAP32[i4 + 8 >> 2];
 STACKTOP = i2;
 return;
}
function _lua_isstring(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i2 = (HEAP32[i2 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i2 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i2 = -1001e3 - i4 | 0;
   i3 = HEAP32[i3 >> 2] | 0;
   if ((HEAP32[i3 + 8 >> 2] | 0) == 22) {
    i4 = 0;
    i4 = i4 & 1;
    STACKTOP = i1;
    return i4 | 0;
   }
   i3 = HEAP32[i3 >> 2] | 0;
   if ((i2 | 0) > (HEAPU8[i3 + 6 | 0] | 0 | 0)) {
    i4 = 0;
    i4 = i4 & 1;
    STACKTOP = i1;
    return i4 | 0;
   } else {
    i2 = i3 + (i2 + -1 << 4) + 16 | 0;
    break;
   }
  } else {
   i3 = (HEAP32[i3 >> 2] | 0) + (i4 << 4) | 0;
   i2 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 if ((i2 | 0) == 5192) {
  i4 = 0;
  i4 = i4 & 1;
  STACKTOP = i1;
  return i4 | 0;
 }
 i4 = ((HEAP32[i2 + 8 >> 2] & 15) + -3 | 0) >>> 0 < 2;
 i4 = i4 & 1;
 STACKTOP = i1;
 return i4 | 0;
}
function _setnodevector(i5, i1, i3) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 if ((i3 | 0) == 0) {
  HEAP32[i1 + 16 >> 2] = 8016;
  i6 = 0;
  i7 = 8016;
  i4 = 0;
  i5 = i1 + 7 | 0;
  HEAP8[i5] = i4;
  i6 = i7 + (i6 << 5) | 0;
  i7 = i1 + 20 | 0;
  HEAP32[i7 >> 2] = i6;
  STACKTOP = i2;
  return;
 }
 i4 = _luaO_ceillog2(i3) | 0;
 if ((i4 | 0) > 30) {
  _luaG_runerror(i5, 8048, i2);
 }
 i3 = 1 << i4;
 if ((i3 + 1 | 0) >>> 0 > 134217727) {
  _luaM_toobig(i5);
 }
 i6 = _luaM_realloc_(i5, 0, 0, i3 << 5) | 0;
 i5 = i1 + 16 | 0;
 HEAP32[i5 >> 2] = i6;
 if ((i3 | 0) > 0) {
  i7 = 0;
  do {
   HEAP32[i6 + (i7 << 5) + 28 >> 2] = 0;
   HEAP32[i6 + (i7 << 5) + 24 >> 2] = 0;
   HEAP32[i6 + (i7 << 5) + 8 >> 2] = 0;
   i7 = i7 + 1 | 0;
   i6 = HEAP32[i5 >> 2] | 0;
  } while ((i7 | 0) != (i3 | 0));
 }
 i7 = i3;
 i4 = i4 & 255;
 i5 = i1 + 7 | 0;
 HEAP8[i5] = i4;
 i6 = i6 + (i7 << 5) | 0;
 i7 = i1 + 20 | 0;
 HEAP32[i7 >> 2] = i6;
 STACKTOP = i2;
 return;
}
function _lua_pushvalue(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i5 = i1 + 8 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 i7 = i3;
 i6 = HEAP32[i7 + 4 >> 2] | 0;
 i1 = i4;
 HEAP32[i1 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i1 + 4 >> 2] = i6;
 HEAP32[i4 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 16;
 STACKTOP = i2;
 return;
}
function _luaL_setfuncs(i3, i6, i1) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 _luaL_checkversion_(i3, 502.0);
 if ((_lua_checkstack(i3, i1 + 20 | 0) | 0) == 0) {
  HEAP32[i4 >> 2] = 1472;
  _luaL_error(i3, 1216, i4) | 0;
 }
 if ((HEAP32[i6 >> 2] | 0) == 0) {
  i7 = ~i1;
  _lua_settop(i3, i7);
  STACKTOP = i2;
  return;
 }
 i4 = -2 - i1 | 0;
 i5 = 0 - i1 | 0;
 if ((i1 | 0) <= 0) {
  do {
   _lua_pushcclosure(i3, HEAP32[i6 + 4 >> 2] | 0, i1);
   _lua_setfield(i3, i4, HEAP32[i6 >> 2] | 0);
   i6 = i6 + 8 | 0;
  } while ((HEAP32[i6 >> 2] | 0) != 0);
  i7 = ~i1;
  _lua_settop(i3, i7);
  STACKTOP = i2;
  return;
 }
 do {
  i7 = 0;
  do {
   _lua_pushvalue(i3, i5);
   i7 = i7 + 1 | 0;
  } while ((i7 | 0) != (i1 | 0));
  _lua_pushcclosure(i3, HEAP32[i6 + 4 >> 2] | 0, i1);
  _lua_setfield(i3, i4, HEAP32[i6 >> 2] | 0);
  i6 = i6 + 8 | 0;
 } while ((HEAP32[i6 >> 2] | 0) != 0);
 i7 = ~i1;
 _lua_settop(i3, i7);
 STACKTOP = i2;
 return;
}
function _lua_touserdata(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i2 = (HEAP32[i3 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i2 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i3 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
    i2 = i2 + (i3 + -1 << 4) + 16 | 0;
   } else {
    i2 = 5192;
   }
  } else {
   i2 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i2 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
  }
 } while (0);
 i3 = HEAP32[i2 + 8 >> 2] & 15;
 if ((i3 | 0) == 2) {
  i5 = HEAP32[i2 >> 2] | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else if ((i3 | 0) == 7) {
  i5 = (HEAP32[i2 >> 2] | 0) + 24 | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else {
  i5 = 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 return 0;
}
function _luaL_checkoption(i2, i3, i6, i4) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 i4 = i4 | 0;
 var i1 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i1;
 if ((i6 | 0) == 0) {
  i6 = _lua_tolstring(i2, i3, 0) | 0;
  if ((i6 | 0) == 0) {
   i9 = _lua_typename(i2, 4) | 0;
   i6 = _lua_typename(i2, _lua_type(i2, i3) | 0) | 0;
   HEAP32[i5 >> 2] = i9;
   HEAP32[i5 + 4 >> 2] = i6;
   _luaL_argerror(i2, i3, _lua_pushfstring(i2, 1744, i5) | 0) | 0;
   i6 = 0;
  }
 } else {
  i6 = _luaL_optlstring(i2, i3, i6, 0) | 0;
 }
 i9 = HEAP32[i4 >> 2] | 0;
 L6 : do {
  if ((i9 | 0) != 0) {
   i8 = 0;
   while (1) {
    i7 = i8 + 1 | 0;
    if ((_strcmp(i9, i6) | 0) == 0) {
     break;
    }
    i9 = HEAP32[i4 + (i7 << 2) >> 2] | 0;
    if ((i9 | 0) == 0) {
     break L6;
    } else {
     i8 = i7;
    }
   }
   STACKTOP = i1;
   return i8 | 0;
  }
 } while (0);
 HEAP32[i5 >> 2] = i6;
 i9 = _luaL_argerror(i2, i3, _lua_pushfstring(i2, 1192, i5) | 0) | 0;
 STACKTOP = i1;
 return i9 | 0;
}
function _lua_toboolean(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i3 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i3 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i2 + (i3 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i2 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
  }
 } while (0);
 i2 = HEAP32[i3 + 8 >> 2] | 0;
 if ((i2 | 0) == 0) {
  i5 = 0;
  i5 = i5 & 1;
  STACKTOP = i1;
  return i5 | 0;
 }
 if ((i2 | 0) != 1) {
  i5 = 1;
  i5 = i5 & 1;
  STACKTOP = i1;
  return i5 | 0;
 }
 i5 = (HEAP32[i3 >> 2] | 0) != 0;
 i5 = i5 & 1;
 STACKTOP = i1;
 return i5 | 0;
}
function _lua_getfield(i1, i6, i3) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i5 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i4 = (HEAP32[i1 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i4 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i6 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i4 = HEAP32[i5 >> 2] | 0, (i6 | 0) <= (HEAPU8[i4 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i4 + (i6 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i4 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i4 = i4 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i4 : 5192;
  }
 } while (0);
 i5 = i1 + 8 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 i3 = _luaS_new(i1, i3) | 0;
 HEAP32[i6 >> 2] = i3;
 HEAP32[i6 + 8 >> 2] = HEAPU8[i3 + 4 | 0] | 0 | 64;
 i6 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i6 + 16;
 _luaV_gettable(i1, i4, i6, i6);
 STACKTOP = i2;
 return;
}
function _luaL_argerror(i1, i6, i3) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i2 = i4;
 i5 = i4 + 12 | 0;
 if ((_lua_getstack(i1, 0, i5) | 0) == 0) {
  HEAP32[i2 >> 2] = i6;
  HEAP32[i2 + 4 >> 2] = i3;
  i8 = _luaL_error(i1, 1040, i2) | 0;
  STACKTOP = i4;
  return i8 | 0;
 }
 _lua_getinfo(i1, 1064, i5) | 0;
 if ((_strcmp(HEAP32[i5 + 8 >> 2] | 0, 1072) | 0) == 0) {
  i6 = i6 + -1 | 0;
  if ((i6 | 0) == 0) {
   HEAP32[i2 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i2 + 4 >> 2] = i3;
   i8 = _luaL_error(i1, 1080, i2) | 0;
   STACKTOP = i4;
   return i8 | 0;
  }
 }
 i7 = i5 + 4 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 | 0) == 0) {
  if ((_pushglobalfuncname(i1, i5) | 0) == 0) {
   i8 = 1112;
  } else {
   i8 = _lua_tolstring(i1, -1, 0) | 0;
  }
  HEAP32[i7 >> 2] = i8;
 }
 HEAP32[i2 >> 2] = i6;
 HEAP32[i2 + 4 >> 2] = i8;
 HEAP32[i2 + 8 >> 2] = i3;
 i8 = _luaL_error(i1, 1120, i2) | 0;
 STACKTOP = i4;
 return i8 | 0;
}
function _match_class(i3, i2) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 switch (_tolower(i2 | 0) | 0) {
 case 117:
  {
   i3 = _isupper(i3 | 0) | 0;
   break;
  }
 case 97:
  {
   i3 = _isalpha(i3 | 0) | 0;
   break;
  }
 case 99:
  {
   i3 = _iscntrl(i3 | 0) | 0;
   break;
  }
 case 120:
  {
   i3 = _isxdigit(i3 | 0) | 0;
   break;
  }
 case 119:
  {
   i3 = _isalnum(i3 | 0) | 0;
   break;
  }
 case 112:
  {
   i3 = _ispunct(i3 | 0) | 0;
   break;
  }
 case 100:
  {
   i3 = (i3 + -48 | 0) >>> 0 < 10 | 0;
   break;
  }
 case 108:
  {
   i3 = _islower(i3 | 0) | 0;
   break;
  }
 case 122:
  {
   i3 = (i3 | 0) == 0 | 0;
   break;
  }
 case 103:
  {
   i3 = _isgraph(i3 | 0) | 0;
   break;
  }
 case 115:
  {
   i3 = _isspace(i3 | 0) | 0;
   break;
  }
 default:
  {
   i3 = (i2 | 0) == (i3 | 0) | 0;
   STACKTOP = i1;
   return i3 | 0;
  }
 }
 if ((_islower(i2 | 0) | 0) != 0) {
  STACKTOP = i1;
  return i3 | 0;
 }
 i3 = (i3 | 0) == 0 | 0;
 STACKTOP = i1;
 return i3 | 0;
}
function _condjump(i1, i3, i6, i4, i5) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 _luaK_code(i1, i6 << 6 | i3 | i4 << 23 | i5 << 14) | 0;
 i3 = i1 + 28 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 HEAP32[i3 >> 2] = -1;
 i3 = _luaK_code(i1, 2147450903) | 0;
 if ((i6 | 0) == -1) {
  i9 = i3;
  STACKTOP = i2;
  return i9 | 0;
 }
 if ((i3 | 0) == -1) {
  i9 = i6;
  STACKTOP = i2;
  return i9 | 0;
 }
 i8 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 i7 = i3;
 while (1) {
  i4 = i8 + (i7 << 2) | 0;
  i5 = HEAP32[i4 >> 2] | 0;
  i9 = (i5 >>> 14) + -131071 | 0;
  if ((i9 | 0) == -1) {
   break;
  }
  i9 = i7 + 1 + i9 | 0;
  if ((i9 | 0) == -1) {
   break;
  } else {
   i7 = i9;
  }
 }
 i6 = i6 + ~i7 | 0;
 if ((((i6 | 0) > -1 ? i6 : 0 - i6 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i4 >> 2] = (i6 << 14) + 2147467264 | i5 & 16383;
 i9 = i3;
 STACKTOP = i2;
 return i9 | 0;
}
function _skipcomment(i6, i1) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 HEAP32[i6 >> 2] = 0;
 i3 = i6 + 4 | 0;
 i5 = 1712;
 while (1) {
  i7 = _fgetc(HEAP32[i3 >> 2] | 0) | 0;
  if ((i7 | 0) == -1) {
   i4 = 3;
   break;
  }
  i8 = i5 + 1 | 0;
  if ((i7 | 0) != (HEAPU8[i5] | 0)) {
   break;
  }
  i5 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 + 1;
  HEAP8[i6 + i5 + 8 | 0] = i7;
  if ((HEAP8[i8] | 0) == 0) {
   i4 = 6;
   break;
  } else {
   i5 = i8;
  }
 }
 if ((i4 | 0) == 3) {
  HEAP32[i1 >> 2] = -1;
  i8 = 0;
  STACKTOP = i2;
  return i8 | 0;
 } else if ((i4 | 0) == 6) {
  HEAP32[i6 >> 2] = 0;
  i7 = _fgetc(HEAP32[i3 >> 2] | 0) | 0;
 }
 HEAP32[i1 >> 2] = i7;
 if ((i7 | 0) != 35) {
  i8 = 0;
  STACKTOP = i2;
  return i8 | 0;
 }
 do {
  i8 = _fgetc(HEAP32[i3 >> 2] | 0) | 0;
 } while (!((i8 | 0) == 10 | (i8 | 0) == -1));
 HEAP32[i1 >> 2] = _fgetc(HEAP32[i3 >> 2] | 0) | 0;
 i8 = 1;
 STACKTOP = i2;
 return i8 | 0;
}
function _lua_isnumber(i4, i6) {
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 i5 = HEAP32[i4 + 16 >> 2] | 0;
 do {
  if ((i6 | 0) <= 0) {
   if (!((i6 | 0) < -1000999)) {
    i3 = (HEAP32[i4 + 8 >> 2] | 0) + (i6 << 4) | 0;
    break;
   }
   if ((i6 | 0) == -1001e3) {
    i3 = (HEAP32[i4 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i4 = -1001e3 - i6 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i5 >> 2] | 0, (i4 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i4 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i5 >> 2] | 0) + (i6 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i4 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 if ((HEAP32[i3 + 8 >> 2] | 0) == 3) {
  i6 = 1;
  i6 = i6 & 1;
  STACKTOP = i1;
  return i6 | 0;
 }
 i6 = (_luaV_tonumber(i3, i2) | 0) != 0;
 i6 = i6 & 1;
 STACKTOP = i1;
 return i6 | 0;
}
function ___shgetc(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i7 = i3 + 104 | 0;
 i6 = HEAP32[i7 >> 2] | 0;
 if (!((i6 | 0) != 0 ? (HEAP32[i3 + 108 >> 2] | 0) >= (i6 | 0) : 0)) {
  i8 = 3;
 }
 if ((i8 | 0) == 3 ? (i1 = ___uflow(i3) | 0, (i1 | 0) >= 0) : 0) {
  i7 = HEAP32[i7 >> 2] | 0;
  i6 = HEAP32[i3 + 8 >> 2] | 0;
  if ((i7 | 0) != 0 ? (i4 = HEAP32[i3 + 4 >> 2] | 0, i5 = i7 - (HEAP32[i3 + 108 >> 2] | 0) + -1 | 0, (i6 - i4 | 0) > (i5 | 0)) : 0) {
   HEAP32[i3 + 100 >> 2] = i4 + i5;
  } else {
   HEAP32[i3 + 100 >> 2] = i6;
  }
  i4 = HEAP32[i3 + 4 >> 2] | 0;
  if ((i6 | 0) != 0) {
   i8 = i3 + 108 | 0;
   HEAP32[i8 >> 2] = i6 + 1 - i4 + (HEAP32[i8 >> 2] | 0);
  }
  i3 = i4 + -1 | 0;
  if ((HEAPU8[i3] | 0 | 0) == (i1 | 0)) {
   i8 = i1;
   STACKTOP = i2;
   return i8 | 0;
  }
  HEAP8[i3] = i1;
  i8 = i1;
  STACKTOP = i2;
  return i8 | 0;
 }
 HEAP32[i3 + 100 >> 2] = 0;
 i8 = -1;
 STACKTOP = i2;
 return i8 | 0;
}
function _lua_type(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i2 = (HEAP32[i2 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i2 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i2 = -1001e3 - i4 | 0;
   i3 = HEAP32[i3 >> 2] | 0;
   if ((HEAP32[i3 + 8 >> 2] | 0) == 22) {
    i4 = -1;
    STACKTOP = i1;
    return i4 | 0;
   }
   i3 = HEAP32[i3 >> 2] | 0;
   if ((i2 | 0) > (HEAPU8[i3 + 6 | 0] | 0 | 0)) {
    i4 = -1;
    STACKTOP = i1;
    return i4 | 0;
   } else {
    i2 = i3 + (i2 + -1 << 4) + 16 | 0;
    break;
   }
  } else {
   i3 = (HEAP32[i3 >> 2] | 0) + (i4 << 4) | 0;
   i2 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 if ((i2 | 0) == 5192) {
  i4 = -1;
  STACKTOP = i1;
  return i4 | 0;
 }
 i4 = HEAP32[i2 + 8 >> 2] & 15;
 STACKTOP = i1;
 return i4 | 0;
}
function _g_iofile(i4, i1, i5) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((_lua_type(i4, 1) | 0) < 1) {
  _lua_getfield(i4, -1001e3, i1);
  STACKTOP = i2;
  return;
 }
 i6 = _lua_tolstring(i4, 1, 0) | 0;
 if ((i6 | 0) != 0) {
  i7 = _lua_newuserdata(i4, 8) | 0;
  i8 = i7 + 4 | 0;
  HEAP32[i8 >> 2] = 0;
  _luaL_setmetatable(i4, 2832);
  HEAP32[i7 >> 2] = 0;
  HEAP32[i8 >> 2] = 156;
  i5 = _fopen(i6 | 0, i5 | 0) | 0;
  HEAP32[i7 >> 2] = i5;
  if ((i5 | 0) == 0) {
   i8 = _strerror(HEAP32[(___errno_location() | 0) >> 2] | 0) | 0;
   HEAP32[i3 >> 2] = i6;
   HEAP32[i3 + 4 >> 2] = i8;
   _luaL_error(i4, 3520, i3) | 0;
  }
 } else {
  if ((HEAP32[(_luaL_checkudata(i4, 1, 2832) | 0) + 4 >> 2] | 0) == 0) {
   _luaL_error(i4, 3080, i3) | 0;
  }
  _lua_pushvalue(i4, 1);
 }
 _lua_setfield(i4, -1001e3, i1);
 _lua_getfield(i4, -1001e3, i1);
 STACKTOP = i2;
 return;
}
function _lua_getlocal(i4, i5, i2) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 if ((i5 | 0) == 0) {
  i3 = HEAP32[i4 + 8 >> 2] | 0;
  if ((HEAP32[i3 + -8 >> 2] | 0) != 70) {
   i5 = 0;
   STACKTOP = i1;
   return i5 | 0;
  }
  i5 = _luaF_getlocalname(HEAP32[(HEAP32[i3 + -16 >> 2] | 0) + 12 >> 2] | 0, i2, 0) | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else {
  HEAP32[i3 >> 2] = 0;
  i2 = _findlocal(i4, HEAP32[i5 + 96 >> 2] | 0, i2, i3) | 0;
  if ((i2 | 0) == 0) {
   i5 = 0;
   STACKTOP = i1;
   return i5 | 0;
  }
  i3 = HEAP32[i3 >> 2] | 0;
  i5 = i4 + 8 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i8 = i3;
  i7 = HEAP32[i8 + 4 >> 2] | 0;
  i6 = i4;
  HEAP32[i6 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i6 + 4 >> 2] = i7;
  HEAP32[i4 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
  HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 16;
  i5 = i2;
  STACKTOP = i1;
  return i5 | 0;
 }
 return 0;
}
function _lua_checkstack(i7, i4) {
 i7 = i7 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i8 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 HEAP32[i3 >> 2] = i4;
 i2 = HEAP32[i7 + 16 >> 2] | 0;
 i5 = i7 + 8 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 i8 = i6;
 do {
  if (((HEAP32[i7 + 24 >> 2] | 0) - i8 >> 4 | 0) <= (i4 | 0)) {
   if (((i8 - (HEAP32[i7 + 28 >> 2] | 0) >> 4) + 5 | 0) > (1e6 - i4 | 0)) {
    i8 = 0;
    STACKTOP = i1;
    return i8 | 0;
   }
   i6 = (_luaD_rawrunprotected(i7, 2, i3) | 0) == 0;
   if (i6) {
    i5 = HEAP32[i5 >> 2] | 0;
    i4 = HEAP32[i3 >> 2] | 0;
    i3 = i6 & 1;
    break;
   } else {
    i8 = 0;
    STACKTOP = i1;
    return i8 | 0;
   }
  } else {
   i5 = i6;
   i3 = 1;
  }
 } while (0);
 i2 = i2 + 4 | 0;
 i4 = i5 + (i4 << 4) | 0;
 if (!((HEAP32[i2 >> 2] | 0) >>> 0 < i4 >>> 0)) {
  i8 = i3;
  STACKTOP = i1;
  return i8 | 0;
 }
 HEAP32[i2 >> 2] = i4;
 i8 = i3;
 STACKTOP = i1;
 return i8 | 0;
}
function _luaK_exp2nextreg(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 _luaK_dischargevars(i1, i3);
 if (((HEAP32[i3 >> 2] | 0) == 6 ? (i4 = HEAP32[i3 + 8 >> 2] | 0, (i4 & 256 | 0) == 0) : 0) ? (HEAPU8[i1 + 46 | 0] | 0 | 0) <= (i4 | 0) : 0) {
  i7 = i1 + 48 | 0;
  HEAP8[i7] = (HEAP8[i7] | 0) + -1 << 24 >> 24;
 }
 i4 = i1 + 48 | 0;
 i5 = HEAP8[i4] | 0;
 i6 = (i5 & 255) + 1 | 0;
 i7 = (HEAP32[i1 >> 2] | 0) + 78 | 0;
 if (!(i6 >>> 0 > (HEAPU8[i7] | 0) >>> 0)) {
  i7 = i5;
  i7 = i7 & 255;
  i7 = i7 + 1 | 0;
  i6 = i7 & 255;
  HEAP8[i4] = i6;
  i7 = i7 & 255;
  i7 = i7 + -1 | 0;
  _exp2reg(i1, i3, i7);
  STACKTOP = i2;
  return;
 }
 if (i6 >>> 0 > 249) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10536);
 }
 HEAP8[i7] = i6;
 i7 = HEAP8[i4] | 0;
 i7 = i7 & 255;
 i7 = i7 + 1 | 0;
 i6 = i7 & 255;
 HEAP8[i4] = i6;
 i7 = i7 & 255;
 i7 = i7 + -1 | 0;
 _exp2reg(i1, i3, i7);
 STACKTOP = i2;
 return;
}
function _lua_next(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0, i5 = 0;
 i1 = STACKTOP;
 i5 = HEAP32[i2 + 16 >> 2] | 0;
 do {
  if ((i4 | 0) <= 0) {
   if (!((i4 | 0) < -1000999)) {
    i4 = (HEAP32[i2 + 8 >> 2] | 0) + (i4 << 4) | 0;
    break;
   }
   if ((i4 | 0) == -1001e3) {
    i4 = (HEAP32[i2 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i4 = -1001e3 - i4 | 0;
   i5 = HEAP32[i5 >> 2] | 0;
   if ((HEAP32[i5 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i5 >> 2] | 0, (i4 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i4 = i3 + (i4 + -1 << 4) + 16 | 0;
   } else {
    i4 = 5192;
   }
  } else {
   i3 = (HEAP32[i5 >> 2] | 0) + (i4 << 4) | 0;
   i4 = i3 >>> 0 < (HEAP32[i2 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i3 = i2 + 8 | 0;
 i2 = _luaH_next(i2, HEAP32[i4 >> 2] | 0, (HEAP32[i3 >> 2] | 0) + -16 | 0) | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 HEAP32[i3 >> 2] = (i2 | 0) == 0 ? i4 + -16 | 0 : i4 + 16 | 0;
 STACKTOP = i1;
 return i2 | 0;
}
function _inclinenumber(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 >> 2] | 0;
 i3 = i1 + 56 | 0;
 i5 = HEAP32[i3 >> 2] | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i6 + -1;
 if ((i6 | 0) == 0) {
  i5 = _luaZ_fill(i5) | 0;
 } else {
  i6 = i5 + 4 | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 + 1;
  i5 = HEAPU8[i5] | 0;
 }
 HEAP32[i1 >> 2] = i5;
 if ((i5 | 0) == 13 | (i5 | 0) == 10 ? (i5 | 0) != (i4 | 0) : 0) {
  i3 = HEAP32[i3 >> 2] | 0;
  i6 = HEAP32[i3 >> 2] | 0;
  HEAP32[i3 >> 2] = i6 + -1;
  if ((i6 | 0) == 0) {
   i3 = _luaZ_fill(i3) | 0;
  } else {
   i6 = i3 + 4 | 0;
   i3 = HEAP32[i6 >> 2] | 0;
   HEAP32[i6 >> 2] = i3 + 1;
   i3 = HEAPU8[i3] | 0;
  }
  HEAP32[i1 >> 2] = i3;
 }
 i5 = i1 + 4 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i6 + 1;
 if ((i6 | 0) > 2147483643) {
  _luaX_syntaxerror(i1, 12560);
 } else {
  STACKTOP = i2;
  return;
 }
}
function _lua_yieldk(i5, i6, i1, i7) {
 i5 = i5 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = HEAP32[i5 + 16 >> 2] | 0;
 if ((HEAP16[i5 + 36 >> 1] | 0) != 0) {
  if ((HEAP32[(HEAP32[i5 + 12 >> 2] | 0) + 172 >> 2] | 0) == (i5 | 0)) {
   _luaG_runerror(i5, 2312, i4);
  } else {
   _luaG_runerror(i5, 2264, i4);
  }
 }
 HEAP8[i5 + 6 | 0] = 1;
 HEAP32[i3 + 20 >> 2] = (HEAP32[i3 >> 2] | 0) - (HEAP32[i5 + 28 >> 2] | 0);
 if (!((HEAP8[i3 + 18 | 0] & 1) == 0)) {
  STACKTOP = i2;
  return 0;
 }
 HEAP32[i3 + 28 >> 2] = i7;
 if ((i7 | 0) == 0) {
  i4 = i5 + 8 | 0;
  i4 = HEAP32[i4 >> 2] | 0;
  i7 = ~i6;
  i7 = i4 + (i7 << 4) | 0;
  HEAP32[i3 >> 2] = i7;
  _luaD_throw(i5, 1);
 }
 HEAP32[i3 + 24 >> 2] = i1;
 i4 = i5 + 8 | 0;
 i4 = HEAP32[i4 >> 2] | 0;
 i7 = ~i6;
 i7 = i4 + (i7 << 4) | 0;
 HEAP32[i3 >> 2] = i7;
 _luaD_throw(i5, 1);
 return 0;
}
function _luaH_getint(i4, i6) {
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, d3 = 0.0, i5 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i1;
 i7 = i6 + -1 | 0;
 if (i7 >>> 0 < (HEAP32[i4 + 28 >> 2] | 0) >>> 0) {
  i7 = (HEAP32[i4 + 12 >> 2] | 0) + (i7 << 4) | 0;
  STACKTOP = i1;
  return i7 | 0;
 }
 d3 = +(i6 | 0);
 HEAPF64[i5 >> 3] = d3 + 1.0;
 i5 = (HEAP32[i5 + 4 >> 2] | 0) + (HEAP32[i5 >> 2] | 0) | 0;
 if ((i5 | 0) < 0) {
  i6 = 0 - i5 | 0;
  i5 = (i5 | 0) == (i6 | 0) ? 0 : i6;
 }
 i4 = (HEAP32[i4 + 16 >> 2] | 0) + (((i5 | 0) % ((1 << (HEAPU8[i4 + 7 | 0] | 0)) + -1 | 1 | 0) | 0) << 5) | 0;
 while (1) {
  if ((HEAP32[i4 + 24 >> 2] | 0) == 3 ? +HEAPF64[i4 + 16 >> 3] == d3 : 0) {
   break;
  }
  i4 = HEAP32[i4 + 28 >> 2] | 0;
  if ((i4 | 0) == 0) {
   i4 = 5192;
   i2 = 10;
   break;
  }
 }
 if ((i2 | 0) == 10) {
  STACKTOP = i1;
  return i4 | 0;
 }
 i7 = i4;
 STACKTOP = i1;
 return i7 | 0;
}
function _luaL_checkversion_(i1, d4) {
 i1 = i1 | 0;
 d4 = +d4;
 var i2 = 0, i3 = 0, i5 = 0, d6 = 0.0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i5 = _lua_version(i1) | 0;
 if ((i5 | 0) == (_lua_version(0) | 0)) {
  d6 = +HEAPF64[i5 >> 3];
  if (d6 != d4) {
   HEAPF64[tempDoublePtr >> 3] = d4;
   HEAP32[i3 >> 2] = HEAP32[tempDoublePtr >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
   i5 = i3 + 8 | 0;
   HEAPF64[tempDoublePtr >> 3] = d6;
   HEAP32[i5 >> 2] = HEAP32[tempDoublePtr >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
   _luaL_error(i1, 1528, i3) | 0;
  }
 } else {
  _luaL_error(i1, 1496, i3) | 0;
 }
 _lua_pushnumber(i1, -4660.0);
 if ((_lua_tointegerx(i1, -1, 0) | 0) == -4660 ? (_lua_tounsignedx(i1, -1, 0) | 0) == -4660 : 0) {
  _lua_settop(i1, -2);
  STACKTOP = i2;
  return;
 }
 _luaL_error(i1, 1584, i3) | 0;
 _lua_settop(i1, -2);
 STACKTOP = i2;
 return;
}
function _math_random(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0, i4 = 0, i5 = 0, d6 = 0.0, d7 = 0.0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 d3 = +((_rand() | 0) % 2147483647 | 0 | 0) / 2147483647.0;
 i5 = _lua_gettop(i1) | 0;
 if ((i5 | 0) == 0) {
  _lua_pushnumber(i1, d3);
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 } else if ((i5 | 0) == 1) {
  d6 = +_luaL_checknumber(i1, 1);
  if (!(d6 >= 1.0)) {
   _luaL_argerror(i1, 1, 4056) | 0;
  }
  _lua_pushnumber(i1, +Math_floor(+(d3 * d6)) + 1.0);
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 } else if ((i5 | 0) == 2) {
  d6 = +_luaL_checknumber(i1, 1);
  d7 = +_luaL_checknumber(i1, 2);
  if (!(d6 <= d7)) {
   _luaL_argerror(i1, 2, 4056) | 0;
  }
  _lua_pushnumber(i1, d6 + +Math_floor(+(d3 * (d7 - d6 + 1.0))));
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 } else {
  i5 = _luaL_error(i1, 4080, i4) | 0;
  STACKTOP = i2;
  return i5 | 0;
 }
 return 0;
}
function _push_onecapture(i2, i3, i4, i6) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 var i1 = 0, i5 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i1;
 if ((HEAP32[i2 + 20 >> 2] | 0) <= (i3 | 0)) {
  i2 = HEAP32[i2 + 16 >> 2] | 0;
  if ((i3 | 0) == 0) {
   _lua_pushlstring(i2, i4, i6 - i4 | 0) | 0;
   STACKTOP = i1;
   return;
  } else {
   _luaL_error(i2, 7224, i5) | 0;
   STACKTOP = i1;
   return;
  }
 }
 i4 = HEAP32[i2 + (i3 << 3) + 28 >> 2] | 0;
 if (!((i4 | 0) == -1)) {
  i5 = HEAP32[i2 + 16 >> 2] | 0;
  i3 = HEAP32[i2 + (i3 << 3) + 24 >> 2] | 0;
  if ((i4 | 0) == -2) {
   _lua_pushinteger(i5, i3 + 1 - (HEAP32[i2 + 4 >> 2] | 0) | 0);
   STACKTOP = i1;
   return;
  }
 } else {
  i6 = i2 + 16 | 0;
  _luaL_error(HEAP32[i6 >> 2] | 0, 7248, i5) | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  i3 = HEAP32[i2 + (i3 << 3) + 24 >> 2] | 0;
 }
 _lua_pushlstring(i5, i3, i4) | 0;
 STACKTOP = i1;
 return;
}
function _luaK_nil(i7, i6, i5) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i2 = STACKTOP;
 i9 = i5 + i6 | 0;
 i1 = i9 + -1 | 0;
 i10 = HEAP32[i7 + 20 >> 2] | 0;
 do {
  if ((i10 | 0) > (HEAP32[i7 + 24 >> 2] | 0) ? (i4 = (HEAP32[(HEAP32[i7 >> 2] | 0) + 12 >> 2] | 0) + (i10 + -1 << 2) | 0, i3 = HEAP32[i4 >> 2] | 0, (i3 & 63 | 0) == 4) : 0) {
   i11 = i3 >>> 6 & 255;
   i10 = i11 + (i3 >>> 23) | 0;
   if (!((i11 | 0) <= (i6 | 0) ? (i10 + 1 | 0) >= (i6 | 0) : 0)) {
    i8 = 5;
   }
   if ((i8 | 0) == 5 ? (i11 | 0) < (i6 | 0) | (i11 | 0) > (i9 | 0) : 0) {
    break;
   }
   i5 = (i11 | 0) < (i6 | 0) ? i11 : i6;
   HEAP32[i4 >> 2] = ((i10 | 0) > (i1 | 0) ? i10 : i1) - i5 << 23 | i5 << 6 & 16320 | i3 & 8372287;
   STACKTOP = i2;
   return;
  }
 } while (0);
 _luaK_code(i7, i6 << 6 | (i5 << 23) + -8388608 | 4) | 0;
 STACKTOP = i2;
 return;
}
function _lua_settable(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i5 = i1 + 8 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 _luaV_settable(i1, i3, i4 + -32 | 0, i4 + -16 | 0);
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + -32;
 STACKTOP = i2;
 return;
}
function _luaL_findtable(i3, i6, i5, i4) {
 i3 = i3 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i7 = 0;
 i2 = STACKTOP;
 if ((i6 | 0) != 0) {
  _lua_pushvalue(i3, i6);
 }
 while (1) {
  i6 = _strchr(i5, 46) | 0;
  if ((i6 | 0) == 0) {
   i6 = i5 + (_strlen(i5 | 0) | 0) | 0;
  }
  i7 = i6 - i5 | 0;
  _lua_pushlstring(i3, i5, i7) | 0;
  _lua_rawget(i3, -2);
  if ((_lua_type(i3, -1) | 0) != 0) {
   if ((_lua_type(i3, -1) | 0) != 5) {
    break;
   }
  } else {
   _lua_settop(i3, -2);
   _lua_createtable(i3, 0, (HEAP8[i6] | 0) == 46 ? 1 : i4);
   _lua_pushlstring(i3, i5, i7) | 0;
   _lua_pushvalue(i3, -2);
   _lua_settable(i3, -4);
  }
  _lua_remove(i3, -2);
  if ((HEAP8[i6] | 0) == 46) {
   i5 = i6 + 1 | 0;
  } else {
   i3 = 0;
   i1 = 10;
   break;
  }
 }
 if ((i1 | 0) == 10) {
  STACKTOP = i2;
  return i3 | 0;
 }
 _lua_settop(i3, -3);
 i7 = i5;
 STACKTOP = i2;
 return i7 | 0;
}
function _luaD_call(i1, i4, i5, i8) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i8 = i8 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i7 = i3;
 i2 = i1 + 38 | 0;
 i6 = (HEAP16[i2 >> 1] | 0) + 1 << 16 >> 16;
 HEAP16[i2 >> 1] = i6;
 if ((i6 & 65535) > 199) {
  if (i6 << 16 >> 16 == 200) {
   _luaG_runerror(i1, 2240, i7);
  }
  if ((i6 & 65535) > 224) {
   _luaD_throw(i1, 6);
  }
 }
 i6 = (i8 | 0) != 0;
 if (!i6) {
  i8 = i1 + 36 | 0;
  HEAP16[i8 >> 1] = (HEAP16[i8 >> 1] | 0) + 1 << 16 >> 16;
 }
 if ((_luaD_precall(i1, i4, i5) | 0) == 0) {
  _luaV_execute(i1);
 }
 if (i6) {
  i8 = HEAP16[i2 >> 1] | 0;
  i8 = i8 + -1 << 16 >> 16;
  HEAP16[i2 >> 1] = i8;
  STACKTOP = i3;
  return;
 }
 i8 = i1 + 36 | 0;
 HEAP16[i8 >> 1] = (HEAP16[i8 >> 1] | 0) + -1 << 16 >> 16;
 i8 = HEAP16[i2 >> 1] | 0;
 i8 = i8 + -1 << 16 >> 16;
 HEAP16[i2 >> 1] = i8;
 STACKTOP = i3;
 return;
}
function _pushline(i6, i1) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 528 | 0;
 i4 = i2;
 i3 = i2 + 8 | 0;
 i7 = (i1 | 0) != 0;
 _lua_getglobal(i6, i7 ? 288 : 296);
 i8 = _lua_tolstring(i6, -1, 0) | 0;
 if ((i8 | 0) == 0) {
  i8 = i7 ? 312 : 320;
 }
 i7 = HEAP32[_stdout >> 2] | 0;
 _fputs(i8 | 0, i7 | 0) | 0;
 _fflush(i7 | 0) | 0;
 i8 = (_fgets(i3 | 0, 512, HEAP32[_stdin >> 2] | 0) | 0) == 0;
 _lua_settop(i6, -2);
 if (i8) {
  i8 = 0;
  STACKTOP = i2;
  return i8 | 0;
 }
 i7 = _strlen(i3 | 0) | 0;
 if ((i7 | 0) != 0 ? (i5 = i3 + (i7 + -1) | 0, (HEAP8[i5] | 0) == 10) : 0) {
  HEAP8[i5] = 0;
 }
 if ((i1 | 0) != 0 ? (HEAP8[i3] | 0) == 61 : 0) {
  HEAP32[i4 >> 2] = i3 + 1;
  _lua_pushfstring(i6, 272, i4) | 0;
  i8 = 1;
  STACKTOP = i2;
  return i8 | 0;
 }
 _lua_pushstring(i6, i3) | 0;
 i8 = 1;
 STACKTOP = i2;
 return i8 | 0;
}
function _db_getlocal(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i2;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i3 = _lua_tothread(i1, 1) | 0;
  i6 = 1;
 } else {
  i3 = i1;
  i6 = 0;
 }
 i5 = _luaL_checkinteger(i1, i6 | 2) | 0;
 i6 = i6 + 1 | 0;
 if ((_lua_type(i1, i6) | 0) == 6) {
  _lua_pushvalue(i1, i6);
  _lua_pushstring(i1, _lua_getlocal(i1, 0, i5) | 0) | 0;
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 }
 if ((_lua_getstack(i3, _luaL_checkinteger(i1, i6) | 0, i4) | 0) == 0) {
  i6 = _luaL_argerror(i1, i6, 11560) | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 i4 = _lua_getlocal(i3, i4, i5) | 0;
 if ((i4 | 0) == 0) {
  _lua_pushnil(i1);
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 } else {
  _lua_xmove(i3, i1, 1);
  _lua_pushstring(i1, i4) | 0;
  _lua_pushvalue(i1, -2);
  i6 = 2;
  STACKTOP = i2;
  return i6 | 0;
 }
 return 0;
}
function _luaB_print(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i3;
 i4 = i3 + 4 | 0;
 i6 = _lua_gettop(i1) | 0;
 _lua_getglobal(i1, 9584);
 i5 = HEAP32[_stdout >> 2] | 0;
 L1 : do {
  if ((i6 | 0) >= 1) {
   i7 = 1;
   while (1) {
    _lua_pushvalue(i1, -1);
    _lua_pushvalue(i1, i7);
    _lua_callk(i1, 1, 1, 0, 0);
    i8 = _lua_tolstring(i1, -1, i4) | 0;
    if ((i8 | 0) == 0) {
     break;
    }
    if ((i7 | 0) > 1) {
     _fputc(9, i5 | 0) | 0;
    }
    _fwrite(i8 | 0, 1, HEAP32[i4 >> 2] | 0, i5 | 0) | 0;
    _lua_settop(i1, -2);
    if ((i7 | 0) < (i6 | 0)) {
     i7 = i7 + 1 | 0;
    } else {
     break L1;
    }
   }
   i8 = _luaL_error(i1, 9816, i2) | 0;
   STACKTOP = i3;
   return i8 | 0;
  }
 } while (0);
 _fputc(10, i5 | 0) | 0;
 _fflush(i5 | 0) | 0;
 i8 = 0;
 STACKTOP = i3;
 return i8 | 0;
}
function _luaB_load(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i2;
 i6 = _lua_tolstring(i1, 1, i5) | 0;
 i4 = _luaL_optlstring(i1, 3, 9872, 0) | 0;
 i3 = (_lua_type(i1, 4) | 0) != -1;
 if ((i6 | 0) == 0) {
  i6 = _luaL_optlstring(i1, 2, 9880, 0) | 0;
  _luaL_checktype(i1, 1, 6);
  _lua_settop(i1, 5);
  i4 = _lua_load(i1, 3, 0, i6, i4) | 0;
 } else {
  i7 = _luaL_optlstring(i1, 2, i6, 0) | 0;
  i4 = _luaL_loadbufferx(i1, i6, HEAP32[i5 >> 2] | 0, i7, i4) | 0;
 }
 if ((i4 | 0) != 0) {
  _lua_pushnil(i1);
  _lua_insert(i1, -2);
  i7 = 2;
  STACKTOP = i2;
  return i7 | 0;
 }
 if (!i3) {
  i7 = 1;
  STACKTOP = i2;
  return i7 | 0;
 }
 _lua_pushvalue(i1, i3 ? 4 : 0);
 if ((_lua_setupvalue(i1, -2, 1) | 0) != 0) {
  i7 = 1;
  STACKTOP = i2;
  return i7 | 0;
 }
 _lua_settop(i1, -2);
 i7 = 1;
 STACKTOP = i2;
 return i7 | 0;
}
function _db_debug(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 256 | 0;
 i6 = i1;
 i4 = i1 + 4 | 0;
 i3 = HEAP32[_stderr >> 2] | 0;
 _fwrite(12040, 11, 1, i3 | 0) | 0;
 _fflush(i3 | 0) | 0;
 i5 = HEAP32[_stdin >> 2] | 0;
 if ((_fgets(i4 | 0, 250, i5 | 0) | 0) == 0) {
  STACKTOP = i1;
  return 0;
 }
 while (1) {
  if ((_strcmp(i4, 12056) | 0) == 0) {
   i2 = 7;
   break;
  }
  if (!((_luaL_loadbufferx(i2, i4, _strlen(i4 | 0) | 0, 12064, 0) | 0) == 0 ? (_lua_pcallk(i2, 0, 0, 0, 0, 0) | 0) == 0 : 0)) {
   HEAP32[i6 >> 2] = _lua_tolstring(i2, -1, 0) | 0;
   _fprintf(i3 | 0, 12088, i6 | 0) | 0;
   _fflush(i3 | 0) | 0;
  }
  _lua_settop(i2, 0);
  _fwrite(12040, 11, 1, i3 | 0) | 0;
  _fflush(i3 | 0) | 0;
  if ((_fgets(i4 | 0, 250, i5 | 0) | 0) == 0) {
   i2 = 7;
   break;
  }
 }
 if ((i2 | 0) == 7) {
  STACKTOP = i1;
  return 0;
 }
 return 0;
}
function _luaL_prepbuffsize(i2, i7) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i1 = HEAP32[i2 + 12 >> 2] | 0;
 i4 = i2 + 4 | 0;
 i8 = HEAP32[i4 >> 2] | 0;
 i5 = i2 + 8 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if (!((i8 - i6 | 0) >>> 0 < i7 >>> 0)) {
  i7 = HEAP32[i2 >> 2] | 0;
  i8 = i6;
  i8 = i7 + i8 | 0;
  STACKTOP = i3;
  return i8 | 0;
 }
 i8 = i8 << 1;
 i8 = (i8 - i6 | 0) >>> 0 < i7 >>> 0 ? i6 + i7 | 0 : i8;
 if (i8 >>> 0 < i6 >>> 0 | (i8 - i6 | 0) >>> 0 < i7 >>> 0) {
  _luaL_error(i1, 1272, i3) | 0;
 }
 i6 = _lua_newuserdata(i1, i8) | 0;
 _memcpy(i6 | 0, HEAP32[i2 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
 if ((HEAP32[i2 >> 2] | 0) != (i2 + 16 | 0)) {
  _lua_remove(i1, -2);
 }
 HEAP32[i2 >> 2] = i6;
 HEAP32[i4 >> 2] = i8;
 i7 = i6;
 i8 = HEAP32[i5 >> 2] | 0;
 i8 = i7 + i8 | 0;
 STACKTOP = i3;
 return i8 | 0;
}
function _luaG_runerror(i1, i5, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 96 | 0;
 i2 = i6;
 i3 = i6 + 32 | 0;
 i6 = i6 + 16 | 0;
 HEAP32[i6 >> 2] = i4;
 i4 = _luaO_pushvfstring(i1, i5, i6) | 0;
 i6 = HEAP32[i1 + 16 >> 2] | 0;
 if ((HEAP8[i6 + 18 | 0] & 1) == 0) {
  _luaG_errormsg(i1);
 }
 i5 = HEAP32[(HEAP32[HEAP32[i6 >> 2] >> 2] | 0) + 12 >> 2] | 0;
 i7 = HEAP32[i5 + 20 >> 2] | 0;
 if ((i7 | 0) == 0) {
  i6 = 0;
 } else {
  i6 = HEAP32[i7 + (((HEAP32[i6 + 28 >> 2] | 0) - (HEAP32[i5 + 12 >> 2] | 0) >> 2) + -1 << 2) >> 2] | 0;
 }
 i5 = HEAP32[i5 + 36 >> 2] | 0;
 if ((i5 | 0) == 0) {
  HEAP8[i3] = 63;
  HEAP8[i3 + 1 | 0] = 0;
 } else {
  _luaO_chunkid(i3, i5 + 16 | 0, 60);
 }
 HEAP32[i2 >> 2] = i3;
 HEAP32[i2 + 4 >> 2] = i6;
 HEAP32[i2 + 8 >> 2] = i4;
 _luaO_pushfstring(i1, 2024, i2) | 0;
 _luaG_errormsg(i1);
}
function _db_upvaluejoin(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i3;
 i2 = _luaL_checkinteger(i1, 2) | 0;
 _luaL_checktype(i1, 1, 6);
 _lua_pushvalue(i1, 1);
 _lua_getinfo(i1, 11728, i4) | 0;
 if (!((i2 | 0) > 0 ? (i2 | 0) <= (HEAPU8[i4 + 32 | 0] | 0 | 0) : 0)) {
  _luaL_argerror(i1, 2, 11736) | 0;
 }
 i5 = _luaL_checkinteger(i1, 4) | 0;
 _luaL_checktype(i1, 3, 6);
 _lua_pushvalue(i1, 3);
 _lua_getinfo(i1, 11728, i4) | 0;
 if (!((i5 | 0) > 0 ? (i5 | 0) <= (HEAPU8[i4 + 32 | 0] | 0 | 0) : 0)) {
  _luaL_argerror(i1, 4, 11736) | 0;
 }
 if ((_lua_iscfunction(i1, 1) | 0) != 0) {
  _luaL_argerror(i1, 1, 11760) | 0;
 }
 if ((_lua_iscfunction(i1, 3) | 0) == 0) {
  _lua_upvaluejoin(i1, 1, i2, 3, i5);
  STACKTOP = i3;
  return 0;
 }
 _luaL_argerror(i1, 3, 11760) | 0;
 _lua_upvaluejoin(i1, 1, i2, 3, i5);
 STACKTOP = i3;
 return 0;
}
function _luaK_jump(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i3 = STACKTOP;
 i2 = i1 + 28 | 0;
 i7 = HEAP32[i2 >> 2] | 0;
 HEAP32[i2 >> 2] = -1;
 i2 = _luaK_code(i1, 2147450903) | 0;
 if ((i7 | 0) == -1) {
  i9 = i2;
  STACKTOP = i3;
  return i9 | 0;
 }
 if ((i2 | 0) == -1) {
  i9 = i7;
  STACKTOP = i3;
  return i9 | 0;
 }
 i6 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 i8 = i2;
 while (1) {
  i5 = i6 + (i8 << 2) | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i9 = (i4 >>> 14) + -131071 | 0;
  if ((i9 | 0) == -1) {
   break;
  }
  i9 = i8 + 1 + i9 | 0;
  if ((i9 | 0) == -1) {
   break;
  } else {
   i8 = i9;
  }
 }
 i6 = i7 + ~i8 | 0;
 if ((((i6 | 0) > -1 ? i6 : 0 - i6 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i5 >> 2] = (i6 << 14) + 2147467264 | i4 & 16383;
 i9 = i2;
 STACKTOP = i3;
 return i9 | 0;
}
function _findfield(i2, i3, i4) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 L1 : do {
  if (((i4 | 0) != 0 ? (_lua_type(i2, -1) | 0) == 5 : 0) ? (_lua_pushnil(i2), (_lua_next(i2, -2) | 0) != 0) : 0) {
   i4 = i4 + -1 | 0;
   while (1) {
    if ((_lua_type(i2, -2) | 0) == 4) {
     if ((_lua_rawequal(i2, i3, -1) | 0) != 0) {
      i3 = 7;
      break;
     }
     if ((_findfield(i2, i3, i4) | 0) != 0) {
      i3 = 9;
      break;
     }
    }
    _lua_settop(i2, -2);
    if ((_lua_next(i2, -2) | 0) == 0) {
     i2 = 0;
     break L1;
    }
   }
   if ((i3 | 0) == 7) {
    _lua_settop(i2, -2);
    i2 = 1;
    break;
   } else if ((i3 | 0) == 9) {
    _lua_remove(i2, -2);
    _lua_pushlstring(i2, 1776, 1) | 0;
    _lua_insert(i2, -2);
    _lua_concat(i2, 3);
    i2 = 1;
    break;
   }
  } else {
   i2 = 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _db_gethook(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i3;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i4 = _lua_tothread(i1, 1) | 0;
 } else {
  i4 = i1;
 }
 i5 = _lua_gethookmask(i4) | 0;
 i6 = _lua_gethook(i4) | 0;
 if ((i6 | 0) != 0 & (i6 | 0) != 9) {
  _lua_pushlstring(i1, 12024, 13) | 0;
 } else {
  _luaL_getsubtable(i1, -1001e3, 11584) | 0;
  _lua_pushthread(i4) | 0;
  _lua_xmove(i4, i1, 1);
  _lua_rawget(i1, -2);
  _lua_remove(i1, -2);
 }
 if ((i5 & 1 | 0) == 0) {
  i6 = 0;
 } else {
  HEAP8[i2] = 99;
  i6 = 1;
 }
 if ((i5 & 2 | 0) != 0) {
  HEAP8[i2 + i6 | 0] = 114;
  i6 = i6 + 1 | 0;
 }
 if ((i5 & 4 | 0) != 0) {
  HEAP8[i2 + i6 | 0] = 108;
  i6 = i6 + 1 | 0;
 }
 HEAP8[i2 + i6 | 0] = 0;
 _lua_pushstring(i1, i2) | 0;
 _lua_pushinteger(i1, _lua_gethookcount(i4) | 0);
 STACKTOP = i3;
 return 3;
}
function _lua_tothread(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i2 = (HEAP32[i3 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i2 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i3 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
    i2 = i2 + (i3 + -1 << 4) + 16 | 0;
   } else {
    i2 = 5192;
   }
  } else {
   i2 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i2 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
  }
 } while (0);
 if ((HEAP32[i2 + 8 >> 2] | 0) != 72) {
  i5 = 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 i5 = HEAP32[i2 >> 2] | 0;
 STACKTOP = i1;
 return i5 | 0;
}
function _luaD_throw(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i3 = i1 + 64 | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 if ((i4 | 0) != 0) {
  HEAP32[i4 + 160 >> 2] = i2;
  _longjmp((HEAP32[i3 >> 2] | 0) + 4 | 0, 1);
 }
 HEAP8[i1 + 6 | 0] = i2;
 i4 = i1 + 12 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 i5 = HEAP32[i3 + 172 >> 2] | 0;
 if ((HEAP32[i5 + 64 >> 2] | 0) != 0) {
  i6 = HEAP32[i1 + 8 >> 2] | 0;
  i9 = i5 + 8 | 0;
  i5 = HEAP32[i9 >> 2] | 0;
  HEAP32[i9 >> 2] = i5 + 16;
  i9 = i6 + -16 | 0;
  i8 = HEAP32[i9 + 4 >> 2] | 0;
  i7 = i5;
  HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
  HEAP32[i7 + 4 >> 2] = i8;
  HEAP32[i5 + 8 >> 2] = HEAP32[i6 + -8 >> 2];
  _luaD_throw(HEAP32[(HEAP32[i4 >> 2] | 0) + 172 >> 2] | 0, i2);
 }
 i2 = HEAP32[i3 + 168 >> 2] | 0;
 if ((i2 | 0) == 0) {
  _abort();
 }
 FUNCTION_TABLE_ii[i2 & 255](i1) | 0;
 _abort();
}
function _lua_len(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i5 = i1 + 8 | 0;
 _luaV_objlen(i1, HEAP32[i5 >> 2] | 0, i3);
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 16;
 STACKTOP = i2;
 return;
}
function _read_line(i4, i5, i1) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 1040 | 0;
 i2 = i3;
 _luaL_buffinit(i4, i2);
 i7 = _luaL_prepbuffsize(i2, 1024) | 0;
 L1 : do {
  if ((_fgets(i7 | 0, 1024, i5 | 0) | 0) != 0) {
   i6 = i2 + 8 | 0;
   while (1) {
    i8 = _strlen(i7 | 0) | 0;
    if ((i8 | 0) != 0 ? (HEAP8[i7 + (i8 + -1) | 0] | 0) == 10 : 0) {
     break;
    }
    HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i8;
    i7 = _luaL_prepbuffsize(i2, 1024) | 0;
    if ((_fgets(i7 | 0, 1024, i5 | 0) | 0) == 0) {
     break L1;
    }
   }
   HEAP32[i6 >> 2] = i8 - i1 + (HEAP32[i6 >> 2] | 0);
   _luaL_pushresult(i2);
   i8 = 1;
   STACKTOP = i3;
   return i8 | 0;
  }
 } while (0);
 _luaL_pushresult(i2);
 i8 = (_lua_rawlen(i4, -1) | 0) != 0 | 0;
 STACKTOP = i3;
 return i8 | 0;
}
function _luaL_tolstring(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 + 16 | 0;
 i3 = i2;
 do {
  if ((_luaL_callmeta(i1, i5, 1384) | 0) == 0) {
   i6 = _lua_type(i1, i5) | 0;
   if ((i6 | 0) == 0) {
    _lua_pushlstring(i1, 1416, 3) | 0;
    break;
   } else if ((i6 | 0) == 1) {
    i6 = (_lua_toboolean(i1, i5) | 0) != 0;
    _lua_pushstring(i1, i6 ? 1400 : 1408) | 0;
    break;
   } else if ((i6 | 0) == 4 | (i6 | 0) == 3) {
    _lua_pushvalue(i1, i5);
    break;
   } else {
    i7 = _lua_typename(i1, _lua_type(i1, i5) | 0) | 0;
    i6 = _lua_topointer(i1, i5) | 0;
    HEAP32[i3 >> 2] = i7;
    HEAP32[i3 + 4 >> 2] = i6;
    _lua_pushfstring(i1, 1424, i3) | 0;
    break;
   }
  }
 } while (0);
 i7 = _lua_tolstring(i1, -1, i4) | 0;
 STACKTOP = i2;
 return i7 | 0;
}
function _save(i7, i1) {
 i7 = i7 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i7 + 60 >> 2] | 0;
 i3 = i4 + 4 | 0;
 i8 = HEAP32[i3 >> 2] | 0;
 i6 = i4 + 8 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 if (!((i8 + 1 | 0) >>> 0 > i5 >>> 0)) {
  i6 = HEAP32[i4 >> 2] | 0;
  i7 = i1 & 255;
  i5 = i8 + 1 | 0;
  HEAP32[i3 >> 2] = i5;
  i8 = i6 + i8 | 0;
  HEAP8[i8] = i7;
  STACKTOP = i2;
  return;
 }
 if (i5 >>> 0 > 2147483645) {
  _lexerror(i7, 12368, 0);
 }
 i8 = i5 << 1;
 i7 = HEAP32[i7 + 52 >> 2] | 0;
 if ((i8 | 0) == -2) {
  _luaM_toobig(i7);
 }
 i7 = _luaM_realloc_(i7, HEAP32[i4 >> 2] | 0, i5, i8) | 0;
 HEAP32[i4 >> 2] = i7;
 HEAP32[i6 >> 2] = i8;
 i8 = HEAP32[i3 >> 2] | 0;
 i6 = i7;
 i7 = i1 & 255;
 i5 = i8 + 1 | 0;
 HEAP32[i3 >> 2] = i5;
 i8 = i6 + i8 | 0;
 HEAP8[i8] = i7;
 STACKTOP = i2;
 return;
}
function _luaK_patchtohere(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 HEAP32[i1 + 24 >> 2] = HEAP32[i1 + 20 >> 2];
 i4 = i1 + 28 | 0;
 if ((i3 | 0) == -1) {
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[i4 >> 2] | 0;
 if ((i7 | 0) == -1) {
  HEAP32[i4 >> 2] = i3;
  STACKTOP = i2;
  return;
 }
 i4 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 while (1) {
  i6 = i4 + (i7 << 2) | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  i8 = (i5 >>> 14) + -131071 | 0;
  if ((i8 | 0) == -1) {
   break;
  }
  i8 = i7 + 1 + i8 | 0;
  if ((i8 | 0) == -1) {
   break;
  } else {
   i7 = i8;
  }
 }
 i3 = ~i7 + i3 | 0;
 if ((((i3 | 0) > -1 ? i3 : 0 - i3 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i6 >> 2] = (i3 << 14) + 2147467264 | i5 & 16383;
 STACKTOP = i2;
 return;
}
function _tinsert(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i7 = i2;
 _luaL_checktype(i1, 1, 5);
 i4 = _luaL_len(i1, 1) | 0;
 i3 = i4 + 1 | 0;
 i6 = _lua_gettop(i1) | 0;
 if ((i6 | 0) == 3) {
  i5 = 2;
 } else if ((i6 | 0) != 2) {
  i7 = _luaL_error(i1, 8320, i7) | 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 if ((i5 | 0) == 2) {
  i5 = _luaL_checkinteger(i1, 2) | 0;
  if ((i5 | 0) < 1 | (i5 | 0) > (i3 | 0)) {
   _luaL_argerror(i1, 2, 8256) | 0;
  }
  if ((i4 | 0) < (i5 | 0)) {
   i3 = i5;
  } else {
   while (1) {
    i4 = i3 + -1 | 0;
    _lua_rawgeti(i1, 1, i4);
    _lua_rawseti(i1, 1, i3);
    if ((i4 | 0) > (i5 | 0)) {
     i3 = i4;
    } else {
     i3 = i5;
     break;
    }
   }
  }
 }
 _lua_rawseti(i1, 1, i3);
 i7 = 0;
 STACKTOP = i2;
 return i7 | 0;
}
function _lua_iscfunction(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i3 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i2 = (HEAP32[i3 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i2 = (HEAP32[i3 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i3 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i2 = HEAP32[i4 >> 2] | 0, (i3 | 0) <= (HEAPU8[i2 + 6 | 0] | 0 | 0)) : 0) {
    i2 = i2 + (i3 + -1 << 4) + 16 | 0;
   } else {
    i2 = 5192;
   }
  } else {
   i2 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i2 = i2 >>> 0 < (HEAP32[i3 + 8 >> 2] | 0) >>> 0 ? i2 : 5192;
  }
 } while (0);
 i5 = HEAP32[i2 + 8 >> 2] | 0;
 STACKTOP = i1;
 return ((i5 | 0) == 22 | (i5 | 0) == 102) & 1 | 0;
}
function _lua_gettable(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 16 >> 2] | 0;
 do {
  if ((i5 | 0) <= 0) {
   if (!((i5 | 0) < -1000999)) {
    i3 = (HEAP32[i1 + 8 >> 2] | 0) + (i5 << 4) | 0;
    break;
   }
   if ((i5 | 0) == -1001e3) {
    i3 = (HEAP32[i1 + 12 >> 2] | 0) + 40 | 0;
    break;
   }
   i5 = -1001e3 - i5 | 0;
   i4 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i4 + 8 >> 2] | 0) != 22 ? (i3 = HEAP32[i4 >> 2] | 0, (i5 | 0) <= (HEAPU8[i3 + 6 | 0] | 0 | 0)) : 0) {
    i3 = i3 + (i5 + -1 << 4) + 16 | 0;
   } else {
    i3 = 5192;
   }
  } else {
   i3 = (HEAP32[i4 >> 2] | 0) + (i5 << 4) | 0;
   i3 = i3 >>> 0 < (HEAP32[i1 + 8 >> 2] | 0) >>> 0 ? i3 : 5192;
  }
 } while (0);
 i5 = (HEAP32[i1 + 8 >> 2] | 0) + -16 | 0;
 _luaV_gettable(i1, i3, i5, i5);
 STACKTOP = i2;
 return;
}
function _luaG_errormsg(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = HEAP32[i1 + 68 >> 2] | 0;
 if ((i2 | 0) == 0) {
  _luaD_throw(i1, 2);
 }
 i4 = HEAP32[i1 + 28 >> 2] | 0;
 i3 = i4 + (i2 + 8) | 0;
 if ((HEAP32[i3 >> 2] & 15 | 0) != 6) {
  _luaD_throw(i1, 6);
 }
 i5 = i1 + 8 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 i9 = i6 + -16 | 0;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i6;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 HEAP32[i6 + 8 >> 2] = HEAP32[i6 + -8 >> 2];
 i6 = HEAP32[i5 >> 2] | 0;
 i7 = i4 + i2 | 0;
 i2 = HEAP32[i7 + 4 >> 2] | 0;
 i4 = i6 + -16 | 0;
 HEAP32[i4 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i4 + 4 >> 2] = i2;
 HEAP32[i6 + -8 >> 2] = HEAP32[i3 >> 2];
 i4 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i4 + 16;
 _luaD_call(i1, i4 + -16 | 0, 1, 0);
 _luaD_throw(i1, 2);
}
function _luaB_costatus(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i3 = i4;
 i2 = _lua_tothread(i1, 1) | 0;
 if ((i2 | 0) == 0) {
  _luaL_argerror(i1, 1, 10856) | 0;
 }
 do {
  if ((i2 | 0) != (i1 | 0)) {
   i5 = _lua_status(i2) | 0;
   if ((i5 | 0) == 0) {
    if ((_lua_getstack(i2, 0, i3) | 0) > 0) {
     _lua_pushlstring(i1, 10896, 6) | 0;
     break;
    }
    if ((_lua_gettop(i2) | 0) == 0) {
     _lua_pushlstring(i1, 10904, 4) | 0;
     break;
    } else {
     _lua_pushlstring(i1, 10880, 9) | 0;
     break;
    }
   } else if ((i5 | 0) == 1) {
    _lua_pushlstring(i1, 10880, 9) | 0;
    break;
   } else {
    _lua_pushlstring(i1, 10904, 4) | 0;
    break;
   }
  } else {
   _lua_pushlstring(i1, 10728, 7) | 0;
  }
 } while (0);
 STACKTOP = i4;
 return 1;
}
function _searcher_Lua(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i4 = _luaL_checklstring(i1, 1, 0) | 0;
 _lua_getfield(i1, -1001001, 4256);
 i5 = _lua_tolstring(i1, -1, 0) | 0;
 if ((i5 | 0) == 0) {
  HEAP32[i3 >> 2] = 4256;
  _luaL_error(i1, 5032, i3) | 0;
 }
 i4 = _searchpath(i1, i4, i5, 4936, 4848) | 0;
 if ((i4 | 0) == 0) {
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 }
 if ((_luaL_loadfilex(i1, i4, 0) | 0) == 0) {
  _lua_pushstring(i1, i4) | 0;
  i5 = 2;
  STACKTOP = i2;
  return i5 | 0;
 } else {
  i6 = _lua_tolstring(i1, 1, 0) | 0;
  i5 = _lua_tolstring(i1, -1, 0) | 0;
  HEAP32[i3 >> 2] = i6;
  HEAP32[i3 + 4 >> 2] = i4;
  HEAP32[i3 + 8 >> 2] = i5;
  i5 = _luaL_error(i1, 4888, i3) | 0;
  STACKTOP = i2;
  return i5 | 0;
 }
 return 0;
}
function _str_sub(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 i2 = _luaL_checklstring(i1, 1, i4) | 0;
 i5 = _luaL_checkinteger(i1, 2) | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 if (!((i5 | 0) > -1)) {
  if (i6 >>> 0 < (0 - i5 | 0) >>> 0) {
   i5 = 0;
  } else {
   i5 = i5 + 1 + i6 | 0;
  }
 }
 i6 = _luaL_optinteger(i1, 3, -1) | 0;
 i4 = HEAP32[i4 >> 2] | 0;
 if (!((i6 | 0) > -1)) {
  if (i4 >>> 0 < (0 - i6 | 0) >>> 0) {
   i6 = 0;
  } else {
   i6 = i6 + 1 + i4 | 0;
  }
 }
 i5 = (i5 | 0) == 0 ? 1 : i5;
 i4 = i6 >>> 0 > i4 >>> 0 ? i4 : i6;
 if (i5 >>> 0 > i4 >>> 0) {
  _lua_pushlstring(i1, 7040, 0) | 0;
  STACKTOP = i3;
  return 1;
 } else {
  _lua_pushlstring(i1, i2 + (i5 + -1) | 0, 1 - i5 + i4 | 0) | 0;
  STACKTOP = i3;
  return 1;
 }
 return 0;
}
function _searcher_C(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i4 = _luaL_checklstring(i1, 1, 0) | 0;
 _lua_getfield(i1, -1001001, 4440);
 i5 = _lua_tolstring(i1, -1, 0) | 0;
 if ((i5 | 0) == 0) {
  HEAP32[i3 >> 2] = 4440;
  _luaL_error(i1, 5032, i3) | 0;
 }
 i5 = _searchpath(i1, i4, i5, 4936, 4848) | 0;
 if ((i5 | 0) == 0) {
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 }
 if ((_loadfunc(i1, i5, i4) | 0) == 0) {
  _lua_pushstring(i1, i5) | 0;
  i5 = 2;
  STACKTOP = i2;
  return i5 | 0;
 } else {
  i6 = _lua_tolstring(i1, 1, 0) | 0;
  i4 = _lua_tolstring(i1, -1, 0) | 0;
  HEAP32[i3 >> 2] = i6;
  HEAP32[i3 + 4 >> 2] = i5;
  HEAP32[i3 + 8 >> 2] = i4;
  i5 = _luaL_error(i1, 4888, i3) | 0;
  STACKTOP = i2;
  return i5 | 0;
 }
 return 0;
}
function _io_open(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i5 = STACKTOP;
 i2 = _luaL_checklstring(i1, 1, 0) | 0;
 i3 = _luaL_optlstring(i1, 2, 3480, 0) | 0;
 i4 = _lua_newuserdata(i1, 8) | 0;
 i6 = i4 + 4 | 0;
 HEAP32[i6 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 HEAP32[i4 >> 2] = 0;
 HEAP32[i6 >> 2] = 156;
 i6 = HEAP8[i3] | 0;
 if (!((!(i6 << 24 >> 24 == 0) ? (i7 = i3 + 1 | 0, (_memchr(3552, i6 << 24 >> 24, 4) | 0) != 0) : 0) ? (i6 = (HEAP8[i7] | 0) == 43 ? i3 + 2 | 0 : i7, (HEAP8[(HEAP8[i6] | 0) == 98 ? i6 + 1 | 0 : i6] | 0) == 0) : 0)) {
  _luaL_argerror(i1, 2, 3560) | 0;
 }
 i7 = _fopen(i2 | 0, i3 | 0) | 0;
 HEAP32[i4 >> 2] = i7;
 if ((i7 | 0) != 0) {
  i7 = 1;
  STACKTOP = i5;
  return i7 | 0;
 }
 i7 = _luaL_fileresult(i1, 0, i2) | 0;
 STACKTOP = i5;
 return i7 | 0;
}
function _unpack(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i6 = i1;
 _luaL_checktype(i2, 1, 5);
 i5 = _luaL_optinteger(i2, 2, 1) | 0;
 if ((_lua_type(i2, 3) | 0) < 1) {
  i3 = _luaL_len(i2, 1) | 0;
 } else {
  i3 = _luaL_checkinteger(i2, 3) | 0;
 }
 if ((i5 | 0) > (i3 | 0)) {
  i6 = 0;
  STACKTOP = i1;
  return i6 | 0;
 }
 i7 = i3 - i5 | 0;
 i4 = i7 + 1 | 0;
 if ((i7 | 0) >= 0 ? (_lua_checkstack(i2, i4) | 0) != 0 : 0) {
  _lua_rawgeti(i2, 1, i5);
  if ((i5 | 0) >= (i3 | 0)) {
   i7 = i4;
   STACKTOP = i1;
   return i7 | 0;
  }
  do {
   i5 = i5 + 1 | 0;
   _lua_rawgeti(i2, 1, i5);
  } while ((i5 | 0) != (i3 | 0));
  STACKTOP = i1;
  return i4 | 0;
 }
 i7 = _luaL_error(i2, 8280, i6) | 0;
 STACKTOP = i1;
 return i7 | 0;
}
function _luaF_getlocalname(i4, i6, i2) {
 i4 = i4 | 0;
 i6 = i6 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i5 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i4 + 60 >> 2] | 0;
 if ((i3 | 0) <= 0) {
  i6 = 0;
  STACKTOP = i1;
  return i6 | 0;
 }
 i4 = HEAP32[i4 + 24 >> 2] | 0;
 i5 = 0;
 while (1) {
  if ((HEAP32[i4 + (i5 * 12 | 0) + 4 >> 2] | 0) > (i2 | 0)) {
   i3 = 0;
   i2 = 8;
   break;
  }
  if ((HEAP32[i4 + (i5 * 12 | 0) + 8 >> 2] | 0) > (i2 | 0)) {
   i6 = i6 + -1 | 0;
   if ((i6 | 0) == 0) {
    i2 = 6;
    break;
   }
  }
  i5 = i5 + 1 | 0;
  if ((i5 | 0) >= (i3 | 0)) {
   i3 = 0;
   i2 = 8;
   break;
  }
 }
 if ((i2 | 0) == 6) {
  i6 = (HEAP32[i4 + (i5 * 12 | 0) >> 2] | 0) + 16 | 0;
  STACKTOP = i1;
  return i6 | 0;
 } else if ((i2 | 0) == 8) {
  STACKTOP = i1;
  return i3 | 0;
 }
 return 0;
}
function _luaK_concat(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 if ((i3 | 0) == -1) {
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[i4 >> 2] | 0;
 if ((i7 | 0) == -1) {
  HEAP32[i4 >> 2] = i3;
  STACKTOP = i2;
  return;
 }
 i4 = HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0;
 while (1) {
  i6 = i4 + (i7 << 2) | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  i8 = (i5 >>> 14) + -131071 | 0;
  if ((i8 | 0) == -1) {
   break;
  }
  i8 = i7 + 1 + i8 | 0;
  if ((i8 | 0) == -1) {
   break;
  } else {
   i7 = i8;
  }
 }
 i3 = ~i7 + i3 | 0;
 if ((((i3 | 0) > -1 ? i3 : 0 - i3 | 0) | 0) > 131071) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10624);
 }
 HEAP32[i6 >> 2] = i5 & 16383 | (i3 << 14) + 2147467264;
 STACKTOP = i2;
 return;
}
function _scalbn(d3, i2) {
 d3 = +d3;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0;
 i1 = STACKTOP;
 if ((i2 | 0) > 1023) {
  d3 = d3 * 8.98846567431158e+307;
  i4 = i2 + -1023 | 0;
  if ((i4 | 0) > 1023) {
   i2 = i2 + -2046 | 0;
   i2 = (i2 | 0) > 1023 ? 1023 : i2;
   d3 = d3 * 8.98846567431158e+307;
  } else {
   i2 = i4;
  }
 } else {
  if ((i2 | 0) < -1022) {
   d3 = d3 * 2.2250738585072014e-308;
   i4 = i2 + 1022 | 0;
   if ((i4 | 0) < -1022) {
    i2 = i2 + 2044 | 0;
    i2 = (i2 | 0) < -1022 ? -1022 : i2;
    d3 = d3 * 2.2250738585072014e-308;
   } else {
    i2 = i4;
   }
  }
 }
 i2 = _bitshift64Shl(i2 + 1023 | 0, 0, 52) | 0;
 i4 = tempRet0;
 HEAP32[tempDoublePtr >> 2] = i2;
 HEAP32[tempDoublePtr + 4 >> 2] = i4;
 d3 = d3 * +HEAPF64[tempDoublePtr >> 3];
 STACKTOP = i1;
 return +d3;
}
function _luaK_numberK(i1, d6) {
 i1 = i1 | 0;
 d6 = +d6;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i4 = i2 + 16 | 0;
 i3 = i2;
 HEAPF64[i4 >> 3] = d6;
 i5 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 52 >> 2] | 0;
 HEAPF64[i3 >> 3] = d6;
 HEAP32[i3 + 8 >> 2] = 3;
 if (d6 != d6 | 0.0 != 0.0 | d6 == 0.0) {
  i7 = i5 + 8 | 0;
  i8 = HEAP32[i7 >> 2] | 0;
  HEAP32[i7 >> 2] = i8 + 16;
  i5 = _luaS_newlstr(i5, i4, 8) | 0;
  HEAP32[i8 >> 2] = i5;
  HEAP32[i8 + 8 >> 2] = HEAPU8[i5 + 4 | 0] | 0 | 64;
  i5 = _addk(i1, (HEAP32[i7 >> 2] | 0) + -16 | 0, i3) | 0;
  HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + -16;
  STACKTOP = i2;
  return i5 | 0;
 } else {
  i8 = _addk(i1, i3, i3) | 0;
  STACKTOP = i2;
  return i8 | 0;
 }
 return 0;
}
function _auxresume(i2, i3, i4) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 do {
  if ((_lua_checkstack(i3, i4) | 0) != 0) {
   if ((_lua_status(i3) | 0) == 0 ? (_lua_gettop(i3) | 0) == 0 : 0) {
    _lua_pushlstring(i2, 10792, 28) | 0;
    i4 = -1;
    break;
   }
   _lua_xmove(i2, i3, i4);
   if (!((_lua_resume(i3, i2, i4) | 0) >>> 0 < 2)) {
    _lua_xmove(i3, i2, 1);
    i4 = -1;
    break;
   }
   i4 = _lua_gettop(i3) | 0;
   if ((_lua_checkstack(i2, i4 + 1 | 0) | 0) == 0) {
    _lua_settop(i3, ~i4);
    _lua_pushlstring(i2, 10824, 26) | 0;
    i4 = -1;
    break;
   } else {
    _lua_xmove(i3, i2, i4);
    break;
   }
  } else {
   _lua_pushlstring(i2, 10760, 28) | 0;
   i4 = -1;
  }
 } while (0);
 STACKTOP = i1;
 return i4 | 0;
}
function _luaX_setinput(i2, i1, i4, i3, i5) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i6 = 0, i7 = 0;
 i6 = STACKTOP;
 HEAP8[i1 + 76 | 0] = 46;
 i7 = i1 + 52 | 0;
 HEAP32[i7 >> 2] = i2;
 HEAP32[i1 >> 2] = i5;
 HEAP32[i1 + 32 >> 2] = 286;
 HEAP32[i1 + 56 >> 2] = i4;
 HEAP32[i1 + 48 >> 2] = 0;
 HEAP32[i1 + 4 >> 2] = 1;
 HEAP32[i1 + 8 >> 2] = 1;
 HEAP32[i1 + 68 >> 2] = i3;
 i5 = _luaS_new(i2, 12264) | 0;
 HEAP32[i1 + 72 >> 2] = i5;
 i5 = i5 + 5 | 0;
 HEAP8[i5] = HEAPU8[i5] | 0 | 32;
 i5 = i1 + 60 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 i4 = _luaM_realloc_(HEAP32[i7 >> 2] | 0, HEAP32[i4 >> 2] | 0, HEAP32[i4 + 8 >> 2] | 0, 32) | 0;
 HEAP32[HEAP32[i5 >> 2] >> 2] = i4;
 HEAP32[(HEAP32[i5 >> 2] | 0) + 8 >> 2] = 32;
 STACKTOP = i6;
 return;
}
function _luaL_optlstring(i2, i4, i6, i5) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 if ((_lua_type(i2, i4) | 0) >= 1) {
  i5 = _lua_tolstring(i2, i4, i5) | 0;
  if ((i5 | 0) != 0) {
   i6 = i5;
   STACKTOP = i1;
   return i6 | 0;
  }
  i5 = _lua_typename(i2, 4) | 0;
  i6 = _lua_typename(i2, _lua_type(i2, i4) | 0) | 0;
  HEAP32[i3 >> 2] = i5;
  HEAP32[i3 + 4 >> 2] = i6;
  _luaL_argerror(i2, i4, _lua_pushfstring(i2, 1744, i3) | 0) | 0;
  i6 = 0;
  STACKTOP = i1;
  return i6 | 0;
 }
 if ((i5 | 0) == 0) {
  STACKTOP = i1;
  return i6 | 0;
 }
 if ((i6 | 0) == 0) {
  i2 = 0;
 } else {
  i2 = _strlen(i6 | 0) | 0;
 }
 HEAP32[i5 >> 2] = i2;
 STACKTOP = i1;
 return i6 | 0;
}
function _lua_xmove(i3, i4, i1) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 if ((i3 | 0) == (i4 | 0)) {
  STACKTOP = i2;
  return;
 }
 i3 = i3 + 8 | 0;
 i5 = (HEAP32[i3 >> 2] | 0) + (0 - i1 << 4) | 0;
 HEAP32[i3 >> 2] = i5;
 if ((i1 | 0) <= 0) {
  STACKTOP = i2;
  return;
 }
 i4 = i4 + 8 | 0;
 i6 = 0;
 while (1) {
  i7 = HEAP32[i4 >> 2] | 0;
  HEAP32[i4 >> 2] = i7 + 16;
  i10 = i5 + (i6 << 4) | 0;
  i9 = HEAP32[i10 + 4 >> 2] | 0;
  i8 = i7;
  HEAP32[i8 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i8 + 4 >> 2] = i9;
  HEAP32[i7 + 8 >> 2] = HEAP32[i5 + (i6 << 4) + 8 >> 2];
  i6 = i6 + 1 | 0;
  if ((i6 | 0) == (i1 | 0)) {
   break;
  }
  i5 = HEAP32[i3 >> 2] | 0;
 }
 STACKTOP = i2;
 return;
}
function _luaM_realloc_(i7, i10, i3, i2) {
 i7 = i7 | 0;
 i10 = i10 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0;
 i5 = STACKTOP;
 i6 = HEAP32[i7 + 12 >> 2] | 0;
 i4 = (i10 | 0) != 0;
 i9 = i6 + 4 | 0;
 i8 = FUNCTION_TABLE_iiiii[HEAP32[i6 >> 2] & 3](HEAP32[i9 >> 2] | 0, i10, i3, i2) | 0;
 if (!((i8 | 0) != 0 | (i2 | 0) == 0)) {
  if ((HEAP8[i6 + 63 | 0] | 0) == 0) {
   _luaD_throw(i7, 4);
  }
  _luaC_fullgc(i7, 1);
  i8 = FUNCTION_TABLE_iiiii[HEAP32[i6 >> 2] & 3](HEAP32[i9 >> 2] | 0, i10, i3, i2) | 0;
  if ((i8 | 0) == 0) {
   _luaD_throw(i7, 4);
  } else {
   i1 = i8;
  }
 } else {
  i1 = i8;
 }
 i6 = i6 + 12 | 0;
 HEAP32[i6 >> 2] = (i4 ? 0 - i3 | 0 : 0) + i2 + (HEAP32[i6 >> 2] | 0);
 STACKTOP = i5;
 return i1 | 0;
}
function _realloc(i2, i3) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i5 = 0;
 i1 = STACKTOP;
 do {
  if ((i2 | 0) != 0) {
   if (i3 >>> 0 > 4294967231) {
    HEAP32[(___errno_location() | 0) >> 2] = 12;
    i4 = 0;
    break;
   }
   if (i3 >>> 0 < 11) {
    i4 = 16;
   } else {
    i4 = i3 + 11 & -8;
   }
   i4 = _try_realloc_chunk(i2 + -8 | 0, i4) | 0;
   if ((i4 | 0) != 0) {
    i4 = i4 + 8 | 0;
    break;
   }
   i4 = _malloc(i3) | 0;
   if ((i4 | 0) == 0) {
    i4 = 0;
   } else {
    i5 = HEAP32[i2 + -4 >> 2] | 0;
    i5 = (i5 & -8) - ((i5 & 3 | 0) == 0 ? 8 : 4) | 0;
    _memcpy(i4 | 0, i2 | 0, (i5 >>> 0 < i3 >>> 0 ? i5 : i3) | 0) | 0;
    _free(i2);
   }
  } else {
   i4 = _malloc(i3) | 0;
  }
 } while (0);
 STACKTOP = i1;
 return i4 | 0;
}
function _lua_setlocal(i3, i5, i4) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 HEAP32[i2 >> 2] = 0;
 i4 = _findlocal(i3, HEAP32[i5 + 96 >> 2] | 0, i4, i2) | 0;
 i3 = i3 + 8 | 0;
 if ((i4 | 0) == 0) {
  i5 = HEAP32[i3 >> 2] | 0;
  i5 = i5 + -16 | 0;
  HEAP32[i3 >> 2] = i5;
  STACKTOP = i1;
  return i4 | 0;
 }
 i6 = HEAP32[i3 >> 2] | 0;
 i5 = HEAP32[i2 >> 2] | 0;
 i8 = i6 + -16 | 0;
 i7 = HEAP32[i8 + 4 >> 2] | 0;
 i2 = i5;
 HEAP32[i2 >> 2] = HEAP32[i8 >> 2];
 HEAP32[i2 + 4 >> 2] = i7;
 HEAP32[i5 + 8 >> 2] = HEAP32[i6 + -8 >> 2];
 i5 = HEAP32[i3 >> 2] | 0;
 i5 = i5 + -16 | 0;
 HEAP32[i3 >> 2] = i5;
 STACKTOP = i1;
 return i4 | 0;
}
function ___remdi3(i1, i4, i5, i6) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 8 | 0;
 i2 = i3 | 0;
 i7 = i4 >> 31 | ((i4 | 0) < 0 ? -1 : 0) << 1;
 i8 = ((i4 | 0) < 0 ? -1 : 0) >> 31 | ((i4 | 0) < 0 ? -1 : 0) << 1;
 i9 = i6 >> 31 | ((i6 | 0) < 0 ? -1 : 0) << 1;
 i10 = ((i6 | 0) < 0 ? -1 : 0) >> 31 | ((i6 | 0) < 0 ? -1 : 0) << 1;
 i1 = _i64Subtract(i7 ^ i1, i8 ^ i4, i7, i8) | 0;
 i4 = tempRet0;
 ___udivmoddi4(i1, i4, _i64Subtract(i9 ^ i5, i10 ^ i6, i9, i10) | 0, tempRet0, i2) | 0;
 i9 = _i64Subtract(HEAP32[i2 >> 2] ^ i7, HEAP32[i2 + 4 >> 2] ^ i8, i7, i8) | 0;
 i8 = tempRet0;
 STACKTOP = i3;
 return (tempRet0 = i8, i9) | 0;
}
function _luaC_barrierproto_(i3, i4, i2) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i5 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i4 + 32 >> 2] | 0) != 0) {
  i5 = HEAP32[i3 + 12 >> 2] | 0;
  i3 = i4 + 5 | 0;
  HEAP8[i3] = HEAP8[i3] & 251;
  i5 = i5 + 88 | 0;
  HEAP32[i4 + 72 >> 2] = HEAP32[i5 >> 2];
  HEAP32[i5 >> 2] = i4;
  STACKTOP = i1;
  return;
 }
 if ((HEAP8[i2 + 5 | 0] & 3) == 0) {
  STACKTOP = i1;
  return;
 }
 i5 = i4 + 5 | 0;
 i4 = HEAP8[i5] | 0;
 if ((i4 & 4) == 0) {
  STACKTOP = i1;
  return;
 }
 i3 = HEAP32[i3 + 12 >> 2] | 0;
 if ((HEAPU8[i3 + 61 | 0] | 0) < 2) {
  _reallymarkobject(i3, i2);
  STACKTOP = i1;
  return;
 } else {
  HEAP8[i5] = HEAP8[i3 + 60 | 0] & 3 | i4 & 184;
  STACKTOP = i1;
  return;
 }
}
function _luaL_openlibs(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_requiref(i1, 2592, 144, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2600, 145, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2608, 146, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2624, 147, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2632, 148, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2640, 149, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2648, 150, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2656, 151, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2664, 152, 1);
 _lua_settop(i1, -2);
 _luaL_requiref(i1, 2672, 153, 1);
 _lua_settop(i1, -2);
 _luaL_getsubtable(i1, -1001e3, 2576) | 0;
 _lua_settop(i1, -2);
 STACKTOP = i2;
 return;
}
function _luaX_token2str(i4, i3) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i5 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i1;
 if ((i3 | 0) >= 257) {
  i5 = HEAP32[12096 + (i3 + -257 << 2) >> 2] | 0;
  if ((i3 | 0) >= 286) {
   STACKTOP = i1;
   return i5 | 0;
  }
  i4 = HEAP32[i4 + 52 >> 2] | 0;
  HEAP32[i2 >> 2] = i5;
  i5 = _luaO_pushfstring(i4, 12256, i2) | 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 i4 = HEAP32[i4 + 52 >> 2] | 0;
 if ((HEAP8[i3 + 10913 | 0] & 4) == 0) {
  HEAP32[i2 >> 2] = i3;
  i5 = _luaO_pushfstring(i4, 12240, i2) | 0;
  STACKTOP = i1;
  return i5 | 0;
 } else {
  HEAP32[i2 >> 2] = i3;
  i5 = _luaO_pushfstring(i4, 12232, i2) | 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 return 0;
}
function _luaL_buffinitsize(i6, i1, i7) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i8 = 0;
 i2 = STACKTOP;
 HEAP32[i1 + 12 >> 2] = i6;
 i3 = i1 + 16 | 0;
 HEAP32[i1 >> 2] = i3;
 i5 = i1 + 8 | 0;
 HEAP32[i5 >> 2] = 0;
 i4 = i1 + 4 | 0;
 HEAP32[i4 >> 2] = 1024;
 if (!(i7 >>> 0 > 1024)) {
  i7 = i3;
  i8 = 0;
  i8 = i7 + i8 | 0;
  STACKTOP = i2;
  return i8 | 0;
 }
 i8 = i7 >>> 0 > 2048 ? i7 : 2048;
 i7 = _lua_newuserdata(i6, i8) | 0;
 _memcpy(i7 | 0, HEAP32[i1 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
 if ((HEAP32[i1 >> 2] | 0) != (i3 | 0)) {
  _lua_remove(i6, -2);
 }
 HEAP32[i1 >> 2] = i7;
 HEAP32[i4 >> 2] = i8;
 i8 = HEAP32[i5 >> 2] | 0;
 i8 = i7 + i8 | 0;
 STACKTOP = i2;
 return i8 | 0;
}
function _luaE_freethread(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 i4 = i3 + 28 | 0;
 _luaF_close(i3, HEAP32[i4 >> 2] | 0);
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 0) {
  _luaM_realloc_(i1, i3, 112, 0) | 0;
  STACKTOP = i2;
  return;
 }
 HEAP32[i3 + 16 >> 2] = i3 + 72;
 i7 = i3 + 84 | 0;
 i6 = HEAP32[i7 >> 2] | 0;
 HEAP32[i7 >> 2] = 0;
 if ((i6 | 0) != 0) {
  while (1) {
   i5 = HEAP32[i6 + 12 >> 2] | 0;
   _luaM_realloc_(i3, i6, 40, 0) | 0;
   if ((i5 | 0) == 0) {
    break;
   } else {
    i6 = i5;
   }
  }
  i5 = HEAP32[i4 >> 2] | 0;
 }
 _luaM_realloc_(i3, i5, HEAP32[i3 + 32 >> 2] << 4, 0) | 0;
 _luaM_realloc_(i1, i3, 112, 0) | 0;
 STACKTOP = i2;
 return;
}
function ___toread(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i3 = STACKTOP;
 i4 = i1 + 74 | 0;
 i2 = HEAP8[i4] | 0;
 HEAP8[i4] = i2 + 255 | i2;
 i4 = i1 + 20 | 0;
 i2 = i1 + 44 | 0;
 if ((HEAP32[i4 >> 2] | 0) >>> 0 > (HEAP32[i2 >> 2] | 0) >>> 0) {
  FUNCTION_TABLE_iiii[HEAP32[i1 + 36 >> 2] & 3](i1, 0, 0) | 0;
 }
 HEAP32[i1 + 16 >> 2] = 0;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i4 >> 2] = 0;
 i4 = HEAP32[i1 >> 2] | 0;
 if ((i4 & 20 | 0) == 0) {
  i4 = HEAP32[i2 >> 2] | 0;
  HEAP32[i1 + 8 >> 2] = i4;
  HEAP32[i1 + 4 >> 2] = i4;
  i4 = 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 if ((i4 & 4 | 0) == 0) {
  i4 = -1;
  STACKTOP = i3;
  return i4 | 0;
 }
 HEAP32[i1 >> 2] = i4 | 32;
 i4 = -1;
 STACKTOP = i3;
 return i4 | 0;
}
function _lua_callk(i3, i7, i4, i6, i5) {
 i3 = i3 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i8 = 0;
 i1 = STACKTOP;
 i2 = i3 + 8 | 0;
 i7 = (HEAP32[i2 >> 2] | 0) + (~i7 << 4) | 0;
 if ((i5 | 0) != 0 ? (HEAP16[i3 + 36 >> 1] | 0) == 0 : 0) {
  i8 = i3 + 16 | 0;
  HEAP32[(HEAP32[i8 >> 2] | 0) + 28 >> 2] = i5;
  HEAP32[(HEAP32[i8 >> 2] | 0) + 24 >> 2] = i6;
  _luaD_call(i3, i7, i4, 1);
 } else {
  _luaD_call(i3, i7, i4, 0);
 }
 if (!((i4 | 0) == -1)) {
  STACKTOP = i1;
  return;
 }
 i3 = (HEAP32[i3 + 16 >> 2] | 0) + 4 | 0;
 i2 = HEAP32[i2 >> 2] | 0;
 if (!((HEAP32[i3 >> 2] | 0) >>> 0 < i2 >>> 0)) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i3 >> 2] = i2;
 STACKTOP = i1;
 return;
}
function _luaX_newstring(i3, i5, i4) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i6 = 0;
 i1 = STACKTOP;
 i2 = HEAP32[i3 + 52 >> 2] | 0;
 i5 = _luaS_newlstr(i2, i5, i4) | 0;
 i4 = i2 + 8 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = i6 + 16;
 HEAP32[i6 >> 2] = i5;
 HEAP32[i6 + 8 >> 2] = HEAPU8[i5 + 4 | 0] | 0 | 64;
 i6 = _luaH_set(i2, HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 4 >> 2] | 0, (HEAP32[i4 >> 2] | 0) + -16 | 0) | 0;
 i3 = i6 + 8 | 0;
 if ((HEAP32[i3 >> 2] | 0) == 0 ? (HEAP32[i6 >> 2] = 1, HEAP32[i3 >> 2] = 1, (HEAP32[(HEAP32[i2 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) : 0) {
  _luaC_step(i2);
 }
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -16;
 STACKTOP = i1;
 return i5 | 0;
}
function _strtod(i3, i2) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, d5 = 0.0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i1;
 i7 = i4 + 0 | 0;
 i6 = i7 + 112 | 0;
 do {
  HEAP32[i7 >> 2] = 0;
  i7 = i7 + 4 | 0;
 } while ((i7 | 0) < (i6 | 0));
 i6 = i4 + 4 | 0;
 HEAP32[i6 >> 2] = i3;
 i7 = i4 + 8 | 0;
 HEAP32[i7 >> 2] = -1;
 HEAP32[i4 + 44 >> 2] = i3;
 HEAP32[i4 + 76 >> 2] = -1;
 ___shlim(i4, 0);
 d5 = +___floatscan(i4, 1, 1);
 i4 = (HEAP32[i6 >> 2] | 0) - (HEAP32[i7 >> 2] | 0) + (HEAP32[i4 + 108 >> 2] | 0) | 0;
 if ((i2 | 0) == 0) {
  STACKTOP = i1;
  return +d5;
 }
 if ((i4 | 0) != 0) {
  i3 = i3 + i4 | 0;
 }
 HEAP32[i2 >> 2] = i3;
 STACKTOP = i1;
 return +d5;
}
function _f_seek(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = 0.0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i3 = HEAP32[i3 >> 2] | 0;
 i5 = _luaL_checkoption(i1, 2, 3208, 3184) | 0;
 d6 = +_luaL_optnumber(i1, 3, 0.0);
 i4 = ~~d6;
 if (!(+(i4 | 0) == d6)) {
  _luaL_argerror(i1, 3, 3224) | 0;
 }
 if ((_fseek(i3 | 0, i4 | 0, HEAP32[3168 + (i5 << 2) >> 2] | 0) | 0) == 0) {
  _lua_pushnumber(i1, +(_ftell(i3 | 0) | 0));
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 } else {
  i5 = _luaL_fileresult(i1, 0, 0) | 0;
  STACKTOP = i2;
  return i5 | 0;
 }
 return 0;
}
function _setpath(i1, i4, i8, i7, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 i3 = i3 | 0;
 var i2 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i8 = _getenv(i8 | 0) | 0;
 if ((i8 | 0) == 0) {
  i7 = _getenv(i7 | 0) | 0;
  if ((i7 | 0) != 0) {
   i5 = i7;
   i6 = 3;
  }
 } else {
  i5 = i8;
  i6 = 3;
 }
 if ((i6 | 0) == 3 ? (_lua_getfield(i1, -1001e3, 4832), i8 = _lua_toboolean(i1, -1) | 0, _lua_settop(i1, -2), (i8 | 0) == 0) : 0) {
  _luaL_gsub(i1, _luaL_gsub(i1, i5, 4808, 4816) | 0, 4824, i3) | 0;
  _lua_remove(i1, -2);
  _lua_setfield(i1, -2, i4);
  STACKTOP = i2;
  return;
 }
 _lua_pushstring(i1, i3) | 0;
 _lua_setfield(i1, -2, i4);
 STACKTOP = i2;
 return;
}
function _luaU_header(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 HEAP8[i1] = 1635077147;
 HEAP8[i1 + 1 | 0] = 6387020;
 HEAP8[i1 + 2 | 0] = 24949;
 HEAP8[i1 + 3 | 0] = 97;
 HEAP8[i1 + 4 | 0] = 82;
 HEAP8[i1 + 5 | 0] = 0;
 HEAP8[i1 + 6 | 0] = 1;
 HEAP8[i1 + 7 | 0] = 4;
 HEAP8[i1 + 8 | 0] = 4;
 HEAP8[i1 + 9 | 0] = 4;
 HEAP8[i1 + 10 | 0] = 8;
 i3 = i1 + 12 | 0;
 HEAP8[i1 + 11 | 0] = 0;
 HEAP8[i3 + 0 | 0] = HEAP8[8816 | 0] | 0;
 HEAP8[i3 + 1 | 0] = HEAP8[8817 | 0] | 0;
 HEAP8[i3 + 2 | 0] = HEAP8[8818 | 0] | 0;
 HEAP8[i3 + 3 | 0] = HEAP8[8819 | 0] | 0;
 HEAP8[i3 + 4 | 0] = HEAP8[8820 | 0] | 0;
 HEAP8[i3 + 5 | 0] = HEAP8[8821 | 0] | 0;
 STACKTOP = i2;
 return;
}
function _db_setlocal(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i3 = i2;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i5 = _lua_tothread(i1, 1) | 0;
  i4 = 1;
 } else {
  i5 = i1;
  i4 = 0;
 }
 i6 = i4 + 1 | 0;
 if ((_lua_getstack(i5, _luaL_checkinteger(i1, i6) | 0, i3) | 0) == 0) {
  i6 = _luaL_argerror(i1, i6, 11560) | 0;
  STACKTOP = i2;
  return i6 | 0;
 } else {
  i6 = i4 + 3 | 0;
  _luaL_checkany(i1, i6);
  _lua_settop(i1, i6);
  _lua_xmove(i1, i5, 1);
  _lua_pushstring(i1, _lua_setlocal(i5, i3, _luaL_checkinteger(i1, i4 | 2) | 0) | 0) | 0;
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 }
 return 0;
}
function _tremove(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 i3 = _luaL_len(i1, 1) | 0;
 i4 = _luaL_optinteger(i1, 2, i3) | 0;
 if ((i4 | 0) != (i3 | 0) ? (i4 | 0) < 1 | (i4 | 0) > (i3 + 1 | 0) : 0) {
  _luaL_argerror(i1, 1, 8256) | 0;
 }
 _lua_rawgeti(i1, 1, i4);
 if ((i4 | 0) >= (i3 | 0)) {
  i5 = i4;
  _lua_pushnil(i1);
  _lua_rawseti(i1, 1, i5);
  STACKTOP = i2;
  return 1;
 }
 while (1) {
  i5 = i4 + 1 | 0;
  _lua_rawgeti(i1, 1, i5);
  _lua_rawseti(i1, 1, i4);
  if ((i5 | 0) == (i3 | 0)) {
   break;
  } else {
   i4 = i5;
  }
 }
 _lua_pushnil(i1);
 _lua_rawseti(i1, 1, i3);
 STACKTOP = i2;
 return 1;
}
function _luaL_checkudata(i1, i7, i5) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = _lua_touserdata(i1, i7) | 0;
 if (((i3 | 0) != 0 ? (_lua_getmetatable(i1, i7) | 0) != 0 : 0) ? (_lua_getfield(i1, -1001e3, i5), i6 = (_lua_rawequal(i1, -1, -2) | 0) == 0, i6 = i6 ? 0 : i3, _lua_settop(i1, -3), (i6 | 0) != 0) : 0) {
  i7 = i6;
  STACKTOP = i2;
  return i7 | 0;
 }
 i6 = _lua_typename(i1, _lua_type(i1, i7) | 0) | 0;
 HEAP32[i4 >> 2] = i5;
 HEAP32[i4 + 4 >> 2] = i6;
 _luaL_argerror(i1, i7, _lua_pushfstring(i1, 1744, i4) | 0) | 0;
 i7 = 0;
 STACKTOP = i2;
 return i7 | 0;
}
function _luaL_error(i1, i5, i7) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i7 = i7 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 128 | 0;
 i3 = i4;
 i2 = i4 + 24 | 0;
 i4 = i4 + 8 | 0;
 HEAP32[i4 >> 2] = i7;
 if ((_lua_getstack(i1, 1, i2) | 0) != 0 ? (_lua_getinfo(i1, 1152, i2) | 0, i6 = HEAP32[i2 + 20 >> 2] | 0, (i6 | 0) > 0) : 0) {
  HEAP32[i3 >> 2] = i2 + 36;
  HEAP32[i3 + 4 >> 2] = i6;
  _lua_pushfstring(i1, 1160, i3) | 0;
  _lua_pushvfstring(i1, i5, i4) | 0;
  _lua_concat(i1, 2);
  _lua_error(i1) | 0;
 }
 _lua_pushlstring(i1, 1168, 0) | 0;
 _lua_pushvfstring(i1, i5, i4) | 0;
 _lua_concat(i1, 2);
 _lua_error(i1) | 0;
 return 0;
}
function _luaK_infix(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 L1 : do {
  switch (i4 | 0) {
  case 6:
   {
    _luaK_exp2nextreg(i1, i3);
    break;
   }
  case 5:
  case 4:
  case 3:
  case 2:
  case 1:
  case 0:
   {
    if (((HEAP32[i3 >> 2] | 0) == 5 ? (HEAP32[i3 + 16 >> 2] | 0) == -1 : 0) ? (HEAP32[i3 + 20 >> 2] | 0) == -1 : 0) {
     break L1;
    }
    _luaK_exp2RK(i1, i3) | 0;
    break;
   }
  case 13:
   {
    _luaK_goiftrue(i1, i3);
    break;
   }
  case 14:
   {
    _luaK_goiffalse(i1, i3);
    break;
   }
  default:
   {
    _luaK_exp2RK(i1, i3) | 0;
   }
  }
 } while (0);
 STACKTOP = i2;
 return;
}
function _luaD_shrinkstack(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 8 >> 2] | 0;
 i3 = HEAP32[i1 + 16 >> 2] | 0;
 if ((i3 | 0) != 0) {
  do {
   i5 = HEAP32[i3 + 4 >> 2] | 0;
   i4 = i4 >>> 0 < i5 >>> 0 ? i5 : i4;
   i3 = HEAP32[i3 + 8 >> 2] | 0;
  } while ((i3 | 0) != 0);
 }
 i3 = i4 - (HEAP32[i1 + 28 >> 2] | 0) | 0;
 i4 = (i3 >> 4) + 1 | 0;
 i4 = ((i4 | 0) / 8 | 0) + 10 + i4 | 0;
 i4 = (i4 | 0) > 1e6 ? 1e6 : i4;
 if ((i3 | 0) > 15999984) {
  STACKTOP = i2;
  return;
 }
 if ((i4 | 0) >= (HEAP32[i1 + 32 >> 2] | 0)) {
  STACKTOP = i2;
  return;
 }
 _luaD_reallocstack(i1, i4);
 STACKTOP = i2;
 return;
}
function _luaF_newproto(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _luaC_newobj(i1, 9, 80, 0, 0) | 0;
 HEAP32[i1 + 8 >> 2] = 0;
 HEAP32[i1 + 44 >> 2] = 0;
 HEAP32[i1 + 16 >> 2] = 0;
 HEAP32[i1 + 56 >> 2] = 0;
 HEAP32[i1 + 12 >> 2] = 0;
 HEAP32[i1 + 32 >> 2] = 0;
 HEAP32[i1 + 48 >> 2] = 0;
 HEAP32[i1 + 20 >> 2] = 0;
 HEAP32[i1 + 52 >> 2] = 0;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 40 >> 2] = 0;
 HEAP8[i1 + 76 | 0] = 0;
 HEAP8[i1 + 77 | 0] = 0;
 HEAP8[i1 + 78 | 0] = 0;
 HEAP32[i1 + 24 >> 2] = 0;
 HEAP32[i1 + 60 >> 2] = 0;
 HEAP32[i1 + 64 >> 2] = 0;
 HEAP32[i1 + 68 >> 2] = 0;
 HEAP32[i1 + 36 >> 2] = 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaF_freeproto(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 _luaM_realloc_(i2, HEAP32[i1 + 12 >> 2] | 0, HEAP32[i1 + 48 >> 2] << 2, 0) | 0;
 _luaM_realloc_(i2, HEAP32[i1 + 16 >> 2] | 0, HEAP32[i1 + 56 >> 2] << 2, 0) | 0;
 _luaM_realloc_(i2, HEAP32[i1 + 8 >> 2] | 0, HEAP32[i1 + 44 >> 2] << 4, 0) | 0;
 _luaM_realloc_(i2, HEAP32[i1 + 20 >> 2] | 0, HEAP32[i1 + 52 >> 2] << 2, 0) | 0;
 _luaM_realloc_(i2, HEAP32[i1 + 24 >> 2] | 0, (HEAP32[i1 + 60 >> 2] | 0) * 12 | 0, 0) | 0;
 _luaM_realloc_(i2, HEAP32[i1 + 28 >> 2] | 0, HEAP32[i1 + 40 >> 2] << 3, 0) | 0;
 _luaM_realloc_(i2, i1, 80, 0) | 0;
 STACKTOP = i3;
 return;
}
function _luaK_patchclose(i3, i7, i4) {
 i3 = i3 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i6 = 0, i8 = 0;
 i2 = STACKTOP;
 if ((i7 | 0) == -1) {
  STACKTOP = i2;
  return;
 }
 i3 = HEAP32[(HEAP32[i3 >> 2] | 0) + 12 >> 2] | 0;
 i4 = (i4 << 6) + 64 & 16320;
 while (1) {
  i6 = i3 + (i7 << 2) | 0;
  i5 = HEAP32[i6 >> 2] | 0;
  i8 = (i5 >>> 14) + -131071 | 0;
  if ((i8 | 0) == -1) {
   break;
  }
  i7 = i7 + 1 + i8 | 0;
  HEAP32[i6 >> 2] = i5 & -16321 | i4;
  if ((i7 | 0) == -1) {
   i1 = 6;
   break;
  }
 }
 if ((i1 | 0) == 6) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i6 >> 2] = i5 & -16321 | i4;
 STACKTOP = i2;
 return;
}
function _loadfunc(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i6 = _luaL_gsub(i1, i5, 4936, 4944) | 0;
 i5 = _strchr(i6, 45) | 0;
 do {
  if ((i5 | 0) != 0) {
   HEAP32[i3 >> 2] = _lua_pushlstring(i1, i6, i5 - i6 | 0) | 0;
   i6 = _ll_loadfunc(i1, i4, _lua_pushfstring(i1, 4952, i3) | 0) | 0;
   if ((i6 | 0) == 2) {
    i6 = i5 + 1 | 0;
    break;
   } else {
    STACKTOP = i2;
    return i6 | 0;
   }
  }
 } while (0);
 HEAP32[i3 >> 2] = i6;
 i6 = _ll_loadfunc(i1, i4, _lua_pushfstring(i1, 4952, i3) | 0) | 0;
 STACKTOP = i2;
 return i6 | 0;
}
function _luaK_setlist(i1, i3, i4, i5) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i4 = ((i4 + -1 | 0) / 50 | 0) + 1 | 0;
 i5 = (i5 | 0) == -1 ? 0 : i5;
 if ((i4 | 0) < 512) {
  _luaK_code(i1, i3 << 6 | i5 << 23 | i4 << 14 | 36) | 0;
  i4 = i3 + 1 | 0;
  i4 = i4 & 255;
  i5 = i1 + 48 | 0;
  HEAP8[i5] = i4;
  STACKTOP = i2;
  return;
 }
 if ((i4 | 0) >= 67108864) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10576);
 }
 _luaK_code(i1, i3 << 6 | i5 << 23 | 36) | 0;
 _luaK_code(i1, i4 << 6 | 39) | 0;
 i4 = i3 + 1 | 0;
 i4 = i4 & 255;
 i5 = i1 + 48 | 0;
 HEAP8[i5] = i4;
 STACKTOP = i2;
 return;
}
function _lua_getstack(i2, i6, i3) {
 i2 = i2 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i5 = 0;
 i1 = STACKTOP;
 L1 : do {
  if ((i6 | 0) >= 0) {
   i5 = HEAP32[i2 + 16 >> 2] | 0;
   if ((i6 | 0) > 0) {
    i4 = i2 + 72 | 0;
    do {
     if ((i5 | 0) == (i4 | 0)) {
      i2 = 0;
      break L1;
     }
     i6 = i6 + -1 | 0;
     i5 = HEAP32[i5 + 8 >> 2] | 0;
    } while ((i6 | 0) > 0);
    if ((i6 | 0) != 0) {
     i2 = 0;
     break;
    }
   }
   if ((i5 | 0) != (i2 + 72 | 0)) {
    HEAP32[i3 + 96 >> 2] = i5;
    i2 = 1;
   } else {
    i2 = 0;
   }
  } else {
   i2 = 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _luaC_checkupvalcolor(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = i5 + 5 | 0;
 i3 = HEAPU8[i4] | 0;
 if ((i3 & 7 | 0) != 0) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP8[i1 + 62 | 0] | 0) != 2 ? (HEAPU8[i1 + 61 | 0] | 0) >= 2 : 0) {
  HEAP8[i4] = HEAP8[i1 + 60 | 0] & 3 | i3 & 184;
  STACKTOP = i2;
  return;
 }
 HEAP8[i4] = i3 & 187 | 4;
 i3 = HEAP32[i5 + 8 >> 2] | 0;
 if ((HEAP32[i3 + 8 >> 2] & 64 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i3 = HEAP32[i3 >> 2] | 0;
 if ((HEAP8[i3 + 5 | 0] & 3) == 0) {
  STACKTOP = i2;
  return;
 }
 _reallymarkobject(i1, i3);
 STACKTOP = i2;
 return;
}
function _luaB_collectgarbage(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[10160 + ((_luaL_checkoption(i1, 1, 10040, 9976) | 0) << 2) >> 2] | 0;
 i3 = _lua_gc(i1, i4, _luaL_optinteger(i1, 2, 0) | 0) | 0;
 if ((i4 | 0) == 3) {
  i4 = _lua_gc(i1, 4, 0) | 0;
  _lua_pushnumber(i1, +(i3 | 0) + +(i4 | 0) * .0009765625);
  _lua_pushinteger(i1, i4);
  i4 = 2;
  STACKTOP = i2;
  return i4 | 0;
 } else if ((i4 | 0) == 9 | (i4 | 0) == 5) {
  _lua_pushboolean(i1, i3);
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  _lua_pushinteger(i1, i3);
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
function _maxn(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0, d4 = 0.0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 _lua_pushnil(i1);
 L1 : do {
  if ((_lua_next(i1, 1) | 0) == 0) {
   d3 = 0.0;
  } else {
   d4 = 0.0;
   while (1) {
    while (1) {
     _lua_settop(i1, -2);
     if ((_lua_type(i1, -1) | 0) == 3 ? (d3 = +_lua_tonumberx(i1, -1, 0), d3 > d4) : 0) {
      break;
     }
     if ((_lua_next(i1, 1) | 0) == 0) {
      d3 = d4;
      break L1;
     }
    }
    if ((_lua_next(i1, 1) | 0) == 0) {
     break;
    } else {
     d4 = d3;
    }
   }
  }
 } while (0);
 _lua_pushnumber(i1, d3);
 STACKTOP = i2;
 return 1;
}
function _str_char(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1040 | 0;
 i4 = i2;
 i3 = _lua_gettop(i1) | 0;
 i5 = _luaL_buffinitsize(i1, i4, i3) | 0;
 if ((i3 | 0) < 1) {
  _luaL_pushresultsize(i4, i3);
  STACKTOP = i2;
  return 1;
 } else {
  i6 = 1;
 }
 while (1) {
  i7 = _luaL_checkinteger(i1, i6) | 0;
  if ((i7 & 255 | 0) != (i7 | 0)) {
   _luaL_argerror(i1, i6, 7920) | 0;
  }
  HEAP8[i5 + (i6 + -1) | 0] = i7;
  if ((i6 | 0) == (i3 | 0)) {
   break;
  } else {
   i6 = i6 + 1 | 0;
  }
 }
 _luaL_pushresultsize(i4, i3);
 STACKTOP = i2;
 return 1;
}
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 _luaK_exp2val(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i2 = STACKTOP;
 i3 = i5 + 16 | 0;
 i4 = i5 + 20 | 0;
 if ((HEAP32[i3 >> 2] | 0) == (HEAP32[i4 >> 2] | 0)) {
  _luaK_dischargevars(i1, i5);
  STACKTOP = i2;
  return;
 }
 _luaK_dischargevars(i1, i5);
 if ((HEAP32[i5 >> 2] | 0) == 6) {
  i6 = HEAP32[i5 + 8 >> 2] | 0;
  if ((HEAP32[i3 >> 2] | 0) == (HEAP32[i4 >> 2] | 0)) {
   STACKTOP = i2;
   return;
  }
  if ((i6 | 0) >= (HEAPU8[i1 + 46 | 0] | 0 | 0)) {
   _exp2reg(i1, i5, i6);
   STACKTOP = i2;
   return;
  }
 }
 _luaK_exp2nextreg(i1, i5);
 STACKTOP = i2;
 return;
}
function _str_reverse(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i4 = i2 + 1040 | 0;
 i1 = i2;
 i3 = _luaL_checklstring(i5, 1, i4) | 0;
 i5 = _luaL_buffinitsize(i5, i1, HEAP32[i4 >> 2] | 0) | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 if ((i6 | 0) == 0) {
  i7 = 0;
  _luaL_pushresultsize(i1, i7);
  STACKTOP = i2;
  return 1;
 } else {
  i7 = 0;
 }
 do {
  HEAP8[i5 + i7 | 0] = HEAP8[i3 + (i6 + ~i7) | 0] | 0;
  i7 = i7 + 1 | 0;
  i6 = HEAP32[i4 >> 2] | 0;
 } while (i7 >>> 0 < i6 >>> 0);
 _luaL_pushresultsize(i1, i6);
 STACKTOP = i2;
 return 1;
}
function _str_upper(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i4 = i1 + 1040 | 0;
 i2 = i1;
 i3 = _luaL_checklstring(i5, 1, i4) | 0;
 i5 = _luaL_buffinitsize(i5, i2, HEAP32[i4 >> 2] | 0) | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  i7 = 0;
  _luaL_pushresultsize(i2, i7);
  STACKTOP = i1;
  return 1;
 } else {
  i6 = 0;
 }
 do {
  HEAP8[i5 + i6 | 0] = _toupper(HEAPU8[i3 + i6 | 0] | 0 | 0) | 0;
  i6 = i6 + 1 | 0;
  i7 = HEAP32[i4 >> 2] | 0;
 } while (i6 >>> 0 < i7 >>> 0);
 _luaL_pushresultsize(i2, i7);
 STACKTOP = i1;
 return 1;
}
function _str_lower(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i4 = i1 + 1040 | 0;
 i2 = i1;
 i3 = _luaL_checklstring(i5, 1, i4) | 0;
 i5 = _luaL_buffinitsize(i5, i2, HEAP32[i4 >> 2] | 0) | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  i7 = 0;
  _luaL_pushresultsize(i2, i7);
  STACKTOP = i1;
  return 1;
 } else {
  i6 = 0;
 }
 do {
  HEAP8[i5 + i6 | 0] = _tolower(HEAPU8[i3 + i6 | 0] | 0 | 0) | 0;
  i6 = i6 + 1 | 0;
  i7 = HEAP32[i4 >> 2] | 0;
 } while (i6 >>> 0 < i7 >>> 0);
 _luaL_pushresultsize(i2, i7);
 STACKTOP = i1;
 return 1;
}
function ___divdi3(i1, i2, i3, i4) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i5 = i2 >> 31 | ((i2 | 0) < 0 ? -1 : 0) << 1;
 i6 = ((i2 | 0) < 0 ? -1 : 0) >> 31 | ((i2 | 0) < 0 ? -1 : 0) << 1;
 i7 = i4 >> 31 | ((i4 | 0) < 0 ? -1 : 0) << 1;
 i8 = ((i4 | 0) < 0 ? -1 : 0) >> 31 | ((i4 | 0) < 0 ? -1 : 0) << 1;
 i1 = _i64Subtract(i5 ^ i1, i6 ^ i2, i5, i6) | 0;
 i2 = tempRet0;
 i5 = i7 ^ i5;
 i6 = i8 ^ i6;
 i7 = _i64Subtract((___udivmoddi4(i1, i2, _i64Subtract(i7 ^ i3, i8 ^ i4, i7, i8) | 0, tempRet0, 0) | 0) ^ i5, tempRet0 ^ i6, i5, i6) | 0;
 return i7 | 0;
}
function _luaK_setoneret(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i4 >> 2] | 0;
 if ((i3 | 0) == 13) {
  i3 = (HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i4 + 8 >> 2] << 2) | 0;
  HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & 8388607 | 16777216;
  HEAP32[i4 >> 2] = 11;
  STACKTOP = i2;
  return;
 } else if ((i3 | 0) == 12) {
  HEAP32[i4 >> 2] = 6;
  i4 = i4 + 8 | 0;
  HEAP32[i4 >> 2] = (HEAP32[(HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] | 0) + (HEAP32[i4 >> 2] << 2) >> 2] | 0) >>> 6 & 255;
  STACKTOP = i2;
  return;
 } else {
  STACKTOP = i2;
  return;
 }
}
function _luaV_tostring(i6, i1) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i3 = i2;
 i4 = i2 + 8 | 0;
 i5 = i1 + 8 | 0;
 if ((HEAP32[i5 >> 2] | 0) != 3) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 HEAPF64[tempDoublePtr >> 3] = +HEAPF64[i1 >> 3];
 HEAP32[i3 >> 2] = HEAP32[tempDoublePtr >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
 i6 = _luaS_newlstr(i6, i4, _sprintf(i4 | 0, 8936, i3 | 0) | 0) | 0;
 HEAP32[i1 >> 2] = i6;
 HEAP32[i5 >> 2] = HEAPU8[i6 + 4 | 0] | 0 | 64;
 i6 = 1;
 STACKTOP = i2;
 return i6 | 0;
}
function _strcmp(i4, i2) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i5 = 0;
 i1 = STACKTOP;
 i5 = HEAP8[i4] | 0;
 i3 = HEAP8[i2] | 0;
 if (i5 << 24 >> 24 != i3 << 24 >> 24 | i5 << 24 >> 24 == 0 | i3 << 24 >> 24 == 0) {
  i4 = i5;
  i5 = i3;
  i4 = i4 & 255;
  i5 = i5 & 255;
  i5 = i4 - i5 | 0;
  STACKTOP = i1;
  return i5 | 0;
 }
 do {
  i4 = i4 + 1 | 0;
  i2 = i2 + 1 | 0;
  i5 = HEAP8[i4] | 0;
  i3 = HEAP8[i2] | 0;
 } while (!(i5 << 24 >> 24 != i3 << 24 >> 24 | i5 << 24 >> 24 == 0 | i3 << 24 >> 24 == 0));
 i4 = i5 & 255;
 i5 = i3 & 255;
 i5 = i4 - i5 | 0;
 STACKTOP = i1;
 return i5 | 0;
}
function _lua_pushstring(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 if ((i3 | 0) == 0) {
  i3 = i1 + 8 | 0;
  i1 = HEAP32[i3 >> 2] | 0;
  HEAP32[i1 + 8 >> 2] = 0;
  HEAP32[i3 >> 2] = i1 + 16;
  i3 = 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i3 = _luaS_new(i1, i3) | 0;
 i1 = i1 + 8 | 0;
 i4 = HEAP32[i1 >> 2] | 0;
 HEAP32[i4 >> 2] = i3;
 HEAP32[i4 + 8 >> 2] = HEAPU8[i3 + 4 | 0] | 0 | 64;
 HEAP32[i1 >> 2] = (HEAP32[i1 >> 2] | 0) + 16;
 i3 = i3 + 16 | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _luaK_exp2anyreg(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 _luaK_dischargevars(i1, i3);
 if ((HEAP32[i3 >> 2] | 0) == 6) {
  i5 = i3 + 8 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  if ((HEAP32[i3 + 16 >> 2] | 0) == (HEAP32[i3 + 20 >> 2] | 0)) {
   i5 = i4;
   STACKTOP = i2;
   return i5 | 0;
  }
  if ((i4 | 0) >= (HEAPU8[i1 + 46 | 0] | 0 | 0)) {
   _exp2reg(i1, i3, i4);
   i5 = HEAP32[i5 >> 2] | 0;
   STACKTOP = i2;
   return i5 | 0;
  }
 } else {
  i5 = i3 + 8 | 0;
 }
 _luaK_exp2nextreg(i1, i3);
 i5 = HEAP32[i5 >> 2] | 0;
 STACKTOP = i2;
 return i5 | 0;
}
function _check_match(i1, i4, i5, i6) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((HEAP32[i1 + 16 >> 2] | 0) == (i4 | 0)) {
  _luaX_next(i1);
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i1 + 4 >> 2] | 0) == (i6 | 0)) {
  _error_expected(i1, i4);
 } else {
  i2 = HEAP32[i1 + 52 >> 2] | 0;
  i4 = _luaX_token2str(i1, i4) | 0;
  i5 = _luaX_token2str(i1, i5) | 0;
  HEAP32[i3 >> 2] = i4;
  HEAP32[i3 + 4 >> 2] = i5;
  HEAP32[i3 + 8 >> 2] = i6;
  _luaX_syntaxerror(i1, _luaO_pushfstring(i2, 6840, i3) | 0);
 }
}
function _fieldsel(i1, i6) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i2;
 i5 = i1 + 48 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 _luaK_exp2anyregup(i4, i6);
 _luaX_next(i1);
 if ((HEAP32[i1 + 16 >> 2] | 0) == 288) {
  i7 = HEAP32[i1 + 24 >> 2] | 0;
  _luaX_next(i1);
  i5 = _luaK_stringK(HEAP32[i5 >> 2] | 0, i7) | 0;
  HEAP32[i3 + 16 >> 2] = -1;
  HEAP32[i3 + 20 >> 2] = -1;
  HEAP32[i3 >> 2] = 4;
  HEAP32[i3 + 8 >> 2] = i5;
  _luaK_indexed(i4, i6, i3);
  STACKTOP = i2;
  return;
 } else {
  _error_expected(i1, 288);
 }
}
function _luaK_exp2anyregup(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i3 >> 2] | 0) == 8 ? (HEAP32[i3 + 16 >> 2] | 0) == (HEAP32[i3 + 20 >> 2] | 0) : 0) {
  STACKTOP = i2;
  return;
 }
 _luaK_dischargevars(i1, i3);
 if ((HEAP32[i3 >> 2] | 0) == 6) {
  i4 = HEAP32[i3 + 8 >> 2] | 0;
  if ((HEAP32[i3 + 16 >> 2] | 0) == (HEAP32[i3 + 20 >> 2] | 0)) {
   STACKTOP = i2;
   return;
  }
  if ((i4 | 0) >= (HEAPU8[i1 + 46 | 0] | 0 | 0)) {
   _exp2reg(i1, i3, i4);
   STACKTOP = i2;
   return;
  }
 }
 _luaK_exp2nextreg(i1, i3);
 STACKTOP = i2;
 return;
}
function _lua_settop(i3, i5) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 if (!((i5 | 0) > -1)) {
  i4 = i3 + 8 | 0;
  HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + (i5 + 1 << 4);
  STACKTOP = i1;
  return;
 }
 i2 = i3 + 8 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 i3 = (HEAP32[HEAP32[i3 + 16 >> 2] >> 2] | 0) + (i5 + 1 << 4) | 0;
 if (i4 >>> 0 < i3 >>> 0) {
  while (1) {
   i5 = i4 + 16 | 0;
   HEAP32[i4 + 8 >> 2] = 0;
   if (i5 >>> 0 < i3 >>> 0) {
    i4 = i5;
   } else {
    break;
   }
  }
  HEAP32[i2 >> 2] = i5;
 }
 HEAP32[i2 >> 2] = i3;
 STACKTOP = i1;
 return;
}
function _luaL_fileresult(i1, i6, i5) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = HEAP32[(___errno_location() | 0) >> 2] | 0;
 if ((i6 | 0) != 0) {
  _lua_pushboolean(i1, 1);
  i6 = 1;
  STACKTOP = i2;
  return i6 | 0;
 }
 _lua_pushnil(i1);
 i6 = _strerror(i3 | 0) | 0;
 if ((i5 | 0) == 0) {
  _lua_pushstring(i1, i6) | 0;
 } else {
  HEAP32[i4 >> 2] = i5;
  HEAP32[i4 + 4 >> 2] = i6;
  _lua_pushfstring(i1, 1176, i4) | 0;
 }
 _lua_pushinteger(i1, i3);
 i6 = 3;
 STACKTOP = i2;
 return i6 | 0;
}
function _luaL_pushmodule(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 _luaL_findtable(i1, -1001e3, 1432, 1) | 0;
 _lua_getfield(i1, -1, i4);
 if ((_lua_type(i1, -1) | 0) == 5) {
  _lua_remove(i1, -2);
  STACKTOP = i2;
  return;
 }
 _lua_settop(i1, -2);
 _lua_rawgeti(i1, -1001e3, 2);
 if ((_luaL_findtable(i1, 0, i4, i5) | 0) != 0) {
  HEAP32[i3 >> 2] = i4;
  _luaL_error(i1, 1440, i3) | 0;
 }
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -3, i4);
 _lua_remove(i1, -2);
 STACKTOP = i2;
 return;
}
function _b_replace(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkunsigned(i1, 1) | 0;
 i5 = _luaL_checkunsigned(i1, 2) | 0;
 i4 = _luaL_checkinteger(i1, 3) | 0;
 i2 = _luaL_optinteger(i1, 4, 1) | 0;
 if (!((i4 | 0) > -1)) {
  _luaL_argerror(i1, 3, 10440) | 0;
 }
 if ((i2 | 0) <= 0) {
  _luaL_argerror(i1, 4, 10472) | 0;
 }
 if ((i2 + i4 | 0) > 32) {
  _luaL_error(i1, 10496, i6) | 0;
 }
 i2 = ~(-2 << i2 + -1);
 _lua_pushunsigned(i1, i3 & ~(i2 << i4) | (i5 & i2) << i4);
 STACKTOP = i6;
 return 1;
}
function _luaT_gettmbyobj(i1, i5, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i5 + 8 >> 2] & 15;
 if ((i4 | 0) == 5) {
  i4 = HEAP32[(HEAP32[i5 >> 2] | 0) + 8 >> 2] | 0;
 } else if ((i4 | 0) == 7) {
  i4 = HEAP32[(HEAP32[i5 >> 2] | 0) + 8 >> 2] | 0;
 } else {
  i4 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + (i4 << 2) + 252 >> 2] | 0;
 }
 if ((i4 | 0) == 0) {
  i5 = 5192;
  STACKTOP = i2;
  return i5 | 0;
 }
 i5 = _luaH_getstr(i4, HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + (i3 << 2) + 184 >> 2] | 0) | 0;
 STACKTOP = i2;
 return i5 | 0;
}
function _luaS_eqstr(i2, i3) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP8[i2 + 4 | 0] | 0;
 do {
  if (i4 << 24 >> 24 == (HEAP8[i3 + 4 | 0] | 0)) {
   if (i4 << 24 >> 24 == 4) {
    i2 = (i2 | 0) == (i3 | 0);
    break;
   }
   i4 = HEAP32[i2 + 12 >> 2] | 0;
   if ((i2 | 0) != (i3 | 0)) {
    if ((i4 | 0) == (HEAP32[i3 + 12 >> 2] | 0)) {
     i2 = (_memcmp(i2 + 16 | 0, i3 + 16 | 0, i4) | 0) == 0;
    } else {
     i2 = 0;
    }
   } else {
    i2 = 1;
   }
  } else {
   i2 = 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 & 1 | 0;
}
function _lua_concat(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 if ((i3 | 0) > 1) {
  if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
   _luaC_step(i1);
  }
  _luaV_concat(i1, i3);
  STACKTOP = i2;
  return;
 } else {
  if ((i3 | 0) != 0) {
   STACKTOP = i2;
   return;
  }
  i3 = i1 + 8 | 0;
  i4 = HEAP32[i3 >> 2] | 0;
  i1 = _luaS_newlstr(i1, 936, 0) | 0;
  HEAP32[i4 >> 2] = i1;
  HEAP32[i4 + 8 >> 2] = HEAPU8[i1 + 4 | 0] | 0 | 64;
  HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 16;
  STACKTOP = i2;
  return;
 }
}
function _ll_loadfunc(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_getfield(i1, -1001e3, 4184);
 _lua_getfield(i1, -1, i4);
 i4 = _lua_touserdata(i1, -1) | 0;
 _lua_settop(i1, -3);
 if ((i4 | 0) == 0) {
  _lua_pushlstring(i1, 4968, 58) | 0;
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 if ((HEAP8[i3] | 0) == 42) {
  _lua_pushboolean(i1, 1);
  i4 = 0;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  _lua_pushlstring(i1, 4968, 58) | 0;
  i4 = 2;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 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 _luaD_growstack(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = HEAP32[i1 + 32 >> 2] | 0;
 if ((i4 | 0) > 1e6) {
  _luaD_throw(i1, 6);
 }
 i3 = i3 + 5 + ((HEAP32[i1 + 8 >> 2] | 0) - (HEAP32[i1 + 28 >> 2] | 0) >> 4) | 0;
 i4 = i4 << 1;
 i4 = (i4 | 0) > 1e6 ? 1e6 : i4;
 i3 = (i4 | 0) < (i3 | 0) ? i3 : i4;
 if ((i3 | 0) > 1e6) {
  _luaD_reallocstack(i1, 1000200);
  _luaG_runerror(i1, 2224, i2);
 } else {
  _luaD_reallocstack(i1, i3);
  STACKTOP = i2;
  return;
 }
}
function _luaL_callmeta(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i4 = _lua_absindex(i1, i4) | 0;
 if ((_lua_getmetatable(i1, i4) | 0) == 0) {
  i4 = 0;
  STACKTOP = i2;
  return i4 | 0;
 }
 _lua_pushstring(i1, i3) | 0;
 _lua_rawget(i1, -2);
 if ((_lua_type(i1, -1) | 0) == 0) {
  _lua_settop(i1, -3);
  i4 = 0;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  _lua_remove(i1, -2);
  _lua_pushvalue(i1, i4);
  _lua_callk(i1, 1, 1, 0, 0);
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
function _luaK_reserveregs(i8, i7) {
 i8 = i8 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 i2 = i8 + 48 | 0;
 i6 = HEAP8[i2] | 0;
 i4 = (i6 & 255) + i7 | 0;
 i5 = (HEAP32[i8 >> 2] | 0) + 78 | 0;
 do {
  if ((i4 | 0) > (HEAPU8[i5] | 0 | 0)) {
   if ((i4 | 0) > 249) {
    _luaX_syntaxerror(HEAP32[i8 + 12 >> 2] | 0, 10536);
   } else {
    HEAP8[i5] = i4;
    i1 = HEAP8[i2] | 0;
    break;
   }
  } else {
   i1 = i6;
  }
 } while (0);
 HEAP8[i2] = (i1 & 255) + i7;
 STACKTOP = i3;
 return;
}
function _aux_lines(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i4 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 i2 = i3 + -1 | 0;
 if ((i3 | 0) >= 19) {
  _luaL_argerror(i1, 17, 3320) | 0;
 }
 _lua_pushvalue(i1, 1);
 _lua_pushinteger(i1, i2);
 _lua_pushboolean(i1, i5);
 if ((i3 | 0) >= 2) {
  i5 = 1;
  while (1) {
   i6 = i5 + 1 | 0;
   _lua_pushvalue(i1, i6);
   if ((i5 | 0) < (i2 | 0)) {
    i5 = i6;
   } else {
    break;
   }
  }
 }
 _lua_pushcclosure(i1, 155, i3 + 2 | 0);
 STACKTOP = i4;
 return;
}
function _memcmp(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i5 = 0, i6 = 0;
 i1 = STACKTOP;
 L1 : do {
  if ((i3 | 0) == 0) {
   i2 = 0;
  } else {
   while (1) {
    i6 = HEAP8[i2] | 0;
    i5 = HEAP8[i4] | 0;
    if (!(i6 << 24 >> 24 == i5 << 24 >> 24)) {
     break;
    }
    i3 = i3 + -1 | 0;
    if ((i3 | 0) == 0) {
     i2 = 0;
     break L1;
    } else {
     i2 = i2 + 1 | 0;
     i4 = i4 + 1 | 0;
    }
   }
   i2 = (i6 & 255) - (i5 & 255) | 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _b_arshift(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkunsigned(i1, 1) | 0;
 i4 = _luaL_checkinteger(i1, 2) | 0;
 if ((i4 | 0) > -1 & (i3 | 0) < 0) {
  if ((i4 | 0) > 31) {
   i3 = -1;
  } else {
   i3 = i3 >>> i4 | ~(-1 >>> i4);
  }
  _lua_pushunsigned(i1, i3);
  STACKTOP = i2;
  return 1;
 }
 i5 = 0 - i4 | 0;
 if ((i4 | 0) > 0) {
  i3 = (i4 | 0) > 31 ? 0 : i3 >>> i4;
 } else {
  i3 = (i5 | 0) > 31 ? 0 : i3 << i5;
 }
 _lua_pushunsigned(i1, i3);
 STACKTOP = i2;
 return 1;
}
function _luaL_checkunsigned(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 i6 = i3 + 8 | 0;
 i2 = _lua_tounsignedx(i1, i5, i6) | 0;
 if ((HEAP32[i6 >> 2] | 0) != 0) {
  STACKTOP = i3;
  return i2 | 0;
 }
 i7 = _lua_typename(i1, 3) | 0;
 i6 = _lua_typename(i1, _lua_type(i1, i5) | 0) | 0;
 HEAP32[i4 >> 2] = i7;
 HEAP32[i4 + 4 >> 2] = i6;
 _luaL_argerror(i1, i5, _lua_pushfstring(i1, 1744, i4) | 0) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _luaB_loadfile(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i1 = STACKTOP;
 i4 = _luaL_optlstring(i2, 1, 0, 0) | 0;
 i5 = _luaL_optlstring(i2, 2, 0, 0) | 0;
 i3 = (_lua_type(i2, 3) | 0) != -1;
 i6 = i3 ? 3 : 0;
 if ((_luaL_loadfilex(i2, i4, i5) | 0) == 0) {
  if (i3 ? (_lua_pushvalue(i2, i6), (_lua_setupvalue(i2, -2, 1) | 0) == 0) : 0) {
   _lua_settop(i2, -2);
   i2 = 1;
  } else {
   i2 = 1;
  }
 } else {
  _lua_pushnil(i2);
  _lua_insert(i2, -2);
  i2 = 2;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _luaL_checkinteger(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 i6 = i3 + 8 | 0;
 i2 = _lua_tointegerx(i1, i5, i6) | 0;
 if ((HEAP32[i6 >> 2] | 0) != 0) {
  STACKTOP = i3;
  return i2 | 0;
 }
 i7 = _lua_typename(i1, 3) | 0;
 i6 = _lua_typename(i1, _lua_type(i1, i5) | 0) | 0;
 HEAP32[i4 >> 2] = i7;
 HEAP32[i4 + 4 >> 2] = i6;
 _luaL_argerror(i1, i5, _lua_pushfstring(i1, 1744, i4) | 0) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _luaB_select(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i3 = STACKTOP;
 i2 = _lua_gettop(i1) | 0;
 if ((_lua_type(i1, 1) | 0) == 4 ? (HEAP8[_lua_tolstring(i1, 1, 0) | 0] | 0) == 35 : 0) {
  _lua_pushinteger(i1, i2 + -1 | 0);
  i4 = 1;
  STACKTOP = i3;
  return i4 | 0;
 }
 i4 = _luaL_checkinteger(i1, 1) | 0;
 if ((i4 | 0) < 0) {
  i4 = i4 + i2 | 0;
 } else {
  i4 = (i4 | 0) > (i2 | 0) ? i2 : i4;
 }
 if ((i4 | 0) <= 0) {
  _luaL_argerror(i1, 1, 9760) | 0;
 }
 i4 = i2 - i4 | 0;
 STACKTOP = i3;
 return i4 | 0;
}
function _luaX_next(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 HEAP32[i1 + 8 >> 2] = HEAP32[i1 + 4 >> 2];
 i3 = i1 + 32 | 0;
 if ((HEAP32[i3 >> 2] | 0) == 286) {
  HEAP32[i1 + 16 >> 2] = _llex(i1, i1 + 24 | 0) | 0;
  STACKTOP = i2;
  return;
 } else {
  i1 = i1 + 16 | 0;
  HEAP32[i1 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
  HEAP32[i1 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
  HEAP32[i1 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
  HEAP32[i1 + 12 >> 2] = HEAP32[i3 + 12 >> 2];
  HEAP32[i3 >> 2] = 286;
  STACKTOP = i2;
  return;
 }
}
function _lua_setglobal(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 i5 = _luaH_getint(HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 40 >> 2] | 0, 2) | 0;
 i4 = i1 + 8 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = i6 + 16;
 i2 = _luaS_new(i1, i2) | 0;
 HEAP32[i6 >> 2] = i2;
 HEAP32[i6 + 8 >> 2] = HEAPU8[i2 + 4 | 0] | 0 | 64;
 i2 = HEAP32[i4 >> 2] | 0;
 _luaV_settable(i1, i5, i2 + -16 | 0, i2 + -32 | 0);
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + -32;
 STACKTOP = i3;
 return;
}
function _luaL_checknumber(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var d2 = 0.0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 i6 = i3 + 8 | 0;
 d2 = +_lua_tonumberx(i1, i5, i6);
 if ((HEAP32[i6 >> 2] | 0) != 0) {
  STACKTOP = i3;
  return +d2;
 }
 i7 = _lua_typename(i1, 3) | 0;
 i6 = _lua_typename(i1, _lua_type(i1, i5) | 0) | 0;
 HEAP32[i4 >> 2] = i7;
 HEAP32[i4 + 4 >> 2] = i6;
 _luaL_argerror(i1, i5, _lua_pushfstring(i1, 1744, i4) | 0) | 0;
 STACKTOP = i3;
 return +d2;
}
function _luaZ_fill(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = FUNCTION_TABLE_iiii[HEAP32[i1 + 8 >> 2] & 3](HEAP32[i1 + 16 >> 2] | 0, HEAP32[i1 + 12 >> 2] | 0, i4) | 0;
 if ((i3 | 0) == 0) {
  i4 = -1;
  STACKTOP = i2;
  return i4 | 0;
 }
 i4 = HEAP32[i4 >> 2] | 0;
 if ((i4 | 0) == 0) {
  i4 = -1;
  STACKTOP = i2;
  return i4 | 0;
 }
 HEAP32[i1 >> 2] = i4 + -1;
 HEAP32[i1 + 4 >> 2] = i3 + 1;
 i4 = HEAPU8[i3] | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _lua_createtable(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i5 = _luaH_new(i1) | 0;
 i6 = i1 + 8 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 HEAP32[i7 >> 2] = i5;
 HEAP32[i7 + 8 >> 2] = 69;
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 16;
 if (!((i3 | 0) > 0 | (i4 | 0) > 0)) {
  STACKTOP = i2;
  return;
 }
 _luaH_resize(i1, i5, i3, i4);
 STACKTOP = i2;
 return;
}
function _generic_reader(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 _luaL_checkstack(i1, 2, 9888);
 _lua_pushvalue(i1, 1);
 _lua_callk(i1, 0, 1, 0, 0);
 if ((_lua_type(i1, -1) | 0) == 0) {
  _lua_settop(i1, -2);
  HEAP32[i2 >> 2] = 0;
  i2 = 0;
  STACKTOP = i3;
  return i2 | 0;
 }
 if ((_lua_isstring(i1, -1) | 0) == 0) {
  _luaL_error(i1, 9920, i3) | 0;
 }
 _lua_replace(i1, 5);
 i2 = _lua_tolstring(i1, 5, i2) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _luaZ_openspace(i5, i1, i6) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = i1 + 8 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 if (!(i3 >>> 0 < i6 >>> 0)) {
  i6 = HEAP32[i1 >> 2] | 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 i6 = i6 >>> 0 < 32 ? 32 : i6;
 if ((i6 + 1 | 0) >>> 0 > 4294967293) {
  _luaM_toobig(i5);
 }
 i5 = _luaM_realloc_(i5, HEAP32[i1 >> 2] | 0, i3, i6) | 0;
 HEAP32[i1 >> 2] = i5;
 HEAP32[i4 >> 2] = i6;
 i6 = i5;
 STACKTOP = i2;
 return i6 | 0;
}
function _luaH_getstr(i4, i3) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i2 = 0;
 i2 = STACKTOP;
 i4 = (HEAP32[i4 + 16 >> 2] | 0) + (((1 << (HEAPU8[i4 + 7 | 0] | 0)) + -1 & HEAP32[i3 + 8 >> 2]) << 5) | 0;
 while (1) {
  if ((HEAP32[i4 + 24 >> 2] | 0) == 68 ? (HEAP32[i4 + 16 >> 2] | 0) == (i3 | 0) : 0) {
   break;
  }
  i4 = HEAP32[i4 + 28 >> 2] | 0;
  if ((i4 | 0) == 0) {
   i3 = 5192;
   i1 = 6;
   break;
  }
 }
 if ((i1 | 0) == 6) {
  STACKTOP = i2;
  return i3 | 0;
 }
 STACKTOP = i2;
 return i4 | 0;
}
function _b_extract(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = _luaL_checkunsigned(i1, 1) | 0;
 i3 = _luaL_checkinteger(i1, 2) | 0;
 i4 = _luaL_optinteger(i1, 3, 1) | 0;
 if (!((i3 | 0) > -1)) {
  _luaL_argerror(i1, 2, 10440) | 0;
 }
 if ((i4 | 0) <= 0) {
  _luaL_argerror(i1, 3, 10472) | 0;
 }
 if ((i4 + i3 | 0) > 32) {
  _luaL_error(i1, 10496, i5) | 0;
 }
 _lua_pushunsigned(i1, i2 >>> i3 & ~(-2 << i4 + -1));
 STACKTOP = i5;
 return 1;
}
function _luaL_checklstring(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i5 = _lua_tolstring(i1, i4, i5) | 0;
 if ((i5 | 0) != 0) {
  STACKTOP = i2;
  return i5 | 0;
 }
 i7 = _lua_typename(i1, 4) | 0;
 i6 = _lua_typename(i1, _lua_type(i1, i4) | 0) | 0;
 HEAP32[i3 >> 2] = i7;
 HEAP32[i3 + 4 >> 2] = i6;
 _luaL_argerror(i1, i4, _lua_pushfstring(i1, 1744, i3) | 0) | 0;
 STACKTOP = i2;
 return i5 | 0;
}
function _db_traceback(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, 1) | 0) == 8) {
  i3 = _lua_tothread(i1, 1) | 0;
  i4 = 1;
 } else {
  i3 = i1;
  i4 = 0;
 }
 i5 = i4 + 1 | 0;
 i6 = _lua_tolstring(i1, i5, 0) | 0;
 if ((i6 | 0) == 0 ? (_lua_type(i1, i5) | 0) >= 1 : 0) {
  _lua_pushvalue(i1, i5);
  STACKTOP = i2;
  return 1;
 }
 _luaL_traceback(i1, i3, i6, _luaL_optinteger(i1, i4 | 2, (i3 | 0) == (i1 | 0) | 0) | 0);
 STACKTOP = i2;
 return 1;
}
function _f_setvbuf(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i5 = HEAP32[i3 >> 2] | 0;
 i4 = _luaL_checkoption(i1, 2, 0, 3128) | 0;
 i3 = _luaL_optinteger(i1, 3, 1024) | 0;
 i3 = _luaL_fileresult(i1, (_setvbuf(i5 | 0, 0, HEAP32[3112 + (i4 << 2) >> 2] | 0, i3 | 0) | 0) == 0 | 0, 0) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _luaU_dump(i3, i1, i4, i2, i5) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i6 = 0, i7 = 0, i8 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i8 = i6 + 20 | 0;
 i7 = i6;
 HEAP32[i7 >> 2] = i3;
 HEAP32[i7 + 4 >> 2] = i4;
 HEAP32[i7 + 8 >> 2] = i2;
 HEAP32[i7 + 12 >> 2] = i5;
 i5 = i7 + 16 | 0;
 _luaU_header(i8);
 HEAP32[i5 >> 2] = FUNCTION_TABLE_iiiii[i4 & 3](i3, i8, 18, i2) | 0;
 _DumpFunction(i1, i7);
 STACKTOP = i6;
 return HEAP32[i5 >> 2] | 0;
}
function _luaB_setmetatable(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _lua_type(i1, 2) | 0;
 _luaL_checktype(i1, 1, 5);
 if (!((i3 | 0) == 0 | (i3 | 0) == 5)) {
  _luaL_argerror(i1, 2, 9680) | 0;
 }
 if ((_luaL_getmetafield(i1, 1, 9704) | 0) == 0) {
  _lua_settop(i1, 2);
  _lua_setmetatable(i1, 1) | 0;
  i3 = 1;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  i3 = _luaL_error(i1, 9720, i2) | 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function _getF(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 i3 = STACKTOP;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((i4 | 0) > 0) {
  HEAP32[i1 >> 2] = i4;
  HEAP32[i2 >> 2] = 0;
  i4 = i2 + 8 | 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 i4 = i2 + 4 | 0;
 if ((_feof(HEAP32[i4 >> 2] | 0) | 0) != 0) {
  i4 = 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 i2 = i2 + 8 | 0;
 HEAP32[i1 >> 2] = _fread(i2 | 0, 1, 1024, HEAP32[i4 >> 2] | 0) | 0;
 i4 = i2;
 STACKTOP = i3;
 return i4 | 0;
}
function _luaL_where(i1, i6) {
 i1 = i1 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i3 = i4;
 i2 = i4 + 8 | 0;
 if ((_lua_getstack(i1, i6, i2) | 0) != 0 ? (_lua_getinfo(i1, 1152, i2) | 0, i5 = HEAP32[i2 + 20 >> 2] | 0, (i5 | 0) > 0) : 0) {
  HEAP32[i3 >> 2] = i2 + 36;
  HEAP32[i3 + 4 >> 2] = i5;
  _lua_pushfstring(i1, 1160, i3) | 0;
  STACKTOP = i4;
  return;
 }
 _lua_pushlstring(i1, 1168, 0) | 0;
 STACKTOP = i4;
 return;
}
function _hookf(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_getsubtable(i1, -1001e3, 11584) | 0;
 _lua_pushthread(i1) | 0;
 _lua_rawget(i1, -2);
 if ((_lua_type(i1, -1) | 0) != 6) {
  STACKTOP = i2;
  return;
 }
 _lua_pushstring(i1, HEAP32[11608 + (HEAP32[i3 >> 2] << 2) >> 2] | 0) | 0;
 i3 = HEAP32[i3 + 20 >> 2] | 0;
 if ((i3 | 0) > -1) {
  _lua_pushinteger(i1, i3);
 } else {
  _lua_pushnil(i1);
 }
 _lua_callk(i1, 2, 0, 0, 0);
 STACKTOP = i2;
 return;
}
function _luaV_tonumber(i5, i2) {
 i5 = i5 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 i4 = HEAP32[i5 + 8 >> 2] | 0;
 if ((i4 | 0) != 3) {
  if ((i4 & 15 | 0) == 4 ? (i5 = HEAP32[i5 >> 2] | 0, (_luaO_str2d(i5 + 16 | 0, HEAP32[i5 + 12 >> 2] | 0, i3) | 0) != 0) : 0) {
   HEAPF64[i2 >> 3] = +HEAPF64[i3 >> 3];
   HEAP32[i2 + 8 >> 2] = 3;
  } else {
   i2 = 0;
  }
 } else {
  i2 = i5;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _luaO_arith(i3, d1, d2) {
 i3 = i3 | 0;
 d1 = +d1;
 d2 = +d2;
 switch (i3 | 0) {
 case 4:
  {
   d1 = d1 - +Math_floor(+(d1 / d2)) * d2;
   break;
  }
 case 6:
  {
   d1 = -d1;
   break;
  }
 case 0:
  {
   d1 = d1 + d2;
   break;
  }
 case 1:
  {
   d1 = d1 - d2;
   break;
  }
 case 5:
  {
   d1 = +Math_pow(+d1, +d2);
   break;
  }
 case 3:
  {
   d1 = d1 / d2;
   break;
  }
 case 2:
  {
   d1 = d1 * d2;
   break;
  }
 default:
  {
   d1 = 0.0;
  }
 }
 return +d1;
}
function _luaB_coresume(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_tothread(i1, 1) | 0;
 if ((i3 | 0) == 0) {
  _luaL_argerror(i1, 1, 10856) | 0;
 }
 i3 = _auxresume(i1, i3, (_lua_gettop(i1) | 0) + -1 | 0) | 0;
 if ((i3 | 0) < 0) {
  _lua_pushboolean(i1, 0);
  _lua_insert(i1, -2);
  i3 = 2;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  _lua_pushboolean(i1, 1);
  _lua_insert(i1, ~i3);
  i3 = i3 + 1 | 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function _pairsmeta(i1, i5, i4, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_luaL_getmetafield(i1, 1, i5) | 0) != 0) {
  _lua_pushvalue(i1, 1);
  _lua_callk(i1, 1, 3, 0, 0);
  STACKTOP = i2;
  return;
 }
 _luaL_checktype(i1, 1, 5);
 _lua_pushcclosure(i1, i3, 0);
 _lua_pushvalue(i1, 1);
 if ((i4 | 0) == 0) {
  _lua_pushnil(i1);
  STACKTOP = i2;
  return;
 } else {
  _lua_pushinteger(i1, 0);
  STACKTOP = i2;
  return;
 }
}
function _io_close(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 if ((_lua_type(i1, 1) | 0) == -1) {
  _lua_getfield(i1, -1001e3, 2800);
 }
 if ((HEAP32[(_luaL_checkudata(i1, 1, 2832) | 0) + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i4 = (_luaL_checkudata(i1, 1, 2832) | 0) + 4 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = 0;
 i1 = FUNCTION_TABLE_ii[i3 & 255](i1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _pack(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 _lua_createtable(i1, i3, 1);
 _lua_pushinteger(i1, i3);
 _lua_setfield(i1, -2, 8312);
 if ((i3 | 0) <= 0) {
  STACKTOP = i2;
  return 1;
 }
 _lua_pushvalue(i1, 1);
 _lua_rawseti(i1, -2, 1);
 _lua_replace(i1, 1);
 if ((i3 | 0) <= 1) {
  STACKTOP = i2;
  return 1;
 }
 do {
  _lua_rawseti(i1, 1, i3);
  i3 = i3 + -1 | 0;
 } while ((i3 | 0) > 1);
 STACKTOP = i2;
 return 1;
}
function _luaL_execresult(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i3 | 0) == -1) {
  i3 = HEAP32[(___errno_location() | 0) >> 2] | 0;
  _lua_pushnil(i1);
  _lua_pushstring(i1, _strerror(i3 | 0) | 0) | 0;
  _lua_pushinteger(i1, i3);
  STACKTOP = i2;
  return 3;
 } else if ((i3 | 0) == 0) {
  _lua_pushboolean(i1, 1);
 } else {
  _lua_pushnil(i1);
 }
 _lua_pushstring(i1, 1184) | 0;
 _lua_pushinteger(i1, i3);
 STACKTOP = i2;
 return 3;
}
function _lua_getglobal(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 i4 = _luaH_getint(HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 40 >> 2] | 0, 2) | 0;
 i5 = i1 + 8 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 >> 2] = i6 + 16;
 i2 = _luaS_new(i1, i2) | 0;
 HEAP32[i6 >> 2] = i2;
 HEAP32[i6 + 8 >> 2] = HEAPU8[i2 + 4 | 0] | 0 | 64;
 i2 = (HEAP32[i5 >> 2] | 0) + -16 | 0;
 _luaV_gettable(i1, i4, i2, i2);
 STACKTOP = i3;
 return;
}
function _luaL_checktype(i1, i5, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((_lua_type(i1, i5) | 0) == (i4 | 0)) {
  STACKTOP = i2;
  return;
 }
 i6 = _lua_typename(i1, i4) | 0;
 i4 = _lua_typename(i1, _lua_type(i1, i5) | 0) | 0;
 HEAP32[i3 >> 2] = i6;
 HEAP32[i3 + 4 >> 2] = i4;
 _luaL_argerror(i1, i5, _lua_pushfstring(i1, 1744, i3) | 0) | 0;
 STACKTOP = i2;
 return;
}
function _luaC_newobj(i7, i4, i6, i5, i1) {
 i7 = i7 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i7 + 12 >> 2] | 0;
 i7 = _luaM_realloc_(i7, 0, i4 & 15, i6) | 0;
 i6 = i7 + i1 | 0;
 i5 = (i5 | 0) == 0 ? i3 + 68 | 0 : i5;
 HEAP8[i7 + (i1 + 5) | 0] = HEAP8[i3 + 60 | 0] & 3;
 HEAP8[i7 + (i1 + 4) | 0] = i4;
 HEAP32[i6 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i5 >> 2] = i6;
 STACKTOP = i2;
 return i6 | 0;
}
function _luaL_requiref(i1, i3, i5, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushcclosure(i1, i5, 0);
 _lua_pushstring(i1, i3) | 0;
 _lua_callk(i1, 1, 1, 0, 0);
 _luaL_getsubtable(i1, -1001e3, 1432) | 0;
 _lua_pushvalue(i1, -2);
 _lua_setfield(i1, -2, i3);
 _lua_settop(i1, -2);
 if ((i4 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 _lua_pushvalue(i1, -1);
 _lua_setglobal(i1, i3);
 STACKTOP = i2;
 return;
}
function _luaG_ordererror(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = HEAP32[8528 + ((HEAP32[i3 + 8 >> 2] & 15) + 1 << 2) >> 2] | 0;
 i4 = HEAP32[8528 + ((HEAP32[i4 + 8 >> 2] & 15) + 1 << 2) >> 2] | 0;
 if ((i3 | 0) == (i4 | 0)) {
  HEAP32[i2 >> 2] = i3;
  _luaG_runerror(i1, 1952, i2);
 } else {
  HEAP32[i2 >> 2] = i3;
  HEAP32[i2 + 4 >> 2] = i4;
  _luaG_runerror(i1, 1992, i2);
 }
}
function _io_popen(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 _luaL_optlstring(i1, 2, 3480, 0) | 0;
 i5 = _lua_newuserdata(i1, 8) | 0;
 i4 = i5 + 4 | 0;
 HEAP32[i4 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 _luaL_error(i1, 3488, i2) | 0;
 HEAP32[i5 >> 2] = 0;
 HEAP32[i4 >> 2] = 157;
 i1 = _luaL_fileresult(i1, 0, i3) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _sort_comp(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, 2) | 0) == 0) {
  i4 = _lua_compare(i1, i3, i4, 1) | 0;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  _lua_pushvalue(i1, 2);
  _lua_pushvalue(i1, i3 + -1 | 0);
  _lua_pushvalue(i1, i4 + -2 | 0);
  _lua_callk(i1, 2, 1, 0, 0);
  i4 = _lua_toboolean(i1, -1) | 0;
  _lua_settop(i1, -2);
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
function _db_upvalueid(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 112 | 0;
 i4 = i3;
 i2 = _luaL_checkinteger(i1, 2) | 0;
 _luaL_checktype(i1, 1, 6);
 _lua_pushvalue(i1, 1);
 _lua_getinfo(i1, 11728, i4) | 0;
 if (!((i2 | 0) > 0 ? (i2 | 0) <= (HEAPU8[i4 + 32 | 0] | 0 | 0) : 0)) {
  _luaL_argerror(i1, 2, 11736) | 0;
 }
 _lua_pushlightuserdata(i1, _lua_upvalueid(i1, 1, i2) | 0);
 STACKTOP = i3;
 return 1;
}
function _luaL_getmetafield(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 do {
  if ((_lua_getmetatable(i2, i4) | 0) != 0) {
   _lua_pushstring(i2, i3) | 0;
   _lua_rawget(i2, -2);
   if ((_lua_type(i2, -1) | 0) == 0) {
    _lua_settop(i2, -3);
    i2 = 0;
    break;
   } else {
    _lua_remove(i2, -2);
    i2 = 1;
    break;
   }
  } else {
   i2 = 0;
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function _luaF_freeupval(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i3 + 8 >> 2] | 0) == (i3 + 16 | 0)) {
  _luaM_realloc_(i1, i3, 32, 0) | 0;
  STACKTOP = i2;
  return;
 }
 i4 = i3 + 16 | 0;
 i5 = i4 + 4 | 0;
 HEAP32[(HEAP32[i5 >> 2] | 0) + 16 >> 2] = HEAP32[i4 >> 2];
 HEAP32[(HEAP32[i4 >> 2] | 0) + 20 >> 2] = HEAP32[i5 >> 2];
 _luaM_realloc_(i1, i3, 32, 0) | 0;
 STACKTOP = i2;
 return;
}
function _luaL_addvalue(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i5 = HEAP32[i1 + 12 >> 2] | 0;
 i3 = _lua_tolstring(i5, -1, i4) | 0;
 i6 = i1 + 16 | 0;
 if ((HEAP32[i1 >> 2] | 0) != (i6 | 0)) {
  _lua_insert(i5, -2);
 }
 _luaL_addlstring(i1, i3, HEAP32[i4 >> 2] | 0);
 _lua_remove(i5, (HEAP32[i1 >> 2] | 0) != (i6 | 0) ? -2 : -1);
 STACKTOP = i2;
 return;
}
function _escerror(i1, i4, i3, i2) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i5 = 0, i6 = 0;
 HEAP32[(HEAP32[i1 + 60 >> 2] | 0) + 4 >> 2] = 0;
 _save(i1, 92);
 L1 : do {
  if ((i3 | 0) > 0) {
   i5 = 0;
   do {
    i6 = HEAP32[i4 + (i5 << 2) >> 2] | 0;
    if ((i6 | 0) == -1) {
     break L1;
    }
    _save(i1, i6);
    i5 = i5 + 1 | 0;
   } while ((i5 | 0) < (i3 | 0));
  }
 } while (0);
 _lexerror(i1, i2, 289);
}
function _pushglobalfuncname(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 _lua_getinfo(i1, 1768, i4) | 0;
 _lua_rawgeti(i1, -1001e3, 2);
 i4 = i3 + 1 | 0;
 if ((_findfield(i1, i4, 2) | 0) == 0) {
  _lua_settop(i1, i3);
  i4 = 0;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  _lua_copy(i1, -1, i4);
  _lua_settop(i1, -3);
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
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 _lua_pushlstring(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i4 = _luaS_newlstr(i1, i3, i4) | 0;
 i3 = i1 + 8 | 0;
 i1 = HEAP32[i3 >> 2] | 0;
 HEAP32[i1 >> 2] = i4;
 HEAP32[i1 + 8 >> 2] = HEAPU8[i4 + 4 | 0] | 0 | 64;
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 16;
 STACKTOP = i2;
 return i4 + 16 | 0;
}
function _ll_searchpath(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i5 = _luaL_checklstring(i1, 1, 0) | 0;
 i4 = _luaL_checklstring(i1, 2, 0) | 0;
 i3 = _luaL_optlstring(i1, 3, 4936, 0) | 0;
 if ((_searchpath(i1, i5, i4, i3, _luaL_optlstring(i1, 4, 4848, 0) | 0) | 0) != 0) {
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 }
 _lua_pushnil(i1);
 _lua_insert(i1, -2);
 i5 = 2;
 STACKTOP = i2;
 return i5 | 0;
}
function _math_log(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0, d4 = 0.0;
 i2 = STACKTOP;
 d3 = +_luaL_checknumber(i1, 1);
 do {
  if ((_lua_type(i1, 2) | 0) >= 1) {
   d4 = +_luaL_checknumber(i1, 2);
   if (d4 == 10.0) {
    d3 = +_log10(+d3);
    break;
   } else {
    d3 = +Math_log(+d3) / +Math_log(+d4);
    break;
   }
  } else {
   d3 = +Math_log(+d3);
  }
 } while (0);
 _lua_pushnumber(i1, d3);
 STACKTOP = i2;
 return 1;
}
function _luaT_init(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = i1 + 12 | 0;
 i4 = 0;
 do {
  i5 = _luaS_new(i1, HEAP32[8576 + (i4 << 2) >> 2] | 0) | 0;
  HEAP32[(HEAP32[i3 >> 2] | 0) + (i4 << 2) + 184 >> 2] = i5;
  i5 = (HEAP32[(HEAP32[i3 >> 2] | 0) + (i4 << 2) + 184 >> 2] | 0) + 5 | 0;
  HEAP8[i5] = HEAPU8[i5] | 0 | 32;
  i4 = i4 + 1 | 0;
 } while ((i4 | 0) != 17);
 STACKTOP = i2;
 return;
}
function _f_gc(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return 0;
 }
 if ((HEAP32[i3 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return 0;
 }
 i4 = (_luaL_checkudata(i1, 1, 2832) | 0) + 4 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = 0;
 FUNCTION_TABLE_ii[i3 & 255](i1) | 0;
 STACKTOP = i2;
 return 0;
}
function ___shlim(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i2 = STACKTOP;
 HEAP32[i1 + 104 >> 2] = i5;
 i4 = HEAP32[i1 + 8 >> 2] | 0;
 i3 = HEAP32[i1 + 4 >> 2] | 0;
 i6 = i4 - i3 | 0;
 HEAP32[i1 + 108 >> 2] = i6;
 if ((i5 | 0) != 0 & (i6 | 0) > (i5 | 0)) {
  HEAP32[i1 + 100 >> 2] = i3 + i5;
  STACKTOP = i2;
  return;
 } else {
  HEAP32[i1 + 100 >> 2] = i4;
  STACKTOP = i2;
  return;
 }
}
function _lua_sethook(i4, i6, i1, i5) {
 i4 = i4 | 0;
 i6 = i6 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0;
 i2 = (i6 | 0) == 0 | (i1 | 0) == 0;
 i3 = HEAP32[i4 + 16 >> 2] | 0;
 if (!((HEAP8[i3 + 18 | 0] & 1) == 0)) {
  HEAP32[i4 + 20 >> 2] = HEAP32[i3 + 28 >> 2];
 }
 HEAP32[i4 + 52 >> 2] = i2 ? 0 : i6;
 HEAP32[i4 + 44 >> 2] = i5;
 HEAP32[i4 + 48 >> 2] = i5;
 HEAP8[i4 + 40 | 0] = i2 ? 0 : i1 & 255;
 return 1;
}
function _io_tmpfile(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = _lua_newuserdata(i1, 8) | 0;
 i3 = i4 + 4 | 0;
 HEAP32[i3 >> 2] = 0;
 _luaL_setmetatable(i1, 2832);
 HEAP32[i4 >> 2] = 0;
 HEAP32[i3 >> 2] = 156;
 i3 = _tmpfile() | 0;
 HEAP32[i4 >> 2] = i3;
 if ((i3 | 0) != 0) {
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 i4 = _luaL_fileresult(i1, 0, 0) | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _luaL_checkstack(i1, i5, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((_lua_checkstack(i1, i5 + 20 | 0) | 0) != 0) {
  STACKTOP = i2;
  return;
 }
 if ((i4 | 0) == 0) {
  _luaL_error(i1, 1240, i3) | 0;
  STACKTOP = i2;
  return;
 } else {
  HEAP32[i3 >> 2] = i4;
  _luaL_error(i1, 1216, i3) | 0;
  STACKTOP = i2;
  return;
 }
}
function _b_rshift(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i4 = _luaL_checkunsigned(i1, 1) | 0;
 i3 = _luaL_checkinteger(i1, 2) | 0;
 i5 = 0 - i3 | 0;
 if ((i3 | 0) > 0) {
  i5 = (i3 | 0) > 31 ? 0 : i4 >>> i3;
  _lua_pushunsigned(i1, i5);
  STACKTOP = i2;
  return 1;
 } else {
  i5 = (i5 | 0) > 31 ? 0 : i4 << i5;
  _lua_pushunsigned(i1, i5);
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _b_lshift(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkunsigned(i1, 1) | 0;
 i4 = _luaL_checkinteger(i1, 2) | 0;
 if ((i4 | 0) < 0) {
  i4 = 0 - i4 | 0;
  i4 = (i4 | 0) > 31 ? 0 : i3 >>> i4;
  _lua_pushunsigned(i1, i4);
  STACKTOP = i2;
  return 1;
 } else {
  i4 = (i4 | 0) > 31 ? 0 : i3 << i4;
  _lua_pushunsigned(i1, i4);
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _math_min(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 d5 = +_luaL_checknumber(i1, 1);
 if ((i3 | 0) >= 2) {
  i4 = 2;
  while (1) {
   d6 = +_luaL_checknumber(i1, i4);
   d5 = d6 < d5 ? d6 : d5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
 }
 _lua_pushnumber(i1, d5);
 STACKTOP = i2;
 return 1;
}
function _math_max(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 d5 = +_luaL_checknumber(i1, 1);
 if ((i3 | 0) >= 2) {
  i4 = 2;
  while (1) {
   d6 = +_luaL_checknumber(i1, i4);
   d5 = d6 > d5 ? d6 : d5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
 }
 _lua_pushnumber(i1, d5);
 STACKTOP = i2;
 return 1;
}
function _io_type(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 i3 = _luaL_testudata(i1, 1, 2832) | 0;
 if ((i3 | 0) == 0) {
  _lua_pushnil(i1);
  STACKTOP = i2;
  return 1;
 }
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _lua_pushlstring(i1, 3456, 11) | 0;
  STACKTOP = i2;
  return 1;
 } else {
  _lua_pushlstring(i1, 3472, 4) | 0;
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _luaF_newLclosure(i3, i2) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0;
 i1 = STACKTOP;
 i3 = _luaC_newobj(i3, 6, (i2 << 2) + 16 | 0, 0, 0) | 0;
 HEAP32[i3 + 12 >> 2] = 0;
 HEAP8[i3 + 6 | 0] = i2;
 if ((i2 | 0) == 0) {
  STACKTOP = i1;
  return i3 | 0;
 }
 i4 = i3 + 16 | 0;
 do {
  i2 = i2 + -1 | 0;
  HEAP32[i4 + (i2 << 2) >> 2] = 0;
 } while ((i2 | 0) != 0);
 STACKTOP = i1;
 return i3 | 0;
}
function _io_flush(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 _lua_getfield(i1, -1001e3, 2800);
 i3 = _lua_touserdata(i1, -1) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  HEAP32[i4 >> 2] = 2804;
  _luaL_error(i1, 3424, i4) | 0;
 }
 i4 = _luaL_fileresult(i1, (_fflush(HEAP32[i3 >> 2] | 0) | 0) == 0 | 0, 0) | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _b_test(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 if ((i3 | 0) < 1) {
  i3 = 1;
 } else {
  i4 = 1;
  i5 = -1;
  while (1) {
   i5 = (_luaL_checkunsigned(i1, i4) | 0) & i5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
  i3 = (i5 | 0) != 0;
 }
 _lua_pushboolean(i1, i3 & 1);
 STACKTOP = i2;
 return 1;
}
function ___muldsi3(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i6 = i2 & 65535;
 i4 = i1 & 65535;
 i3 = Math_imul(i4, i6) | 0;
 i5 = i2 >>> 16;
 i4 = (i3 >>> 16) + (Math_imul(i4, i5) | 0) | 0;
 i1 = i1 >>> 16;
 i2 = Math_imul(i1, i6) | 0;
 return (tempRet0 = (i4 >>> 16) + (Math_imul(i1, i5) | 0) + (((i4 & 65535) + i2 | 0) >>> 16) | 0, i4 + i2 << 16 | i3 & 65535 | 0) | 0;
}
function _str_dump(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1056 | 0;
 i3 = i2 + 8 | 0;
 _luaL_checktype(i1, 1, 6);
 _lua_settop(i1, 1);
 _luaL_buffinit(i1, i3);
 if ((_lua_dump(i1, 2, i3) | 0) == 0) {
  _luaL_pushresult(i3);
  i3 = 1;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  i3 = _luaL_error(i1, 7888, i2) | 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function ___memrchr(i2, i3, i5) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i4 = 0;
 i1 = STACKTOP;
 i3 = i3 & 255;
 while (1) {
  i4 = i5 + -1 | 0;
  if ((i5 | 0) == 0) {
   i5 = 0;
   i2 = 4;
   break;
  }
  i5 = i2 + i4 | 0;
  if ((HEAP8[i5] | 0) == i3 << 24 >> 24) {
   i2 = 4;
   break;
  } else {
   i5 = i4;
  }
 }
 if ((i2 | 0) == 4) {
  STACKTOP = i1;
  return i5 | 0;
 }
 return 0;
}
function _luaL_getsubtable(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_getfield(i1, i3, i4);
 if ((_lua_type(i1, -1) | 0) == 5) {
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 }
 _lua_settop(i1, -2);
 i3 = _lua_absindex(i1, i3) | 0;
 _lua_createtable(i1, 0, 0);
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, i3, i4);
 i4 = 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _luaE_freeCI(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = (HEAP32[i1 + 16 >> 2] | 0) + 12 | 0;
 i3 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = 0;
 if ((i3 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 while (1) {
  i4 = HEAP32[i3 + 12 >> 2] | 0;
  _luaM_realloc_(i1, i3, 40, 0) | 0;
  if ((i4 | 0) == 0) {
   break;
  } else {
   i3 = i4;
  }
 }
 STACKTOP = i2;
 return;
}
function _f_tostring(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i4 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i4 + 4 >> 2] | 0) == 0) {
  _lua_pushlstring(i1, 3040, 13) | 0;
  STACKTOP = i2;
  return 1;
 } else {
  HEAP32[i3 >> 2] = HEAP32[i4 >> 2];
  _lua_pushfstring(i1, 3056, i3) | 0;
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _lua_newuserdata(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i3 = _luaS_newudata(i1, i3, 0) | 0;
 i1 = i1 + 8 | 0;
 i4 = HEAP32[i1 >> 2] | 0;
 HEAP32[i4 >> 2] = i3;
 HEAP32[i4 + 8 >> 2] = 71;
 HEAP32[i1 >> 2] = (HEAP32[i1 >> 2] | 0) + 16;
 STACKTOP = i2;
 return i3 + 24 | 0;
}
function _luaL_pushresultsize(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i5 = i1 + 8 | 0;
 i4 = (HEAP32[i5 >> 2] | 0) + i3 | 0;
 HEAP32[i5 >> 2] = i4;
 i3 = HEAP32[i1 + 12 >> 2] | 0;
 _lua_pushlstring(i3, HEAP32[i1 >> 2] | 0, i4) | 0;
 if ((HEAP32[i1 >> 2] | 0) == (i1 + 16 | 0)) {
  STACKTOP = i2;
  return;
 }
 _lua_remove(i3, -2);
 STACKTOP = i2;
 return;
}
function _luaL_testudata(i2, i5, i4) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = _lua_touserdata(i2, i5) | 0;
 if ((i3 | 0) != 0 ? (_lua_getmetatable(i2, i5) | 0) != 0 : 0) {
  _lua_getfield(i2, -1001e3, i4);
  i5 = (_lua_rawequal(i2, -1, -2) | 0) == 0;
  _lua_settop(i2, -3);
  i2 = i5 ? 0 : i3;
 } else {
  i2 = 0;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _finishpcall(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_lua_checkstack(i1, 1) | 0) == 0) {
  _lua_settop(i1, 0);
  _lua_pushboolean(i1, 0);
  _lua_pushstring(i1, 9632) | 0;
  i3 = 2;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  _lua_pushboolean(i1, i3);
  _lua_replace(i1, 1);
  i3 = _lua_gettop(i1) | 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function _searcher_preload(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 _lua_getfield(i1, -1001e3, 4592);
 _lua_getfield(i1, -1, i3);
 if ((_lua_type(i1, -1) | 0) != 0) {
  STACKTOP = i2;
  return 1;
 }
 HEAP32[i4 >> 2] = i3;
 _lua_pushfstring(i1, 5096, i4) | 0;
 STACKTOP = i2;
 return 1;
}
function _luaB_auxwrap(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i3 = STACKTOP;
 i2 = _lua_tothread(i1, -1001001) | 0;
 i2 = _auxresume(i1, i2, _lua_gettop(i1) | 0) | 0;
 if ((i2 | 0) >= 0) {
  STACKTOP = i3;
  return i2 | 0;
 }
 if ((_lua_isstring(i1, -1) | 0) == 0) {
  _lua_error(i1) | 0;
 }
 _luaL_where(i1, 1);
 _lua_insert(i1, -2);
 _lua_concat(i1, 2);
 _lua_error(i1) | 0;
 return 0;
}
function _ll_loadlib(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 i3 = _ll_loadfunc(i1, i3, _luaL_checklstring(i1, 2, 0) | 0) | 0;
 if ((i3 | 0) == 0) {
  i3 = 1;
  STACKTOP = i2;
  return i3 | 0;
 }
 _lua_pushnil(i1);
 _lua_insert(i1, -2);
 _lua_pushstring(i1, (i3 | 0) == 1 ? 5176 : 5184) | 0;
 i3 = 3;
 STACKTOP = i2;
 return i3 | 0;
}
function _luaS_hash(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i5 = 0;
 i1 = STACKTOP;
 i5 = i3 ^ i4;
 i3 = (i4 >>> 5) + 1 | 0;
 if (i3 >>> 0 > i4 >>> 0) {
  STACKTOP = i1;
  return i5 | 0;
 }
 do {
  i5 = (i5 << 5) + (i5 >>> 2) + (HEAPU8[i2 + (i4 + -1) | 0] | 0) ^ i5;
  i4 = i4 - i3 | 0;
 } while (!(i4 >>> 0 < i3 >>> 0));
 STACKTOP = i1;
 return i5 | 0;
}
function _b_and(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 if ((i3 | 0) < 1) {
  i5 = -1;
 } else {
  i4 = 1;
  i5 = -1;
  while (1) {
   i5 = (_luaL_checkunsigned(i1, i4) | 0) & i5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
 }
 _lua_pushunsigned(i1, i5);
 STACKTOP = i2;
 return 1;
}
function _luaopen_string(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 14);
 _luaL_setfuncs(i1, 6920, 0);
 _lua_createtable(i1, 0, 1);
 _lua_pushlstring(i1, 7040, 0) | 0;
 _lua_pushvalue(i1, -2);
 _lua_setmetatable(i1, -2) | 0;
 _lua_settop(i1, -2);
 _lua_pushvalue(i1, -2);
 _lua_setfield(i1, -2, 7048);
 _lua_settop(i1, -2);
 STACKTOP = i2;
 return 1;
}
function _b_xor(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 if ((i3 | 0) < 1) {
  i5 = 0;
 } else {
  i4 = 1;
  i5 = 0;
  while (1) {
   i5 = (_luaL_checkunsigned(i1, i4) | 0) ^ i5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
 }
 _lua_pushunsigned(i1, i5);
 STACKTOP = i2;
 return 1;
}
function _luaB_assert(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((_lua_toboolean(i1, 1) | 0) == 0) {
  HEAP32[i3 >> 2] = _luaL_optlstring(i1, 2, 10216, 0) | 0;
  i3 = _luaL_error(i1, 10208, i3) | 0;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  i3 = _lua_gettop(i1) | 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function _b_or(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 if ((i3 | 0) < 1) {
  i5 = 0;
 } else {
  i4 = 1;
  i5 = 0;
  while (1) {
   i5 = _luaL_checkunsigned(i1, i4) | 0 | i5;
   if ((i4 | 0) == (i3 | 0)) {
    break;
   } else {
    i4 = i4 + 1 | 0;
   }
  }
 }
 _lua_pushunsigned(i1, i5);
 STACKTOP = i2;
 return 1;
}
function _io_write(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 _lua_getfield(i1, -1001e3, 2800);
 i3 = _lua_touserdata(i1, -1) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  HEAP32[i4 >> 2] = 2804;
  _luaL_error(i1, 3424, i4) | 0;
 }
 i4 = _g_write(i1, HEAP32[i3 >> 2] | 0, 1) | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _luaK_checkstack(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 i3 = (HEAPU8[i1 + 48 | 0] | 0) + i3 | 0;
 i4 = (HEAP32[i1 >> 2] | 0) + 78 | 0;
 if ((i3 | 0) <= (HEAPU8[i4] | 0 | 0)) {
  STACKTOP = i2;
  return;
 }
 if ((i3 | 0) > 249) {
  _luaX_syntaxerror(HEAP32[i1 + 12 >> 2] | 0, 10536);
 }
 HEAP8[i4] = i3;
 STACKTOP = i2;
 return;
}
function _io_read(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 _lua_getfield(i1, -1001e3, 2776);
 i3 = _lua_touserdata(i1, -1) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  HEAP32[i4 >> 2] = 2780;
  _luaL_error(i1, 3424, i4) | 0;
 }
 i4 = _g_read(i1, HEAP32[i3 >> 2] | 0, 1) | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _db_setupvalue(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 3);
 i3 = _luaL_checkinteger(i1, 2) | 0;
 _luaL_checktype(i1, 1, 6);
 i3 = _lua_setupvalue(i1, 1, i3) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 _lua_pushstring(i1, i3) | 0;
 _lua_insert(i1, -1);
 i3 = 1;
 STACKTOP = i2;
 return i3 | 0;
}
function ___uflow(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 if ((HEAP32[i2 + 8 >> 2] | 0) == 0 ? (___toread(i2) | 0) != 0 : 0) {
  i2 = -1;
 } else {
  if ((FUNCTION_TABLE_iiii[HEAP32[i2 + 32 >> 2] & 3](i2, i3, 1) | 0) == 1) {
   i2 = HEAPU8[i3] | 0;
  } else {
   i2 = -1;
  }
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _llvm_cttz_i32(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = HEAP8[cttz_i8 + (i1 & 255) | 0] | 0;
 if ((i2 | 0) < 8) return i2 | 0;
 i2 = HEAP8[cttz_i8 + (i1 >> 8 & 255) | 0] | 0;
 if ((i2 | 0) < 8) return i2 + 8 | 0;
 i2 = HEAP8[cttz_i8 + (i1 >> 16 & 255) | 0] | 0;
 if ((i2 | 0) < 8) return i2 + 16 | 0;
 return (HEAP8[cttz_i8 + (i1 >>> 24) | 0] | 0) + 24 | 0;
}
function _llvm_ctlz_i32(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = HEAP8[ctlz_i8 + (i1 >>> 24) | 0] | 0;
 if ((i2 | 0) < 8) return i2 | 0;
 i2 = HEAP8[ctlz_i8 + (i1 >> 16 & 255) | 0] | 0;
 if ((i2 | 0) < 8) return i2 + 8 | 0;
 i2 = HEAP8[ctlz_i8 + (i1 >> 8 & 255) | 0] | 0;
 if ((i2 | 0) < 8) return i2 + 16 | 0;
 return (HEAP8[ctlz_i8 + (i1 & 255) | 0] | 0) + 24 | 0;
}
function _luaO_ceillog2(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0;
 i1 = STACKTOP;
 i2 = i2 + -1 | 0;
 if (i2 >>> 0 > 255) {
  i3 = 0;
  while (1) {
   i3 = i3 + 8 | 0;
   i4 = i2 >>> 8;
   if (i2 >>> 0 > 65535) {
    i2 = i4;
   } else {
    i2 = i4;
    break;
   }
  }
 } else {
  i3 = 0;
 }
 STACKTOP = i1;
 return (HEAPU8[5208 + i2 | 0] | 0) + i3 | 0;
}
function _os_exit(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, 1) | 0) == 1) {
  i3 = (_lua_toboolean(i1, 1) | 0) == 0 | 0;
 } else {
  i3 = _luaL_optinteger(i1, 1, 0) | 0;
 }
 if ((_lua_toboolean(i1, 2) | 0) != 0) {
  _lua_close(i1);
 }
 if ((i1 | 0) == 0) {
  STACKTOP = i2;
  return 0;
 } else {
  _exit(i3 | 0);
 }
 return 0;
}
function _luaL_newmetatable(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_getfield(i1, -1001e3, i3);
 if ((_lua_type(i1, -1) | 0) != 0) {
  i3 = 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 _lua_settop(i1, -2);
 _lua_createtable(i1, 0, 0);
 _lua_pushvalue(i1, -1);
 _lua_setfield(i1, -1001e3, i3);
 i3 = 1;
 STACKTOP = i2;
 return i3 | 0;
}
function _luaH_free(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i4 + 16 >> 2] | 0;
 if ((i3 | 0) != 8016) {
  _luaM_realloc_(i1, i3, 32 << (HEAPU8[i4 + 7 | 0] | 0), 0) | 0;
 }
 _luaM_realloc_(i1, HEAP32[i4 + 12 >> 2] | 0, HEAP32[i4 + 28 >> 2] << 4, 0) | 0;
 _luaM_realloc_(i1, i4, 32, 0) | 0;
 STACKTOP = i2;
 return;
}
function _luaO_int2fb(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0;
 i1 = STACKTOP;
 if (i3 >>> 0 < 8) {
  STACKTOP = i1;
  return i3 | 0;
 }
 if (i3 >>> 0 > 15) {
  i2 = 1;
  do {
   i4 = i3 + 1 | 0;
   i3 = i4 >>> 1;
   i2 = i2 + 1 | 0;
  } while (i4 >>> 0 > 31);
  i2 = i2 << 3;
 } else {
  i2 = 8;
 }
 i4 = i2 | i3 + -8;
 STACKTOP = i1;
 return i4 | 0;
}
function _luaK_codek(i3, i4, i1) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i4 = i4 << 6;
 if ((i1 | 0) < 262144) {
  i4 = _luaK_code(i3, i4 | i1 << 14 | 1) | 0;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  i4 = _luaK_code(i3, i4 | 2) | 0;
  _luaK_code(i3, i1 << 6 | 39) | 0;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
function _luaB_xpcall(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_gettop(i1) | 0;
 if ((i3 | 0) <= 1) {
  _luaL_argerror(i1, 2, 9616) | 0;
 }
 _lua_pushvalue(i1, 1);
 _lua_copy(i1, 2, 1);
 _lua_replace(i1, 2);
 i3 = _finishpcall(i1, (_lua_pcallk(i1, i3 + -2 | 0, -1, 1, 0, 166) | 0) == 0 | 0) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _luaS_newudata(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if (i3 >>> 0 > 4294967269) {
  _luaM_toobig(i1);
 } else {
  i1 = _luaC_newobj(i1, 7, i3 + 24 | 0, 0, 0) | 0;
  HEAP32[i1 + 16 >> 2] = i3;
  HEAP32[i1 + 8 >> 2] = 0;
  HEAP32[i1 + 12 >> 2] = i4;
  STACKTOP = i2;
  return i1 | 0;
 }
 return 0;
}
function _lua_dump(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 8 >> 2] | 0;
 if ((HEAP32[i3 + -8 >> 2] | 0) != 70) {
  i5 = 1;
  STACKTOP = i2;
  return i5 | 0;
 }
 i5 = _luaU_dump(i1, HEAP32[(HEAP32[i3 + -16 >> 2] | 0) + 12 >> 2] | 0, i4, i5, 0) | 0;
 STACKTOP = i2;
 return i5 | 0;
}
function _luaS_eqlngstr(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = HEAP32[i2 + 12 >> 2] | 0;
 if ((i2 | 0) != (i4 | 0)) {
  if ((i3 | 0) == (HEAP32[i4 + 12 >> 2] | 0)) {
   i2 = (_memcmp(i2 + 16 | 0, i4 + 16 | 0, i3) | 0) == 0;
  } else {
   i2 = 0;
  }
 } else {
  i2 = 1;
 }
 STACKTOP = i1;
 return i2 & 1 | 0;
}
function _luaC_barrier_(i4, i3, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i4 + 12 >> 2] | 0;
 if ((HEAPU8[i4 + 61 | 0] | 0) < 2) {
  _reallymarkobject(i4, i1);
  STACKTOP = i2;
  return;
 } else {
  i3 = i3 + 5 | 0;
  HEAP8[i3] = HEAP8[i4 + 60 | 0] & 3 | HEAP8[i3] & 184;
  STACKTOP = i2;
  return;
 }
}
function _db_getupvalue(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkinteger(i1, 2) | 0;
 _luaL_checktype(i1, 1, 6);
 i3 = _lua_getupvalue(i1, 1, i3) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 _lua_pushstring(i1, i3) | 0;
 _lua_insert(i1, -2);
 i3 = 2;
 STACKTOP = i2;
 return i3 | 0;
}
function _os_execute(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i4 = _luaL_optlstring(i1, 1, 0, 0) | 0;
 i3 = _system(i4 | 0) | 0;
 if ((i4 | 0) == 0) {
  _lua_pushboolean(i1, i3);
  i4 = 1;
  STACKTOP = i2;
  return i4 | 0;
 } else {
  i4 = _luaL_execresult(i1, i3) | 0;
  STACKTOP = i2;
  return i4 | 0;
 }
 return 0;
}
function _lua_pushfstring(i4, i5, i1) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 if ((HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i4);
 }
 HEAP32[i3 >> 2] = i1;
 i5 = _luaO_pushvfstring(i4, i5, i3) | 0;
 STACKTOP = i2;
 return i5 | 0;
}
function _luaB_dofile(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_optlstring(i1, 1, 0, 0) | 0;
 _lua_settop(i1, 1);
 if ((_luaL_loadfilex(i1, i3, 0) | 0) == 0) {
  _lua_callk(i1, 0, -1, 0, 164);
  i3 = (_lua_gettop(i1) | 0) + -1 | 0;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  _lua_error(i1) | 0;
 }
 return 0;
}
function _f_write(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i3 = HEAP32[i3 >> 2] | 0;
 _lua_pushvalue(i1, 1);
 i3 = _g_write(i1, i3, 2) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _lua_getctx(i3, i1) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i3 + 16 >> 2] | 0;
 if ((HEAP8[i3 + 18 | 0] & 8) == 0) {
  i3 = 0;
  STACKTOP = i2;
  return i3 | 0;
 }
 if ((i1 | 0) != 0) {
  HEAP32[i1 >> 2] = HEAP32[i3 + 24 >> 2];
 }
 i3 = HEAPU8[i3 + 37 | 0] | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _f_flush(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i3 = _luaL_fileresult(i1, (_fflush(HEAP32[i3 >> 2] | 0) | 0) == 0 | 0, 0) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _os_tmpname(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i2 + 4 | 0;
 if ((_tmpnam(i3 | 0) | 0) == 0) {
  i3 = _luaL_error(i1, 5824, i2) | 0;
  STACKTOP = i2;
  return i3 | 0;
 } else {
  _lua_pushstring(i1, i3) | 0;
  i3 = 1;
  STACKTOP = i2;
  return i3 | 0;
 }
 return 0;
}
function _traceback(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_tolstring(i1, 1, 0) | 0;
 if ((i3 | 0) == 0) {
  if ((_lua_type(i1, 1) | 0) >= 1 ? (_luaL_callmeta(i1, 1, 216) | 0) == 0 : 0) {
   _lua_pushlstring(i1, 232, 18) | 0;
  }
 } else {
  _luaL_traceback(i1, i1, i3, 1);
 }
 STACKTOP = i2;
 return 1;
}
function _luaH_new(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _luaC_newobj(i1, 5, 32, 0, 0) | 0;
 HEAP32[i1 + 8 >> 2] = 0;
 HEAP8[i1 + 6 | 0] = -1;
 HEAP32[i1 + 12 >> 2] = 0;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 16 >> 2] = 8016;
 HEAP8[i1 + 7 | 0] = 0;
 HEAP32[i1 + 20 >> 2] = 8016;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaL_len(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2 + 4 | 0;
 _lua_len(i1, i3);
 i3 = _lua_tointegerx(i1, -1, i4) | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  _luaL_error(i1, 1352, i2) | 0;
 }
 _lua_settop(i1, -2);
 STACKTOP = i2;
 return i3 | 0;
}
function _getS(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0, i5 = 0;
 i3 = STACKTOP;
 i5 = i2 + 4 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 if ((i4 | 0) == 0) {
  i5 = 0;
  STACKTOP = i3;
  return i5 | 0;
 }
 HEAP32[i1 >> 2] = i4;
 HEAP32[i5 >> 2] = 0;
 i5 = HEAP32[i2 >> 2] | 0;
 STACKTOP = i3;
 return i5 | 0;
}
function _luaC_runtilstate(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = (HEAP32[i1 + 12 >> 2] | 0) + 61 | 0;
 if ((1 << (HEAPU8[i3] | 0) & i4 | 0) != 0) {
  STACKTOP = i2;
  return;
 }
 do {
  _singlestep(i1) | 0;
 } while ((1 << (HEAPU8[i3] | 0) & i4 | 0) == 0);
 STACKTOP = i2;
 return;
}
function _luaX_init(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i3 = 0;
 do {
  i4 = _luaS_new(i1, HEAP32[12096 + (i3 << 2) >> 2] | 0) | 0;
  i5 = i4 + 5 | 0;
  HEAP8[i5] = HEAPU8[i5] | 0 | 32;
  i3 = i3 + 1 | 0;
  HEAP8[i4 + 6 | 0] = i3;
 } while ((i3 | 0) != 22);
 STACKTOP = i2;
 return;
}
function _luaK_indexed(i5, i1, i4) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0;
 i3 = STACKTOP;
 i2 = i1 + 8 | 0;
 HEAP8[i2 + 2 | 0] = HEAP32[i2 >> 2];
 HEAP16[i2 >> 1] = _luaK_exp2RK(i5, i4) | 0;
 HEAP8[i2 + 3 | 0] = (HEAP32[i1 >> 2] | 0) == 8 ? 8 : 7;
 HEAP32[i1 >> 2] = 9;
 STACKTOP = i3;
 return;
}
function _db_setuservalue(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, 1) | 0) == 2) {
  _luaL_argerror(i1, 1, 11680) | 0;
 }
 _luaL_checktype(i1, 1, 7);
 if ((_lua_type(i1, 2) | 0) >= 1) {
  _luaL_checktype(i1, 2, 5);
 }
 _lua_settop(i1, 2);
 _lua_setuservalue(i1, 1);
 STACKTOP = i2;
 return 1;
}
function _ll_seeall(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 if ((_lua_getmetatable(i1, 1) | 0) == 0) {
  _lua_createtable(i1, 0, 1);
  _lua_pushvalue(i1, -1);
  _lua_setmetatable(i1, 1) | 0;
 }
 _lua_rawgeti(i1, -1001e3, 2);
 _lua_setfield(i1, -2, 5168);
 STACKTOP = i2;
 return 0;
}
function _luaL_loadbufferx(i3, i5, i4, i2, i1) {
 i3 = i3 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i6 = 0, i7 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i7 = i6;
 HEAP32[i7 >> 2] = i5;
 HEAP32[i7 + 4 >> 2] = i4;
 i5 = _lua_load(i3, 2, i7, i2, i1) | 0;
 STACKTOP = i6;
 return i5 | 0;
}
function _luaT_gettm(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i4 = _luaH_getstr(i1, i4) | 0;
 if ((HEAP32[i4 + 8 >> 2] | 0) != 0) {
  STACKTOP = i2;
  return i4 | 0;
 }
 i4 = i1 + 6 | 0;
 HEAP8[i4] = HEAPU8[i4] | 0 | 1 << i3;
 i4 = 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _luaL_pushresult(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 12 >> 2] | 0;
 _lua_pushlstring(i3, HEAP32[i1 >> 2] | 0, HEAP32[i1 + 8 >> 2] | 0) | 0;
 if ((HEAP32[i1 >> 2] | 0) == (i1 + 16 | 0)) {
  STACKTOP = i2;
  return;
 }
 _lua_remove(i3, -2);
 STACKTOP = i2;
 return;
}
function _resume_error(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0;
 i4 = i1 + 8 | 0;
 HEAP32[i4 >> 2] = i2;
 i3 = _luaS_new(i1, i3) | 0;
 HEAP32[i2 >> 2] = i3;
 HEAP32[i2 + 8 >> 2] = HEAPU8[i3 + 4 | 0] | 0 | 64;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 16;
 _luaD_throw(i1, -1);
}
function _lua_absindex(i3, i1) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i1 + 1000999 | 0) >>> 0 > 1000999) {
  i3 = i1;
  STACKTOP = i2;
  return i3 | 0;
 }
 i3 = ((HEAP32[i3 + 8 >> 2] | 0) - (HEAP32[HEAP32[i3 + 16 >> 2] >> 2] | 0) >> 4) + i1 | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function ___uremdi3(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 8 | 0;
 i5 = i6 | 0;
 ___udivmoddi4(i4, i3, i2, i1, i5) | 0;
 STACKTOP = i6;
 return (tempRet0 = HEAP32[i5 + 4 >> 2] | 0, HEAP32[i5 >> 2] | 0) | 0;
}
function _f_read(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = _luaL_checkudata(i1, 1, 2832) | 0;
 if ((HEAP32[i3 + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 i3 = _g_read(i1, HEAP32[i3 >> 2] | 0, 2) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _sort(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 i3 = _luaL_len(i1, 1) | 0;
 _luaL_checkstack(i1, 40, 8208);
 if ((_lua_type(i1, 2) | 0) >= 1) {
  _luaL_checktype(i1, 2, 6);
 }
 _lua_settop(i1, 2);
 _auxsort(i1, 1, i3);
 STACKTOP = i2;
 return 0;
}
function _luaB_error(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = _luaL_optinteger(i1, 2, 1) | 0;
 _lua_settop(i1, 1);
 if (!((_lua_isstring(i1, 1) | 0) != 0 & (i2 | 0) > 0)) {
  _lua_error(i1) | 0;
 }
 _luaL_where(i1, i2);
 _lua_pushvalue(i1, 1);
 _lua_concat(i1, 2);
 _lua_error(i1) | 0;
 return 0;
}
function _error(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = HEAP32[i1 >> 2] | 0;
 HEAP32[i3 >> 2] = HEAP32[i1 + 12 >> 2];
 HEAP32[i3 + 4 >> 2] = i2;
 _luaO_pushfstring(i4, 8840, i3) | 0;
 _luaD_throw(HEAP32[i1 >> 2] | 0, 3);
}
function _ipairsaux(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkinteger(i1, 2) | 0;
 _luaL_checktype(i1, 1, 5);
 i3 = i3 + 1 | 0;
 _lua_pushinteger(i1, i3);
 _lua_rawgeti(i1, 1, i3);
 i1 = (_lua_type(i1, -1) | 0) == 0;
 STACKTOP = i2;
 return (i1 ? 1 : 2) | 0;
}
function _panic(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 i3 = HEAP32[_stderr >> 2] | 0;
 HEAP32[i4 >> 2] = _lua_tolstring(i1, -1, 0) | 0;
 _fprintf(i3 | 0, 1656, i4 | 0) | 0;
 _fflush(i3 | 0) | 0;
 STACKTOP = i2;
 return 0;
}
function _testSetjmp(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0;
 while ((i3 | 0) < 20) {
  i4 = HEAP32[i2 + (i3 << 2) >> 2] | 0;
  if ((i4 | 0) == 0) break;
  if ((i4 | 0) == (i1 | 0)) {
   return HEAP32[i2 + ((i3 << 2) + 4) >> 2] | 0;
  }
  i3 = i3 + 2 | 0;
 }
 return 0;
}
function _luaopen_math(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 28);
 _luaL_setfuncs(i1, 3576, 0);
 _lua_pushnumber(i1, 3.141592653589793);
 _lua_setfield(i1, -2, 3808);
 _lua_pushnumber(i1, inf);
 _lua_setfield(i1, -2, 3816);
 STACKTOP = i2;
 return 1;
}
function _luaopen_base(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_rawgeti(i1, -1001e3, 2);
 _lua_rawgeti(i1, -1001e3, 2);
 _lua_setfield(i1, -2, 9144);
 _luaL_setfuncs(i1, 9152, 0);
 _lua_pushlstring(i1, 9344, 7) | 0;
 _lua_setfield(i1, -2, 9352);
 STACKTOP = i2;
 return 1;
}
function _luaE_extendCI(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i3 = STACKTOP;
 i2 = _luaM_realloc_(i1, 0, 0, 40) | 0;
 i1 = i1 + 16 | 0;
 HEAP32[(HEAP32[i1 >> 2] | 0) + 12 >> 2] = i2;
 HEAP32[i2 + 8 >> 2] = HEAP32[i1 >> 2];
 HEAP32[i2 + 12 >> 2] = 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _luaB_getmetatable(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 if ((_lua_getmetatable(i1, 1) | 0) == 0) {
  _lua_pushnil(i1);
  STACKTOP = i2;
  return 1;
 } else {
  _luaL_getmetafield(i1, 1, 9704) | 0;
  STACKTOP = i2;
  return 1;
 }
 return 0;
}
function _lua_pushunsigned(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var d3 = 0.0;
 if ((i2 | 0) > -1) {
  d3 = +(i2 | 0);
 } else {
  d3 = +(i2 >>> 0);
 }
 i2 = i1 + 8 | 0;
 i1 = HEAP32[i2 >> 2] | 0;
 HEAPF64[i1 >> 3] = d3;
 HEAP32[i1 + 8 >> 2] = 3;
 HEAP32[i2 >> 2] = i1 + 16;
 return;
}
function _lua_pushthread(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = i1 + 8 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 HEAP32[i3 >> 2] = i1;
 HEAP32[i3 + 8 >> 2] = 72;
 HEAP32[i2 >> 2] = (HEAP32[i2 >> 2] | 0) + 16;
 return (HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 172 >> 2] | 0) == (i1 | 0) | 0;
}
function _gctm(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_len(i1, 1) | 0;
 if ((i3 | 0) <= 0) {
  STACKTOP = i2;
  return 0;
 }
 do {
  _lua_rawgeti(i1, 1, i3);
  _lua_settop(i1, -2);
  i3 = i3 + -1 | 0;
 } while ((i3 | 0) > 0);
 STACKTOP = i2;
 return 0;
}
function ___muldi3(i4, i2, i3, i1) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0;
 i5 = i4;
 i6 = i3;
 i4 = ___muldsi3(i5, i6) | 0;
 i3 = tempRet0;
 return (tempRet0 = (Math_imul(i2, i6) | 0) + (Math_imul(i1, i5) | 0) + i3 | i3 & 0, i4 | 0 | 0) | 0;
}
function _luaH_resizearray(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0, i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i3 + 16 >> 2] | 0) == 8016) {
  i5 = 0;
 } else {
  i5 = 1 << (HEAPU8[i3 + 7 | 0] | 0);
 }
 _luaH_resize(i1, i3, i4, i5);
 STACKTOP = i2;
 return;
}
function _luaK_stringK(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i3;
 HEAP32[i4 >> 2] = i2;
 HEAP32[i4 + 8 >> 2] = HEAPU8[i2 + 4 | 0] | 0 | 64;
 i2 = _addk(i1, i4, i4) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _math_modf(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0, i4 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = i2;
 d3 = +_modf(+(+_luaL_checknumber(i1, 1)), i4 | 0);
 _lua_pushnumber(i1, +HEAPF64[i4 >> 3]);
 _lua_pushnumber(i1, d3);
 STACKTOP = i2;
 return 2;
}
function _os_setlocale(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_optlstring(i1, 1, 0, 0) | 0;
 _lua_pushstring(i1, _setlocale(HEAP32[5960 + ((_luaL_checkoption(i1, 2, 6016, 5984) | 0) << 2) >> 2] | 0, i3 | 0) | 0) | 0;
 STACKTOP = i2;
 return 1;
}
function _luaB_pcall(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 _lua_pushnil(i1);
 _lua_insert(i1, 1);
 i1 = _finishpcall(i1, (_lua_pcallk(i1, (_lua_gettop(i1) | 0) + -2 | 0, -1, 0, 0, 166) | 0) == 0 | 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _error_expected(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = HEAP32[i1 + 52 >> 2] | 0;
 HEAP32[i3 >> 2] = _luaX_token2str(i1, i2) | 0;
 _luaX_syntaxerror(i1, _luaO_pushfstring(i4, 6328, i3) | 0);
}
function _lua_pushvfstring(i1, i3, i4) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 12 >> 2] | 0) > 0) {
  _luaC_step(i1);
 }
 i4 = _luaO_pushvfstring(i1, i3, i4) | 0;
 STACKTOP = i2;
 return i4 | 0;
}
function _db_setmetatable(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _lua_type(i1, 2) | 0;
 if (!((i3 | 0) == 0 | (i3 | 0) == 5)) {
  _luaL_argerror(i1, 2, 11536) | 0;
 }
 _lua_settop(i1, 2);
 _lua_setmetatable(i1, 1) | 0;
 STACKTOP = i2;
 return 1;
}
function _b_rrot(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i3 = 0 - (_luaL_checkinteger(i1, 2) | 0) | 0;
 i4 = _luaL_checkunsigned(i1, 1) | 0;
 i3 = i3 & 31;
 _lua_pushunsigned(i1, i4 >>> (32 - i3 | 0) | i4 << i3);
 STACKTOP = i2;
 return 1;
}
function _luaC_step(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 12 >> 2] | 0;
 if ((HEAP8[i3 + 63 | 0] | 0) == 0) {
  _luaE_setdebt(i3, -1600);
  STACKTOP = i2;
  return;
 } else {
  _luaC_forcestep(i1);
  STACKTOP = i2;
  return;
 }
}
function _math_frexp(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 _lua_pushnumber(i1, +_frexp(+(+_luaL_checknumber(i1, 1)), i3 | 0));
 _lua_pushinteger(i1, HEAP32[i3 >> 2] | 0);
 STACKTOP = i2;
 return 2;
}
function _luaO_pushfstring(i2, i1, i3) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i4 = 0, i5 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i5 = i4;
 HEAP32[i5 >> 2] = i3;
 i3 = _luaO_pushvfstring(i2, i1, i5) | 0;
 STACKTOP = i4;
 return i3 | 0;
}
function _luaO_hexavalue(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((HEAP8[i1 + 10913 | 0] & 2) == 0) {
  i1 = (i1 | 32) + -87 | 0;
  STACKTOP = i2;
  return i1 | 0;
 } else {
  i1 = i1 + -48 | 0;
  STACKTOP = i2;
  return i1 | 0;
 }
 return 0;
}
function _b_lrot(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checkinteger(i1, 2) | 0;
 i4 = _luaL_checkunsigned(i1, 1) | 0;
 i3 = i3 & 31;
 _lua_pushunsigned(i1, i4 >>> (32 - i3 | 0) | i4 << i3);
 STACKTOP = i2;
 return 1;
}
function _f_lines(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 if ((HEAP32[(_luaL_checkudata(i1, 1, 2832) | 0) + 4 >> 2] | 0) == 0) {
  _luaL_error(i1, 3080, i2) | 0;
 }
 _aux_lines(i1, 0);
 STACKTOP = i2;
 return 1;
}
function _luaC_barrierback_(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i2 = HEAP32[i2 + 12 >> 2] | 0;
 i3 = i1 + 5 | 0;
 HEAP8[i3] = HEAP8[i3] & 251;
 i2 = i2 + 88 | 0;
 HEAP32[i1 + 24 >> 2] = HEAP32[i2 >> 2];
 HEAP32[i2 >> 2] = i1;
 return;
}
function _os_rename(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 i1 = _luaL_fileresult(i1, (_rename(i3 | 0, _luaL_checklstring(i1, 2, 0) | 0) | 0) == 0 | 0, 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _bitshift64Ashr(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 if ((i1 | 0) < 32) {
  tempRet0 = i2 >> i1;
  return i3 >>> i1 | (i2 & (1 << i1) - 1) << 32 - i1;
 }
 tempRet0 = (i2 | 0) < 0 ? -1 : 0;
 return i2 >> i1 - 32 | 0;
}
function _luaB_cowrap(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 6);
 i3 = _lua_newthread(i1) | 0;
 _lua_pushvalue(i1, 1);
 _lua_xmove(i1, i3, 1);
 _lua_pushcclosure(i1, 167, 1);
 STACKTOP = i2;
 return 1;
}
function _gmatch(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checklstring(i1, 1, 0) | 0;
 _luaL_checklstring(i1, 2, 0) | 0;
 _lua_settop(i1, 2);
 _lua_pushinteger(i1, 0);
 _lua_pushcclosure(i1, 163, 3);
 STACKTOP = i2;
 return 1;
}
function _luaB_next(i2) {
 i2 = i2 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 _luaL_checktype(i2, 1, 5);
 _lua_settop(i2, 2);
 if ((_lua_next(i2, 1) | 0) == 0) {
  _lua_pushnil(i2);
  i2 = 1;
 } else {
  i2 = 2;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _luaK_codeABC(i5, i3, i4, i2, i1) {
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i6 = 0;
 i6 = STACKTOP;
 i5 = _luaK_code(i5, i4 << 6 | i3 | i2 << 23 | i1 << 14) | 0;
 STACKTOP = i6;
 return i5 | 0;
}
function _luaH_set(i2, i4, i5) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = _luaH_get(i4, i5) | 0;
 if ((i3 | 0) == 5192) {
  i3 = _luaH_newkey(i2, i4, i5) | 0;
 }
 STACKTOP = i1;
 return i3 | 0;
}
function _luaZ_init(i4, i1, i3, i2) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 HEAP32[i1 + 16 >> 2] = i4;
 HEAP32[i1 + 8 >> 2] = i3;
 HEAP32[i1 + 12 >> 2] = i2;
 HEAP32[i1 >> 2] = 0;
 HEAP32[i1 + 4 >> 2] = 0;
 return;
}
function _lua_pushlightuserdata(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i2 = i2 + 8 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 HEAP32[i3 >> 2] = i1;
 HEAP32[i3 + 8 >> 2] = 2;
 HEAP32[i2 >> 2] = (HEAP32[i2 >> 2] | 0) + 16;
 return;
}
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 _bitshift64Shl(i2, i3, i1) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 if ((i1 | 0) < 32) {
  tempRet0 = i3 << i1 | (i2 & (1 << i1) - 1 << 32 - i1) >>> 32 - i1;
  return i2 << i1;
 }
 tempRet0 = i2 << i1 - 32;
 return 0;
}
function _luaB_rawlen(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if (((_lua_type(i1, 1) | 0) & -2 | 0) != 4) {
  _luaL_argerror(i1, 1, 9784) | 0;
 }
 _lua_pushinteger(i1, _lua_rawlen(i1, 1) | 0);
 STACKTOP = i2;
 return 1;
}
function _l_alloc(i3, i1, i4, i2) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i3 = STACKTOP;
 if ((i2 | 0) == 0) {
  _free(i1);
  i1 = 0;
 } else {
  i1 = _realloc(i1, i2) | 0;
 }
 STACKTOP = i3;
 return i1 | 0;
}
function _bitshift64Lshr(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 if ((i1 | 0) < 32) {
  tempRet0 = i2 >>> i1;
  return i3 >>> i1 | (i2 & (1 << i1) - 1) << 32 - i1;
 }
 tempRet0 = 0;
 return i2 >>> i1 - 32 | 0;
}
function _luaG_aritherror(i3, i1, i2) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i4 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i4 = (_luaV_tonumber(i1, i4) | 0) == 0;
 _luaG_typeerror(i3, i4 ? i1 : i2, 1928);
}
function _str_len(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 _luaL_checklstring(i1, 1, i3) | 0;
 _lua_pushinteger(i1, HEAP32[i3 >> 2] | 0);
 STACKTOP = i2;
 return 1;
}
function _luaL_optinteger(i3, i4, i2) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0;
 i1 = STACKTOP;
 if ((_lua_type(i3, i4) | 0) >= 1) {
  i2 = _luaL_checkinteger(i3, i4) | 0;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function _os_difftime(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = ~~+_luaL_checknumber(i1, 1);
 _lua_pushnumber(i1, +_difftime(i3 | 0, ~~+_luaL_optnumber(i1, 2, 0.0) | 0));
 STACKTOP = i2;
 return 1;
}
function _lua_pushboolean(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i2 = i2 + 8 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 HEAP32[i3 >> 2] = (i1 | 0) != 0;
 HEAP32[i3 + 8 >> 2] = 1;
 HEAP32[i2 >> 2] = i3 + 16;
 return;
}
function _os_remove(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = _luaL_checklstring(i1, 1, 0) | 0;
 i1 = _luaL_fileresult(i1, (_remove(i3 | 0) | 0) == 0 | 0, i3) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaopen_table(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 7);
 _luaL_setfuncs(i1, 8088, 0);
 _lua_getfield(i1, -1, 8152);
 _lua_setglobal(i1, 8152);
 STACKTOP = i2;
 return 1;
}
function _lua_pushinteger(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i2 = i2 + 8 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 HEAPF64[i3 >> 3] = +(i1 | 0);
 HEAP32[i3 + 8 >> 2] = 3;
 HEAP32[i2 >> 2] = i3 + 16;
 return;
}
function _luaB_rawset(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 _luaL_checkany(i1, 2);
 _luaL_checkany(i1, 3);
 _lua_settop(i1, 3);
 _lua_rawset(i1, 1);
 STACKTOP = i2;
 return 1;
}
function _luaE_setdebt(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = i2 + 12 | 0;
 i2 = i2 + 8 | 0;
 HEAP32[i2 >> 2] = (HEAP32[i3 >> 2] | 0) - i1 + (HEAP32[i2 >> 2] | 0);
 HEAP32[i3 >> 2] = i1;
 return;
}
function _luaB_cocreate(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 6);
 i3 = _lua_newthread(i1) | 0;
 _lua_pushvalue(i1, 1);
 _lua_xmove(i1, i3, 1);
 STACKTOP = i2;
 return 1;
}
function _io_noclose(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 HEAP32[(_luaL_checkudata(i1, 1, 2832) | 0) + 4 >> 2] = 154;
 _lua_pushnil(i1);
 _lua_pushlstring(i1, 2840, 26) | 0;
 STACKTOP = i2;
 return 2;
}
function _io_fclose(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _luaL_fileresult(i1, (_fclose(HEAP32[(_luaL_checkudata(i1, 1, 2832) | 0) >> 2] | 0) | 0) == 0 | 0, 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaL_optnumber(i3, i4, d2) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 d2 = +d2;
 var i1 = 0;
 i1 = STACKTOP;
 if ((_lua_type(i3, i4) | 0) >= 1) {
  d2 = +_luaL_checknumber(i3, i4);
 }
 STACKTOP = i1;
 return +d2;
}
function _math_atan2(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0;
 i2 = STACKTOP;
 d3 = +_luaL_checknumber(i1, 1);
 _lua_pushnumber(i1, +Math_atan2(+d3, +(+_luaL_checknumber(i1, 2))));
 STACKTOP = i2;
 return 1;
}
function _luaK_codeABx(i4, i2, i3, i1) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 i4 = _luaK_code(i4, i3 << 6 | i2 | i1 << 14) | 0;
 STACKTOP = i5;
 return i4 | 0;
}
function _luaF_newCclosure(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i2 = _luaC_newobj(i2, 38, (i1 << 4) + 16 | 0, 0, 0) | 0;
 HEAP8[i2 + 6 | 0] = i1;
 STACKTOP = i3;
 return i2 | 0;
}
function _math_pow(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0;
 i2 = STACKTOP;
 d3 = +_luaL_checknumber(i1, 1);
 _lua_pushnumber(i1, +Math_pow(+d3, +(+_luaL_checknumber(i1, 2))));
 STACKTOP = i2;
 return 1;
}
function _math_ldexp(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0;
 i2 = STACKTOP;
 d3 = +_luaL_checknumber(i1, 1);
 _lua_pushnumber(i1, +_ldexp(d3, _luaL_checkinteger(i1, 2) | 0));
 STACKTOP = i2;
 return 1;
}
function _luaF_newupval(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _luaC_newobj(i1, 10, 32, 0, 0) | 0;
 HEAP32[i1 + 8 >> 2] = i1 + 16;
 HEAP32[i1 + 24 >> 2] = 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _lua_pushnumber(i2, d1) {
 i2 = i2 | 0;
 d1 = +d1;
 var i3 = 0;
 i2 = i2 + 8 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 HEAPF64[i3 >> 3] = d1;
 HEAP32[i3 + 8 >> 2] = 3;
 HEAP32[i2 >> 2] = i3 + 16;
 return;
}
function _math_fmod(i1) {
 i1 = i1 | 0;
 var i2 = 0, d3 = 0.0;
 i2 = STACKTOP;
 d3 = +_luaL_checknumber(i1, 1);
 _lua_pushnumber(i1, +_fmod(+d3, +(+_luaL_checknumber(i1, 2))));
 STACKTOP = i2;
 return 1;
}
function _luaG_concaterror(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 i4 = HEAP32[i2 + 8 >> 2] | 0;
 _luaG_typeerror(i3, (i4 & 15 | 0) == 4 | (i4 | 0) == 3 ? i1 : i2, 1912);
}
function _luaB_rawequal(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 _luaL_checkany(i1, 2);
 _lua_pushboolean(i1, _lua_rawequal(i1, 1, 2) | 0);
 STACKTOP = i2;
 return 1;
}
function _db_getuservalue(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, 1) | 0) == 7) {
  _lua_getuservalue(i1, 1);
 } else {
  _lua_pushnil(i1);
 }
 STACKTOP = i2;
 return 1;
}
function _strchr(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i2 = ___strchrnul(i2, i1) | 0;
 STACKTOP = i3;
 return ((HEAP8[i2] | 0) == (i1 & 255) << 24 >> 24 ? i2 : 0) | 0;
}
function runPostSets() {}
function _rand_r(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = (Math_imul(HEAP32[i1 >> 2] | 0, 31010991) | 0) + 1735287159 & 2147483647;
 HEAP32[i1 >> 2] = i2;
 return i2 | 0;
}
function _luaL_checkany(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((_lua_type(i1, i3) | 0) == -1) {
  _luaL_argerror(i1, i3, 1256) | 0;
 }
 STACKTOP = i2;
 return;
}
function _i64Subtract(i2, i4, i1, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 - i3 - (i1 >>> 0 > i2 >>> 0 | 0) >>> 0;
 return (tempRet0 = i4, i2 - i1 >>> 0 | 0) | 0;
}
function _db_getmetatable(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 if ((_lua_getmetatable(i1, 1) | 0) == 0) {
  _lua_pushnil(i1);
 }
 STACKTOP = i2;
 return 1;
}
function _luaB_rawget(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checktype(i1, 1, 5);
 _luaL_checkany(i1, 2);
 _lua_settop(i1, 2);
 _lua_rawget(i1, 1);
 STACKTOP = i2;
 return 1;
}
function _luaB_type(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 _lua_pushstring(i1, _lua_typename(i1, _lua_type(i1, 1) | 0) | 0) | 0;
 STACKTOP = i2;
 return 1;
}
function dynCall_iiiii(i5, i4, i3, i2, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiiii[i5 & 3](i4 | 0, i3 | 0, i2 | 0, i1 | 0) | 0;
}
function _lstop(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 _lua_sethook(i1, 0, 0, 0) | 0;
 _luaL_error(i1, 200, i2) | 0;
 STACKTOP = i2;
 return;
}
function _i64Add(i1, i3, i4, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i4 = i1 + i4 >>> 0;
 return (tempRet0 = i3 + i2 + (i4 >>> 0 < i1 >>> 0 | 0) >>> 0, i4 | 0) | 0;
}
function _luaK_ret(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 i4 = STACKTOP;
 _luaK_code(i3, i2 << 6 | (i1 << 23) + 8388608 | 31) | 0;
 STACKTOP = i4;
 return;
}
function _strpbrk(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i1 = i2 + (_strcspn(i2, i1) | 0) | 0;
 STACKTOP = i3;
 return ((HEAP8[i1] | 0) != 0 ? i1 : 0) | 0;
}
function _luaL_setmetatable(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 _lua_getfield(i1, -1001e3, i2);
 _lua_setmetatable(i1, -2) | 0;
 STACKTOP = i3;
 return;
}
function _lua_atpanic(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = (HEAP32[i2 + 12 >> 2] | 0) + 168 | 0;
 i2 = HEAP32[i3 >> 2] | 0;
 HEAP32[i3 >> 2] = i1;
 return i2 | 0;
}
function _luaL_newstate() {
 var i1 = 0, i2 = 0;
 i2 = STACKTOP;
 i1 = _lua_newstate(1, 0) | 0;
 if ((i1 | 0) != 0) {
  _lua_atpanic(i1, 143) | 0;
 }
 STACKTOP = i2;
 return i1 | 0;
}
function _luaL_buffinit(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 HEAP32[i1 + 12 >> 2] = i2;
 HEAP32[i1 >> 2] = i1 + 16;
 HEAP32[i1 + 8 >> 2] = 0;
 HEAP32[i1 + 4 >> 2] = 1024;
 return;
}
function _strrchr(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i2 = ___memrchr(i1, i2, (_strlen(i1 | 0) | 0) + 1 | 0) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _luaK_fixline(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 HEAP32[(HEAP32[(HEAP32[i1 >> 2] | 0) + 20 >> 2] | 0) + ((HEAP32[i1 + 20 >> 2] | 0) + -1 << 2) >> 2] = i2;
 return;
}
function _luaX_lookahead(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i3 = STACKTOP;
 i2 = _llex(i1, i1 + 40 | 0) | 0;
 HEAP32[i1 + 32 >> 2] = i2;
 STACKTOP = i3;
 return i2 | 0;
}
function _f_call(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 _luaD_call(i2, HEAP32[i1 >> 2] | 0, HEAP32[i1 + 4 >> 2] | 0, 0);
 STACKTOP = i3;
 return;
}
function _io_pclose(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkudata(i1, 1, 2832) | 0;
 i1 = _luaL_execresult(i1, -1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaS_new(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i2 = _luaS_newlstr(i2, i1, _strlen(i1 | 0) | 0) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _os_getenv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushstring(i1, _getenv(_luaL_checklstring(i1, 1, 0) | 0) | 0) | 0;
 STACKTOP = i2;
 return 1;
}
function _math_rad(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_luaL_checknumber(i1, 1) * .017453292519943295);
 STACKTOP = i2;
 return 1;
}
function _math_deg(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_luaL_checknumber(i1, 1) / .017453292519943295);
 STACKTOP = i2;
 return 1;
}
function _writer(i4, i2, i1, i3) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 _luaL_addlstring(i3, i2, i1);
 STACKTOP = i4;
 return 0;
}
function _luaL_addstring(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 _luaL_addlstring(i2, i1, _strlen(i1 | 0) | 0);
 STACKTOP = i3;
 return;
}
function _pcallcont(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _finishpcall(i1, (_lua_getctx(i1, 0) | 0) == 1 | 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaopen_coroutine(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 6);
 _luaL_setfuncs(i1, 10656, 0);
 STACKTOP = i2;
 return 1;
}
function _lua_version(i1) {
 i1 = i1 | 0;
 if ((i1 | 0) == 0) {
  i1 = 920;
 } else {
  i1 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 176 >> 2] | 0;
 }
 return i1 | 0;
}
function _lua_pushnil(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i1 = i1 + 8 | 0;
 i2 = HEAP32[i1 >> 2] | 0;
 HEAP32[i2 + 8 >> 2] = 0;
 HEAP32[i1 >> 2] = i2 + 16;
 return;
}
function _math_floor(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_floor(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _laction(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _signal(i1 | 0, 0) | 0;
 _lua_sethook(HEAP32[48] | 0, 1, 11, 1) | 0;
 STACKTOP = i2;
 return;
}
function dynCall_iiii(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiii[i4 & 3](i3 | 0, i2 | 0, i1 | 0) | 0;
}
function _luaopen_debug(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 16);
 _luaL_setfuncs(i1, 11176, 0);
 STACKTOP = i2;
 return 1;
}
function _luaopen_bit32(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 12);
 _luaL_setfuncs(i1, 10240, 0);
 STACKTOP = i2;
 return 1;
}
function _math_sqrt(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_sqrt(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_ceil(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_ceil(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_atan(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_atan(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_asin(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_asin(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_acos(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_acos(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _lua_close(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _close_state(HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 172 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function _dothecall(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i2 = STACKTOP;
 _luaD_call(i1, (HEAP32[i1 + 8 >> 2] | 0) + -32 | 0, 0, 0);
 STACKTOP = i2;
 return;
}
function _math_tan(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_tan(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_sin(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_sin(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_log10(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_log10(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_exp(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_exp(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_cos(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_cos(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_abs(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +Math_abs(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_randomseed(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _srand(_luaL_checkunsigned(i1, 1) | 0);
 _rand() | 0;
 STACKTOP = i2;
 return 0;
}
function _luaopen_os(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_createtable(i1, 0, 11);
 _luaL_setfuncs(i1, 5624, 0);
 STACKTOP = i2;
 return 1;
}
function _math_tanh(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_tanh(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_sinh(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_sinh(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _math_cosh(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +_cosh(+(+_luaL_checknumber(i1, 1))));
 STACKTOP = i2;
 return 1;
}
function _luaB_yield(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _lua_yieldk(i1, _lua_gettop(i1) | 0, 0, 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaB_tostring(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _luaL_checkany(i1, 1);
 _luaL_tolstring(i1, 1, 0) | 0;
 STACKTOP = i2;
 return 1;
}
function _growstack(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 _luaD_growstack(i2, HEAP32[i1 >> 2] | 0);
 STACKTOP = i3;
 return;
}
function ___udivdi3(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 i4 = ___udivmoddi4(i4, i3, i2, i1, 0) | 0;
 return i4 | 0;
}
function _b_not(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushunsigned(i1, ~(_luaL_checkunsigned(i1, 1) | 0));
 STACKTOP = i2;
 return 1;
}
function _luaO_fb2int(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = i1 >>> 3 & 31;
 if ((i2 | 0) != 0) {
  i1 = (i1 & 7 | 8) << i2 + -1;
 }
 return i1 | 0;
}
function _luaB_corunning(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushboolean(i1, _lua_pushthread(i1) | 0);
 STACKTOP = i2;
 return 2;
}
function stackAlloc(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + i1 | 0;
 STACKTOP = STACKTOP + 7 & -8;
 return i2 | 0;
}
function _strcoll(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 i2 = _strcmp(i2, i1) | 0;
 STACKTOP = i3;
 return i2 | 0;
}
function _os_clock(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushnumber(i1, +(_clock() | 0) / 1.0e6);
 STACKTOP = i2;
 return 1;
}
function _dofilecont(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = (_lua_gettop(i1) | 0) + -1 | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _scalbnl(d2, i1) {
 d2 = +d2;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 d2 = +_scalbn(d2, i1);
 STACKTOP = i3;
 return +d2;
}
function _tolower(i1) {
 i1 = i1 | 0;
 if ((i1 | 0) < 65) return i1 | 0;
 if ((i1 | 0) > 90) return i1 | 0;
 return i1 - 65 + 97 | 0;
}
function _lua_gettop(i1) {
 i1 = i1 | 0;
 return (HEAP32[i1 + 8 >> 2] | 0) - ((HEAP32[HEAP32[i1 + 16 >> 2] >> 2] | 0) + 16) >> 4 | 0;
}
function dynCall_iii(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iii[i3 & 1](i2 | 0, i1 | 0) | 0;
}
function _str_match(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _str_find_aux(i1, 0) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _luaM_toobig(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 _luaG_runerror(i1, 4144, i2);
}
function _luaK_getlabel(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = HEAP32[i1 + 20 >> 2] | 0;
 HEAP32[i1 + 24 >> 2] = i2;
 return i2 | 0;
}
function _ldexp(d2, i1) {
 d2 = +d2;
 i1 = i1 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 d2 = +_scalbn(d2, i1);
 STACKTOP = i3;
 return +d2;
}
function _str_find(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _str_find_aux(i1, 1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function _db_getregistry(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _lua_pushvalue(i1, -1001e3);
 STACKTOP = i2;
 return 1;
}
function _luaB_ipairs(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _pairsmeta(i1, 9960, 1, 165);
 STACKTOP = i2;
 return 3;
}
function _strlen(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = i1;
 while (HEAP8[i2] | 0) {
  i2 = i2 + 1 | 0;
 }
 return i2 - i1 | 0;
}
function _luaB_pairs(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _pairsmeta(i1, 9864, 0, 93);
 STACKTOP = i2;
 return 3;
}
function setThrew(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 if ((__THREW__ | 0) == 0) {
  __THREW__ = i1;
  threwValue = i2;
 }
}
function _io_output(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _g_iofile(i1, 2800, 3512);
 STACKTOP = i2;
 return 1;
}
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 _io_input(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _g_iofile(i1, 2776, 3480);
 STACKTOP = i2;
 return 1;
}
function _semerror(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 HEAP32[i2 + 16 >> 2] = 0;
 _luaX_syntaxerror(i2, i1);
}
function _luaX_syntaxerror(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 _lexerror(i1, i2, HEAP32[i1 + 16 >> 2] | 0);
}
function b4(i1, i2, i3, i4) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 abort(4);
 return 0;
}
function _lua_typename(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 return HEAP32[8528 + (i1 + 1 << 2) >> 2] | 0;
}
function dynCall_ii(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_ii[i2 & 255](i1 | 0) | 0;
}
function dynCall_vi(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_vi[i2 & 1](i1 | 0);
}
function b0(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 abort(0);
 return 0;
}
function _lua_gethookmask(i1) {
 i1 = i1 | 0;
 return HEAPU8[i1 + 40 | 0] | 0 | 0;
}
function _lua_gethookcount(i1) {
 i1 = i1 | 0;
 return HEAP32[i1 + 44 >> 2] | 0;
}
function _lua_status(i1) {
 i1 = i1 | 0;
 return HEAPU8[i1 + 6 | 0] | 0 | 0;
}
function _lua_gethook(i1) {
 i1 = i1 | 0;
 return HEAP32[i1 + 52 >> 2] | 0;
}
function b5(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(5);
 return 0;
}
function _lua_error(i1) {
 i1 = i1 | 0;
 _luaG_errormsg(i1);
 return 0;
}
function b2(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(2);
}
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 b3(i1) {
 i1 = i1 | 0;
 abort(3);
 return 0;
}
function _rand() {
 return _rand_r(___rand_seed) | 0;
}
function stackSave() {
 return STACKTOP | 0;
}
function b1(i1) {
 i1 = i1 | 0;
 abort(1);
}

// EMSCRIPTEN_END_FUNCS
  var FUNCTION_TABLE_iiii = [b0,_getF,_getS,_generic_reader];
  var FUNCTION_TABLE_vi = [b1,_laction];
  var FUNCTION_TABLE_vii = [b2,_lstop,_growstack,_f_call,_resume,_unroll,_f_parser,_dothecall,_f_luaopen,_hookf,b2,b2,b2,b2,b2,b2];
  var FUNCTION_TABLE_ii = [b3,_io_close,_io_flush,_io_input,_io_lines,_io_open,_io_output,_io_popen,_io_read,_io_tmpfile,_io_type,_io_write,_f_flush,_f_lines,_f_read,_f_seek,_f_setvbuf,_f_write,_f_gc,_f_tostring,_math_abs,_math_acos,_math_asin,_math_atan2,_math_atan,_math_ceil,_math_cosh,_math_cos,_math_deg
  ,_math_exp,_math_floor,_math_fmod,_math_frexp,_math_ldexp,_math_log10,_math_log,_math_max,_math_min,_math_modf,_math_pow,_math_rad,_math_random,_math_randomseed,_math_sinh,_math_sin,_math_sqrt,_math_tanh,_math_tan,_ll_loadlib,_ll_searchpath,_ll_seeall,_ll_module,_ll_require,_os_clock,_os_date,_os_difftime,_os_execute,_os_exit,_os_getenv
  ,_os_remove,_os_rename,_os_setlocale,_os_time,_os_tmpname,_str_byte,_str_char,_str_dump,_str_find,_str_format,_gmatch,_str_gsub,_str_len,_str_lower,_str_match,_str_rep,_str_reverse,_str_sub,_str_upper,_tconcat,_maxn,_tinsert,_pack,_unpack,_tremove,_sort,_luaB_assert,_luaB_collectgarbage,_luaB_dofile,_luaB_error
  ,_luaB_getmetatable,_luaB_ipairs,_luaB_loadfile,_luaB_load,_luaB_next,_luaB_pairs,_luaB_pcall,_luaB_print,_luaB_rawequal,_luaB_rawlen,_luaB_rawget,_luaB_rawset,_luaB_select,_luaB_setmetatable,_luaB_tonumber,_luaB_tostring,_luaB_type,_luaB_xpcall,_b_arshift,_b_and,_b_not,_b_or,_b_xor,_b_test,_b_extract,_b_lrot,_b_lshift,_b_replace,_b_rrot,_b_rshift
  ,_luaB_cocreate,_luaB_coresume,_luaB_corunning,_luaB_costatus,_luaB_cowrap,_luaB_yield,_db_debug,_db_getuservalue,_db_gethook,_db_getinfo,_db_getlocal,_db_getregistry,_db_getmetatable,_db_getupvalue,_db_upvaluejoin,_db_upvalueid,_db_setuservalue,_db_sethook,_db_setlocal,_db_setmetatable,_db_setupvalue,_db_traceback,_pmain,_traceback,_panic,_luaopen_base,_luaopen_package,_luaopen_coroutine,_luaopen_table,_luaopen_io
  ,_luaopen_os,_luaopen_string,_luaopen_bit32,_luaopen_math,_luaopen_debug,_io_noclose,_io_readline,_io_fclose,_io_pclose,_gctm,_searcher_preload,_searcher_Lua,_searcher_C,_searcher_Croot,_gmatch_aux,_dofilecont,_ipairsaux,_pcallcont,_luaB_auxwrap,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3
  ,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3
  ,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3
  ,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3,b3];
  var FUNCTION_TABLE_iiiii = [b4,_l_alloc,_writer,b4];
  var FUNCTION_TABLE_iii = [b5,_lua_newstate];

  return { _testSetjmp: _testSetjmp, _i64Subtract: _i64Subtract, _free: _free, _main: _main, _rand_r: _rand_r, _realloc: _realloc, _i64Add: _i64Add, _tolower: _tolower, _saveSetjmp: _saveSetjmp, _memset: _memset, _malloc: _malloc, _memcpy: _memcpy, _strlen: _strlen, _rand: _rand, _bitshift64Shl: _bitshift64Shl, 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_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_ii: dynCall_ii, dynCall_iiiii: dynCall_iiiii, dynCall_iii: dynCall_iii };
})
// EMSCRIPTEN_END_ASM
({ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array }, { "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "min": Math_min, "invoke_iiii": invoke_iiii, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_iiiii": invoke_iiiii, "invoke_iii": invoke_iii, "_isalnum": _isalnum, "_fabs": _fabs, "_frexp": _frexp, "_exp": _exp, "_fread": _fread, "__reallyNegative": __reallyNegative, "_longjmp": _longjmp, "__addDays": __addDays, "_fsync": _fsync, "_signal": _signal, "_rename": _rename, "_sbrk": _sbrk, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_sinh": _sinh, "_sysconf": _sysconf, "_close": _close, "_ferror": _ferror, "_clock": _clock, "_cos": _cos, "_tanh": _tanh, "_unlink": _unlink, "_write": _write, "__isLeapYear": __isLeapYear, "_ftell": _ftell, "_isupper": _isupper, "_gmtime_r": _gmtime_r, "_islower": _islower, "_tmpnam": _tmpnam, "_tmpfile": _tmpfile, "_send": _send, "_abort": _abort, "_setvbuf": _setvbuf, "_atan2": _atan2, "_setlocale": _setlocale, "_isgraph": _isgraph, "_modf": _modf, "_strerror_r": _strerror_r, "_fscanf": _fscanf, "___setErrNo": ___setErrNo, "_isalpha": _isalpha, "_srand": _srand, "_mktime": _mktime, "_putchar": _putchar, "_gmtime": _gmtime, "_localeconv": _localeconv, "_sprintf": _sprintf, "_localtime": _localtime, "_read": _read, "_fwrite": _fwrite, "_time": _time, "_fprintf": _fprintf, "_exit": _exit, "_freopen": _freopen, "_llvm_pow_f64": _llvm_pow_f64, "_fgetc": _fgetc, "_fmod": _fmod, "_lseek": _lseek, "_rmdir": _rmdir, "_asin": _asin, "_floor": _floor, "_pwrite": _pwrite, "_localtime_r": _localtime_r, "_tzset": _tzset, "_open": _open, "_remove": _remove, "_snprintf": _snprintf, "__scanString": __scanString, "_strftime": _strftime, "_fseek": _fseek, "_iscntrl": _iscntrl, "_isxdigit": _isxdigit, "_fclose": _fclose, "_log": _log, "_recv": _recv, "_tan": _tan, "_copysign": _copysign, "__getFloat": __getFloat, "_fputc": _fputc, "_ispunct": _ispunct, "_ceil": _ceil, "_isspace": _isspace, "_fopen": _fopen, "_sin": _sin, "_acos": _acos, "_cosh": _cosh, "___buildEnvironment": ___buildEnvironment, "_difftime": _difftime, "_ungetc": _ungetc, "_system": _system, "_fflush": _fflush, "_log10": _log10, "_fileno": _fileno, "__exit": __exit, "__arraySum": __arraySum, "_fgets": _fgets, "_atan": _atan, "_pread": _pread, "_mkport": _mkport, "_toupper": _toupper, "_feof": _feof, "___errno_location": ___errno_location, "_clearerr": _clearerr, "_getenv": _getenv, "_strerror": _strerror, "_emscripten_longjmp": _emscripten_longjmp, "__formatString": __formatString, "_fputs": _fputs, "_sqrt": _sqrt, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "cttz_i8": cttz_i8, "ctlz_i8": ctlz_i8, "___rand_seed": ___rand_seed, "NaN": NaN, "Infinity": Infinity, "_stderr": _stderr, "_stdin": _stdin, "_stdout": _stdout }, buffer);
var _testSetjmp = Module["_testSetjmp"] = asm["_testSetjmp"];
var _i64Subtract = Module["_i64Subtract"] = asm["_i64Subtract"];
var _free = Module["_free"] = asm["_free"];
var _main = Module["_main"] = asm["_main"];
var _rand_r = Module["_rand_r"] = asm["_rand_r"];
var _realloc = Module["_realloc"] = asm["_realloc"];
var _i64Add = Module["_i64Add"] = asm["_i64Add"];
var _tolower = Module["_tolower"] = asm["_tolower"];
var _saveSetjmp = Module["_saveSetjmp"] = asm["_saveSetjmp"];
var _memset = Module["_memset"] = asm["_memset"];
var _malloc = Module["_malloc"] = asm["_malloc"];
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
var _strlen = Module["_strlen"] = asm["_strlen"];
var _rand = Module["_rand"] = asm["_rand"];
var _bitshift64Shl = Module["_bitshift64Shl"] = asm["_bitshift64Shl"];
var runPostSets = Module["runPostSets"] = asm["runPostSets"];
var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
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_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"];
var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];

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


// TODO: strip out parts of this we do not need

//======= begin closure i64 code =======

// Copyright 2009 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @fileoverview Defines a Long class for representing a 64-bit two's-complement
 * integer value, which faithfully simulates the behavior of a Java "long". This
 * implementation is derived from LongLib in GWT.
 *
 */

var i64Math = (function() { // Emscripten wrapper
  var goog = { math: {} };


  /**
   * Constructs a 64-bit two's-complement integer, given its low and high 32-bit
   * values as *signed* integers.  See the from* functions below for more
   * convenient ways of constructing Longs.
   *
   * The internal representation of a long is the two given signed, 32-bit values.
   * We use 32-bit pieces because these are the size of integers on which
   * Javascript performs bit-operations.  For operations like addition and
   * multiplication, we split each number into 16-bit pieces, which can easily be
   * multiplied within Javascript's floating-point representation without overflow
   * or change in sign.
   *
   * In the algorithms below, we frequently reduce the negative case to the
   * positive case by negating the input(s) and then post-processing the result.
   * Note that we must ALWAYS check specially whether those values are MIN_VALUE
   * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
   * a positive number, it overflows back into a negative).  Not handling this
   * case would often result in infinite recursion.
   *
   * @param {number} low  The low (signed) 32 bits of the long.
   * @param {number} high  The high (signed) 32 bits of the long.
   * @constructor
   */
  goog.math.Long = function(low, high) {
    /**
     * @type {number}
     * @private
     */
    this.low_ = low | 0;  // force into 32 signed bits.

    /**
     * @type {number}
     * @private
     */
    this.high_ = high | 0;  // force into 32 signed bits.
  };


  // NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
  // from* methods on which they depend.


  /**
   * A cache of the Long representations of small integer values.
   * @type {!Object}
   * @private
   */
  goog.math.Long.IntCache_ = {};


  /**
   * Returns a Long representing the given (32-bit) integer value.
   * @param {number} value The 32-bit integer in question.
   * @return {!goog.math.Long} The corresponding Long value.
   */
  goog.math.Long.fromInt = function(value) {
    if (-128 <= value && value < 128) {
      var cachedObj = goog.math.Long.IntCache_[value];
      if (cachedObj) {
        return cachedObj;
      }
    }

    var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);
    if (-128 <= value && value < 128) {
      goog.math.Long.IntCache_[value] = obj;
    }
    return obj;
  };


  /**
   * Returns a Long representing the given value, provided that it is a finite
   * number.  Otherwise, zero is returned.
   * @param {number} value The number in question.
   * @return {!goog.math.Long} The corresponding Long value.
   */
  goog.math.Long.fromNumber = function(value) {
    if (isNaN(value) || !isFinite(value)) {
      return goog.math.Long.ZERO;
    } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {
      return goog.math.Long.MIN_VALUE;
    } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {
      return goog.math.Long.MAX_VALUE;
    } else if (value < 0) {
      return goog.math.Long.fromNumber(-value).negate();
    } else {
      return new goog.math.Long(
          (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,
          (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);
    }
  };


  /**
   * Returns a Long representing the 64-bit integer that comes by concatenating
   * the given high and low bits.  Each is assumed to use 32 bits.
   * @param {number} lowBits The low 32-bits.
   * @param {number} highBits The high 32-bits.
   * @return {!goog.math.Long} The corresponding Long value.
   */
  goog.math.Long.fromBits = function(lowBits, highBits) {
    return new goog.math.Long(lowBits, highBits);
  };


  /**
   * Returns a Long representation of the given string, written using the given
   * radix.
   * @param {string} str The textual representation of the Long.
   * @param {number=} opt_radix The radix in which the text is written.
   * @return {!goog.math.Long} The corresponding Long value.
   */
  goog.math.Long.fromString = function(str, opt_radix) {
    if (str.length == 0) {
      throw Error('number format error: empty string');
    }

    var radix = opt_radix || 10;
    if (radix < 2 || 36 < radix) {
      throw Error('radix out of range: ' + radix);
    }

    if (str.charAt(0) == '-') {
      return goog.math.Long.fromString(str.substring(1), radix).negate();
    } else if (str.indexOf('-') >= 0) {
      throw Error('number format error: interior "-" character: ' + str);
    }

    // Do several (8) digits each time through the loop, so as to
    // minimize the calls to the very expensive emulated div.
    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));

    var result = goog.math.Long.ZERO;
    for (var i = 0; i < str.length; i += 8) {
      var size = Math.min(8, str.length - i);
      var value = parseInt(str.substring(i, i + size), radix);
      if (size < 8) {
        var power = goog.math.Long.fromNumber(Math.pow(radix, size));
        result = result.multiply(power).add(goog.math.Long.fromNumber(value));
      } else {
        result = result.multiply(radixToPower);
        result = result.add(goog.math.Long.fromNumber(value));
      }
    }
    return result;
  };


  // NOTE: the compiler should inline these constant values below and then remove
  // these variables, so there should be no runtime penalty for these.


  /**
   * Number used repeated below in calculations.  This must appear before the
   * first call to any from* function below.
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_32_DBL_ =
      goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_31_DBL_ =
      goog.math.Long.TWO_PWR_32_DBL_ / 2;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_48_DBL_ =
      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_64_DBL_ =
      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;


  /**
   * @type {number}
   * @private
   */
  goog.math.Long.TWO_PWR_63_DBL_ =
      goog.math.Long.TWO_PWR_64_DBL_ / 2;


  /** @type {!goog.math.Long} */
  goog.math.Long.ZERO = goog.math.Long.fromInt(0);


  /** @type {!goog.math.Long} */
  goog.math.Long.ONE = goog.math.Long.fromInt(1);


  /** @type {!goog.math.Long} */
  goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);


  /** @type {!goog.math.Long} */
  goog.math.Long.MAX_VALUE =
      goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);


  /** @type {!goog.math.Long} */
  goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);


  /**
   * @type {!goog.math.Long}
   * @private
   */
  goog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);


  /** @return {number} The value, assuming it is a 32-bit integer. */
  goog.math.Long.prototype.toInt = function() {
    return this.low_;
  };


  /** @return {number} The closest floating-point representation to this value. */
  goog.math.Long.prototype.toNumber = function() {
    return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +
           this.getLowBitsUnsigned();
  };


  /**
   * @param {number=} opt_radix The radix in which the text should be written.
   * @return {string} The textual representation of this value.
   */
  goog.math.Long.prototype.toString = function(opt_radix) {
    var radix = opt_radix || 10;
    if (radix < 2 || 36 < radix) {
      throw Error('radix out of range: ' + radix);
    }

    if (this.isZero()) {
      return '0';
    }

    if (this.isNegative()) {
      if (this.equals(goog.math.Long.MIN_VALUE)) {
        // We need to change the Long value before it can be negated, so we remove
        // the bottom-most digit in this base and then recurse to do the rest.
        var radixLong = goog.math.Long.fromNumber(radix);
        var div = this.div(radixLong);
        var rem = div.multiply(radixLong).subtract(this);
        return div.toString(radix) + rem.toInt().toString(radix);
      } else {
        return '-' + this.negate().toString(radix);
      }
    }

    // Do several (6) digits each time through the loop, so as to
    // minimize the calls to the very expensive emulated div.
    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));

    var rem = this;
    var result = '';
    while (true) {
      var remDiv = rem.div(radixToPower);
      var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();
      var digits = intval.toString(radix);

      rem = remDiv;
      if (rem.isZero()) {
        return digits + result;
      } else {
        while (digits.length < 6) {
          digits = '0' + digits;
        }
        result = '' + digits + result;
      }
    }
  };


  /** @return {number} The high 32-bits as a signed value. */
  goog.math.Long.prototype.getHighBits = function() {
    return this.high_;
  };


  /** @return {number} The low 32-bits as a signed value. */
  goog.math.Long.prototype.getLowBits = function() {
    return this.low_;
  };


  /** @return {number} The low 32-bits as an unsigned value. */
  goog.math.Long.prototype.getLowBitsUnsigned = function() {
    return (this.low_ >= 0) ?
        this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;
  };


  /**
   * @return {number} Returns the number of bits needed to represent the absolute
   *     value of this Long.
   */
  goog.math.Long.prototype.getNumBitsAbs = function() {
    if (this.isNegative()) {
      if (this.equals(goog.math.Long.MIN_VALUE)) {
        return 64;
      } else {
        return this.negate().getNumBitsAbs();
      }
    } else {
      var val = this.high_ != 0 ? this.high_ : this.low_;
      for (var bit = 31; bit > 0; bit--) {
        if ((val & (1 << bit)) != 0) {
          break;
        }
      }
      return this.high_ != 0 ? bit + 33 : bit + 1;
    }
  };


  /** @return {boolean} Whether this value is zero. */
  goog.math.Long.prototype.isZero = function() {
    return this.high_ == 0 && this.low_ == 0;
  };


  /** @return {boolean} Whether this value is negative. */
  goog.math.Long.prototype.isNegative = function() {
    return this.high_ < 0;
  };


  /** @return {boolean} Whether this value is odd. */
  goog.math.Long.prototype.isOdd = function() {
    return (this.low_ & 1) == 1;
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long equals the other.
   */
  goog.math.Long.prototype.equals = function(other) {
    return (this.high_ == other.high_) && (this.low_ == other.low_);
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long does not equal the other.
   */
  goog.math.Long.prototype.notEquals = function(other) {
    return (this.high_ != other.high_) || (this.low_ != other.low_);
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long is less than the other.
   */
  goog.math.Long.prototype.lessThan = function(other) {
    return this.compare(other) < 0;
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long is less than or equal to the other.
   */
  goog.math.Long.prototype.lessThanOrEqual = function(other) {
    return this.compare(other) <= 0;
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long is greater than the other.
   */
  goog.math.Long.prototype.greaterThan = function(other) {
    return this.compare(other) > 0;
  };


  /**
   * @param {goog.math.Long} other Long to compare against.
   * @return {boolean} Whether this Long is greater than or equal to the other.
   */
  goog.math.Long.prototype.greaterThanOrEqual = function(other) {
    return this.compare(other) >= 0;
  };


  /**
   * Compares this Long with the given one.
   * @param {goog.math.Long} other Long to compare against.
   * @return {number} 0 if they are the same, 1 if the this is greater, and -1
   *     if the given one is greater.
   */
  goog.math.Long.prototype.compare = function(other) {
    if (this.equals(other)) {
      return 0;
    }

    var thisNeg = this.isNegative();
    var otherNeg = other.isNegative();
    if (thisNeg && !otherNeg) {
      return -1;
    }
    if (!thisNeg && otherNeg) {
      return 1;
    }

    // at this point, the signs are the same, so subtraction will not overflow
    if (this.subtract(other).isNegative()) {
      return -1;
    } else {
      return 1;
    }
  };


  /** @return {!goog.math.Long} The negation of this value. */
  goog.math.Long.prototype.negate = function() {
    if (this.equals(goog.math.Long.MIN_VALUE)) {
      return goog.math.Long.MIN_VALUE;
    } else {
      return this.not().add(goog.math.Long.ONE);
    }
  };


  /**
   * Returns the sum of this and the given Long.
   * @param {goog.math.Long} other Long to add to this one.
   * @return {!goog.math.Long} The sum of this and the given Long.
   */
  goog.math.Long.prototype.add = function(other) {
    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.

    var a48 = this.high_ >>> 16;
    var a32 = this.high_ & 0xFFFF;
    var a16 = this.low_ >>> 16;
    var a00 = this.low_ & 0xFFFF;

    var b48 = other.high_ >>> 16;
    var b32 = other.high_ & 0xFFFF;
    var b16 = other.low_ >>> 16;
    var b00 = other.low_ & 0xFFFF;

    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
    c00 += a00 + b00;
    c16 += c00 >>> 16;
    c00 &= 0xFFFF;
    c16 += a16 + b16;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c32 += a32 + b32;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c48 += a48 + b48;
    c48 &= 0xFFFF;
    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
  };


  /**
   * Returns the difference of this and the given Long.
   * @param {goog.math.Long} other Long to subtract from this.
   * @return {!goog.math.Long} The difference of this and the given Long.
   */
  goog.math.Long.prototype.subtract = function(other) {
    return this.add(other.negate());
  };


  /**
   * Returns the product of this and the given long.
   * @param {goog.math.Long} other Long to multiply with this.
   * @return {!goog.math.Long} The product of this and the other.
   */
  goog.math.Long.prototype.multiply = function(other) {
    if (this.isZero()) {
      return goog.math.Long.ZERO;
    } else if (other.isZero()) {
      return goog.math.Long.ZERO;
    }

    if (this.equals(goog.math.Long.MIN_VALUE)) {
      return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;
    } else if (other.equals(goog.math.Long.MIN_VALUE)) {
      return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;
    }

    if (this.isNegative()) {
      if (other.isNegative()) {
        return this.negate().multiply(other.negate());
      } else {
        return this.negate().multiply(other).negate();
      }
    } else if (other.isNegative()) {
      return this.multiply(other.negate()).negate();
    }

    // If both longs are small, use float multiplication
    if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&
        other.lessThan(goog.math.Long.TWO_PWR_24_)) {
      return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());
    }

    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
    // We can skip products that would overflow.

    var a48 = this.high_ >>> 16;
    var a32 = this.high_ & 0xFFFF;
    var a16 = this.low_ >>> 16;
    var a00 = this.low_ & 0xFFFF;

    var b48 = other.high_ >>> 16;
    var b32 = other.high_ & 0xFFFF;
    var b16 = other.low_ >>> 16;
    var b00 = other.low_ & 0xFFFF;

    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
    c00 += a00 * b00;
    c16 += c00 >>> 16;
    c00 &= 0xFFFF;
    c16 += a16 * b00;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c16 += a00 * b16;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c32 += a32 * b00;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c32 += a16 * b16;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c32 += a00 * b32;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
    c48 &= 0xFFFF;
    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
  };


  /**
   * Returns this Long divided by the given one.
   * @param {goog.math.Long} other Long by which to divide.
   * @return {!goog.math.Long} This Long divided by the given one.
   */
  goog.math.Long.prototype.div = function(other) {
    if (other.isZero()) {
      throw Error('division by zero');
    } else if (this.isZero()) {
      return goog.math.Long.ZERO;
    }

    if (this.equals(goog.math.Long.MIN_VALUE)) {
      if (other.equals(goog.math.Long.ONE) ||
          other.equals(goog.math.Long.NEG_ONE)) {
        return goog.math.Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE
      } else if (other.equals(goog.math.Long.MIN_VALUE)) {
        return goog.math.Long.ONE;
      } else {
        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
        var halfThis = this.shiftRight(1);
        var approx = halfThis.div(other).shiftLeft(1);
        if (approx.equals(goog.math.Long.ZERO)) {
          return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;
        } else {
          var rem = this.subtract(other.multiply(approx));
          var result = approx.add(rem.div(other));
          return result;
        }
      }
    } else if (other.equals(goog.math.Long.MIN_VALUE)) {
      return goog.math.Long.ZERO;
    }

    if (this.isNegative()) {
      if (other.isNegative()) {
        return this.negate().div(other.negate());
      } else {
        return this.negate().div(other).negate();
      }
    } else if (other.isNegative()) {
      return this.div(other.negate()).negate();
    }

    // Repeat the following until the remainder is less than other:  find a
    // floating-point that approximates remainder / other *from below*, add this
    // into the result, and subtract it from the remainder.  It is critical that
    // the approximate value is less than or equal to the real value so that the
    // remainder never becomes negative.
    var res = goog.math.Long.ZERO;
    var rem = this;
    while (rem.greaterThanOrEqual(other)) {
      // Approximate the result of division. This may be a little greater or
      // smaller than the actual value.
      var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));

      // We will tweak the approximate result by changing it in the 48-th digit or
      // the smallest non-fractional digit, whichever is larger.
      var log2 = Math.ceil(Math.log(approx) / Math.LN2);
      var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);

      // Decrease the approximation until it is smaller than the remainder.  Note
      // that if it is too large, the product overflows and is negative.
      var approxRes = goog.math.Long.fromNumber(approx);
      var approxRem = approxRes.multiply(other);
      while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
        approx -= delta;
        approxRes = goog.math.Long.fromNumber(approx);
        approxRem = approxRes.multiply(other);
      }

      // We know the answer can't be zero... and actually, zero would cause
      // infinite recursion since we would make no progress.
      if (approxRes.isZero()) {
        approxRes = goog.math.Long.ONE;
      }

      res = res.add(approxRes);
      rem = rem.subtract(approxRem);
    }
    return res;
  };


  /**
   * Returns this Long modulo the given one.
   * @param {goog.math.Long} other Long by which to mod.
   * @return {!goog.math.Long} This Long modulo the given one.
   */
  goog.math.Long.prototype.modulo = function(other) {
    return this.subtract(this.div(other).multiply(other));
  };


  /** @return {!goog.math.Long} The bitwise-NOT of this value. */
  goog.math.Long.prototype.not = function() {
    return goog.math.Long.fromBits(~this.low_, ~this.high_);
  };


  /**
   * Returns the bitwise-AND of this Long and the given one.
   * @param {goog.math.Long} other The Long with which to AND.
   * @return {!goog.math.Long} The bitwise-AND of this and the other.
   */
  goog.math.Long.prototype.and = function(other) {
    return goog.math.Long.fromBits(this.low_ & other.low_,
                                   this.high_ & other.high_);
  };


  /**
   * Returns the bitwise-OR of this Long and the given one.
   * @param {goog.math.Long} other The Long with which to OR.
   * @return {!goog.math.Long} The bitwise-OR of this and the other.
   */
  goog.math.Long.prototype.or = function(other) {
    return goog.math.Long.fromBits(this.low_ | other.low_,
                                   this.high_ | other.high_);
  };


  /**
   * Returns the bitwise-XOR of this Long and the given one.
   * @param {goog.math.Long} other The Long with which to XOR.
   * @return {!goog.math.Long} The bitwise-XOR of this and the other.
   */
  goog.math.Long.prototype.xor = function(other) {
    return goog.math.Long.fromBits(this.low_ ^ other.low_,
                                   this.high_ ^ other.high_);
  };


  /**
   * Returns this Long with bits shifted to the left by the given amount.
   * @param {number} numBits The number of bits by which to shift.
   * @return {!goog.math.Long} This shifted to the left by the given amount.
   */
  goog.math.Long.prototype.shiftLeft = function(numBits) {
    numBits &= 63;
    if (numBits == 0) {
      return this;
    } else {
      var low = this.low_;
      if (numBits < 32) {
        var high = this.high_;
        return goog.math.Long.fromBits(
            low << numBits,
            (high << numBits) | (low >>> (32 - numBits)));
      } else {
        return goog.math.Long.fromBits(0, low << (numBits - 32));
      }
    }
  };


  /**
   * Returns this Long with bits shifted to the right by the given amount.
   * @param {number} numBits The number of bits by which to shift.
   * @return {!goog.math.Long} This shifted to the right by the given amount.
   */
  goog.math.Long.prototype.shiftRight = function(numBits) {
    numBits &= 63;
    if (numBits == 0) {
      return this;
    } else {
      var high = this.high_;
      if (numBits < 32) {
        var low = this.low_;
        return goog.math.Long.fromBits(
            (low >>> numBits) | (high << (32 - numBits)),
            high >> numBits);
      } else {
        return goog.math.Long.fromBits(
            high >> (numBits - 32),
            high >= 0 ? 0 : -1);
      }
    }
  };


  /**
   * Returns this Long with bits shifted to the right by the given amount, with
   * the new top bits matching the current sign bit.
   * @param {number} numBits The number of bits by which to shift.
   * @return {!goog.math.Long} This shifted to the right by the given amount, with
   *     zeros placed into the new leading bits.
   */
  goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {
    numBits &= 63;
    if (numBits == 0) {
      return this;
    } else {
      var high = this.high_;
      if (numBits < 32) {
        var low = this.low_;
        return goog.math.Long.fromBits(
            (low >>> numBits) | (high << (32 - numBits)),
            high >>> numBits);
      } else if (numBits == 32) {
        return goog.math.Long.fromBits(high, 0);
      } else {
        return goog.math.Long.fromBits(high >>> (numBits - 32), 0);
      }
    }
  };

  //======= begin jsbn =======

  var navigator = { appName: 'Modern Browser' }; // polyfill a little

  // Copyright (c) 2005  Tom Wu
  // All Rights Reserved.
  // http://www-cs-students.stanford.edu/~tjw/jsbn/

  /*
   * Copyright (c) 2003-2005  Tom Wu
   * All Rights Reserved.
   *
   * Permission is hereby granted, free of charge, to any person obtaining
   * a copy of this software and associated documentation files (the
   * "Software"), to deal in the Software without restriction, including
   * without limitation the rights to use, copy, modify, merge, publish,
   * distribute, sublicense, and/or sell copies of the Software, and to
   * permit persons to whom the Software is furnished to do so, subject to
   * the following conditions:
   *
   * The above copyright notice and this permission notice shall be
   * included in all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
   * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
   *
   * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
   * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
   * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
   * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
   * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   *
   * In addition, the following condition applies:
   *
   * All redistributions must retain an intact copy of this copyright notice
   * and disclaimer.
   */

  // Basic JavaScript BN library - subset useful for RSA encryption.

  // Bits per digit
  var dbits;

  // JavaScript engine analysis
  var canary = 0xdeadbeefcafe;
  var j_lm = ((canary&0xffffff)==0xefcafe);

  // (public) Constructor
  function BigInteger(a,b,c) {
    if(a != null)
      if("number" == typeof a) this.fromNumber(a,b,c);
      else if(b == null && "string" != typeof a) this.fromString(a,256);
      else this.fromString(a,b);
  }

  // return new, unset BigInteger
  function nbi() { return new BigInteger(null); }

  // am: Compute w_j += (x*this_i), propagate carries,
  // c is initial carry, returns final carry.
  // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
  // We need to select the fastest one that works in this environment.

  // am1: use a single mult and divide to get the high bits,
  // max digit bits should be 26 because
  // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
  function am1(i,x,w,j,c,n) {
    while(--n >= 0) {
      var v = x*this[i++]+w[j]+c;
      c = Math.floor(v/0x4000000);
      w[j++] = v&0x3ffffff;
    }
    return c;
  }
  // am2 avoids a big mult-and-extract completely.
  // Max digit bits should be <= 30 because we do bitwise ops
  // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
  function am2(i,x,w,j,c,n) {
    var xl = x&0x7fff, xh = x>>15;
    while(--n >= 0) {
      var l = this[i]&0x7fff;
      var h = this[i++]>>15;
      var m = xh*l+h*xl;
      l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);
      c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
      w[j++] = l&0x3fffffff;
    }
    return c;
  }
  // Alternately, set max digit bits to 28 since some
  // browsers slow down when dealing with 32-bit numbers.
  function am3(i,x,w,j,c,n) {
    var xl = x&0x3fff, xh = x>>14;
    while(--n >= 0) {
      var l = this[i]&0x3fff;
      var h = this[i++]>>14;
      var m = xh*l+h*xl;
      l = xl*l+((m&0x3fff)<<14)+w[j]+c;
      c = (l>>28)+(m>>14)+xh*h;
      w[j++] = l&0xfffffff;
    }
    return c;
  }
  if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
    BigInteger.prototype.am = am2;
    dbits = 30;
  }
  else if(j_lm && (navigator.appName != "Netscape")) {
    BigInteger.prototype.am = am1;
    dbits = 26;
  }
  else { // Mozilla/Netscape seems to prefer am3
    BigInteger.prototype.am = am3;
    dbits = 28;
  }

  BigInteger.prototype.DB = dbits;
  BigInteger.prototype.DM = ((1<<dbits)-1);
  BigInteger.prototype.DV = (1<<dbits);

  var BI_FP = 52;
  BigInteger.prototype.FV = Math.pow(2,BI_FP);
  BigInteger.prototype.F1 = BI_FP-dbits;
  BigInteger.prototype.F2 = 2*dbits-BI_FP;

  // Digit conversions
  var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
  var BI_RC = new Array();
  var rr,vv;
  rr = "0".charCodeAt(0);
  for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
  rr = "a".charCodeAt(0);
  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
  rr = "A".charCodeAt(0);
  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;

  function int2char(n) { return BI_RM.charAt(n); }
  function intAt(s,i) {
    var c = BI_RC[s.charCodeAt(i)];
    return (c==null)?-1:c;
  }

  // (protected) copy this to r
  function bnpCopyTo(r) {
    for(var i = this.t-1; i >= 0; --i) r[i] = this[i];
    r.t = this.t;
    r.s = this.s;
  }

  // (protected) set from integer value x, -DV <= x < DV
  function bnpFromInt(x) {
    this.t = 1;
    this.s = (x<0)?-1:0;
    if(x > 0) this[0] = x;
    else if(x < -1) this[0] = x+DV;
    else this.t = 0;
  }

  // return bigint initialized to value
  function nbv(i) { var r = nbi(); r.fromInt(i); return r; }

  // (protected) set from string and radix
  function bnpFromString(s,b) {
    var k;
    if(b == 16) k = 4;
    else if(b == 8) k = 3;
    else if(b == 256) k = 8; // byte array
    else if(b == 2) k = 1;
    else if(b == 32) k = 5;
    else if(b == 4) k = 2;
    else { this.fromRadix(s,b); return; }
    this.t = 0;
    this.s = 0;
    var i = s.length, mi = false, sh = 0;
    while(--i >= 0) {
      var x = (k==8)?s[i]&0xff:intAt(s,i);
      if(x < 0) {
        if(s.charAt(i) == "-") mi = true;
        continue;
      }
      mi = false;
      if(sh == 0)
        this[this.t++] = x;
      else if(sh+k > this.DB) {
        this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
        this[this.t++] = (x>>(this.DB-sh));
      }
      else
        this[this.t-1] |= x<<sh;
      sh += k;
      if(sh >= this.DB) sh -= this.DB;
    }
    if(k == 8 && (s[0]&0x80) != 0) {
      this.s = -1;
      if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
    }
    this.clamp();
    if(mi) BigInteger.ZERO.subTo(this,this);
  }

  // (protected) clamp off excess high words
  function bnpClamp() {
    var c = this.s&this.DM;
    while(this.t > 0 && this[this.t-1] == c) --this.t;
  }

  // (public) return string representation in given radix
  function bnToString(b) {
    if(this.s < 0) return "-"+this.negate().toString(b);
    var k;
    if(b == 16) k = 4;
    else if(b == 8) k = 3;
    else if(b == 2) k = 1;
    else if(b == 32) k = 5;
    else if(b == 4) k = 2;
    else return this.toRadix(b);
    var km = (1<<k)-1, d, m = false, r = "", i = this.t;
    var p = this.DB-(i*this.DB)%k;
    if(i-- > 0) {
      if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }
      while(i >= 0) {
        if(p < k) {
          d = (this[i]&((1<<p)-1))<<(k-p);
          d |= this[--i]>>(p+=this.DB-k);
        }
        else {
          d = (this[i]>>(p-=k))&km;
          if(p <= 0) { p += this.DB; --i; }
        }
        if(d > 0) m = true;
        if(m) r += int2char(d);
      }
    }
    return m?r:"0";
  }

  // (public) -this
  function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }

  // (public) |this|
  function bnAbs() { return (this.s<0)?this.negate():this; }

  // (public) return + if this > a, - if this < a, 0 if equal
  function bnCompareTo(a) {
    var r = this.s-a.s;
    if(r != 0) return r;
    var i = this.t;
    r = i-a.t;
    if(r != 0) return (this.s<0)?-r:r;
    while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
    return 0;
  }

  // returns bit length of the integer x
  function nbits(x) {
    var r = 1, t;
    if((t=x>>>16) != 0) { x = t; r += 16; }
    if((t=x>>8) != 0) { x = t; r += 8; }
    if((t=x>>4) != 0) { x = t; r += 4; }
    if((t=x>>2) != 0) { x = t; r += 2; }
    if((t=x>>1) != 0) { x = t; r += 1; }
    return r;
  }

  // (public) return the number of bits in "this"
  function bnBitLength() {
    if(this.t <= 0) return 0;
    return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));
  }

  // (protected) r = this << n*DB
  function bnpDLShiftTo(n,r) {
    var i;
    for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
    for(i = n-1; i >= 0; --i) r[i] = 0;
    r.t = this.t+n;
    r.s = this.s;
  }

  // (protected) r = this >> n*DB
  function bnpDRShiftTo(n,r) {
    for(var i = n; i < this.t; ++i) r[i-n] = this[i];
    r.t = Math.max(this.t-n,0);
    r.s = this.s;
  }

  // (protected) r = this << n
  function bnpLShiftTo(n,r) {
    var bs = n%this.DB;
    var cbs = this.DB-bs;
    var bm = (1<<cbs)-1;
    var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
    for(i = this.t-1; i >= 0; --i) {
      r[i+ds+1] = (this[i]>>cbs)|c;
      c = (this[i]&bm)<<bs;
    }
    for(i = ds-1; i >= 0; --i) r[i] = 0;
    r[ds] = c;
    r.t = this.t+ds+1;
    r.s = this.s;
    r.clamp();
  }

  // (protected) r = this >> n
  function bnpRShiftTo(n,r) {
    r.s = this.s;
    var ds = Math.floor(n/this.DB);
    if(ds >= this.t) { r.t = 0; return; }
    var bs = n%this.DB;
    var cbs = this.DB-bs;
    var bm = (1<<bs)-1;
    r[0] = this[ds]>>bs;
    for(var i = ds+1; i < this.t; ++i) {
      r[i-ds-1] |= (this[i]&bm)<<cbs;
      r[i-ds] = this[i]>>bs;
    }
    if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;
    r.t = this.t-ds;
    r.clamp();
  }

  // (protected) r = this - a
  function bnpSubTo(a,r) {
    var i = 0, c = 0, m = Math.min(a.t,this.t);
    while(i < m) {
      c += this[i]-a[i];
      r[i++] = c&this.DM;
      c >>= this.DB;
    }
    if(a.t < this.t) {
      c -= a.s;
      while(i < this.t) {
        c += this[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      c += this.s;
    }
    else {
      c += this.s;
      while(i < a.t) {
        c -= a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      c -= a.s;
    }
    r.s = (c<0)?-1:0;
    if(c < -1) r[i++] = this.DV+c;
    else if(c > 0) r[i++] = c;
    r.t = i;
    r.clamp();
  }

  // (protected) r = this * a, r != this,a (HAC 14.12)
  // "this" should be the larger one if appropriate.
  function bnpMultiplyTo(a,r) {
    var x = this.abs(), y = a.abs();
    var i = x.t;
    r.t = i+y.t;
    while(--i >= 0) r[i] = 0;
    for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);
    r.s = 0;
    r.clamp();
    if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
  }

  // (protected) r = this^2, r != this (HAC 14.16)
  function bnpSquareTo(r) {
    var x = this.abs();
    var i = r.t = 2*x.t;
    while(--i >= 0) r[i] = 0;
    for(i = 0; i < x.t-1; ++i) {
      var c = x.am(i,x[i],r,2*i,0,1);
      if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
        r[i+x.t] -= x.DV;
        r[i+x.t+1] = 1;
      }
    }
    if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
    r.s = 0;
    r.clamp();
  }

  // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
  // r != q, this != m.  q or r may be null.
  function bnpDivRemTo(m,q,r) {
    var pm = m.abs();
    if(pm.t <= 0) return;
    var pt = this.abs();
    if(pt.t < pm.t) {
      if(q != null) q.fromInt(0);
      if(r != null) this.copyTo(r);
      return;
    }
    if(r == null) r = nbi();
    var y = nbi(), ts = this.s, ms = m.s;
    var nsh = this.DB-nbits(pm[pm.t-1]);  // normalize modulus
    if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
    else { pm.copyTo(y); pt.copyTo(r); }
    var ys = y.t;
    var y0 = y[ys-1];
    if(y0 == 0) return;
    var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);
    var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
    var i = r.t, j = i-ys, t = (q==null)?nbi():q;
    y.dlShiftTo(j,t);
    if(r.compareTo(t) >= 0) {
      r[r.t++] = 1;
      r.subTo(t,r);
    }
    BigInteger.ONE.dlShiftTo(ys,t);
    t.subTo(y,y);  // "negative" y so we can replace sub with am later
    while(y.t < ys) y[y.t++] = 0;
    while(--j >= 0) {
      // Estimate quotient digit
      var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
      if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {  // Try it out
        y.dlShiftTo(j,t);
        r.subTo(t,r);
        while(r[i] < --qd) r.subTo(t,r);
      }
    }
    if(q != null) {
      r.drShiftTo(ys,q);
      if(ts != ms) BigInteger.ZERO.subTo(q,q);
    }
    r.t = ys;
    r.clamp();
    if(nsh > 0) r.rShiftTo(nsh,r);  // Denormalize remainder
    if(ts < 0) BigInteger.ZERO.subTo(r,r);
  }

  // (public) this mod a
  function bnMod(a) {
    var r = nbi();
    this.abs().divRemTo(a,null,r);
    if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
    return r;
  }

  // Modular reduction using "classic" algorithm
  function Classic(m) { this.m = m; }
  function cConvert(x) {
    if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
    else return x;
  }
  function cRevert(x) { return x; }
  function cReduce(x) { x.divRemTo(this.m,null,x); }
  function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
  function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

  Classic.prototype.convert = cConvert;
  Classic.prototype.revert = cRevert;
  Classic.prototype.reduce = cReduce;
  Classic.prototype.mulTo = cMulTo;
  Classic.prototype.sqrTo = cSqrTo;

  // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
  // justification:
  //         xy == 1 (mod m)
  //         xy =  1+km
  //   xy(2-xy) = (1+km)(1-km)
  // x[y(2-xy)] = 1-k^2m^2
  // x[y(2-xy)] == 1 (mod m^2)
  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
  // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
  // JS multiply "overflows" differently from C/C++, so care is needed here.
  function bnpInvDigit() {
    if(this.t < 1) return 0;
    var x = this[0];
    if((x&1) == 0) return 0;
    var y = x&3;    // y == 1/x mod 2^2
    y = (y*(2-(x&0xf)*y))&0xf;  // y == 1/x mod 2^4
    y = (y*(2-(x&0xff)*y))&0xff;  // y == 1/x mod 2^8
    y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;  // y == 1/x mod 2^16
    // last step - calculate inverse mod DV directly;
    // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
    y = (y*(2-x*y%this.DV))%this.DV;    // y == 1/x mod 2^dbits
    // we really want the negative inverse, and -DV < y < DV
    return (y>0)?this.DV-y:-y;
  }

  // Montgomery reduction
  function Montgomery(m) {
    this.m = m;
    this.mp = m.invDigit();
    this.mpl = this.mp&0x7fff;
    this.mph = this.mp>>15;
    this.um = (1<<(m.DB-15))-1;
    this.mt2 = 2*m.t;
  }

  // xR mod m
  function montConvert(x) {
    var r = nbi();
    x.abs().dlShiftTo(this.m.t,r);
    r.divRemTo(this.m,null,r);
    if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
    return r;
  }

  // x/R mod m
  function montRevert(x) {
    var r = nbi();
    x.copyTo(r);
    this.reduce(r);
    return r;
  }

  // x = x/R mod m (HAC 14.32)
  function montReduce(x) {
    while(x.t <= this.mt2)  // pad x so am has enough room later
      x[x.t++] = 0;
    for(var i = 0; i < this.m.t; ++i) {
      // faster way of calculating u0 = x[i]*mp mod DV
      var j = x[i]&0x7fff;
      var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
      // use am to combine the multiply-shift-add into one call
      j = i+this.m.t;
      x[j] += this.m.am(0,u0,x,i,0,this.m.t);
      // propagate carry
      while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
    }
    x.clamp();
    x.drShiftTo(this.m.t,x);
    if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
  }

  // r = "x^2/R mod m"; x != r
  function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

  // r = "xy/R mod m"; x,y != r
  function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

  Montgomery.prototype.convert = montConvert;
  Montgomery.prototype.revert = montRevert;
  Montgomery.prototype.reduce = montReduce;
  Montgomery.prototype.mulTo = montMulTo;
  Montgomery.prototype.sqrTo = montSqrTo;

  // (protected) true iff this is even
  function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }

  // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
  function bnpExp(e,z) {
    if(e > 0xffffffff || e < 1) return BigInteger.ONE;
    var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
    g.copyTo(r);
    while(--i >= 0) {
      z.sqrTo(r,r2);
      if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
      else { var t = r; r = r2; r2 = t; }
    }
    return z.revert(r);
  }

  // (public) this^e % m, 0 <= e < 2^32
  function bnModPowInt(e,m) {
    var z;
    if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
    return this.exp(e,z);
  }

  // protected
  BigInteger.prototype.copyTo = bnpCopyTo;
  BigInteger.prototype.fromInt = bnpFromInt;
  BigInteger.prototype.fromString = bnpFromString;
  BigInteger.prototype.clamp = bnpClamp;
  BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
  BigInteger.prototype.drShiftTo = bnpDRShiftTo;
  BigInteger.prototype.lShiftTo = bnpLShiftTo;
  BigInteger.prototype.rShiftTo = bnpRShiftTo;
  BigInteger.prototype.subTo = bnpSubTo;
  BigInteger.prototype.multiplyTo = bnpMultiplyTo;
  BigInteger.prototype.squareTo = bnpSquareTo;
  BigInteger.prototype.divRemTo = bnpDivRemTo;
  BigInteger.prototype.invDigit = bnpInvDigit;
  BigInteger.prototype.isEven = bnpIsEven;
  BigInteger.prototype.exp = bnpExp;

  // public
  BigInteger.prototype.toString = bnToString;
  BigInteger.prototype.negate = bnNegate;
  BigInteger.prototype.abs = bnAbs;
  BigInteger.prototype.compareTo = bnCompareTo;
  BigInteger.prototype.bitLength = bnBitLength;
  BigInteger.prototype.mod = bnMod;
  BigInteger.prototype.modPowInt = bnModPowInt;

  // "constants"
  BigInteger.ZERO = nbv(0);
  BigInteger.ONE = nbv(1);

  // jsbn2 stuff

  // (protected) convert from radix string
  function bnpFromRadix(s,b) {
    this.fromInt(0);
    if(b == null) b = 10;
    var cs = this.chunkSize(b);
    var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
    for(var i = 0; i < s.length; ++i) {
      var x = intAt(s,i);
      if(x < 0) {
        if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
        continue;
      }
      w = b*w+x;
      if(++j >= cs) {
        this.dMultiply(d);
        this.dAddOffset(w,0);
        j = 0;
        w = 0;
      }
    }
    if(j > 0) {
      this.dMultiply(Math.pow(b,j));
      this.dAddOffset(w,0);
    }
    if(mi) BigInteger.ZERO.subTo(this,this);
  }

  // (protected) return x s.t. r^x < DV
  function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }

  // (public) 0 if this == 0, 1 if this > 0
  function bnSigNum() {
    if(this.s < 0) return -1;
    else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
    else return 1;
  }

  // (protected) this *= n, this >= 0, 1 < n < DV
  function bnpDMultiply(n) {
    this[this.t] = this.am(0,n-1,this,0,0,this.t);
    ++this.t;
    this.clamp();
  }

  // (protected) this += n << w words, this >= 0
  function bnpDAddOffset(n,w) {
    if(n == 0) return;
    while(this.t <= w) this[this.t++] = 0;
    this[w] += n;
    while(this[w] >= this.DV) {
      this[w] -= this.DV;
      if(++w >= this.t) this[this.t++] = 0;
      ++this[w];
    }
  }

  // (protected) convert to radix string
  function bnpToRadix(b) {
    if(b == null) b = 10;
    if(this.signum() == 0 || b < 2 || b > 36) return "0";
    var cs = this.chunkSize(b);
    var a = Math.pow(b,cs);
    var d = nbv(a), y = nbi(), z = nbi(), r = "";
    this.divRemTo(d,y,z);
    while(y.signum() > 0) {
      r = (a+z.intValue()).toString(b).substr(1) + r;
      y.divRemTo(d,y,z);
    }
    return z.intValue().toString(b) + r;
  }

  // (public) return value as integer
  function bnIntValue() {
    if(this.s < 0) {
      if(this.t == 1) return this[0]-this.DV;
      else if(this.t == 0) return -1;
    }
    else if(this.t == 1) return this[0];
    else if(this.t == 0) return 0;
    // assumes 16 < DB < 32
    return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];
  }

  // (protected) r = this + a
  function bnpAddTo(a,r) {
    var i = 0, c = 0, m = Math.min(a.t,this.t);
    while(i < m) {
      c += this[i]+a[i];
      r[i++] = c&this.DM;
      c >>= this.DB;
    }
    if(a.t < this.t) {
      c += a.s;
      while(i < this.t) {
        c += this[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      c += this.s;
    }
    else {
      c += this.s;
      while(i < a.t) {
        c += a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      c += a.s;
    }
    r.s = (c<0)?-1:0;
    if(c > 0) r[i++] = c;
    else if(c < -1) r[i++] = this.DV+c;
    r.t = i;
    r.clamp();
  }

  BigInteger.prototype.fromRadix = bnpFromRadix;
  BigInteger.prototype.chunkSize = bnpChunkSize;
  BigInteger.prototype.signum = bnSigNum;
  BigInteger.prototype.dMultiply = bnpDMultiply;
  BigInteger.prototype.dAddOffset = bnpDAddOffset;
  BigInteger.prototype.toRadix = bnpToRadix;
  BigInteger.prototype.intValue = bnIntValue;
  BigInteger.prototype.addTo = bnpAddTo;

  //======= end jsbn =======

  // Emscripten wrapper
  var Wrapper = {
    abs: function(l, h) {
      var x = new goog.math.Long(l, h);
      var ret;
      if (x.isNegative()) {
        ret = x.negate();
      } else {
        ret = x;
      }
      HEAP32[tempDoublePtr>>2] = ret.low_;
      HEAP32[tempDoublePtr+4>>2] = ret.high_;
    },
    ensureTemps: function() {
      if (Wrapper.ensuredTemps) return;
      Wrapper.ensuredTemps = true;
      Wrapper.two32 = new BigInteger();
      Wrapper.two32.fromString('4294967296', 10);
      Wrapper.two64 = new BigInteger();
      Wrapper.two64.fromString('18446744073709551616', 10);
      Wrapper.temp1 = new BigInteger();
      Wrapper.temp2 = new BigInteger();
    },
    lh2bignum: function(l, h) {
      var a = new BigInteger();
      a.fromString(h.toString(), 10);
      var b = new BigInteger();
      a.multiplyTo(Wrapper.two32, b);
      var c = new BigInteger();
      c.fromString(l.toString(), 10);
      var d = new BigInteger();
      c.addTo(b, d);
      return d;
    },
    stringify: function(l, h, unsigned) {
      var ret = new goog.math.Long(l, h).toString();
      if (unsigned && ret[0] == '-') {
        // unsign slowly using jsbn bignums
        Wrapper.ensureTemps();
        var bignum = new BigInteger();
        bignum.fromString(ret, 10);
        ret = new BigInteger();
        Wrapper.two64.addTo(bignum, ret);
        ret = ret.toString(10);
      }
      return ret;
    },
    fromString: function(str, base, min, max, unsigned) {
      Wrapper.ensureTemps();
      var bignum = new BigInteger();
      bignum.fromString(str, base);
      var bigmin = new BigInteger();
      bigmin.fromString(min, 10);
      var bigmax = new BigInteger();
      bigmax.fromString(max, 10);
      if (unsigned && bignum.compareTo(BigInteger.ZERO) < 0) {
        var temp = new BigInteger();
        bignum.addTo(Wrapper.two64, temp);
        bignum = temp;
      }
      var error = false;
      if (bignum.compareTo(bigmin) < 0) {
        bignum = bigmin;
        error = true;
      } else if (bignum.compareTo(bigmax) > 0) {
        bignum = bigmax;
        error = true;
      }
      var ret = goog.math.Long.fromString(bignum.toString()); // min-max checks should have clamped this to a range goog.math.Long can handle well
      HEAP32[tempDoublePtr>>2] = ret.low_;
      HEAP32[tempDoublePtr+4>>2] = ret.high_;
      if (error) throw 'range error';
    }
  };
  return Wrapper;
})();

//======= end closure i64 code =======



// === 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(['binarytrees.lua'].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(['binarytrees.lua'].concat(Module["arguments"]));
