text: // Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code
  // Note: Some Emscripten settings may limit the speed of the generated code.
  // 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 = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');
  
  (function(Module) {
  // 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
    Module['print'] = function(x) {
      process['stdout'].write(x + '\n');
    };
    Module['printErr'] = function(x) {
      process['stderr'].write(x + '\n');
    };
    var nodeFS = require('fs');
    var nodePath = require('path');
    Module['read'] = function(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(filename) { return Module['read'](filename, true) };
    Module['load'] = function(f) {
      globalEval(read(f));
    };
    Module['arguments'] = process['argv'].slice(2);
    module.exports = Module;
  }
  if (ENVIRONMENT_IS_SHELL) {
    Module['print'] = print;
    if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
    Module['read'] = read;
    Module['readBinary'] = function(f) {
      return read(f, 'binary');
    };
    if (typeof scriptArgs != 'undefined') {
      Module['arguments'] = scriptArgs;
    } else if (typeof arguments != 'undefined') {
      Module['arguments'] = arguments;
    }
    this['Module'] = Module;
  }
  if (ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER) {
    Module['print'] = function(x) {
      console.log(x);
    };
    Module['printErr'] = function(x) {
      console.log(x);
    };
    this['Module'] = Module;
  }
  if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
    Module['read'] = function(url) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', url, false);
      xhr.send(null);
      return xhr.responseText;
    };
    if (typeof arguments != 'undefined') {
      Module['arguments'] = arguments;
    }
  }
  if (ENVIRONMENT_IS_WORKER) {
    // We can do very little here...
    var TRY_USE_DUMP = false;
    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
    }));
    Module['load'] = importScripts;
  }
  if (!ENVIRONMENT_IS_WORKER && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_SHELL) {
    // 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(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)) {
        var logg = log2(quantum);
        return '((((' +target + ')+' + (quantum-1) + ')>>' + logg + ')<<' + logg + ')';
      }
      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, quantumSize) {
      if (Runtime.QUANTUM_SIZE == 1) return 1;
      var size = {
        '%i1': 1,
        '%i8': 1,
        '%i16': 2,
        '%i32': 4,
        '%i64': 8,
        "%float": 4,
        "%double": 8
      }['%'+type]; // add '%' since float and double confuse Closure compiler as keys, and also spidermonkey as a compiler will remove 's from '_i8' etc
      if (!size) {
        if (type.charAt(type.length-1) == '*') {
          size = Runtime.QUANTUM_SIZE; // A pointer
        } else if (type[0] == 'i') {
          var bits = parseInt(type.substr(1));
          assert(bits % 8 == 0);
          size = bits/8;
        }
      }
      return size;
    },
    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 (type == 'i64' || type == 'double' || vararg) 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;
            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 {
          throw 'Unclear type in struct: ' + field + ', in ' + type.name_ + ' :: ' + dump(Types.types[type.name_]);
        }
        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;
      });
      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 + 2*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;
    },
    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() {
          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 (needed) {
          buffer.push(code);
          needed--;
        }
        if (buffer.length == 0) {
          if (code < 128) return String.fromCharCode(code);
          buffer.push(code);
          if (code > 191 && code < 224) {
            needed = 1;
          } else {
            needed = 2;
          }
          return '';
        }
        if (needed > 0) return '';
        var c1 = buffer[0];
        var c2 = buffer[1];
        var c3 = buffer[2];
        var ret;
        if (c1 > 191 && c1 < 224) {
          ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
        } else {
          ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        }
        buffer.length = 0;
        return ret;
      }
      this.processJSString = function(string) {
        string = unescape(encodeURIComponent(string));
        var ret = [];
        for (var i = 0; i < string.length; i++) {
          ret.push(string.charCodeAt(i));
        }
        return ret;
      }
    },
    stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = ((((STACKTOP)+7)>>3)<<3); return ret; },
    staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = ((((STATICTOP)+7)>>3)<<3); return ret; },
    dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = ((((DYNAMICTOP)+7)>>3)<<3); 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
  }
  //========================================
  // 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 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;
  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
        if (!stack) stack = Runtime.stackSave();
        var ret = Runtime.stackAlloc(value.length+1);
        writeStringToMemory(value, ret);
        return ret;
      } else 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,((Math.min((+(Math.floor((value)/(+(4294967296))))), (+(4294967295))))|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) {
    // 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;
  // Memory management
  var PAGE_SIZE = 4096;
  function alignMemoryPage(x) {
    return ((x+4095)>>12)<<12;
  }
  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 in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value, or (2) set Module.TOTAL_MEMORY before the program runs.');
  }
  var TOTAL_STACK = Module['TOTAL_STACK'] || 131072;
  var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 4194304;
  var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
  // Initialize the runtime's memory
  // check for full engine support (use string 'subarray' to avoid closure compiler confusion)
  assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
         'Cannot fallback to non-typed array case: Code is too specialized');
  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 unSign(value, bits, ignore, sig) {
    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, sig) {
    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;
  }
  if (!Math['imul']) Math['imul'] = function(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'];
  // 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 runDependencyTracking = {};
  var calledInit = false, calledRun = false;
  var runDependencyWatcher = null;
  function addRunDependency(id) {
    runDependencies++;
    if (Module['monitorRunDependencies']) {
      Module['monitorRunDependencies'](runDependencies);
    }
    if (id) {
      assert(!runDependencyTracking[id]);
      runDependencyTracking[id] = 1;
    } else {
      Module.printErr('warning: run dependency added without ID');
    }
  }
  Module['addRunDependency'] = addRunDependency;
  function removeRunDependency(id) {
    runDependencies--;
    if (Module['monitorRunDependencies']) {
      Module['monitorRunDependencies'](runDependencies);
    }
    if (id) {
      assert(runDependencyTracking[id]);
      delete runDependencyTracking[id];
    } else {
      Module.printErr('warning: run dependency removed without ID');
    }
    if (runDependencies == 0) {
      if (runDependencyWatcher !== null) {
        clearInterval(runDependencyWatcher);
        runDependencyWatcher = null;
      }
      // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
      if (!calledRun && shouldRunNow) run();
    }
  }
  Module['removeRunDependency'] = removeRunDependency;
  Module["preloadedImages"] = {}; // maps url to image data
  Module["preloadedAudios"] = {}; // maps url to audio data
  function loadMemoryInitializer(filename) {
    function applyData(data) {
      HEAPU8.set(data, STATIC_BASE);
    }
    // always do this asynchronously, to keep shell and web as similar as possible
    addOnPreRun(function() {
      if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
        applyData(Module['readBinary'](filename));
      } else {
        Browser.asyncLoad(filename, function(data) {
          applyData(data);
        }, function(data) {
          throw 'could not load memory initializer ' + filename;
        });
      }
    });
  }
  // === Body ===
  STATIC_BASE = 8;
  STATICTOP = STATIC_BASE + 47432;
  /* global initializers */ __ATINIT__.push({ func: function() { runPostSets() } });
  var _stderr;
  var ___progname;
  var __ZTVN10__cxxabiv120__si_class_type_infoE;
  var __ZTVN10__cxxabiv119__pointer_type_infoE;
  var __ZTVN10__cxxabiv117__class_type_infoE;
  var __ZTIy;
  var __ZTIx;
  var __ZTIt;
  var __ZTIs;
  var __ZTIm;
  var __ZTIl;
  var __ZTIj;
  var __ZTIi;
  var __ZTIh;
  var __ZTIf;
  var __ZTIe;
  var __ZTId;
  var __ZTIc;
  var __ZTIa;
  var __ZN10ime_pinyin11DictBuilderC1Ev;
  var __ZN10ime_pinyin11DictBuilderD1Ev;
  var __ZN10ime_pinyin8DictTrieC1Ev;
  var __ZN10ime_pinyin8DictTrieD1Ev;
  var __ZN10ime_pinyin12MatrixSearchC1Ev;
  var __ZN10ime_pinyin12MatrixSearchD1Ev;
  var __ZN10ime_pinyin5NGramC1Ev;
  var __ZN10ime_pinyin5NGramD1Ev;
  var __ZN10ime_pinyin12SpellingTrieC1Ev;
  var __ZN10ime_pinyin12SpellingTrieD1Ev;
  var __ZN10ime_pinyin4SyncC1Ev;
  var __ZN10ime_pinyin4SyncD1Ev;
  var __ZN10ime_pinyin8DictListC1Ev;
  var __ZN10ime_pinyin8DictListD1Ev;
  var __ZN10ime_pinyin8LpiCacheC1Ev;
  var __ZN10ime_pinyin8LpiCacheD1Ev;
  var __ZN10ime_pinyin13SpellingTableC1Ev;
  var __ZN10ime_pinyin13SpellingTableD1Ev;
  var __ZN10ime_pinyin14SpellingParserC1Ev;
  var __ZN10ime_pinyin8UserDictC1Ev;
  var __ZN10ime_pinyin8UserDictD1Ev;
  var __ZN10ime_pinyin11Utf16ReaderC1Ev;
  var __ZN10ime_pinyin11Utf16ReaderD1Ev;
  var __ZNSt9type_infoD1Ev;
  var __ZNSt8bad_castC1Ev;
  var __ZNSt8bad_castD1Ev;
  var __ZNSt10bad_typeidC1Ev;
  var __ZNSt10bad_typeidD1Ev;
  var __ZN10__cxxabiv116__shim_type_infoD1Ev;
  var __ZN10__cxxabiv123__fundamental_type_infoD1Ev;
  var __ZN10__cxxabiv123__fundamental_type_infoD2Ev;
  var __ZN10__cxxabiv117__array_type_infoD1Ev;
  var __ZN10__cxxabiv117__array_type_infoD2Ev;
  var __ZN10__cxxabiv120__function_type_infoD1Ev;
  var __ZN10__cxxabiv120__function_type_infoD2Ev;
  var __ZN10__cxxabiv116__enum_type_infoD1Ev;
  var __ZN10__cxxabiv116__enum_type_infoD2Ev;
  var __ZN10__cxxabiv117__class_type_infoD1Ev;
  var __ZN10__cxxabiv117__class_type_infoD2Ev;
  var __ZN10__cxxabiv120__si_class_type_infoD1Ev;
  var __ZN10__cxxabiv120__si_class_type_infoD2Ev;
  var __ZN10__cxxabiv121__vmi_class_type_infoD1Ev;
  var __ZN10__cxxabiv121__vmi_class_type_infoD2Ev;
  var __ZN10__cxxabiv117__pbase_type_infoD1Ev;
  var __ZN10__cxxabiv117__pbase_type_infoD2Ev;
  var __ZN10__cxxabiv119__pointer_type_infoD1Ev;
  var __ZN10__cxxabiv119__pointer_type_infoD2Ev;
  var __ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev;
  var __ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev;
  var __ZNSt9bad_allocC1Ev;
  var __ZNSt9bad_allocD1Ev;
  var __ZNSt20bad_array_new_lengthC1Ev;
  var __ZNSt20bad_array_new_lengthD1Ev;
  var __ZNSt20bad_array_new_lengthD2Ev;
  var _err;
  var _errx;
  var _warn;
  var _warnx;
  var _verr;
  var _verrx;
  var _vwarn;
  var _vwarnx;
  var _stderr = _stderr=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTVN10__cxxabiv120__si_class_type_infoE=allocate([0,0,0,0,248,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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_STATIC);
  __ZTVN10__cxxabiv119__pointer_type_infoE=allocate([0,0,0,0,24,42,0,0,0,0,0,0,0,0,0,0,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_STATIC);
  __ZTVN10__cxxabiv117__class_type_infoE=allocate([0,0,0,0,56,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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_STATIC);
  __ZTIy=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIx=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIt=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIs=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIm=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIl=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIj=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIi=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIh=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIf=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIe=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTId=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIc=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  __ZTIa=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
  /* memory initializer */ allocate([45,44,32,0,0,0,0,0,45,44,32,0,0,0,0,0,45,44,32,0,0,0,0,0,45,44,32,0,0,0,0,0,45,44,32,0,0,0,0,0,91,114,111,111,116,32,105,115,32,108,97,121,101,114,32,45,49,93,0,0,0,0,0,0,10,45,45,45,45,45,45,45,45,45,45,45,45,83,84,65,84,32,73,78,70,79,45,45,45,45,45,45,45,45,45,45,45,45,45,0,0,0,0,0,111,112,116,105,111,110,32,114,101,113,117,105,114,101,115,32,97,110,32,97,114,103,117,109,101,110,116,32,45,45,32,37,115,0,0,0,0,0,0,0,111,112,116,105,111,110,32,114,101,113,117,105,114,101,115,32,97,110,32,97,114,103,117,109,101,110,116,32,45,45,32,37,99,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,89,64,0,0,0,0,0,136,195,64,0,0,0,0,132,215,151,65,0,128,224,55,121,195,65,67,23,110,5,181,181,184,147,70,245,249,63,233,3,79,56,77,50,29,48,249,72,119,130,90,60,191,115,127,221,79,21,117,64,181,0,0,0,0,0,0,63,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,111,112,116,105,111,110,32,100,111,101,115,110,39,116,32,116,97,107,101,32,97,110,32,97,114,103,117,109,101,110,116,32,45,45,32,37,46,42,115,0,117,110,107,110,111,119,110,32,111,112,116,105,111,110,32,45,45,32,37,115,0,0,0,0,117,110,107,110,111,119,110,32,111,112,116,105,111,110,32,45,45,32,37,99,0,0,0,0,255,255,255,255,0,0,0,0,97,109,98,105,103,117,111,117,115,32,111,112,116,105,111,110,32,45,45,32,37,46,42,115,0,0,0,0,0,0,0,0,32,77,105,108,101,83,116,111,110,101,58,32,37,120,44,32,37,120,10,0,0,0,0,0,78,85,76,76,32,33,61,32,100,101,112,32,38,38,32,102,114,111,109,95,104,97,110,100,108,101,32,62,32,48,32,38,38,32,102,114,111,109,95,104,97,110,100,108,101,32,60,32,109,105,108,101,95,115,116,111,110,101,115,95,112,111,115,95,0,0,0,0,0,0,0,0,37,115,58,32,0,0,0,0,102,111,117,110,100,95,110,117,109,32,43,32,49,32,60,32,109,97,120,95,115,112,108,105,100,115,0,0,0,0,0,0,83,104,0,0,0,0,0,0,108,109,97,95,102,114,101,113,95,105,100,120,95,0,0,0,100,108,95,115,117,99,99,101,115,115,0,0,0,0,0,0,45,45,45,37,100,10,0,0,115,111,110,45,62,115,112,108,95,105,100,120,32,62,61,32,105,100,95,115,116,97,114,116,32,38,38,32,115,111,110,45,62,115,112,108,95,105,100,120,32,60,32,105,100,95,115,116,97,114,116,32,43,32,105,100,95,110,117,109,0,0,0,0,78,85,76,76,32,33,61,32,104,122,95,102,111,117,110,100,32,38,38,32,104,97,110,122,105,32,61,61,32,42,104,122,95,102,111,117,110,100,0,0,67,104,0,0,0,0,0,0,102,114,101,113,95,99,111,100,101,115,95,0,0,0,0,0,48,32,33,61,32,110,117,109,0,0,0,0,0,0,0,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,37,100,39,116,104,32,68,77,73,32,110,111,100,101,32,98,101,103,105,110,45,45,45,45,45,45,45,45,45,45,45,62,10,0,0,0,0,0,0,49,32,61,61,32,110,111,100,101,45,62,115,111,110,95,49,115,116,95,111,102,102,0,0,104,122,115,95,108,101,110,32,60,61,32,107,77,97,120,80,114,101,100,105,99,116,83,105,122,101,32,38,38,32,104,122,115,95,108,101,110,32,62,32,48,0,0,0,0,0,0,0,37,115,0,0,0,0,0,0,102,114,101,113,95,99,111,100,101,115,95,100,102,95,0,0,49,32,61,61,32,115,112,108,95,105,100,120,95,110,117,109,0,0,0,0,0,0,0,0,115,112,108,95,105,100,95,102,114,32,60,61,32,107,77,97,120,76,101,109,109,97,83,105,122,101,0,0,0,0,0,0,78,85,76,76,32,33,61,32,100,101,112,32,38,38,32,48,32,61,61,32,102,114,111,109,95,104,97,110,100,108,101,0,105,100,95,110,117,109,32,61,61,32,115,116,97,114,116,95,105,100,95,91,107,77,97,120,76,101,109,109,97,83,105,122,101,93,0,0,0,0,0,0,115,111,110,95,112,111,115,32,43,32,49,32,61,61,32,110,117,109,95,111,102,95,115,111,110,0,0,0,0,0,0,0,102,114,101,113,115,91,112,111,115,93,32,62,32,48,0,0,117,116,102,49,54,95,115,116,114,108,101,110,40,116,111,107,101,110,41,32,60,61,32,107,77,97,120,80,105,110,121,105,110,83,105,122,101,0,0,0,116,109,112,32,61,61,32,108,109,97,95,108,101,110,0,0,48,32,61,61,32,100,101,112,45,62,115,112,108,105,100,115,95,101,120,116,101,110,100,101,100,0,0,0,0,0,0,0,46,46,47,115,104,97,114,101,47,109,97,116,114,105,120,115,101,97,114,99,104,46,99,112,112,0,0,0,0,0,0,0,80,79,83,73,88,76,89,95,67,79,82,82,69,67,84,0,99,117,114,114,101,110,116,95,112,111,115,32,61,61,32,115,116,97,114,116,95,112,111,115,95,91,107,77,97,120,76,101,109,109,97,83,105,122,101,93,0,0,0,0,0,0,0,0,105,115,95,118,97,108,105,100,95,115,112,108,95,99,104,97,114,40,99,104,97,114,95,99,117,114,114,101,110,116,41,0,105,100,120,95,110,111,119,32,43,32,49,32,61,61,32,110,101,120,116,95,105,100,120,95,117,110,117,115,101,100,0,0,78,85,76,76,32,33,61,32,116,111,107,101,110,0,0,0,99,95,112,104,114,97,115,101,95,46,108,101,110,103,116,104,32,62,32,48,32,38,38,32,99,95,112,121,95,108,101,110,32,61,61,32,99,95,112,104,114,97,115,101,95,46,115,112,108,95,115,116,97,114,116,91,99,95,112,104,114,97,115,101,95,46,115,117,98,108,109,97,95,115,116,97,114,116,91,99,95,112,104,114,97,115,101,95,46,115,117,98,108,109,97,95,110,117,109,93,93,0,0,0,114,98,0,0,0,0,0,0,115,99,105,115,95,110,117,109,95,32,61,61,32,115,99,105,115,95,110,117,109,0,0,0,40,99,104,97,114,95,102,111,114,95,110,111,100,101,32,62,61,32,39,65,39,41,32,38,38,32,40,99,104,97,114,95,102,111,114,95,110,111,100,101,32,60,61,32,39,90,39,32,124,124,32,39,104,39,32,61,61,32,99,104,97,114,95,102,111,114,95,110,111,100,101,41,0,0,0,0,0,0,0,0,108,101,109,109,97,95,97,114,114,91,112,111,115,93,46,105,100,120,95,98,121,95,104,122,32,61,61,32,105,100,120,95,110,111,119,0,0,0,0,0,109,111,118,101,95,112,111,115,32,62,32,48,0,0,0,0,98,95,97,99,95,116,109,112,0,0,0,0,0,0,0,0,119,98,0,0,0,0,0,0,46,46,32,116,111,116,97,108,32,108,101,109,109,97,32,110,111,100,101,32,110,117,109,98,101,114,58,32,37,108,100,10,0,0,0,0,0,0,0,0,115,116,97,116,105,99,95,99,97,115,116,60,115,105,122,101,95,116,62,40,115,112,108,105,100,32,45,32,107,70,117,108,108,83,112,108,73,100,83,116,97,114,116,41,32,60,32,98,117,102,95,115,105,122,101,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,109,97,120,32,115,121,115,116,101,109,32,98,121,116,101,115,32,61,32,37,49,48,108,117,10,0,0,0,0,0,0,0,46,46,32,115,111,110,32,98,117,102,32,97,108,108,111,99,97,116,105,111,110,32,110,117,109,98,101,114,32,119,105,116,104,32,109,111,114,101,32,116,104,97,110,32,49,32,115,111,110,58,32,37,108,100,10,0,102,97,108,115,101,0,0,0,78,85,76,76,32,33,61,32,105,110,115,116,97,110,99,101,95,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,99,97,115,116,0,0,0,99,117,114,114,101,110,116,95,104,122,95,108,101,110,32,62,61,32,108,97,115,116,95,104,122,95,108,101,110,0,0,0,46,46,32,115,111,110,32,98,117,102,32,97,108,108,111,99,97,116,105,111,110,32,110,117,109,98,101,114,32,119,105,116,104,32,111,110,108,121,32,49,32,115,111,110,58,32,37,108,100,10,0,0,0,0,0,0,121,109,95,105,100,32,62,32,48,0,0,0,0,0,0,0,105,116,101,109,95,110,117,109,91,99,111,100,101,93,32,62,32,48,0,0,0,0,0,0,46,46,32,116,111,116,97,108,95,104,111,109,111,95,110,117,109,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,48,44,32,0,0,0,0,0,114,98,0,0,0,0,0,0,46,46,32,116,111,116,97,108,95,110,111,100,101,95,105,110,95,115,111,110,98,117,102,95,97,108,108,110,111,115,111,110,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,0,42,102,111,117,110,100,32,61,61,32,104,122,0,0,0,0,108,109,97,95,98,117,102,91,114,101,109,97,105,110,95,110,117,109,32,45,32,49,93,46,104,97,110,122,105,32,61,61,32,108,109,97,95,98,117,102,91,112,111,115,93,46,104,97,110,122,105,0,0,0,0,0,119,43,0,0,0,0,0,0,46,46,32,116,111,116,97,108,95,115,111,110,98,117,102,95,97,108,108,110,111,115,111,110,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,0,114,101,109,97,105,110,95,110,117,109,32,62,32,48,0,0,46,46,32,116,111,116,97,108,95,115,111,110,98,117,102,95,110,117,109,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,0,0,0,0,0,0,108,112,115,105,95,110,117,109,32,62,32,110,117,109,0,0,46,46,32,116,111,116,97,108,95,110,111,100,101,95,104,97,115,115,111,110,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,49,44,32,0,0,78,85,76,76,32,33,61,32,109,116,114,120,95,110,100,0,46,46,47,115,104,97,114,101,47,115,112,101,108,108,105,110,103,116,97,98,108,101,46,99,112,112,0,0,0,0,0,0,46,46,32,116,111,116,97,108,95,115,111,110,95,110,117,109,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,0,100,109,105,95,99,95,112,104,114,97,115,101,95,0,0,0,108,109,97,95,115,116,97,114,116,95,91,102,105,120,101,100,95,108,109,97,115,95,93,32,61,61,32,102,105,120,101,100,95,104,122,115,95,0,0,0,46,46,47,115,104,97,114,101,47,108,112,105,99,97,99,104,101,46,99,112,112,0,0,0,115,112,108,95,116,114,105,101,95,45,62,105,115,95,104,97,108,102,95,105,100,40,115,112,108,105,100,41,0,0,0,0,46,46,32,109,97,120,95,104,111,109,111,98,117,102,95,108,101,110,32,112,101,114,32,108,97,121,101,114,58,10,32,32,32,45,44,32,0,0,0,0,108,109,97,95,105,100,95,110,117,109,95,32,43,32,102,105,120,101,100,95,108,109,97,115,95,32,45,32,112,111,115,32,45,32,49,32,62,61,32,112,111,115,0,0,0,0,0,0,108,109,97,95,110,111,100,101,95,110,117,109,95,108,101,48,95,32,60,61,32,98,117,102,95,115,105,122,101,0,0,0,37,115,58,32,0,0,0,0,105,110,32,117,115,101,32,98,121,116,101,115,32,32,32,32,32,61,32,37,49,48,108,117,10,0,0,0,0,0,0,0,46,46,47,115,104,97,114,101,47,117,115,101,114,100,105,99,116,46,99,112,112,0,0,0,112,104,114,97,115,101,95,108,101,110,32,62,32,48,0,0,97,118,101,114,97,103,101,95,115,99,111,114,101,32,60,61,32,50,53,53,0,0,0,0,78,85,76,76,32,33,61,32,108,112,105,95,99,97,99,104,101,95,108,101,110,95,0,0,108,101,109,109,97,95,97,114,114,91,48,93,46,105,100,120,95,98,121,95,104,122,32,61,61,32,49,0,0,0,0,0,37,115,10,0,0,0,0,0,37,108,100,44,32,0,0,0,112,104,114,97,115,101,95,108,101,110,32,61,61,32,108,109,97,95,115,116,97,114,116,95,91,102,105,120,101,100,95,108,109,97,115,95,93,0,0,0,115,117,99,101,115,115,0,0,46,46,47,115,104,97,114,101,47,100,105,99,116,108,105,115,116,46,99,112,112,0,0,0,99,98,95,110,101,119,0,0,37,115,10,0,0,0,0,0,46,46,32,109,97,120,95,115,111,110,98,117,102,95,108,101,110,32,112,101,114,32,108,97,121,101,114,40,102,114,111,109,32,108,97,121,101,114,32,48,41,58,10,32,32,32,0,0,108,109,97,95,108,101,110,32,61,61,32,108,109,97,95,115,116,97,114,116,95,91,112,111,115,32,43,32,49,93,32,45,32,108,109,97,95,115,116,97,114,116,95,91,112,111,115,93,0,0,0,0,0,0,0,0,42,110,117,109,32,62,61,32,49,0,0,0,0,0,0,0,111,108,100,114,111,119,32,62,61,32,100,109,105,45,62,115,112,108,115,116,114,95,108,101,110,0,0,0,0,0,0,0,100,101,112,95,45,62,105,100,95,110,117,109,32,62,32,48,0,0,0,0,0,0,0,0,99,97,110,100,95,115,112,108,105,100,115,95,116,104,105,115,32,62,32,48,0,0,0,0,37,115,58,32,0,0,0,0,115,111,110,95,112,111,115,32,43,32,49,32,61,61,32,112,97,114,101,110,116,95,115,111,110,95,110,117,109,0,0,0,48,32,61,61,32,112,114,101,118,95,105,100,115,95,110,117,109,0,0,0,0,0,0,0,40,33,97,114,103,95,118,97,108,105,100,32,38,38,32,115,112,108,105,100,115,95,109,97,120,32,62,61,32,108,109,97,95,108,101,110,41,32,124,124,32,108,109,97,95,108,101,110,32,61,61,32,115,112,108,105,100,115,95,109,97,120,0,0,104,111,109,111,95,110,117,109,32,60,61,32,50,53,53,0,78,85,76,76,32,33,61,32,101,110,100,95,110,111,100,101,0,0,0,0,0,0,0,0,110,111,100,101,95,115,111,110,45,62,115,112,108,95,105,100,120,32,62,61,32,105,100,95,115,116,97,114,116,32,38,38,32,110,111,100,101,95,115,111,110,45,62,115,112,108,95,105,100,120,32,60,32,105,100,95,115,116,97,114,116,32,43,32,105,100,95,110,117,109,0,0,104,111,109,111,95,110,117,109,32,60,61,32,54,53,53,51,53,0,0,0,0,0,0,0,46,46,47,115,104,97,114,101,47,115,112,101,108,108,105,110,103,116,114,105,101,46,99,112,112,0,0,0,0,0,0,0,98,0,0,0,0,0,0,0,110,111,100,101,32,61,61,32,114,111,111,116,95,32,38,38,32,49,32,61,61,32,110,111,100,101,95,102,114,95,110,117,109,0,0,0,0,0,0,0,115,112,108,95,115,116,97,114,116,95,91,102,105,120,101,100,95,104,122,115,95,93,32,61,61,32,102,105,120,101,100,95,99,104,95,112,111,115,0,0,37,115,58,32,0,0,0,0,112,97,114,101,110,116,95,115,111,110,95,110,117,109,32,60,61,32,50,53,53,0,0,0,115,116,101,112,95,116,111,95,100,109,105,95,102,114,32,33,61,32,115,116,97,116,105,99,95,99,97,115,116,60,80,111,111,108,80,111,115,84,121,112,101,62,40,45,49,41,0,0,105,100,95,110,117,109,32,62,32,48,0,0,0,0,0,0,98,97,100,95,97,114,114,97,121,95,110,101,119,95,108,101,110,103,116,104,0,0,0,0,112,97,114,101,110,116,95,115,111,110,95,110,117,109,32,60,61,32,54,53,53,51,53,0,99,97,110,100,95,108,101,110,32,62,32,48,0,0,0,0,46,46,47,115,104,97,114,101,47,100,105,99,116,116,114,105,101,46,99,112,112,0,0,0,110,111,100,101,95,103,101,49,45,62,115,111,110,95,49,115,116,95,111,102,102,95,108,32,62,32,48,32,124,124,32,110,111,100,101,95,103,101,49,45,62,115,111,110,95,49,115,116,95,111,102,102,95,104,32,62,32,48,0,0,0,0,0,0,115,121,115,116,101,109,32,98,121,116,101,115,32,32,32,32,32,61,32,37,49,48,108,117,10,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,116,121,112,101,105,100,0,108,101,118,101,108,32,60,32,107,77,97,120,76,101,109,109,97,83,105,122,101,0,0,0,114,98,0,0,0,0,0,0,115,99,111,114,101,32,62,61,32,48,0,0,0,0,0,0,60,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,37,100,39,116,104,32,68,77,73,32,110,111,100,101,32,101,110,100,45,45,45,45,45,45,45,45,45,45,45,45,45,45,10,10,0,0,0,0,0,78,85,76,76,32,33,61,32,108,112,105,95,99,97,99,104,101,95,0,0,0,0,0,0,110,111,100,101,95,108,101,48,45,62,115,111,110,95,49,115,116,95,111,102,102,32,60,61,32,108,109,97,95,110,111,100,101,95,110,117,109,95,103,101,49,95,0,0,0,0,0,0,78,85,76,76,32,33,61,32,115,116,114,0,0,0,0,0,108,97,115,116,95,104,122,95,108,101,110,32,62,32,48,0,46,46,47,115,104,97,114,101,47,110,103,114,97,109,46,99,112,112,0,0,0,0,0,0,102,111,117,110,100,0,0,0,58,32,0,0,0,0,0,0,32,84,111,116,97,108,32,80,105,110,121,105,110,32,76,101,110,58,32,37,100,10,0,0,104,50,102,95,110,117,109,95,91,42,115,112,108,105,100,93,32,62,32,48,0,0,0,0,110,111,100,101,45,62,115,111,110,95,49,115,116,95,111,102,102,95,108,32,62,32,48,32,124,124,32,110,111,100,101,45,62,115,111,110,95,49,115,116,95,111,102,102,95,104,32,62,32,48,0,0,0,0,0,0,115,116,97,116,105,99,95,99,97,115,116,60,115,105,122,101,95,116,62,40,102,111,117,110,100,32,45,32,98,117,102,95,41,32,62,61,32,115,116,97,114,116,95,112,111,115,95,91,115,116,114,95,108,101,110,32,45,32,49,93,0,0,0,0,105,116,101,109,95,110,117,109,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,78,85,76,76,32,33,61,32,100,105,99,116,95,116,114,105,101,45,62,108,109,97,95,105,100,120,95,98,117,102,95,0,32,83,112,101,108,108,105,110,103,32,58,32,37,115,44,32,37,100,10,0,0,0,0,0,110,111,100,101,45,62,115,111,110,95,49,115,116,95,111,102,102,32,60,61,32,108,109,97,95,110,111,100,101,95,110,117,109,95,103,101,49,95,0,0,102,111,117,110,100,32,62,32,98,117,102,95,0,0,0,0,90,104,0,0,0,0,0,0,78,85,76,76,32,33,61,32,100,105,99,116,95,116,114,105,101,45,62,114,111,111,116,95,0,0,0,0,0,0,0,0,46,46,47,115,104,97,114,101,47,100,105,99,116,98,117,105,108,100,101,114,46,99,112,112,0,0,0,0,0,0,0,0,114,98,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,84,114,105,101,58,58,105,102,95,118,97,108,105,100,95,105,100,95,117,112,100,97,116,101,40,117,105,110,116,49,54,32,42,41,32,99,111,110,115,116,0,0,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,85,115,101,114,68,105,99,116,58,58,114,101,99,108,97,105,109,40,41,0,0,0,0,105,109,101,95,112,105,110,121,105,110,58,58,76,112,105,67,97,99,104,101,58,58,76,112,105,67,97,99,104,101,40,41,0,0,0,0,0,0,0,0,115,116,97,116,105,99,32,105,109,101,95,112,105,110,121,105,110,58,58,76,112,105,67,97,99,104,101,32,38,105,109,101,95,112,105,110,121,105,110,58,58,76,112,105,67,97,99,104,101,58,58,103,101,116,95,105,110,115,116,97,110,99,101,40,41,0,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,108,111,97,100,95,100,105,99,116,40,70,73,76,69,32,42,41,0,0,0,0,118,105,114,116,117,97,108,32,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,103,101,116,95,108,112,105,115,40,99,111,110,115,116,32,117,105,110,116,49,54,32,42,44,32,117,105,110,116,49,54,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,41,0,0,0,0,0,118,105,114,116,117,97,108,32,117,105,110,116,49,54,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,103,101,116,95,108,101,109,109,97,95,115,112,108,105,100,115,40,76,101,109,109,97,73,100,84,121,112,101,44,32,117,105,110,116,49,54,32,42,44,32,117,105,110,116,49,54,44,32,98,111,111,108,41,0,0,0,0,0,0,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,101,120,116,101,110,100,95,100,105,99,116,50,40,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,44,32,99,111,110,115,116,32,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,32,42,41,0,0,0,0,0,0,0,0,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,101,120,116,101,110,100,95,100,105,99,116,49,40,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,44,32,99,111,110,115,116,32,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,32,42,41,0,0,0,0,0,0,0,0,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,101,120,116,101,110,100,95,100,105,99,116,48,40,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,44,32,99,111,110,115,116,32,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,32,42,41,0,0,0,0,0,0,0,0,118,105,114,116,117,97,108,32,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,101,120,116,101,110,100,95,100,105,99,116,40,77,105,108,101,83,116,111,110,101,72,97,110,100,108,101,44,32,99,111,110,115,116,32,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,32,42,41,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,58,58,116,114,121,95,101,120,116,101,110,100,40,99,111,110,115,116,32,117,105,110,116,49,54,32,42,44,32,117,105,110,116,49,54,44,32,76,101,109,109,97,73,100,84,121,112,101,41,0,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,102,105,108,108,95,115,99,105,115,40,99,111,110,115,116,32,105,109,101,95,112,105,110,121,105,110,58,58,83,105,110,103,108,101,67,104,97,114,73,116,101,109,32,42,44,32,115,105,122,101,95,116,41,0,0,0,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,102,105,108,108,95,108,105,115,116,40,99,111,110,115,116,32,105,109,101,95,112,105,110,121,105,110,58,58,76,101,109,109,97,69,110,116,114,121,32,42,44,32,115,105,122,101,95,116,41,0,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,112,114,101,100,105,99,116,40,99,111,110,115,116,32,99,104,97,114,49,54,32,42,44,32,117,105,110,116,49,54,44,32,78,80,114,101,100,105,99,116,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,41,0,0,0,0,117,105,110,116,49,54,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,103,101,116,95,115,112,108,105,100,115,95,102,111,114,95,104,97,110,122,105,40,99,104,97,114,49,54,44,32,117,105,110,116,49,54,44,32,117,105,110,116,49,54,32,42,44,32,117,105,110,116,49,54,41,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,99,111,110,118,101,114,116,95,116,111,95,115,99,105,115,95,105,100,115,40,99,104,97,114,49,54,32,42,44,32,117,105,110,116,49,54,41,0,0,0,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,99,111,110,118,101,114,116,95,116,111,95,104,97,110,122,105,115,40,99,104,97,114,49,54,32,42,44,32,117,105,110,116,49,54,41,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,99,97,108,99,117,108,97,116,101,95,115,105,122,101,40,99,111,110,115,116,32,105,109,101,95,112,105,110,121,105,110,58,58,76,101,109,109,97,69,110,116,114,121,32,42,44,32,115,105,122,101,95,116,41,0,0,0,0,0,76,101,109,109,97,73,100,84,121,112,101,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,76,105,115,116,58,58,103,101,116,95,108,101,109,109,97,95,105,100,40,99,111,110,115,116,32,99,104,97,114,49,54,32,42,44,32,117,105,110,116,49,54,41,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,78,71,114,97,109,58,58,98,117,105,108,100,95,117,110,105,103,114,97,109,40,105,109,101,95,112,105,110,121,105,110,58,58,76,101,109,109,97,69,110,116,114,121,32,42,44,32,115,105,122,101,95,116,44,32,76,101,109,109,97,73,100,84,121,112,101,41,0,0,0,0,100,111,117,98,108,101,32,105,109,101,95,112,105,110,121,105,110,58,58,114,101,99,97,108,99,117,108,97,116,101,95,107,101,114,110,101,108,40,100,111,117,98,108,101,32,42,44,32,115,105,122,101,95,116,44,32,100,111,117,98,108,101,32,42,44,32,67,79,68,69,66,79,79,75,95,84,89,80,69,32,42,41,0,0,0,0,0,0,99,111,110,115,116,32,99,104,97,114,32,42,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,84,97,98,108,101,58,58,97,114,114,97,110,103,101,40,115,105,122,101,95,116,32,42,44,32,115,105,122,101,95,116,32,42,41,0,0,0,0,0,0,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,78,111,100,101,32,42,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,84,114,105,101,58,58,99,111,110,115,116,114,117,99,116,95,115,112,101,108,108,105,110,103,115,95,115,117,98,115,101,116,40,115,105,122,101,95,116,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,44,32,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,78,111,100,101,32,42,41,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,83,112,101,108,108,105,110,103,84,114,105,101,58,58,98,117,105,108,100,95,121,109,95,105,110,102,111,40,41,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,100,101,108,115,101,97,114,99,104,40,115,105,122,101,95,116,44,32,98,111,111,108,44,32,98,111,111,108,41,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,103,101,116,95,108,112,105,115,40,99,111,110,115,116,32,117,105,110,116,49,54,32,42,44,32,115,105,122,101,95,116,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,99,111,110,115,116,32,99,104,97,114,49,54,32,42,44,32,98,111,111,108,41,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,99,104,111,111,115,101,40,115,105,122,101,95,116,41,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,97,100,100,95,108,109,97,95,116,111,95,117,115,101,114,100,105,99,116,40,117,105,110,116,49,54,44,32,117,105,110,116,49,54,44,32,102,108,111,97,116,41,0,0,0,0,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,99,97,110,99,101,108,95,108,97,115,116,95,99,104,111,105,99,101,40,41,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,109,101,114,103,101,95,102,105,120,101,100,95,108,109,97,115,40,115,105,122,101,95,116,41,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,103,101,116,95,115,112,108,95,115,116,97,114,116,95,105,100,40,41,0,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,97,100,100,95,99,104,97,114,95,113,119,101,114,116,121,40,41,0,0,0,0,0,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,101,120,116,101,110,100,95,109,116,114,120,95,110,100,40,77,97,116,114,105,120,78,111,100,101,32,42,44,32,76,109,97,80,115,98,73,116,101,109,32,42,44,32,115,105,122,101,95,116,44,32,80,111,111,108,80,111,115,84,121,112,101,44,32,115,105,122,101,95,116,41,0,0,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,114,101,115,101,116,95,115,101,97,114,99,104,40,115,105,122,101,95,116,44,32,98,111,111,108,44,32,98,111,111,108,44,32,98,111,111,108,41,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,101,120,116,101,110,100,95,100,109,105,95,99,40,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,68,105,99,116,77,97,116,99,104,73,110,102,111,32,42,41,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,77,97,116,114,105,120,83,101,97,114,99,104,58,58,101,120,116,101,110,100,95,100,109,105,40,68,105,99,116,69,120,116,80,97,114,97,32,42,44,32,68,105,99,116,77,97,116,99,104,73,110,102,111,32,42,41,0,0,0,0,0,99,104,97,114,49,54,32,42,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,114,101,97,100,95,118,97,108,105,100,95,104,97,110,122,105,115,40,99,111,110,115,116,32,99,104,97,114,32,42,44,32,115,105,122,101,95,116,32,42,41,0,0,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,104,122,95,105,110,95,104,97,110,122,105,115,95,108,105,115,116,40,99,111,110,115,116,32,99,104,97,114,49,54,32,42,44,32,115,105,122,101,95,116,44,32,99,104,97,114,49,54,41,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,99,111,110,115,116,114,117,99,116,95,115,117,98,115,101,116,40,118,111,105,100,32,42,44,32,105,109,101,95,112,105,110,121,105,110,58,58,76,101,109,109,97,69,110,116,114,121,32,42,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,44,32,115,105,122,101,95,116,41,0,0,0,0,0,0,0,0,118,111,105,100,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,103,101,116,95,116,111,112,95,108,101,109,109,97,115,40,41,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,114,101,97,100,95,114,97,119,95,100,105,99,116,40,99,111,110,115,116,32,99,104,97,114,32,42,44,32,99,111,110,115,116,32,99,104,97,114,32,42,44,32,115,105,122,101,95,116,41,0,0,0,0,0,0,0,115,105,122,101,95,116,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,98,117,105,108,100,95,115,99,105,115,40,41,0,0,0,0,98,111,111,108,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,66,117,105,108,100,101,114,58,58,98,117,105,108,100,95,100,105,99,116,40,99,111,110,115,116,32,99,104,97,114,32,42,44,32,99,111,110,115,116,32,99,104,97,114,32,42,44,32,105,109,101,95,112,105,110,121,105,110,58,58,68,105,99,116,84,114,105,101,32,42,41,0,0,0,0,32,183,0,0,0,0,0,0,0,0,0,0,200,38,0,0,62,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,38,0,0,38,0,0,0,84,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,38,0,0,98,0,0,0,50,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,0,0,38,0,0,0,82,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,39,0,0,26,0,0,0,78,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,41,0,0,30,0,0,0,2,0,0,0,2,0,0,0,14,0,0,0,12,0,0,0,2,0,0,0,2,0,0,0,10,0,0,0,20,0,0,0,4,0,0,0,8,0,0,0,2,0,0,0,6,0,0,0,8,0,0,0,30,0,0,0,16,0,0,0,48,0,0,0,16,0,0,0,10,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,41,0,0,68,0,0,0,12,0,0,0,12,0,0,0,8,0,0,0,18,0,0,0,10,0,0,0,4,0,0,0,6,0,0,0,14,0,0,0,12,0,0,0,6,0,0,0,8,0,0,0,18,0,0,0,10,0,0,0,42,0,0,0,4,0,0,0,28,0,0,0,6,0,0,0,8,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,41,0,0,74,0,0,0,34,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,41,0,0,88,0,0,0,60,0,0,0,94,0,0,0,22,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,41,0,0,88,0,0,0,24,0,0,0,94,0,0,0,22,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,41,0,0,88,0,0,0,106,0,0,0,94,0,0,0,22,0,0,0,10,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,42,0,0,88,0,0,0,46,0,0,0,94,0,0,0,22,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,42,0,0,88,0,0,0,70,0,0,0,94,0,0,0,22,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,42,0,0,88,0,0,0,20,0,0,0,94,0,0,0,22,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,42,0,0,88,0,0,0,72,0,0,0,94,0,0,0,22,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,42,0,0,88,0,0,0,100,0,0,0,94,0,0,0,22,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,119,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,104,0,0,0,0,0,0,0,102,0,0,0,0,0,0,0,101,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,98,0,0,0,0,0,0,0,97,0,0,0,0,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,83,116,57,101,120,99,101,112,116,105,111,110,0,0,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,83,116,56,98,97,100,95,99,97,115,116,0,0,0,0,0,83,116,50,48,98,97,100,95,97,114,114,97,121,95,110,101,119,95,108,101,110,103,116,104,0,0,0,0,0,0,0,0,83,116,49,48,98,97,100,95,116,121,112,101,105,100,0,0,80,121,0,0,0,0,0,0,80,120,0,0,0,0,0,0,80,119,0,0,0,0,0,0,80,118,0,0,0,0,0,0,80,116,0,0,0,0,0,0,80,115,0,0,0,0,0,0,80,109,0,0,0,0,0,0,80,108,0,0,0,0,0,0,80,106,0,0,0,0,0,0,80,105,0,0,0,0,0,0,80,104,0,0,0,0,0,0,80,102,0,0,0,0,0,0,80,101,0,0,0,0,0,0,80,100,0,0,0,0,0,0,80,99,0,0,0,0,0,0,80,98,0,0,0,0,0,0,80,97,0,0,0,0,0,0,80,75,121,0,0,0,0,0,80,75,120,0,0,0,0,0,80,75,119,0,0,0,0,0,80,75,118,0,0,0,0,0,80,75,116,0,0,0,0,0,80,75,115,0,0,0,0,0,80,75,109,0,0,0,0,0,80,75,108,0,0,0,0,0,80,75,106,0,0,0,0,0,80,75,105,0,0,0,0,0,80,75,104,0,0,0,0,0,80,75,102,0,0,0,0,0,80,75,101,0,0,0,0,0,80,75,100,0,0,0,0,0,80,75,99,0,0,0,0,0,80,75,98,0,0,0,0,0,80,75,97,0,0,0,0,0,80,75,68,115,0,0,0,0,80,75,68,110,0,0,0,0,80,75,68,105,0,0,0,0,80,68,115,0,0,0,0,0,80,68,110,0,0,0,0,0,80,68,105,0,0,0,0,0,78,49,48,105,109,101,95,112,105,110,121,105,110,56,85,115,101,114,68,105,99,116,69,0,78,49,48,105,109,101,95,112,105,110,121,105,110,56,68,105,99,116,84,114,105,101,69,0,78,49,48,105,109,101,95,112,105,110,121,105,110,49,50,65,116,111,109,68,105,99,116,66,97,115,101,69,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,57,95,95,112,111,105,110,116,101,114,95,116,111,95,109,101,109,98,101,114,95,116,121,112,101,95,105,110,102,111,69,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,51,95,95,102,117,110,100,97,109,101,110,116,97,108,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,102,117,110,99,116,105,111,110,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,97,114,114,97,121,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,101,110,117,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,68,115,0,0,0,0,0,0,68,110,0,0,0,0,0,0,68,105,0,0,0,0,0,0,56,33,0,0,96,34,0,0,56,33,0,0,104,34,0,0,56,33,0,0,200,34,0,0,0,0,0,0,216,34,0,0,0,0,0,0,232,34,0,0,0,0,0,0,248,34,0,0,208,38,0,0,0,0,0,0,0,0,0,0,8,35,0,0,208,38,0,0,0,0,0,0,0,0,0,0,24,35,0,0,216,38,0,0,0,0,0,0,0,0,0,0,56,35,0,0,208,38,0,0,0,0,0,0,0,0,0,0,72,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,35,0,0,0,0,0,0,176,38,0,0,0,0,0,0,96,35,0,0,0,0,0,0,184,38,0,0,0,0,0,0,104,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,35,0,0,0,0,0,0,0,0,0,0].concat([0,0,0,0,192,35,0,0,0,0,0,0,192,38,0,0,0,0,0,0,200,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,35,0,0,1,0,0,0,0,0,0,0,0,0,0,0,216,35,0,0,1,0,0,0,0,0,0,0,0,0,0,0,224,35,0,0,1,0,0,0,176,38,0,0,0,0,0,0,232,35,0,0,1,0,0,0,184,38,0,0,0,0,0,0,240,35,0,0,1,0,0,0,0,0,0,0,0,0,0,0,248,35,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,8,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,16,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,24,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,32,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,40,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,48,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,56,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,64,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,72,36,0,0,1,0,0,0,192,38,0,0,0,0,0,0,80,36,0,0,1,0,0,0,0,0,0,0,0,0,0,0,88,36,0,0,1,0,0,0,120,42,0,0,0,0,0,0,96,36,0,0,1,0,0,0,128,42,0,0,0,0,0,0,104,36,0,0,1,0,0,0,136,42,0,0,0,0,0,0,112,36,0,0,0,0,0,0,120,42,0,0,0,0,0,0,120,36,0,0,0,0,0,0,128,42,0,0,0,0,0,0,128,36,0,0,0,0,0,0,136,42,0,0,0,0,0,0,136,36,0,0,192,41,0,0,0,0,0,0,96,33,0,0,160,36,0,0,0,0,0,0,1,0,0,0,192,41,0,0,0,0,0,0,0,0,0,0,184,36,0,0,0,0,0,0,216,36,0,0,40,42,0,0,0,0,0,0,0,0,0,0,8,37,0,0,88,42,0,0,0,0,0,0,0,0,0,0,48,37,0,0,56,42,0,0,0,0,0,0,0,0,0,0,88,37,0,0,56,42,0,0,0,0,0,0,0,0,0,0,128,37,0,0,88,42,0,0,0,0,0,0,0,0,0,0,168,37,0,0,40,42,0,0,0,0,0,0,0,0,0,0,208,37,0,0,88,42,0,0,0,0,0,0,0,0,0,0,248,37,0,0,88,42,0,0,0,0,0,0,0,0,0,0,32,38,0,0,88,42,0,0,0,0,0,0,0,0,0,0,72,38,0,0,200,38,0,0,0,0,0,0,0,0,0,0,112,38,0,0,88,42,0,0,0,0,0,0,56,33,0,0,152,38,0,0,56,33,0,0,160,38,0,0,56,33,0,0,168,38,0,0,72,77,0,0,0,0,0,72,78,71,0,0,0,0,78,71,0,0,0,0,0,0,0,0,48,65,66,67,99,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,115,84,85,86,87,88,89,90,122,0,0,2,1,1,1,2,1,1,1,0,1,1,1,1,1,2,1,1,1,1,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0,128,48,0,0,128,32,14,0,128,32,200,3,128,32,8,250,128,32,8,130,0,0,192,224,240,248,252,0])
  , "i8", ALLOC_NONE, Runtime.GLOBAL_BASE)
  var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
  assert(tempDoublePtr % 8 == 0);
  function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
    HEAP8[tempDoublePtr] = HEAP8[ptr];
    HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
    HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
    HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
  }
  function copyTempDouble(ptr) {
    HEAP8[tempDoublePtr] = HEAP8[ptr];
    HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
    HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
    HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
    HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
    HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
    HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
    HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
  }
    function ___gxx_personality_v0() {
      }
    Module["_strcpy"] = _strcpy;
    function _llvm_umul_with_overflow_i32(x, y) {
        x = x>>>0;
        y = y>>>0;
        return ((asm["setTempRet0"](x*y > 4294967295),(x*y)>>>0)|0);
      }
    Module["_memset"] = _memset;var _llvm_memset_p0i8_i32=_memset;
    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:35,EIDRM:36,ECHRNG:37,EL2NSYNC:38,EL3HLT:39,EL3RST:40,ELNRNG:41,EUNATCH:42,ENOCSI:43,EL2HLT:44,EDEADLK:45,ENOLCK:46,EBADE:50,EBADR:51,EXFULL:52,ENOANO:53,EBADRQC:54,EBADSLT:55,EDEADLOCK:56,EBFONT:57,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:74,ELBIN:75,EDOTDOT:76,EBADMSG:77,EFTYPE:79,ENOTUNIQ:80,EBADFD:81,EREMCHG:82,ELIBACC:83,ELIBBAD:84,ELIBSCN:85,ELIBMAX:86,ELIBEXEC:87,ENOSYS:88,ENMFILE:89,ENOTEMPTY:90,ENAMETOOLONG:91,ELOOP:92,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:106,EPROTOTYPE:107,ENOTSOCK:108,ENOPROTOOPT:109,ESHUTDOWN:110,ECONNREFUSED:111,EADDRINUSE:112,ECONNABORTED:113,ENETUNREACH:114,ENETDOWN:115,ETIMEDOUT:116,EHOSTDOWN:117,EHOSTUNREACH:118,EINPROGRESS:119,EALREADY:120,EDESTADDRREQ:121,EMSGSIZE:122,EPROTONOSUPPORT:123,ESOCKTNOSUPPORT:124,EADDRNOTAVAIL:125,ENETRESET:126,EISCONN:127,ENOTCONN:128,ETOOMANYREFS:129,EPROCLIM:130,EUSERS:131,EDQUOT:132,ESTALE:133,ENOTSUP:134,ENOMEDIUM:135,ENOSHARE:136,ECASECLASH:137,EILSEQ:138,EOVERFLOW:139,ECANCELED:140,ENOTRECOVERABLE:141,EOWNERDEAD:142,ESTRPIPE:143};
    var ___errno_state=0;function ___setErrNo(value) {
        // For convenient setting and returning of errno.
        HEAP32[((___errno_state)>>2)]=value
        return value;
      }
    var _stdin=allocate(1, "i32*", ALLOC_STATIC);
    var _stdout=allocate(1, "i32*", ALLOC_STATIC);
    var _stderr=allocate(1, "i32*", ALLOC_STATIC);
    var __impure_ptr=allocate(1, "i32*", ALLOC_STATIC);var FS={currentPath:"/",nextInode:2,streams:[null],ignorePermissions:true,createFileHandle:function (stream, fd) {
          if (typeof stream === 'undefined') {
            stream = null;
          }
          if (!fd) {
            if (stream && stream.socket) {
              for (var i = 1; i < 64; i++) {
                if (!FS.streams[i]) {
                  fd = i;
                  break;
                }
              }
              assert(fd, 'ran out of low fds for sockets');
            } else {
              fd = Math.max(FS.streams.length, 64);
              for (var i = FS.streams.length; i < fd; i++) {
                FS.streams[i] = null; // Keep dense
              }
            }
          }
          // Close WebSocket first if we are about to replace the fd (i.e. dup2)
          if (FS.streams[fd] && FS.streams[fd].socket && FS.streams[fd].socket.close) {
            FS.streams[fd].socket.close();
          }
          FS.streams[fd] = stream;
          return fd;
        },removeFileHandle:function (fd) {
          FS.streams[fd] = null;
        },joinPath:function (parts, forceRelative) {
          var ret = parts[0];
          for (var i = 1; i < parts.length; i++) {
            if (ret[ret.length-1] != '/') ret += '/';
            ret += parts[i];
          }
          if (forceRelative && ret[0] == '/') ret = ret.substr(1);
          return ret;
        },absolutePath:function (relative, base) {
          if (typeof relative !== 'string') return null;
          if (base === undefined) base = FS.currentPath;
          if (relative && relative[0] == '/') base = '';
          var full = base + '/' + relative;
          var parts = full.split('/').reverse();
          var absolute = [''];
          while (parts.length) {
            var part = parts.pop();
            if (part == '' || part == '.') {
              // Nothing.
            } else if (part == '..') {
              if (absolute.length > 1) absolute.pop();
            } else {
              absolute.push(part);
            }
          }
          return absolute.length == 1 ? '/' : absolute.join('/');
        },analyzePath:function (path, dontResolveLastLink, linksVisited) {
          var ret = {
            isRoot: false,
            exists: false,
            error: 0,
            name: null,
            path: null,
            object: null,
            parentExists: false,
            parentPath: null,
            parentObject: null
          };
          path = FS.absolutePath(path);
          if (path == '/') {
            ret.isRoot = true;
            ret.exists = ret.parentExists = true;
            ret.name = '/';
            ret.path = ret.parentPath = '/';
            ret.object = ret.parentObject = FS.root;
          } else if (path !== null) {
            linksVisited = linksVisited || 0;
            path = path.slice(1).split('/');
            var current = FS.root;
            var traversed = [''];
            while (path.length) {
              if (path.length == 1 && current.isFolder) {
                ret.parentExists = true;
                ret.parentPath = traversed.length == 1 ? '/' : traversed.join('/');
                ret.parentObject = current;
                ret.name = path[0];
              }
              var target = path.shift();
              if (!current.isFolder) {
                ret.error = ERRNO_CODES.ENOTDIR;
                break;
              } else if (!current.read) {
                ret.error = ERRNO_CODES.EACCES;
                break;
              } else if (!current.contents.hasOwnProperty(target)) {
                ret.error = ERRNO_CODES.ENOENT;
                break;
              }
              current = current.contents[target];
              if (current.link && !(dontResolveLastLink && path.length == 0)) {
                if (linksVisited > 40) { // Usual Linux SYMLOOP_MAX.
                  ret.error = ERRNO_CODES.ELOOP;
                  break;
                }
                var link = FS.absolutePath(current.link, traversed.join('/'));
                ret = FS.analyzePath([link].concat(path).join('/'),
                                     dontResolveLastLink, linksVisited + 1);
                return ret;
              }
              traversed.push(target);
              if (path.length == 0) {
                ret.exists = true;
                ret.path = traversed.join('/');
                ret.object = current;
              }
            }
          }
          return ret;
        },findObject:function (path, dontResolveLastLink) {
          var ret = FS.analyzePath(path, dontResolveLastLink);
          if (ret.exists) {
            return ret.object;
          } else {
            ___setErrNo(ret.error);
            return null;
          }
        },createObject:function (parent, name, properties, canRead, canWrite) {
          if (!parent) parent = '/';
          if (typeof parent === 'string') parent = FS.findObject(parent);
          if (!parent) {
            ___setErrNo(ERRNO_CODES.EACCES);
            throw new Error('Parent path must exist.');
          }
          if (!parent.isFolder) {
            ___setErrNo(ERRNO_CODES.ENOTDIR);
            throw new Error('Parent must be a folder.');
          }
          if (!parent.write && !FS.ignorePermissions) {
            ___setErrNo(ERRNO_CODES.EACCES);
            throw new Error('Parent folder must be writeable.');
          }
          if (!name || name == '.' || name == '..') {
            ___setErrNo(ERRNO_CODES.ENOENT);
            throw new Error('Name must not be empty.');
          }
          if (parent.contents.hasOwnProperty(name)) {
            ___setErrNo(ERRNO_CODES.EEXIST);
            throw new Error("Can't overwrite object.");
          }
          parent.contents[name] = {
            read: canRead === undefined ? true : canRead,
            write: canWrite === undefined ? false : canWrite,
            timestamp: Date.now(),
            inodeNumber: FS.nextInode++
          };
          for (var key in properties) {
            if (properties.hasOwnProperty(key)) {
              parent.contents[name][key] = properties[key];
            }
          }
          return parent.contents[name];
        },createFolder:function (parent, name, canRead, canWrite) {
          var properties = {isFolder: true, isDevice: false, contents: {}};
          return FS.createObject(parent, name, properties, canRead, canWrite);
        },createPath:function (parent, path, canRead, canWrite) {
          var current = FS.findObject(parent);
          if (current === null) throw new Error('Invalid parent.');
          path = path.split('/').reverse();
          while (path.length) {
            var part = path.pop();
            if (!part) continue;
            if (!current.contents.hasOwnProperty(part)) {
              FS.createFolder(current, part, canRead, canWrite);
            }
            current = current.contents[part];
          }
          return current;
        },createFile:function (parent, name, properties, canRead, canWrite) {
          properties.isFolder = false;
          return FS.createObject(parent, name, properties, canRead, canWrite);
        },createDataFile:function (parent, name, data, canRead, canWrite) {
          if (typeof data === 'string') {
            var dataArray = new Array(data.length);
            for (var i = 0, len = data.length; i < len; ++i) dataArray[i] = data.charCodeAt(i);
            data = dataArray;
          }
          var properties = {
            isDevice: false,
            contents: data.subarray ? data.subarray(0) : data // as an optimization, create a new array wrapper (not buffer) here, to help JS engines understand this object
          };
          return FS.createFile(parent, name, properties, canRead, canWrite);
        },createLazyFile:function (parent, name, url, canRead, canWrite) {
          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';
            // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
            var LazyUint8Array = function() {
              this.lengthKnown = false;
              this.chunks = []; // Loaded chunks. Index is the chunk number
            }
            LazyUint8Array.prototype.get = function(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(getter) {
              this.getter = getter;
            }
            LazyUint8Array.prototype.cacheLength = function() {
                // 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;
            }
            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 };
          }
          return FS.createFile(parent, name, properties, canRead, canWrite);
        },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile) {
          Browser.init();
          var fullname = FS.joinPath([parent, name], true);
          function processData(byteArray) {
            function finish(byteArray) {
              if (!dontCreateFile) {
                FS.createDataFile(parent, name, byteArray, canRead, canWrite);
              }
              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);
          }
        },createLink:function (parent, name, target, canRead, canWrite) {
          var properties = {isDevice: false, link: target};
          return FS.createFile(parent, name, properties, canRead, canWrite);
        },createDevice:function (parent, name, input, output) {
          if (!(input || output)) {
            throw new Error('A device must have at least one callback defined.');
          }
          var ops = {isDevice: true, input: input, output: output};
          return FS.createFile(parent, name, ops, Boolean(input), Boolean(output));
        },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;
        },staticInit:function () {
          // The main file system tree. All the contents are inside this.
          FS.root = {
            read: true,
            write: true,
            isFolder: true,
            isDevice: false,
            timestamp: Date.now(),
            inodeNumber: 1,
            contents: {}
          };
          // Create the temporary folder, if not already created
          try {
            FS.createFolder('/', 'tmp', true, true);
          } catch(e) {}
          FS.createFolder('/', 'dev', true, true);
        },init:function (input, output, error) {
          // Make sure we initialize only once.
          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;
          // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
          input = input || Module['stdin'];
          output = output || Module['stdout'];
          error = error || Module['stderr'];
          // Default handlers.
          var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true;
          if (!input) {
            stdinOverridden = false;
            input = function() {
              if (!input.cache || !input.cache.length) {
                var result;
                if (typeof window != 'undefined' &&
                    typeof window.prompt == 'function') {
                  // Browser.
                  result = window.prompt('Input: ');
                  if (result === null) result = String.fromCharCode(0); // cancel ==> EOF
                } else if (typeof readline == 'function') {
                  // Command line.
                  result = readline();
                }
                if (!result) result = '';
                input.cache = intArrayFromString(result + '\n', true);
              }
              return input.cache.shift();
            };
          }
          var utf8 = new Runtime.UTF8Processor();
          function createSimpleOutput() {
            var fn = function (val) {
              if (val === null || val === 10) {
                fn.printer(fn.buffer.join(''));
                fn.buffer = [];
              } else {
                fn.buffer.push(utf8.processCChar(val));
              }
            };
            return fn;
          }
          if (!output) {
            stdoutOverridden = false;
            output = createSimpleOutput();
          }
          if (!output.printer) output.printer = Module['print'];
          if (!output.buffer) output.buffer = [];
          if (!error) {
            stderrOverridden = false;
            error = createSimpleOutput();
          }
          if (!error.printer) error.printer = Module['printErr'];
          if (!error.buffer) error.buffer = [];
          // Create the I/O devices.
          var stdin = FS.createDevice('/dev', 'stdin', input);
          stdin.isTerminal = !stdinOverridden;
          var stdout = FS.createDevice('/dev', 'stdout', null, output);
          stdout.isTerminal = !stdoutOverridden;
          var stderr = FS.createDevice('/dev', 'stderr', null, error);
          stderr.isTerminal = !stderrOverridden;
          FS.createDevice('/dev', 'tty', input, output);
          FS.createDevice('/dev', 'null', function(){}, function(){});
          // Create default streams.
          FS.streams[1] = {
            path: '/dev/stdin',
            object: stdin,
            position: 0,
            isRead: true,
            isWrite: false,
            isAppend: false,
            error: false,
            eof: false,
            ungotten: []
          };
          FS.streams[2] = {
            path: '/dev/stdout',
            object: stdout,
            position: 0,
            isRead: false,
            isWrite: true,
            isAppend: false,
            error: false,
            eof: false,
            ungotten: []
          };
          FS.streams[3] = {
            path: '/dev/stderr',
            object: stderr,
            position: 0,
            isRead: false,
            isWrite: true,
            isAppend: false,
            error: false,
            eof: false,
            ungotten: []
          };
          // TODO: put these low in memory like we used to assert on: assert(Math.max(_stdin, _stdout, _stderr) < 15000); // make sure these are low, we flatten arrays with these
          HEAP32[((_stdin)>>2)]=1;
          HEAP32[((_stdout)>>2)]=2;
          HEAP32[((_stderr)>>2)]=3;
          // Other system paths
          FS.createPath('/', 'dev/shm/tmp', true, true); // temp files
          // Newlib initialization
          for (var i = FS.streams.length; i < Math.max(_stdin, _stdout, _stderr) + 4; i++) {
            FS.streams[i] = null; // Make sure to keep FS.streams dense
          }
          FS.streams[_stdin] = FS.streams[1];
          FS.streams[_stdout] = FS.streams[2];
          FS.streams[_stderr] = FS.streams[3];
          allocate([ allocate(
            [0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0],
            'void*', ALLOC_NORMAL) ], 'void*', ALLOC_NONE, __impure_ptr);
        },quit:function () {
          if (!FS.init.initialized) return;
          // Flush any partially-printed lines in stdout and stderr. Careful, they may have been closed
          if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output(10);
          if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output(10);
        },standardizePath:function (path) {
          if (path.substr(0, 2) == './') path = path.substr(2);
          return path;
        },deleteFile:function (path) {
          path = FS.analyzePath(path);
          if (!path.parentExists || !path.exists) {
            throw 'Invalid path ' + path;
          }
          delete path.parentObject.contents[path.name];
        }};
        Module['FS'] = FS;
    var ___dirent_struct_layout={__size__:1040,d_ino:0,d_name:4,d_off:1028,d_reclen:1032,d_type:1036};function _open(path, oflag, varargs) {
        // int open(const char *path, int oflag, ...);
        // http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
        // NOTE: This implementation tries to mimic glibc rather than strictly
        // following the POSIX standard.
        var mode = HEAP32[((varargs)>>2)];
        // Simplify flags.
        var accessMode = oflag & 3;
        var isWrite = accessMode != 0;
        var isRead = accessMode != 1;
        var isCreate = Boolean(oflag & 512);
        var isExistCheck = Boolean(oflag & 2048);
        var isTruncate = Boolean(oflag & 1024);
        var isAppend = Boolean(oflag & 8);
        // Verify path.
        var origPath = path;
        path = FS.analyzePath(Pointer_stringify(path));
        if (!path.parentExists) {
          ___setErrNo(path.error);
          return -1;
        }
        var target = path.object || null;
        var finalPath;
        // Verify the file exists, create if needed and allowed.
        if (target) {
          if (isCreate && isExistCheck) {
            ___setErrNo(ERRNO_CODES.EEXIST);
            return -1;
          }
          if ((isWrite || isTruncate) && target.isFolder) {
            ___setErrNo(ERRNO_CODES.EISDIR);
            return -1;
          }
          if (isRead && !target.read || isWrite && !target.write) {
            ___setErrNo(ERRNO_CODES.EACCES);
            return -1;
          }
          if (isTruncate && !target.isDevice) {
            target.contents = [];
          } else {
            if (!FS.forceLoadFile(target)) {
              ___setErrNo(ERRNO_CODES.EIO);
              return -1;
            }
          }
          finalPath = path.path;
        } else {
          if (!isCreate) {
            ___setErrNo(ERRNO_CODES.ENOENT);
            return -1;
          }
          if (!path.parentObject.write) {
            ___setErrNo(ERRNO_CODES.EACCES);
            return -1;
          }
          target = FS.createDataFile(path.parentObject, path.name, [],
                                     mode & 0x100, mode & 0x80);  // S_IRUSR, S_IWUSR.
          finalPath = path.parentPath + '/' + path.name;
        }
        // Actually create an open stream.
        var id;
        if (target.isFolder) {
          var entryBuffer = 0;
          if (___dirent_struct_layout) {
            entryBuffer = _malloc(___dirent_struct_layout.__size__);
          }
          var contents = [];
          for (var key in target.contents) contents.push(key);
          id = FS.createFileHandle({
            path: finalPath,
            object: target,
            // An index into contents. Special values: -2 is ".", -1 is "..".
            position: -2,
            isRead: true,
            isWrite: false,
            isAppend: false,
            error: false,
            eof: false,
            ungotten: [],
            // Folder-specific properties:
            // Remember the contents at the time of opening in an array, so we can
            // seek between them relying on a single order.
            contents: contents,
            // Each stream has its own area for readdir() returns.
            currentEntry: entryBuffer
          });
        } else {
          id = FS.createFileHandle({
            path: finalPath,
            object: target,
            position: 0,
            isRead: isRead,
            isWrite: isWrite,
            isAppend: isAppend,
            error: false,
            eof: false,
            ungotten: []
          });
        }
        return id;
      }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 |= 512;
          flags |= 1024;
        } else if (mode[0] == 'a') {
          if (mode.indexOf('+') != -1) {
            flags = 2;
          } else {
            flags = 1;
          }
          flags |= 512;
          flags |= 8;
        } else {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return 0;
        }
        var ret = _open(filename, flags, allocate([0x1FF, 0, 0, 0], 'i32', ALLOC_STACK));  // All creation permissions.
        return (ret == -1) ? 0 : ret;
      }
    function _recv(fd, buf, len, flags) {
        var info = FS.streams[fd];
        if (!info) return -1;
        if (!info.hasData()) {
          ___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior
          return -1;
        }
        var buffer = info.inQueue.shift();
        if (len < buffer.length) {
          if (info.stream) {
            // This is tcp (reliable), so if not all was read, keep it
            info.inQueue.unshift(buffer.subarray(len));
          }
          buffer = buffer.subarray(0, len);
        }
        HEAPU8.set(buffer, buf);
        return buffer.length;
      }
    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.streams[fildes];
        if (!stream || stream.object.isDevice) {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        } else if (!stream.isRead) {
          ___setErrNo(ERRNO_CODES.EACCES);
          return -1;
        } else if (stream.object.isFolder) {
          ___setErrNo(ERRNO_CODES.EISDIR);
          return -1;
        } else if (nbyte < 0 || offset < 0) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else if (offset >= stream.object.contents.length) {
          return 0;
        } else {
          var bytesRead = 0;
          var contents = stream.object.contents;
          var size = Math.min(contents.length - offset, nbyte);
          assert(size >= 0);
          if (contents.subarray) { // typed array
            HEAPU8.set(contents.subarray(offset, offset+size), buf);
          } else
          if (contents.slice) { // normal array
            for (var i = 0; i < size; i++) {
              HEAP8[(((buf)+(i))|0)]=contents[offset + i]
            }
          } else {
            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
              HEAP8[(((buf)+(i))|0)]=contents.get(offset + i)
            }
          }
          bytesRead += size;
          return bytesRead;
        }
      }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.streams[fildes];
        if (stream && ('socket' in stream)) {
          return _recv(fildes, buf, nbyte, 0);
        } else if (!stream) {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        } else if (!stream.isRead) {
          ___setErrNo(ERRNO_CODES.EACCES);
          return -1;
        } else if (nbyte < 0) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else {
          var bytesRead;
          if (stream.object.isDevice) {
            if (stream.object.input) {
              bytesRead = 0;
              for (var i = 0; i < nbyte; i++) {
                try {
                  var result = stream.object.input();
                } catch (e) {
                  ___setErrNo(ERRNO_CODES.EIO);
                  return -1;
                }
                if (result === undefined && bytesRead === 0) {
                  ___setErrNo(ERRNO_CODES.EAGAIN);
                  return -1;
                }
                if (result === null || result === undefined) break;
                bytesRead++;
                HEAP8[(((buf)+(i))|0)]=result
              }
              return bytesRead;
            } else {
              ___setErrNo(ERRNO_CODES.ENXIO);
              return -1;
            }
          } else {
            bytesRead = _pread(fildes, buf, nbyte, stream.position);
            assert(bytesRead >= -1);
            if (bytesRead != -1) {
              stream.position += bytesRead;
            }
            return bytesRead;
          }
        }
      }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.streams[stream];
        while (streamObj.ungotten.length && bytesToRead > 0) {
          HEAP8[((ptr++)|0)]=streamObj.ungotten.pop()
          bytesToRead--;
          bytesRead++;
        }
        var err = _read(stream, 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 _close(fildes) {
        // int close(int fildes);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/close.html
        if (FS.streams[fildes]) {
          if (FS.streams[fildes].currentEntry) {
            _free(FS.streams[fildes].currentEntry);
          }
          FS.streams[fildes] = null;
          return 0;
        } else {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        }
      }
    function _fsync(fildes) {
        // int fsync(int fildes);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/fsync.html
        if (FS.streams[fildes]) {
          // 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
        _fsync(stream);
        return _close(stream);
      }
    function _lseek(fildes, offset, whence) {
        // off_t lseek(int fildes, off_t offset, int whence);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/lseek.html
        if (FS.streams[fildes] && !FS.streams[fildes].object.isDevice) {
          var stream = FS.streams[fildes];
          var position = offset;
          if (whence === 1) {  // SEEK_CUR.
            position += stream.position;
          } else if (whence === 2) {  // SEEK_END.
            position += stream.object.contents.length;
          }
          if (position < 0) {
            ___setErrNo(ERRNO_CODES.EINVAL);
            return -1;
          } else {
            stream.ungotten = [];
            stream.position = position;
            return position;
          }
        } else {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        }
      }function _fseek(stream, offset, whence) {
        // int fseek(FILE *stream, long offset, int whence);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/fseek.html
        var ret = _lseek(stream, offset, whence);
        if (ret == -1) {
          return -1;
        } else {
          FS.streams[stream].eof = false;
          return 0;
        }
      }
    function _ftell(stream) {
        // long ftell(FILE *stream);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/ftell.html
        if (FS.streams[stream]) {
          stream = FS.streams[stream];
          if (stream.object.isDevice) {
            ___setErrNo(ERRNO_CODES.ESPIPE);
            return -1;
          } else {
            return stream.position;
          }
        } else {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        }
      }
    function ___assert_func(filename, line, func, condition) {
        throw 'Assertion failed: ' + (condition ? Pointer_stringify(condition) : 'unknown condition') + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + new Error().stack;
      }
    Module["_memcpy"] = _memcpy;var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;
    function __exit(status) {
        // void _exit(int status);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
        Module['exit'](status);
      }function _exit(status) {
        __exit(status);
      }function __ZSt9terminatev() {
        _exit(-1234);
      }
    Module["_strlen"] = _strlen;
    function _send(fd, buf, len, flags) {
        var info = FS.streams[fd];
        if (!info) return -1;
        info.sender(HEAPU8.subarray(buf, buf+len));
        return 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.streams[fildes];
        if (!stream || stream.object.isDevice) {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        } else if (!stream.isWrite) {
          ___setErrNo(ERRNO_CODES.EACCES);
          return -1;
        } else if (stream.object.isFolder) {
          ___setErrNo(ERRNO_CODES.EISDIR);
          return -1;
        } else if (nbyte < 0 || offset < 0) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else {
          var contents = stream.object.contents;
          while (contents.length < offset) contents.push(0);
          for (var i = 0; i < nbyte; i++) {
            contents[offset + i] = HEAPU8[(((buf)+(i))|0)];
          }
          stream.object.timestamp = Date.now();
          return i;
        }
      }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.streams[fildes];
        if (stream && ('socket' in stream)) {
            return _send(fildes, buf, nbyte, 0);
        } else if (!stream) {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        } else if (!stream.isWrite) {
          ___setErrNo(ERRNO_CODES.EACCES);
          return -1;
        } else if (nbyte < 0) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else {
          if (stream.object.isDevice) {
            if (stream.object.output) {
              for (var i = 0; i < nbyte; i++) {
                try {
                  stream.object.output(HEAP8[(((buf)+(i))|0)]);
                } catch (e) {
                  ___setErrNo(ERRNO_CODES.EIO);
                  return -1;
                }
              }
              stream.object.timestamp = Date.now();
              return i;
            } else {
              ___setErrNo(ERRNO_CODES.ENXIO);
              return -1;
            }
          } else {
            var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position);
            if (bytesWritten != -1) stream.position += bytesWritten;
            return bytesWritten;
          }
        }
      }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 bytesWritten = _write(stream, ptr, bytesToWrite);
        if (bytesWritten == -1) {
          if (FS.streams[stream]) FS.streams[stream].error = true;
          return 0;
        } else {
          return Math.floor(bytesWritten / size);
        }
      }
    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+8))>>2)]];
            argIndex += 8; // each 32-bit chunk is in a 64-bit block
          } else {
            type = 'i32'; // varargs are always i32, i64, or double
            ret = HEAP32[(((varargs)+(argIndex))>>2)];
          }
          argIndex += Math.max(Runtime.getNativeFieldSize(type), Runtime.getAlignSize(type, null, true));
          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;
            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;
                  }
                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;
            if (next == 46) {
              var 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)];
            } else {
              var precision = 6; // Standard default.
            }
            // 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 (flagAlwaysSigned) {
                  if (currArg < 0) {
                    prefix = '-' + prefix;
                  } else {
                    prefix = '+' + prefix;
                  }
                }
                // 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 (flagAlwaysSigned && currArg >= 0) {
                    argText = '+' + argText;
                  }
                }
                // Add padding.
                while (argText.length < width) {
                  if (flagLeftAlign) {
                    argText += ' ';
                  } else {
                    if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
                      argText = argText[0] + '0' + argText.slice(1);
                    } else {
                      argText = (flagZeroPad ? '0' : ' ') + argText;
                    }
                  }
                }
                // Adjust case.
                if (next < 97) argText = argText.toUpperCase();
                // Insert the result into the buffer.
                argText.split('').forEach(function(chr) {
                  ret.push(chr.charCodeAt(0));
                });
                break;
              }
              case 's': {
                // String.
                var arg = getNextArg('i8*');
                var argLength = arg ? _strlen(arg) : '(null)'.length;
                if (precisionSet) argLength = Math.min(argLength, precision);
                if (!flagLeftAlign) {
                  while (argLength < width--) {
                    ret.push(32);
                  }
                }
                if (arg) {
                  for (var i = 0; i < argLength; i++) {
                    ret.push(HEAPU8[((arg++)|0)]);
                  }
                } else {
                  ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));
                }
                if (flagLeftAlign) {
                  while (argLength < width--) {
                    ret.push(32);
                  }
                }
                break;
              }
              case 'c': {
                // Character.
                if (flagLeftAlign) ret.push(getNextArg('i8'));
                while (--width > 0) {
                  ret.push(32);
                }
                if (!flagLeftAlign) ret.push(getNextArg('i8'));
                break;
              }
              case 'n': {
                // Write the length written so far to the next parameter.
                var ptr = getNextArg('i32*');
                HEAP32[((ptr)>>2)]=ret.length
                break;
              }
              case '%': {
                // Literal percent sign.
                ret.push(curr);
                break;
              }
              default: {
                // Unknown specifiers remain untouched.
                for (var i = startTextIndex; i < textIndex + 2; i++) {
                  ret.push(HEAP8[(i)]);
                }
              }
            }
            textIndex += 2;
            // TODO: Support a/A (hex float) and m (last error) specifiers.
            // TODO: Support %1${specifier} for arg selection.
          } else {
            ret.push(curr);
            textIndex += 1;
          }
        }
        return ret;
      }function _fprintf(stream, format, varargs) {
        // int fprintf(FILE *restrict stream, const char *restrict format, ...);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
        var result = __formatString(format, varargs);
        var stack = Runtime.stackSave();
        var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);
        Runtime.stackRestore(stack);
        return ret;
      }function _printf(format, varargs) {
        // int printf(const char *restrict format, ...);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
        var stdout = HEAP32[((_stdout)>>2)];
        return _fprintf(stdout, format, varargs);
      }
    var _llvm_memset_p0i8_i64=_memset;
    function _fputs(s, stream) {
        // int fputs(const char *restrict s, FILE *restrict stream);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
        return _write(stream, s, _strlen(s));
      }
    function _fputc(c, stream) {
        // int fputc(int c, FILE *stream);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
        var chr = unSign(c & 0xFF);
        HEAP8[((_fputc.ret)|0)]=chr
        var ret = _write(stream, _fputc.ret, 1);
        if (ret == -1) {
          if (FS.streams[stream]) FS.streams[stream].error = true;
          return -1;
        } else {
          return chr;
        }
      }function _puts(s) {
        // int puts(const char *s);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html
        // NOTE: puts() always writes an extra newline.
        var stdout = HEAP32[((_stdout)>>2)];
        var ret = _fputs(s, stdout);
        if (ret < 0) {
          return ret;
        } else {
          var newlineRet = _fputc(10, stdout);
          return (newlineRet < 0) ? -1 : ret + 1;
        }
      }
    function _putchar(c) {
        // int putchar(int c);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html
        return _fputc(c, HEAP32[((_stdout)>>2)]);
      }
    function _fdopen(fildes, mode) {
        // FILE *fdopen(int fildes, const char *mode);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/fdopen.html
        if (FS.streams[fildes]) {
          var stream = FS.streams[fildes];
          mode = Pointer_stringify(mode);
          if ((mode.indexOf('w') != -1 && !stream.isWrite) ||
              (mode.indexOf('r') != -1 && !stream.isRead) ||
              (mode.indexOf('a') != -1 && !stream.isAppend) ||
              (mode.indexOf('+') != -1 && (!stream.isRead || !stream.isWrite))) {
            ___setErrNo(ERRNO_CODES.EINVAL);
            return 0;
          } else {
            stream.error = false;
            stream.eof = false;
            return fildes;
          }
        } else {
          ___setErrNo(ERRNO_CODES.EBADF);
          return 0;
        }
      }
    function ___cxa_pure_virtual() {
        ABORT = true;
        throw 'Pure virtual function called!';
      }
  
    function _qsort2(base, num, size, cmp) {
        // forward calls to the JavaScript sort method
        // first, sort the items logically
        var keys = [];
  
        for (var i = 0; i < num; i++) {
          keys.push(HEAP32[(base + i * size) >> 2]);
        }
  
        keys.sort(function(a, b) {
          return a - b;
        });
  
        // apply the sort
        for (var i = 0; i < num; i++) {
          HEAP32[(base+i*size >> 2)] = keys[i];
        }
      }
  
    function _qsort(base, num, size, cmp) {
        if (num == 0 || size == 0) return;
        // forward calls to the JavaScript sort method
        // first, sort the items logically
        var keys = [];
        for (var i = 0; i < num; i++) keys.push(i);
        keys.sort(function(a, b) {
          return Module['dynCall_iii'](cmp, base+a*size, base+b*size);
        });
        // apply the sort
        var temp = _malloc(num*size);
        _memcpy(temp, base, num*size);
        for (var i = 0; i < num; i++) {
          if (keys[i] == i) continue; // already in place
          _memcpy(base+i*size, temp+keys[i]*size, size);
        }
        _free(temp);
      }
    var _fabs=Math.abs;
    var _log=Math.log;
    function _strncmp(px, py, n) {
        var i = 0;
        while (i < n) {
          var x = HEAPU8[(((px)+(i))|0)];
          var y = HEAPU8[(((py)+(i))|0)];
          if (x == y && x == 0) return 0;
          if (x == 0) return -1;
          if (y == 0) return 1;
          if (x == y) {
            i ++;
            continue;
          } else {
            return x > y ? 1 : -1;
          }
        }
        return 0;
      }function _strcmp(px, py) {
        return _strncmp(px, py, TOTAL_MEMORY);
      }
    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 _strdup(ptr) {
        var len = _strlen(ptr);
        var newStr = _malloc(len + 1);
        (_memcpy(newStr, ptr, len)|0);
        HEAP8[(((newStr)+(len))|0)]=0;
        return newStr;
      }
    function _bsearch(key, base, num, size, compar) {
        var cmp = function(x, y) {
          return Module['dynCall_iii'](compar, x, y);
        };
        var left = 0;
        var right = num;
        var mid, test, addr;
        while (left < right) {
          mid = (left + right) >>> 1;
          addr = base + (mid * size);
          test = cmp(key, addr);
          if (test < 0) {
            right = mid;
          } else if (test > 0) {
            left = mid + 1;
          } else {
            return addr;
          }
        }
        return 0;
      }
    var _sqrt=Math.sqrt;
    Module["_strncpy"] = _strncpy;
    function _gettimeofday(ptr) {
        // %struct.timeval = type { i32, i32 }
        var now = Date.now();
        HEAP32[((ptr)>>2)]=Math.floor(now/1000); // seconds
        HEAP32[(((ptr)+(4))>>2)]=Math.floor((now-1000*Math.floor(now/1000))*1000); // microseconds
        return 0;
      }
    Module["_memcmp"] = _memcmp;
    function _unlink(path) {
        // int unlink(const char *path);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/unlink.html
        path = Pointer_stringify(path);
        path = FS.analyzePath(path, true);
        if (!path.parentExists || !path.exists) {
          ___setErrNo(path.error);
          return -1;
        } else if (path.object.isFolder) {
          ___setErrNo(ERRNO_CODES.EPERM);
          return -1;
        } else if (!path.parentObject.write) {
          ___setErrNo(ERRNO_CODES.EACCES);
          return -1;
        } else {
          delete path.parentObject.contents[path.name];
          return 0;
        }
      }
    function _ferror(stream) {
        // int ferror(FILE *stream);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/ferror.html
        return Number(FS.streams[stream] && FS.streams[stream].error);
      }
    function _feof(stream) {
        // int feof(FILE *stream);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/feof.html
        return Number(FS.streams[stream] && FS.streams[stream].eof);
      }
    function _truncate(path, length) {
        // int truncate(const char *path, off_t length);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/truncate.html
        // NOTE: The path argument may be a string, to simplify ftruncate().
        if (length < 0) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else {
          if (typeof path !== 'string') path = Pointer_stringify(path);
          var target = FS.findObject(path);
          if (target === null) return -1;
          if (target.isFolder) {
            ___setErrNo(ERRNO_CODES.EISDIR);
            return -1;
          } else if (target.isDevice) {
            ___setErrNo(ERRNO_CODES.EINVAL);
            return -1;
          } else if (!target.write) {
            ___setErrNo(ERRNO_CODES.EACCES);
            return -1;
          } else {
            var contents = target.contents;
            if (length < contents.length) contents.length = length;
            else while (length > contents.length) contents.push(0);
            target.timestamp = Date.now();
            return 0;
          }
        }
      }function _ftruncate(fildes, length) {
        // int ftruncate(int fildes, off_t length);
        // http://pubs.opengroup.org/onlinepubs/000095399/functions/ftruncate.html
        if (FS.streams[fildes] && FS.streams[fildes].isWrite) {
          return _truncate(FS.streams[fildes].path, length);
        } else if (FS.streams[fildes]) {
          ___setErrNo(ERRNO_CODES.EINVAL);
          return -1;
        } else {
          ___setErrNo(ERRNO_CODES.EBADF);
          return -1;
        }
      }
    Module["_memmove"] = _memmove;var _llvm_memmove_p0i8_p0i8_i32=_memmove;
    function _time(ptr) {
        var ret = Math.floor(Date.now()/1000);
        if (ptr) {
          HEAP32[((ptr)>>2)]=ret
        }
        return ret;
      }
    function _abort() {
        Module['abort']();
      }
    function ___errno_location() {
        return ___errno_state;
      }var ___errno=___errno_location;
    function _sysconf(name) {
        // long sysconf(int name);
        // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
        switch(name) {
          case 8: return PAGE_SIZE;
          case 54:
          case 56:
          case 21:
          case 61:
          case 63:
          case 22:
          case 67:
          case 23:
          case 24:
          case 25:
          case 26:
          case 27:
          case 69:
          case 28:
          case 101:
          case 70:
          case 71:
          case 29:
          case 30:
          case 199:
          case 75:
          case 76:
          case 32:
          case 43:
          case 44:
          case 80:
          case 46:
          case 47:
          case 45:
          case 48:
          case 49:
          case 42:
          case 82:
          case 33:
          case 7:
          case 108:
          case 109:
          case 107:
          case 112:
          case 119:
          case 121:
            return 200809;
          case 13:
          case 104:
          case 94:
          case 95:
          case 34:
          case 35:
          case 77:
          case 81:
          case 83:
          case 84:
          case 85:
          case 86:
          case 87:
          case 88:
          case 89:
          case 90:
          case 91:
          case 94:
          case 95:
          case 110:
          case 111:
          case 113:
          case 114:
          case 115:
          case 116:
          case 117:
          case 118:
          case 120:
          case 40:
          case 16:
          case 79:
          case 19:
            return -1;
          case 92:
          case 93:
          case 5:
          case 72:
          case 6:
          case 74:
          case 92:
          case 93:
          case 96:
          case 97:
          case 98:
          case 99:
          case 102:
          case 103:
          case 105:
            return 1;
          case 38:
          case 66:
          case 50:
          case 51:
          case 4:
            return 1024;
          case 15:
          case 64:
          case 41:
            return 32;
          case 55:
          case 37:
          case 17:
            return 2147483647;
          case 18:
          case 1:
            return 47839;
          case 59:
          case 57:
            return 99;
          case 68:
          case 58:
            return 2048;
          case 0: return 2097152;
          case 3: return 65536;
          case 14: return 32768;
          case 73: return 32767;
          case 39: return 16384;
          case 60: return 1000;
          case 106: return 700;
          case 52: return 256;
          case 62: return 255;
          case 2: return 100;
          case 65: return 64;
          case 36: return 20;
          case 100: return 16;
          case 20: return 6;
          case 53: return 4;
          case 10: return 1;
        }
        ___setErrNo(ERRNO_CODES.EINVAL);
        return -1;
      }
    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 ___cxa_allocate_exception(size) {
        return _malloc(size);
      }
    function _llvm_eh_exception() {
        return HEAP32[((_llvm_eh_exception.buf)>>2)];
      }
    function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()
        return !!__ZSt18uncaught_exceptionv.uncaught_exception;
      }
    function ___cxa_is_number_type(type) {
        var isNumber = false;
        try { if (type == __ZTIi) isNumber = true } catch(e){}
        try { if (type == __ZTIj) isNumber = true } catch(e){}
        try { if (type == __ZTIl) isNumber = true } catch(e){}
        try { if (type == __ZTIm) isNumber = true } catch(e){}
        try { if (type == __ZTIx) isNumber = true } catch(e){}
        try { if (type == __ZTIy) isNumber = true } catch(e){}
        try { if (type == __ZTIf) isNumber = true } catch(e){}
        try { if (type == __ZTId) isNumber = true } catch(e){}
        try { if (type == __ZTIe) isNumber = true } catch(e){}
        try { if (type == __ZTIc) isNumber = true } catch(e){}
        try { if (type == __ZTIa) isNumber = true } catch(e){}
        try { if (type == __ZTIh) isNumber = true } catch(e){}
        try { if (type == __ZTIs) isNumber = true } catch(e){}
        try { if (type == __ZTIt) isNumber = true } catch(e){}
        return isNumber;
      }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {
        if (possibility == 0) return false;
        if (possibilityType == 0 || possibilityType == definiteType)
          return true;
        var possibility_type_info;
        if (___cxa_is_number_type(possibilityType)) {
          possibility_type_info = possibilityType;
        } else {
          var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;
          possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];
        }
        switch (possibility_type_info) {
        case 0: // possibility is a pointer
          // See if definite type is a pointer
          var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;
          var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];
          if (definite_type_info == 0) {
            // Also a pointer; compare base types of pointers
            var defPointerBaseAddr = definiteType+8;
            var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];
            var possPointerBaseAddr = possibilityType+8;
            var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];
            return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);
          } else
            return false; // one pointer and one non-pointer
        case 1: // class with no base class
          return false;
        case 2: // class with base class
          var parentTypeAddr = possibilityType + 8;
          var parentType = HEAP32[((parentTypeAddr)>>2)];
          return ___cxa_does_inherit(definiteType, parentType, possibility);
        default:
          return false; // some unencountered type
        }
      }
    function ___resumeException(ptr) {
        if (HEAP32[((_llvm_eh_exception.buf)>>2)] == 0) HEAP32[((_llvm_eh_exception.buf)>>2)]=ptr;
        throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";;
      }function ___cxa_find_matching_catch(thrown, throwntype) {
        if (thrown == -1) thrown = HEAP32[((_llvm_eh_exception.buf)>>2)];
        if (throwntype == -1) throwntype = HEAP32[(((_llvm_eh_exception.buf)+(4))>>2)];
        var typeArray = Array.prototype.slice.call(arguments, 2);
        // If throwntype is a pointer, this means a pointer has been
        // thrown. When a pointer is thrown, actually what's thrown
        // is a pointer to the pointer. We'll dereference it.
        if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {
          var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;
          var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];
          if (throwntypeInfo == 0)
            thrown = HEAP32[((thrown)>>2)];
        }
        // The different catch blocks are denoted by different types.
        // Due to inheritance, those types may not precisely match the
        // type of the thrown object. Find one which matches, and
        // return the type of the catch block which should be called.
        for (var i = 0; i < typeArray.length; i++) {
          if (___cxa_does_inherit(typeArray[i], throwntype, thrown))
            return ((asm["setTempRet0"](typeArray[i]),thrown)|0);
        }
        // Shouldn't happen unless we have bogus data in typeArray
        // or encounter a type for which emscripten doesn't have suitable
        // typeinfo defined. Best-efforts match just in case.
        return ((asm["setTempRet0"](throwntype),thrown)|0);
      }function ___cxa_throw(ptr, type, destructor) {
        if (!___cxa_throw.initialized) {
          try {
            HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug
          } catch(e){}
          try {
            HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug
          } catch(e){}
          try {
            HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug
          } catch(e){}
          ___cxa_throw.initialized = true;
        }
        HEAP32[((_llvm_eh_exception.buf)>>2)]=ptr
        HEAP32[(((_llvm_eh_exception.buf)+(4))>>2)]=type
        HEAP32[(((_llvm_eh_exception.buf)+(8))>>2)]=destructor
        if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
          __ZSt18uncaught_exceptionv.uncaught_exception = 1;
        } else {
          __ZSt18uncaught_exceptionv.uncaught_exception++;
        }
        throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";;
      }
    function ___cxa_call_unexpected(exception) {
        Module.printErr('Unexpected exception thrown, this is not properly supported - aborting');
        ABORT = true;
        throw exception;
      }
    function ___cxa_begin_catch(ptr) {
        __ZSt18uncaught_exceptionv.uncaught_exception--;
        return ptr;
      }
    function ___cxa_free_exception(ptr) {
        try {
          return _free(ptr);
        } catch(e) { // XXX FIXME
        }
      }function ___cxa_end_catch() {
        if (___cxa_end_catch.rethrown) {
          ___cxa_end_catch.rethrown = false;
          return;
        }
        // Clear state flag.
        asm['setThrew'](0);
        // Clear type.
        HEAP32[(((_llvm_eh_exception.buf)+(4))>>2)]=0
        // Call destructor if one is registered then clear it.
        var ptr = HEAP32[((_llvm_eh_exception.buf)>>2)];
        var destructor = HEAP32[(((_llvm_eh_exception.buf)+(8))>>2)];
        if (destructor) {
          Runtime.dynCall('vi', destructor, [ptr]);
          HEAP32[(((_llvm_eh_exception.buf)+(8))>>2)]=0
        }
        // Free ptr if it isn't null.
        if (ptr) {
          ___cxa_free_exception(ptr);
          HEAP32[((_llvm_eh_exception.buf)>>2)]=0
        }
      }
    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];
          for (var j = 0; j < line.length; j++) {
            HEAP8[(((poolPtr)+(j))|0)]=line.charCodeAt(j);
          }
          HEAP8[(((poolPtr)+(j))|0)]=0;
          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;
      }
    function _strchr(ptr, chr) {
        ptr--;
        do {
          ptr++;
          var val = HEAP8[(ptr)];
          if (val == chr) return ptr;
        } while (val);
        return 0;
      }
    var _llvm_va_start=undefined;
    function _llvm_va_end() {}
    function _vfprintf(s, f, va_arg) {
        return _fprintf(s, f, HEAP32[((va_arg)>>2)]);
      }
    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:"No message of desired type",36:"Identifier removed",37:"Channel number out of range",38:"Level 2 not synchronized",39:"Level 3 halted",40:"Level 3 reset",41:"Link number out of range",42:"Protocol driver not attached",43:"No CSI structure available",44:"Level 2 halted",45:"Deadlock condition",46:"No record locks available",50:"Invalid exchange",51:"Invalid request descriptor",52:"Exchange full",53:"No anode",54:"Invalid request code",55:"Invalid slot",56:"File locking deadlock error",57:"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",74:"Multihop attempted",75:"Inode is remote (not really error)",76:"Cross mount point (not really error)",77:"Trying to read unreadable message",79:"Inappropriate file type or format",80:"Given log. name not unique",81:"f.d. invalid for this operation",82:"Remote address changed",83:"Can\t access a needed shared lib",84:"Accessing a corrupted shared lib",85:".lib section in a.out corrupted",86:"Attempting to link in too many libs",87:"Attempting to exec a shared library",88:"Function not implemented",89:"No more files",90:"Directory not empty",91:"File or path name too long",92:"Too many symbolic links",95:"Operation not supported on transport endpoint",96:"Protocol family not supported",104:"Connection reset by peer",105:"No buffer space available",106:"Address family not supported by protocol family",107:"Protocol wrong type for socket",108:"Socket operation on non-socket",109:"Protocol not available",110:"Can't send after socket shutdown",111:"Connection refused",112:"Address already in use",113:"Connection aborted",114:"Network is unreachable",115:"Network interface is not configured",116:"Connection timed out",117:"Host is down",118:"Host is unreachable",119:"Connection already in progress",120:"Socket already connected",121:"Destination address required",122:"Message too long",123:"Unknown protocol",124:"Socket type not supported",125:"Address not available",126:"ENETRESET",127:"Socket is already connected",128:"Socket is not connected",129:"TOOMANYREFS",130:"EPROCLIM",131:"EUSERS",132:"EDQUOT",133:"ESTALE",134:"Not supported",135:"No medium (in tape drive)",136:"No such host or network path",137:"Filename exists with different case",138:"EILSEQ",139:"Value too large for defined data type",140:"Operation canceled",141:"State not recoverable",142:"Previous owner died",143:"Streams pipe error"};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];
            for (var i = 0; i < msg.length; i++) {
              HEAP8[(((strerrbuf)+(i))|0)]=msg.charCodeAt(i)
            }
            HEAP8[(((strerrbuf)+(i))|0)]=0
            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;
      }
    function _isspace(chr) {
        switch(chr) {
          case 32:
          case 9:
          case 10:
          case 11:
          case 12:
          case 13:
            return true;
          default:
            return false;
        };
      }
    var Browser={mainLoop:{scheduler:null,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) : console.log("warning: cannot create object URLs");
          // 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(name) {
            return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
          };
          imagePlugin['handle'] = function(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() {
              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(event) {
              console.log('Image ' + url + ' could not be decoded');
              if (onerror) onerror();
            };
            img.src = url;
          };
          Module['preloadPlugins'].push(imagePlugin);
          var audioPlugin = {};
          audioPlugin['canHandle'] = function(name) {
            return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
          };
          audioPlugin['handle'] = function(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(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'];
          canvas.requestPointerLock = canvas['requestPointerLock'] ||
                                      canvas['mozRequestPointerLock'] ||
                                      canvas['webkitRequestPointerLock'];
          canvas.exitPointerLock = document['exitPointerLock'] ||
                                   document['mozExitPointerLock'] ||
                                   document['webkitExitPointerLock'] ||
                                   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.addEventListener('pointerlockchange', pointerLockChange, false);
          document.addEventListener('mozpointerlockchange', pointerLockChange, false);
          document.addEventListener('webkitpointerlockchange', 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) {
          var ctx;
          try {
            if (useWebGL) {
              ctx = canvas.getContext('experimental-webgl', {
                alpha: false
              });
            } else {
              ctx = canvas.getContext('2d');
            }
            if (!ctx) throw ':(';
          } catch (e) {
            Module.print('Could not create canvas - ' + 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) {
            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;
            if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
                 document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
                 document['fullScreenElement'] || document['fullscreenElement']) === canvas) {
              canvas.cancelFullScreen = document['cancelFullScreen'] ||
                                        document['mozCancelFullScreen'] ||
                                        document['webkitCancelFullScreen'];
              canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
              if (Browser.lockPointer) canvas.requestPointerLock();
              Browser.isFullScreen = true;
              if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
            } else if (Browser.resizeCanvas){
              Browser.setWindowedCanvasSize();
            }
            if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
          }
          if (!Browser.fullScreenHandlersInstalled) {
            Browser.fullScreenHandlersInstalled = true;
            document.addEventListener('fullscreenchange', fullScreenChange, false);
            document.addEventListener('mozfullscreenchange', fullScreenChange, false);
            document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
          }
          canvas.requestFullScreen = canvas['requestFullScreen'] ||
                                     canvas['mozRequestFullScreen'] ||
                                     (canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
          canvas.requestFullScreen();
        },requestAnimationFrame:function (func) {
          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;
        },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 = event.pageX - (window.scrollX + rect.left);
            var y = event.pageY - (window.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() {
            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'];
          canvas.width = width;
          canvas.height = height;
          if (!noUpdates) Browser.updateResizeListeners();
        },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
          var canvas = Module['canvas'];
          this.windowedWidth = canvas.width;
          this.windowedHeight = canvas.height;
          canvas.width = screen.width;
          canvas.height = screen.height;
          // 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 () {
          var canvas = Module['canvas'];
          canvas.width = this.windowedWidth;
          canvas.height = this.windowedHeight;
          // 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();
        }};
  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;
  _fputc.ret = allocate([0], "i8", ALLOC_STATIC);
  _llvm_eh_exception.buf = allocate(12, "void*", ALLOC_STATIC);
  ___buildEnvironment(ENV);
  Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
    Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };
    Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };
    Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };
    Module["getUserMedia"] = function() { Browser.getUserMedia() }
  STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
  staticSealed = true; // seal the static portion of memory
  STACK_MAX = STACK_BASE + 131072;
  DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
  assert(DYNAMIC_BASE < TOTAL_MEMORY); // Stack must fit in TOTAL_MEMORY; allocations from here on may enlarge TOTAL_MEMORY
   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_viiiii(index,a1,a2,a3,a4,a5) {
    try {
      Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_vi(index,a1) {
    try {
      Module["dynCall_vi"](index,a1);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_vii(index,a1,a2) {
    try {
      Module["dynCall_vii"](index,a1,a2);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) {
    try {
      return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6);
    } 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_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_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_viii(index,a1,a2,a3) {
    try {
      Module["dynCall_viii"](index,a1,a2,a3);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_v(index) {
    try {
      Module["dynCall_v"](index);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
    try {
      Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_iii(index,a1,a2) {
    try {
      return Module["dynCall_iii"](index,a1,a2);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_iiiiii(index,a1,a2,a3,a4,a5) {
    try {
      return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function invoke_viiii(index,a1,a2,a3,a4) {
    try {
      Module["dynCall_viiii"](index,a1,a2,a3,a4);
    } catch(e) {
      if (typeof e !== 'number' && e !== 'longjmp') throw e;
      asm["setThrew"](1, 0);
    }
  }
  function asmPrintInt(x, y) {
    Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
  }
  function asmPrintFloat(x, y) {
    Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
  }
  // EMSCRIPTEN_START_ASM
  var asm = (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 __ZTIy=env.__ZTIy|0;
    var __ZTIx=env.__ZTIx|0;
    var __ZTIt=env.__ZTIt|0;
    var __ZTIs=env.__ZTIs|0;
    var __ZTIm=env.__ZTIm|0;
    var __ZTIl=env.__ZTIl|0;
    var __ZTIi=env.__ZTIi|0;
    var __ZTIh=env.__ZTIh|0;
    var __ZTIj=env.__ZTIj|0;
    var __ZTIe=env.__ZTIe|0;
    var __ZTId=env.__ZTId|0;
    var __ZTVN10__cxxabiv117__class_type_infoE=env.__ZTVN10__cxxabiv117__class_type_infoE|0;
    var __ZTIf=env.__ZTIf|0;
    var __ZTIa=env.__ZTIa|0;
    var __ZTIc=env.__ZTIc|0;
    var __ZTVN10__cxxabiv120__si_class_type_infoE=env.__ZTVN10__cxxabiv120__si_class_type_infoE|0;
    var _stderr=env._stderr|0;
    var ___progname=env.___progname|0;
    var __ZTVN10__cxxabiv119__pointer_type_infoE=env.__ZTVN10__cxxabiv119__pointer_type_infoE|0;
    var NaN=+env.NaN;
    var Infinity=+env.Infinity;
    var __THREW__ = 0;
    var threwValue = 0;
    var setjmpId = 0;
    var undef = 0;
    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_viiiii=env.invoke_viiiii;
    var invoke_vi=env.invoke_vi;
    var invoke_vii=env.invoke_vii;
    var invoke_iiiiiii=env.invoke_iiiiiii;
    var invoke_iiiii=env.invoke_iiiii;
    var invoke_ii=env.invoke_ii;
    var invoke_iiii=env.invoke_iiii;
    var invoke_viii=env.invoke_viii;
    var invoke_v=env.invoke_v;
    var invoke_viiiiii=env.invoke_viiiiii;
    var invoke_iii=env.invoke_iii;
    var invoke_iiiiii=env.invoke_iiiiii;
    var invoke_viiii=env.invoke_viiii;
    var _strncmp=env._strncmp;
    var _lseek=env._lseek;
    var ___cxa_call_unexpected=env.___cxa_call_unexpected;
    var _snprintf=env._snprintf;
    var ___cxa_free_exception=env.___cxa_free_exception;
    var ___cxa_throw=env.___cxa_throw;
    var _fread=env._fread;
    var _fclose=env._fclose;
    var _strerror=env._strerror;
    var ___cxa_pure_virtual=env.___cxa_pure_virtual;
    var _fprintf=env._fprintf;
    var _sqrt=env._sqrt;
    var _llvm_va_end=env._llvm_va_end;
    var _pread=env._pread;
    var _close=env._close;
    var _feof=env._feof;
    var _fopen=env._fopen;
    var _open=env._open;
    var _strchr=env._strchr;
    var _fputc=env._fputc;
    var ___buildEnvironment=env.___buildEnvironment;
    var _log=env._log;
    var _puts=env._puts;
    var _abort=env._abort;
    var ___setErrNo=env.___setErrNo;
    var _recv=env._recv;
    var _fseek=env._fseek;
    var _qsort2=env._qsort2;
    var _qsort=env._qsort;
    var _send=env._send;
    var _write=env._write;
    var _fputs=env._fputs;
    var _ftell=env._ftell;
    var _llvm_umul_with_overflow_i32=env._llvm_umul_with_overflow_i32;
    var _exit=env._exit;
    var ___cxa_find_matching_catch=env.___cxa_find_matching_catch;
    var _strdup=env._strdup;
    var ___cxa_allocate_exception=env.___cxa_allocate_exception;
    var _ferror=env._ferror;
    var _printf=env._printf;
    var _sysconf=env._sysconf;
    var _sbrk=env._sbrk;
    var _truncate=env._truncate;
    var _read=env._read;
    var ___cxa_is_number_type=env.___cxa_is_number_type;
    var __reallyNegative=env.__reallyNegative;
    var _time=env._time;
    var __formatString=env.__formatString;
    var ___cxa_does_inherit=env.___cxa_does_inherit;
    var _getenv=env._getenv;
    var __ZSt9terminatev=env.__ZSt9terminatev;
    var _gettimeofday=env._gettimeofday;
    var _llvm_eh_exception=env._llvm_eh_exception;
    var _vfprintf=env._vfprintf;
    var ___cxa_begin_catch=env.___cxa_begin_catch;
    var _unlink=env._unlink;
    var ___assert_func=env.___assert_func;
    var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv;
    var _pwrite=env._pwrite;
    var _putchar=env._putchar;
    var _fabs=env._fabs;
    var _fsync=env._fsync;
    var _strerror_r=env._strerror_r;
    var ___errno_location=env.___errno_location;
    var ___gxx_personality_v0=env.___gxx_personality_v0;
    var _isspace=env._isspace;
    var _fdopen=env._fdopen;
    var _bsearch=env._bsearch;
    var _fwrite=env._fwrite;
    var _ftruncate=env._ftruncate;
    var __exit=env.__exit;
    var ___resumeException=env.___resumeException;
    var _strcmp=env._strcmp;
    var ___cxa_end_catch=env.___cxa_end_catch;
  // EMSCRIPTEN_START_FUNCS
  function stackAlloc(size) {
   size = size | 0;
   var ret = 0;
   ret = STACKTOP;
   STACKTOP = STACKTOP + size | 0;
   STACKTOP = STACKTOP + 7 >> 3 << 3;
   return ret | 0;
  }
  function stackSave() {
   return STACKTOP | 0;
  }
  function stackRestore(top) {
   top = top | 0;
   STACKTOP = top;
  }
  function setThrew(threw, value) {
   threw = threw | 0;
   value = value | 0;
   if ((__THREW__ | 0) == 0) {
    __THREW__ = threw;
    threwValue = value;
   }
  }
  function copyTempFloat(ptr) {
   ptr = ptr | 0;
   HEAP8[tempDoublePtr] = HEAP8[ptr];
   HEAP8[tempDoublePtr + 1 | 0] = HEAP8[ptr + 1 | 0];
   HEAP8[tempDoublePtr + 2 | 0] = HEAP8[ptr + 2 | 0];
   HEAP8[tempDoublePtr + 3 | 0] = HEAP8[ptr + 3 | 0];
  }
  function copyTempDouble(ptr) {
   ptr = ptr | 0;
   HEAP8[tempDoublePtr] = HEAP8[ptr];
   HEAP8[tempDoublePtr + 1 | 0] = HEAP8[ptr + 1 | 0];
   HEAP8[tempDoublePtr + 2 | 0] = HEAP8[ptr + 2 | 0];
   HEAP8[tempDoublePtr + 3 | 0] = HEAP8[ptr + 3 | 0];
   HEAP8[tempDoublePtr + 4 | 0] = HEAP8[ptr + 4 | 0];
   HEAP8[tempDoublePtr + 5 | 0] = HEAP8[ptr + 5 | 0];
   HEAP8[tempDoublePtr + 6 | 0] = HEAP8[ptr + 6 | 0];
   HEAP8[tempDoublePtr + 7 | 0] = HEAP8[ptr + 7 | 0];
  }
  function setTempRet0(value) {
   value = value | 0;
   tempRet0 = value;
  }
  function setTempRet1(value) {
   value = value | 0;
   tempRet1 = value;
  }
  function setTempRet2(value) {
   value = value | 0;
   tempRet2 = value;
  }
  function setTempRet3(value) {
   value = value | 0;
   tempRet3 = value;
  }
  function setTempRet4(value) {
   value = value | 0;
   tempRet4 = value;
  }
  function setTempRet5(value) {
   value = value | 0;
   tempRet5 = value;
  }
  function setTempRet6(value) {
   value = value | 0;
   tempRet6 = value;
  }
  function setTempRet7(value) {
   value = value | 0;
   tempRet7 = value;
  }
  function setTempRet8(value) {
   value = value | 0;
   tempRet8 = value;
  }
  function setTempRet9(value) {
   value = value | 0;
   tempRet9 = value;
  }
  function runPostSets() {
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 8 >> 2] = 88;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 12 >> 2] = 108;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 16 >> 2] = 94;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 20 >> 2] = 22;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 24 >> 2] = 10;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 28 >> 2] = 6;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 32 >> 2] = 2;
   HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE + 36 >> 2] = 4;
   HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE + 8 >> 2] = 88;
   HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE + 12 >> 2] = 96;
   HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE + 16 >> 2] = 94;
   HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE + 20 >> 2] = 22;
   HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE + 24 >> 2] = 12;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 8 >> 2] = 88;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 12 >> 2] = 86;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 16 >> 2] = 94;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 20 >> 2] = 22;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 24 >> 2] = 10;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 28 >> 2] = 2;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 32 >> 2] = 6;
   HEAP32[__ZTVN10__cxxabiv117__class_type_infoE + 36 >> 2] = 2;
   HEAP32[__ZTIy >> 2] = 8504;
   HEAP32[__ZTIy + 4 >> 2] = 8784;
   HEAP32[__ZTIx >> 2] = 8504;
   HEAP32[__ZTIx + 4 >> 2] = 8792;
   HEAP32[__ZTIt >> 2] = 8504;
   HEAP32[__ZTIt + 4 >> 2] = 8816;
   HEAP32[__ZTIs >> 2] = 8504;
   HEAP32[__ZTIs + 4 >> 2] = 8824;
   HEAP32[__ZTIm >> 2] = 8504;
   HEAP32[__ZTIm + 4 >> 2] = 8832;
   HEAP32[__ZTIl >> 2] = 8504;
   HEAP32[__ZTIl + 4 >> 2] = 8840;
   HEAP32[__ZTIj >> 2] = 8504;
   HEAP32[__ZTIj + 4 >> 2] = 8848;
   HEAP32[__ZTIi >> 2] = 8504;
   HEAP32[__ZTIi + 4 >> 2] = 8856;
   HEAP32[__ZTIh >> 2] = 8504;
   HEAP32[__ZTIh + 4 >> 2] = 8864;
   HEAP32[__ZTIf >> 2] = 8504;
   HEAP32[__ZTIf + 4 >> 2] = 8872;
   HEAP32[__ZTIe >> 2] = 8504;
   HEAP32[__ZTIe + 4 >> 2] = 8880;
   HEAP32[__ZTId >> 2] = 8504;
   HEAP32[__ZTId + 4 >> 2] = 8888;
   HEAP32[__ZTIc >> 2] = 8504;
   HEAP32[__ZTIc + 4 >> 2] = 8896;
   HEAP32[__ZTIa >> 2] = 8504;
   HEAP32[__ZTIa + 4 >> 2] = 8912;
   HEAP32[2482] = __ZTVN10__cxxabiv117__class_type_infoE + 8;
   HEAP32[2484] = __ZTVN10__cxxabiv117__class_type_infoE + 8;
   HEAP32[2486] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2490] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2494] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2498] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2502] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2505] = __ZTIy;
   HEAP32[2506] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2509] = __ZTIx;
   HEAP32[2510] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2514] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2518] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2521] = __ZTIt;
   HEAP32[2522] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2525] = __ZTIs;
   HEAP32[2526] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2529] = __ZTIm;
   HEAP32[2530] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2533] = __ZTIl;
   HEAP32[2534] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2537] = __ZTIj;
   HEAP32[2538] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2541] = __ZTIi;
   HEAP32[2542] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2545] = __ZTIh;
   HEAP32[2546] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2549] = __ZTIf;
   HEAP32[2550] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2553] = __ZTIe;
   HEAP32[2554] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2557] = __ZTId;
   HEAP32[2558] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2561] = __ZTIc;
   HEAP32[2562] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2566] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2569] = __ZTIa;
   HEAP32[2570] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2573] = __ZTIy;
   HEAP32[2574] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2577] = __ZTIx;
   HEAP32[2578] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2582] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2586] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2589] = __ZTIt;
   HEAP32[2590] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2593] = __ZTIs;
   HEAP32[2594] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2597] = __ZTIm;
   HEAP32[2598] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2601] = __ZTIl;
   HEAP32[2602] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2605] = __ZTIj;
   HEAP32[2606] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2609] = __ZTIi;
   HEAP32[2610] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2613] = __ZTIh;
   HEAP32[2614] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2617] = __ZTIf;
   HEAP32[2618] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2621] = __ZTIe;
   HEAP32[2622] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2625] = __ZTId;
   HEAP32[2626] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2629] = __ZTIc;
   HEAP32[2630] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2634] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2637] = __ZTIa;
   HEAP32[2638] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2642] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2646] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2650] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2654] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2658] = __ZTVN10__cxxabiv119__pointer_type_infoE + 8;
   HEAP32[2662] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2672] = __ZTVN10__cxxabiv117__class_type_infoE + 8;
   HEAP32[2674] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2678] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2682] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2686] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2690] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2694] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2698] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2702] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2706] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2710] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
   HEAP32[2714] = __ZTVN10__cxxabiv120__si_class_type_infoE + 8;
  }
  function __ZN10ime_pinyin14compare_char16EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $retval_0 = 0;
   $1 = HEAP16[$p1 >> 1] | 0;
   $3 = HEAP16[$p2 >> 1] | 0;
   if (($1 & 65535) < ($3 & 65535)) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = ($1 & 65535) > ($3 & 65535) | 0;
   return $retval_0 | 0;
  }
  function _im_get_spl_start_at($id) {
   $id = $id | 0;
   return HEAP16[(HEAP32[2818] | 0) + ($id << 1) >> 1] | 0;
  }
  function _im_get_predict_at($pos) {
   $pos = $pos | 0;
   var $retval_0 = 0;
   if ($pos >>> 0 > 499) {
    $retval_0 = 0;
   } else {
    $retval_0 = 11280 + ($pos * 48 | 0) | 0;
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin22cmp_scis_hz_splid_freqEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $5 = 0, $bf_clear = 0, $7 = 0, $bf_clear12 = 0, $8 = 0, $9 = 0, $10 = 0.0, $11 = 0.0, $retval_0 = 0;
   $1 = HEAP16[$p1 + 4 >> 1] | 0;
   $3 = HEAP16[$p2 + 4 >> 1] | 0;
   do {
    if (($1 & 65535) < ($3 & 65535)) {
     $retval_0 = -1;
    } else {
     if (($1 & 65535) > ($3 & 65535)) {
      $retval_0 = 1;
      break;
     }
     $5 = HEAP16[$p1 + 6 >> 1] | 0;
     $bf_clear = $5 & 31;
     $7 = HEAP16[$p2 + 6 >> 1] | 0;
     $bf_clear12 = $7 & 31;
     if (($bf_clear & 65535) < ($bf_clear12 & 65535)) {
      $retval_0 = -1;
      break;
     }
     if (($bf_clear & 65535) > ($bf_clear12 & 65535)) {
      $retval_0 = 1;
      break;
     }
     $8 = ($5 & 65535) >>> 5;
     $9 = ($7 & 65535) >>> 5;
     if (($8 & 65535) < ($9 & 65535)) {
      $retval_0 = -1;
      break;
     }
     if (($8 & 65535) > ($9 & 65535)) {
      $retval_0 = 1;
      break;
     }
     $10 = +HEAPF32[$p1 >> 2];
     $11 = +HEAPF32[$p2 >> 2];
     if ($10 > $11) {
      $retval_0 = -1;
      break;
     }
     $retval_0 = $10 < $11 | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin17cmp_scis_hz_splidEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $5 = 0, $bf_clear = 0, $7 = 0, $bf_clear12 = 0, $8 = 0, $9 = 0, $retval_0 = 0;
   $1 = HEAP16[$p1 + 4 >> 1] | 0;
   $3 = HEAP16[$p2 + 4 >> 1] | 0;
   do {
    if (($1 & 65535) < ($3 & 65535)) {
     $retval_0 = -1;
    } else {
     if (($1 & 65535) > ($3 & 65535)) {
      $retval_0 = 1;
      break;
     }
     $5 = HEAP16[$p1 + 6 >> 1] | 0;
     $bf_clear = $5 & 31;
     $7 = HEAP16[$p2 + 6 >> 1] | 0;
     $bf_clear12 = $7 & 31;
     if (($bf_clear & 65535) < ($bf_clear12 & 65535)) {
      $retval_0 = -1;
      break;
     }
     if (($bf_clear & 65535) > ($bf_clear12 & 65535)) {
      $retval_0 = 1;
      break;
     }
     $8 = ($5 & 65535) >>> 5;
     $9 = ($7 & 65535) >>> 5;
     if (($8 & 65535) < ($9 & 65535)) {
      $retval_0 = -1;
      break;
     }
     $retval_0 = ($8 & 65535) > ($9 & 65535) | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function _im_open_decoder($fn_sys_dict, $fn_usr_dict) {
   $fn_sys_dict = $fn_sys_dict | 0;
   $fn_usr_dict = $fn_usr_dict | 0;
   var $0 = 0, $call = 0, $6 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) != 0) {
    __ZN10ime_pinyin12MatrixSearchD2Ev($0);
    __ZdlPv($0 | 0);
   }
   $call = __Znwj(12504) | 0;
   $6 = $call;
   __ZN10ime_pinyin12MatrixSearchC2Ev($6);
   HEAP32[10830] = $6;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch4initEPKcS2_($6, $fn_sys_dict, $fn_usr_dict) | 0;
   return $retval_0 | 0;
  }
  function _im_open_decoder_fd($sys_fd, $start_offset, $length, $fn_usr_dict) {
   $sys_fd = $sys_fd | 0;
   $start_offset = $start_offset | 0;
   $length = $length | 0;
   $fn_usr_dict = $fn_usr_dict | 0;
   var $0 = 0, $call = 0, $6 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) != 0) {
    __ZN10ime_pinyin12MatrixSearchD2Ev($0);
    __ZdlPv($0 | 0);
   }
   $call = __Znwj(12504) | 0;
   $6 = $call;
   __ZN10ime_pinyin12MatrixSearchC2Ev($6);
   HEAP32[10830] = $6;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch7init_fdEillPKc($6, $sys_fd, $start_offset, $length, $fn_usr_dict) | 0;
   return $retval_0 | 0;
  }
  function _im_close_decoder() {
   var $0 = 0, $1 = 0;
   $0 = HEAP32[10830] | 0;
   do {
    if (($0 | 0) != 0) {
     __ZN10ime_pinyin12MatrixSearch5closeEv($0);
     $1 = HEAP32[10830] | 0;
     if (($1 | 0) == 0) {
      break;
     }
     __ZN10ime_pinyin12MatrixSearchD2Ev($1);
     __ZdlPv($1 | 0);
    }
   } while (0);
   HEAP32[10830] = 0;
   return;
  }
  function _im_set_max_lens($max_sps_len, $max_hzs_len) {
   $max_sps_len = $max_sps_len | 0;
   $max_hzs_len = $max_hzs_len | 0;
   var $0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   __ZN10ime_pinyin12MatrixSearch12set_max_lensEjj($0, $max_sps_len, $max_hzs_len);
   return;
  }
  function _im_flush_cache() {
   var $0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   __ZN10ime_pinyin12MatrixSearch11flush_cacheEv($0);
   return;
  }
  function _im_search($pybuf, $pylen) {
   $pybuf = $pybuf | 0;
   $pylen = $pylen | 0;
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin12MatrixSearch6searchEPKcj($0, $pybuf, $pylen) | 0;
   $retval_0 = __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv(HEAP32[10830] | 0) | 0;
   return $retval_0 | 0;
  }
  function _im_delsearch($pos, $is_pos_in_splid, $clear_fixed_this_step) {
   $pos = $pos | 0;
   $is_pos_in_splid = $is_pos_in_splid | 0;
   $clear_fixed_this_step = $clear_fixed_this_step | 0;
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin12MatrixSearch9delsearchEjbb($0, $pos, $is_pos_in_splid, $clear_fixed_this_step) | 0;
   $retval_0 = __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv(HEAP32[10830] | 0) | 0;
   return $retval_0 | 0;
  }
  function _im_reset_search() {
   var $0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   __ZN10ime_pinyin12MatrixSearch12reset_searchEv($0) | 0;
   return;
  }
  function _im_get_sps_str($decoded_len) {
   $decoded_len = $decoded_len | 0;
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch9get_pystrEPj($0, $decoded_len) | 0;
   return $retval_0 | 0;
  }
  function _im_get_candidate($cand_id, $cand_str, $max_len) {
   $cand_id = $cand_id | 0;
   $cand_str = $cand_str | 0;
   $max_len = $max_len | 0;
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch13get_candidateEjPtj($0, $cand_id, $cand_str, $max_len) | 0;
   return $retval_0 | 0;
  }
  function _toUTF8($src, $length) {
   $src = $src | 0;
   $length = $length | 0;
   var $utf16Start = 0, $utf8Start = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $utf16Start = sp | 0;
   $utf8Start = sp + 8 | 0;
   HEAP32[$utf16Start >> 2] = $src;
   HEAP32[$utf8Start >> 2] = 43328;
   _ConvertUTF16toUTF8($utf16Start, $src + ($length << 1) | 0, $utf8Start, 44352, 0) | 0;
   STACKTOP = sp;
   return 43328 | 0;
  }
  function _toUTF16($src, $length) {
   $src = $src | 0;
   $length = $length | 0;
   var $utf8Start = 0, $utf16Start = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $utf8Start = sp | 0;
   $utf16Start = sp + 8 | 0;
   HEAP32[$utf8Start >> 2] = $src;
   HEAP32[$utf16Start >> 2] = 44352;
   _ConvertUTF8toUTF16($utf8Start, $src + $length | 0, $utf16Start, 46400, 0) | 0;
   STACKTOP = sp;
   return 44352 | 0;
  }
  function _im_get_candidate_char($cand_id) {
   $cand_id = $cand_id | 0;
   var $0 = 0, $arraydecay = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 128 | 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $arraydecay = sp | 0;
   __ZN10ime_pinyin12MatrixSearch13get_candidateEjPtj($0, $cand_id, $arraydecay, 64) | 0;
   _toUTF8($arraydecay, 64) | 0;
   $retval_0 = 43328;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function _im_get_spl_start() {
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch13get_spl_startERPKt($0, 11272) | 0;
   return $retval_0 | 0;
  }
  function _im_choose($choice_id) {
   $choice_id = $choice_id | 0;
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch6chooseEj($0, $choice_id) | 0;
   return $retval_0 | 0;
  }
  function _im_cancel_last_choice() {
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch18cancel_last_choiceEv($0) | 0;
   return $retval_0 | 0;
  }
  function _im_get_fixed_len() {
   var $0 = 0, $retval_0 = 0;
   $0 = HEAP32[10830] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch12get_fixedlenEv($0) | 0;
   return $retval_0 | 0;
  }
  function _im_get_predicts_utf8($buf, $pre_buf) {
   $buf = $buf | 0;
   $pre_buf = $pre_buf | 0;
   var $call5 = 0, $idx_09 = 0, $arraydecay = 0, $inc = 0, $retval_0 = 0;
   if (($buf | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   _toUTF16($buf, 64) | 0;
   _utf16_strlen(44352) | 0;
   $call5 = __ZN10ime_pinyin12MatrixSearch12get_predictsEPKtPA8_tj(HEAP32[10830] | 0, 44352, 35280, 500) | 0;
   HEAP32[$pre_buf >> 2] = 11280;
   $idx_09 = 0;
   while (1) {
    $arraydecay = (HEAP32[$pre_buf >> 2] | 0) + ($idx_09 * 48 | 0) | 0;
    _toUTF8(35280 + ($idx_09 << 4) | 0, 8) | 0;
    _strcpy($arraydecay | 0, 43328 | 0) | 0;
    $inc = $idx_09 + 1 | 0;
    if ($inc >>> 0 < 500) {
     $idx_09 = $inc;
    } else {
     $retval_0 = $call5;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function _im_get_predicts($his_buf, $pre_buf) {
   $his_buf = $his_buf | 0;
   $pre_buf = $pre_buf | 0;
   var $retval_0 = 0;
   if (($his_buf | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   _utf16_strlen($his_buf) | 0;
   HEAP32[$pre_buf >> 2] = 35280;
   $retval_0 = __ZN10ime_pinyin12MatrixSearch12get_predictsEPKtPA8_tj(HEAP32[10830] | 0, $his_buf, 35280, 500) | 0;
   return $retval_0 | 0;
  }
  function _im_enable_shm_as_szm($enable) {
   $enable = $enable | 0;
   __ZN10ime_pinyin12SpellingTrie14szm_enable_shmEb(__ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0, $enable);
   return;
  }
  function _im_enable_ym_as_szm($enable) {
   $enable = $enable | 0;
   __ZN10ime_pinyin12SpellingTrie13szm_enable_ymEb(__ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0, $enable);
   return;
  }
  function __ZN10ime_pinyin19cmp_lemma_entry_hzsEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $arraydecay = 0, $call = 0, $arraydecay2 = 0, $call3 = 0, $retval_0 = 0;
   $arraydecay = $p1 + 8 | 0;
   $call = _utf16_strlen($arraydecay) | 0;
   $arraydecay2 = $p2 + 8 | 0;
   $call3 = _utf16_strlen($arraydecay2) | 0;
   if ($call >>> 0 < $call3 >>> 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   if ($call >>> 0 > $call3 >>> 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $retval_0 = _utf16_strcmp($arraydecay, $arraydecay2) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin10compare_pyEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $call = 0, $retval_0 = 0;
   $call = _utf16_strcmp($p1 + 42 | 0, $p2 + 42 | 0) | 0;
   if (($call | 0) != 0) {
    $retval_0 = $call;
    return $retval_0 | 0;
   }
   $retval_0 = ~~+HEAPF32[$p2 + 120 >> 2] - ~~+HEAPF32[$p1 + 120 >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin22cmp_lemma_entry_hzspysEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $arraydecay = 0, $call = 0, $arraydecay2 = 0, $call3 = 0, $call11 = 0, $retval_0 = 0;
   $arraydecay = $p1 + 8 | 0;
   $call = _utf16_strlen($arraydecay) | 0;
   $arraydecay2 = $p2 + 8 | 0;
   $call3 = _utf16_strlen($arraydecay2) | 0;
   if ($call >>> 0 < $call3 >>> 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   if ($call >>> 0 > $call3 >>> 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $call11 = _utf16_strcmp($arraydecay, $arraydecay2) | 0;
   if (($call11 | 0) != 0) {
    $retval_0 = $call11;
    return $retval_0 | 0;
   }
   $retval_0 = _utf16_strcmp($p1 + 42 | 0, $p2 + 42 | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin14compare_splid2EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strcmp($p1 + 42 | 0, $p2 + 42 | 0) | 0;
  }
  function __ZN10ime_pinyin11DictBuilderC2Ev($this) {
   $this = $this | 0;
   _memset($this | 0, 0, 60);
   return;
  }
  function __ZN10ime_pinyin11DictBuilderD2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
   return;
  }
  function __ZN10ime_pinyin11DictBuilder13free_resourceEv($this) {
   $this = $this | 0;
   var $lemma_arr_ = 0, $0 = 0, $scis_ = 0, $2 = 0, $lma_nodes_le0_ = 0, $4 = 0, $6 = 0, $8 = 0, $spl_table_ = 0, $10 = 0, $spl_parser_ = 0, $14 = 0;
   $lemma_arr_ = $this | 0;
   $0 = HEAP32[$lemma_arr_ >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0);
   }
   $scis_ = $this + 8 | 0;
   $2 = HEAP32[$scis_ >> 2] | 0;
   if (($2 | 0) != 0) {
    __ZdaPv($2);
   }
   $lma_nodes_le0_ = $this + 16 | 0;
   $4 = HEAP32[$lma_nodes_le0_ >> 2] | 0;
   if (($4 | 0) != 0) {
    __ZdaPv($4);
   }
   $6 = HEAP32[$this + 20 >> 2] | 0;
   if (($6 | 0) != 0) {
    __ZdaPv($6);
   }
   $8 = HEAP32[$this + 32 >> 2] | 0;
   if (($8 | 0) != 0) {
    __ZdaPv($8);
   }
   $spl_table_ = $this + 52 | 0;
   $10 = HEAP32[$spl_table_ >> 2] | 0;
   if (($10 | 0) != 0) {
    __ZN10ime_pinyin13SpellingTableD2Ev($10);
    __ZdlPv($10 | 0);
   }
   $spl_parser_ = $this + 56 | 0;
   $14 = HEAP32[$spl_parser_ >> 2] | 0;
   if (($14 | 0) != 0) {
    __ZdlPv($14);
   }
   HEAP32[$lemma_arr_ >> 2] = 0;
   HEAP32[$scis_ >> 2] = 0;
   HEAP32[$spl_table_ >> 2] = 0;
   HEAP32[$spl_parser_ >> 2] = 0;
   HEAP32[$this + 4 >> 2] = 0;
   _memset($lma_nodes_le0_ | 0, 0, 28);
   return;
  }
  function __ZN10ime_pinyin11DictBuilder14alloc_resourceEj($this, $lma_num) {
   $this = $this | 0;
   $lma_num = $lma_num | 0;
   var $lemma_num_ = 0, $0$0 = 0, $lemma_arr_ = 0, $top_lmas_ = 0, $mul = 0, $scis_num_ = 0, $7$0 = 0, $scis_ = 0, $lma_nodes_le0_ = 0, $14$0 = 0, $lma_nodes_ge1_ = 0, $20$0 = 0, $homo_idx_buf_ = 0, $25 = 0, $spl_table_ = 0, $call13 = 0, $26 = 0, $27 = 0, $53 = 0, $retval_0 = 0;
   if (($lma_num | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
   $lemma_num_ = $this + 4 | 0;
   HEAP32[$lemma_num_ >> 2] = $lma_num;
   $0$0 = _llvm_umul_with_overflow_i32($lma_num | 0, 124) | 0;
   $lemma_arr_ = $this | 0;
   HEAP32[$lemma_arr_ >> 2] = __Znaj(tempRet0 ? -1 : $0$0) | 0;
   HEAP32[$this + 48 >> 2] = 0;
   $top_lmas_ = $this + 44 | 0;
   HEAP32[$top_lmas_ >> 2] = __Znaj(1240) | 0;
   $mul = HEAP32[$lemma_num_ >> 2] << 3;
   $scis_num_ = $this + 12 | 0;
   HEAP32[$scis_num_ >> 2] = $mul;
   $7$0 = _llvm_umul_with_overflow_i32($mul | 0, 8) | 0;
   $scis_ = $this + 8 | 0;
   HEAP32[$scis_ >> 2] = __Znaj(tempRet0 ? -1 : $7$0) | 0;
   HEAP32[$this + 24 >> 2] = 0;
   $lma_nodes_le0_ = $this + 16 | 0;
   HEAP32[$lma_nodes_le0_ >> 2] = __Znaj(7728) | 0;
   HEAP32[$this + 28 >> 2] = 0;
   $14$0 = _llvm_umul_with_overflow_i32(HEAP32[$lemma_num_ >> 2] | 0, 10) | 0;
   $lma_nodes_ge1_ = $this + 20 | 0;
   HEAP32[$lma_nodes_ge1_ >> 2] = __Znaj(tempRet0 ? -1 : $14$0) | 0;
   $20$0 = _llvm_umul_with_overflow_i32(HEAP32[$lemma_num_ >> 2] | 0, 4) | 0;
   $homo_idx_buf_ = $this + 32 | 0;
   HEAP32[$homo_idx_buf_ >> 2] = __Znaj(tempRet0 ? -1 : $20$0) | 0;
   $25 = __Znwj(56) | 0;
   __ZN10ime_pinyin13SpellingTableC2Ev($25);
   $spl_table_ = $this + 52 | 0;
   HEAP32[$spl_table_ >> 2] = $25;
   $call13 = __Znwj(4) | 0;
   $26 = $call13;
   __ZN10ime_pinyin14SpellingParserC2Ev($26);
   HEAP32[$this + 56 >> 2] = $26;
   $27 = HEAP32[$lemma_arr_ >> 2] | 0;
   do {
    if (($27 | 0) != 0) {
     if ((HEAP32[$top_lmas_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$scis_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$spl_table_ >> 2] | 0) == 0 | ($call13 | 0) == 0) {
      break;
     }
     if ((HEAP32[$lma_nodes_le0_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$lma_nodes_ge1_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$homo_idx_buf_ >> 2] | 0) == 0) {
      break;
     }
     _memset($27 | 0, 0, (HEAP32[$lemma_num_ >> 2] | 0) * 124 | 0 | 0);
     _memset(HEAP32[$scis_ >> 2] | 0, 0, HEAP32[$scis_num_ >> 2] << 3 | 0);
     _memset(HEAP32[$lma_nodes_le0_ >> 2] | 0, 0, 7728);
     _memset(HEAP32[$lma_nodes_ge1_ >> 2] | 0, 0, (HEAP32[$lemma_num_ >> 2] | 0) * 10 | 0 | 0);
     _memset(HEAP32[$homo_idx_buf_ >> 2] | 0, 0, HEAP32[$lemma_num_ >> 2] << 2 | 0);
     $53 = HEAP32[$spl_table_ >> 2] | 0;
     __ZN10ime_pinyin13SpellingTable10init_tableEjjb($53, 6, 2e3, 1) | 0;
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder17read_valid_hanzisEPKcPj($this, $fn_validhzs, $num) {
   $this = $this | 0;
   $fn_validhzs = $fn_validhzs | 0;
   $num = $num | 0;
   var $utf16header = 0, $call = 0, $cmp7 = 0, $div = 0, $sub = 0, $2$0 = 0, $call16 = 0, $call22 = 0, $cmp23 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $utf16header = sp | 0;
   if (($fn_validhzs | 0) == 0 | ($num | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP32[$num >> 2] = 0;
   $call = _fopen($fn_validhzs | 0, 4440) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $cmp7 = (_fread($utf16header | 0, 2, 1, $call | 0) | 0) == 1;
   if (!($cmp7 & (HEAP16[$utf16header >> 1] | 0) == -257)) {
    _fclose($call | 0) | 0;
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _fseek($call | 0, 0, 2) | 0;
   $div = (_ftell($call | 0) | 0) >>> 1;
   HEAP32[$num >> 2] = $div;
   if (($div | 0) == 0) {
    ___assert_func(4408, 240, 7456, 3040);
    return 0;
   }
   $sub = $div - 1 | 0;
   HEAP32[$num >> 2] = $sub;
   $2$0 = _llvm_umul_with_overflow_i32($sub | 0, 2) | 0;
   $call16 = __Znaj(tempRet0 ? -1 : $2$0) | 0;
   if (($call16 | 0) == 0) {
    _fclose($call | 0) | 0;
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _fseek($call | 0, 2, 0) | 0;
   $call22 = _fread($call16 | 0, 2, HEAP32[$num >> 2] | 0, $call | 0) | 0;
   $cmp23 = ($call22 | 0) == (HEAP32[$num >> 2] | 0);
   _fclose($call | 0) | 0;
   if ($cmp23) {
    __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($call16, HEAP32[$num >> 2] | 0, 2, 24);
    $retval_0 = $call16;
    STACKTOP = sp;
    return $retval_0 | 0;
   } else {
    __ZdaPv($call16);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin11DictBuilder19format_spelling_strEPc($this, $spl_str) {
   $this = $this | 0;
   $spl_str = $spl_str | 0;
   var $0 = 0, $1 = 0, $arrayidx21 = 0, $pos_020 = 0, $4 = 0;
   if (($spl_str | 0) == 0) {
    return;
   }
   $0 = HEAP8[$spl_str] | 0;
   if ($0 << 24 >> 24 == 0) {
    return;
   } else {
    $pos_020 = 0;
    $arrayidx21 = $spl_str;
    $1 = $0;
   }
   do {
    if (($1 - 97 & 255) < 26) {
     HEAP8[$arrayidx21] = $1 - 32 & 255;
    }
    do {
     if ($pos_020 << 16 >> 16 == 1) {
      if ((HEAP8[$arrayidx21] | 0) != 72) {
       break;
      }
      $4 = HEAP8[$spl_str] | 0;
      if (!(($4 << 24 >> 24 | 0) == 67 | ($4 << 24 >> 24 | 0) == 83 | ($4 << 24 >> 24 | 0) == 90)) {
       break;
      }
      HEAP8[$arrayidx21] = 104;
     }
    } while (0);
    $pos_020 = $pos_020 + 1 & 65535;
    $arrayidx21 = $spl_str + ($pos_020 & 65535) | 0;
    $1 = HEAP8[$arrayidx21] | 0;
   } while ($1 << 24 >> 24 != 0);
   return;
  }
  function __ZN10ime_pinyin11DictBuilder18str_in_hanzis_listEPKtjS2_j($this, $hzs, $hzs_len, $str, $str_len) {
   $this = $this | 0;
   $hzs = $hzs | 0;
   $hzs_len = $hzs_len | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   var $pos_0 = 0, $retval_0 = 0, label = 0;
   if (($hzs | 0) == 0 | ($str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $pos_0 = 0;
   }
   while (1) {
    if ($pos_0 >>> 0 >= $str_len >>> 0) {
     $retval_0 = 1;
     label = 227;
     break;
    }
    if (__ZN10ime_pinyin11DictBuilder17hz_in_hanzis_listEPKtjt(0, $hzs, $hzs_len, HEAP16[$str + ($pos_0 << 1) >> 1] | 0) | 0) {
     $pos_0 = $pos_0 + 1 | 0;
    } else {
     $retval_0 = 0;
     label = 226;
     break;
    }
   }
   if ((label | 0) == 226) {
    return $retval_0 | 0;
   } else if ((label | 0) == 227) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin11DictBuilder17sort_lemmas_by_hzEv($this) {
   $this = $this | 0;
   var $lemma_arr_ = 0, $0 = 0, $lemma_num_ = 0, $1 = 0, $i_09 = 0, $idx_max_08 = 0, $5 = 0, $inc23 = 0, $phitmp = 0, $retval_0 = 0;
   $lemma_arr_ = $this | 0;
   $0 = HEAP32[$lemma_arr_ >> 2] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lemma_num_ = $this + 4 | 0;
   $1 = HEAP32[$lemma_num_ >> 2] | 0;
   if (($1 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($0, $1, 124, 22);
   HEAP32[(HEAP32[$lemma_arr_ >> 2] | 0) + 4 >> 2] = 1;
   if ((HEAP32[$lemma_num_ >> 2] | 0) >>> 0 > 1) {
    $idx_max_08 = 2;
    $i_09 = 1;
   } else {
    $retval_0 = 2;
    return $retval_0 | 0;
   }
   while (1) {
    $5 = HEAP32[$lemma_arr_ >> 2] | 0;
    _utf16_strcmp($5 + ($i_09 * 124 | 0) + 8 | 0, $5 + (($i_09 - 1 | 0) * 124 | 0) + 8 | 0) | 0;
    HEAP32[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_09 * 124 | 0) + 4 >> 2] = $idx_max_08;
    $inc23 = $i_09 + 1 | 0;
    $phitmp = $idx_max_08 + 1 | 0;
    if ($inc23 >>> 0 < (HEAP32[$lemma_num_ >> 2] | 0) >>> 0) {
     $idx_max_08 = $phitmp;
     $i_09 = $inc23;
    } else {
     $retval_0 = $phitmp;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder17hz_in_hanzis_listEPKtjt($this, $hzs, $hzs_len, $hz) {
   $this = $this | 0;
   $hzs = $hzs | 0;
   $hzs_len = $hzs_len | 0;
   $hz = $hz | 0;
   var $hz_addr = 0, $call = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $hz_addr = sp | 0;
   HEAP16[$hz_addr >> 1] = $hz;
   if (($hzs | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($hz_addr, $hzs, $hzs_len, 2, 24) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ((HEAP16[$call >> 1] | 0) == (HEAP16[$hz_addr >> 1] | 0)) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   } else {
    ___assert_func(4408, 273, 7536, 2128);
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin11DictBuilder14get_top_lemmasEv($this) {
   $this = $this | 0;
   var $top_lmas_num_ = 0, $lemma_arr_ = 0, $lemma_num_ = 0, $top_lmas_ = 0, $top_lmas_13 = 0, $pos_016 = 0, $2 = 0, $5 = 0, $6 = 0, $7 = 0, $arrayidx11 = 0, $9 = 0, $cmp19 = 0, $move_pos_0_in = 0, $move_pos_0 = 0, $12 = 0, $sub30 = 0, $13 = 0, $14 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $inc = 0, label = 0;
   $top_lmas_num_ = $this + 48 | 0;
   HEAP32[$top_lmas_num_ >> 2] = 0;
   $lemma_arr_ = $this | 0;
   if ((HEAP32[$lemma_arr_ >> 2] | 0) == 0) {
    return;
   }
   $lemma_num_ = $this + 4 | 0;
   if ((HEAP32[$lemma_num_ >> 2] | 0) == 0) {
    return;
   }
   $top_lmas_ = $this + 44 | 0;
   $top_lmas_13 = $this + 44 | 0;
   $pos_016 = 0;
   L275 : while (1) {
    $2 = HEAP32[$top_lmas_num_ >> 2] | 0;
    do {
     if (($2 | 0) == 0) {
      $5 = HEAP32[$top_lmas_ >> 2] | 0;
      $6 = (HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_016 * 124 | 0) | 0;
      _memcpy($5 | 0, $6 | 0, 124) | 0;
      HEAP32[$top_lmas_num_ >> 2] = 1;
     } else {
      $7 = HEAP32[$lemma_arr_ >> 2] | 0;
      $arrayidx11 = $7 + ($pos_016 * 124 | 0) | 0;
      $9 = HEAP32[$top_lmas_13 >> 2] | 0;
      $cmp19 = $2 >>> 0 < 10;
      if (+HEAPF32[$7 + ($pos_016 * 124 | 0) + 120 >> 2] <= +HEAPF32[$9 + (($2 - 1 | 0) * 124 | 0) + 120 >> 2]) {
       if (!$cmp19) {
        break;
       }
       $23 = $9 + ($2 * 124 | 0) | 0;
       $24 = $arrayidx11;
       _memcpy($23 | 0, $24 | 0, 124) | 0;
       HEAP32[$top_lmas_num_ >> 2] = (HEAP32[$top_lmas_num_ >> 2] | 0) + 1;
       break;
      }
      if ($cmp19) {
       HEAP32[$top_lmas_num_ >> 2] = $2 + 1;
      }
      $move_pos_0_in = HEAP32[$top_lmas_num_ >> 2] | 0;
      while (1) {
       $move_pos_0 = $move_pos_0_in - 1 | 0;
       if (($move_pos_0 | 0) == 0) {
        label = 258;
        break L275;
       }
       $12 = HEAP32[$top_lmas_13 >> 2] | 0;
       $sub30 = $move_pos_0_in - 2 | 0;
       $13 = $12 + ($move_pos_0 * 124 | 0) | 0;
       $14 = $12 + ($sub30 * 124 | 0) | 0;
       _memcpy($13 | 0, $14 | 0, 124) | 0;
       if (($sub30 | 0) == 0) {
        break;
       }
       if (+HEAPF32[(HEAP32[$top_lmas_13 >> 2] | 0) + (($move_pos_0_in - 3 | 0) * 124 | 0) + 120 >> 2] > +HEAPF32[(HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_016 * 124 | 0) + 120 >> 2]) {
        break;
       } else {
        $move_pos_0_in = $move_pos_0;
       }
      }
      $21 = (HEAP32[$top_lmas_13 >> 2] | 0) + ($sub30 * 124 | 0) | 0;
      $22 = (HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_016 * 124 | 0) | 0;
      _memcpy($21 | 0, $22 | 0, 124) | 0;
     }
    } while (0);
    $inc = $pos_016 + 1 | 0;
    if ($inc >>> 0 < (HEAP32[$lemma_num_ >> 2] | 0) >>> 0) {
     $pos_016 = $inc;
    } else {
     label = 264;
     break;
    }
   }
   if ((label | 0) == 258) {
    ___assert_func(4408, 315, 7728, 1616);
   } else if ((label | 0) == 264) {
    return;
   }
  }
  function __ZN10ime_pinyin11DictBuilder13read_raw_dictEPKcS2_j($this, $fn_raw, $fn_validhzs, $max_item) {
   $this = $this | 0;
   $fn_raw = $fn_raw | 0;
   $fn_validhzs = $fn_validhzs | 0;
   $max_item = $max_item | 0;
   var $utf16_reader = 0, $read_buf = 0, $valid_hzs_num = 0, $token_size = 0, $to_tokenize = 0, $call11 = 0, $arraydecay = 0, $lemma_arr_ = 0, $cmp66 = 0, $spl_table_ = 0, $i_045 = 0, $call19 = 0, $call27 = 0, $arraydecay35 = 0, $call41 = 0, $call49 = 0.0, $call61 = 0, $call65 = 0, $8 = 0, $9 = 0, $hz_pos_0 = 0, $call95 = 0, $17 = 0, $spelling_not_support_0_off0 = 0, $i_1 = 0, $inc143 = 0, $lemma_num_0 = 0, $retval_0 = 0, $retval_1 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 1072 | 0;
   $utf16_reader = sp | 0;
   $read_buf = sp + 24 | 0;
   $valid_hzs_num = sp + 1048 | 0;
   $token_size = sp + 1056 | 0;
   $to_tokenize = sp + 1064 | 0;
   if (($fn_raw | 0) == 0) {
    $retval_1 = 0;
    STACKTOP = sp;
    return $retval_1 | 0;
   }
   __ZN10ime_pinyin11Utf16ReaderC2Ev($utf16_reader);
   L301 : do {
    if (__ZN10ime_pinyin11Utf16Reader4openEPKcj($utf16_reader, $fn_raw, 5120) | 0) {
     if (!(__ZN10ime_pinyin11DictBuilder14alloc_resourceEj($this, 24e4) | 0)) {
      __ZN10ime_pinyin11Utf16Reader5closeEv($utf16_reader) | 0;
     }
     HEAP32[$valid_hzs_num >> 2] = 0;
     $call11 = __ZN10ime_pinyin11DictBuilder17read_valid_hanzisEPKcPj(0, $fn_validhzs, $valid_hzs_num) | 0;
     L308 : do {
      if (($max_item | 0) == 0) {
       $lemma_num_0 = 24e4;
      } else {
       $arraydecay = $read_buf | 0;
       $lemma_arr_ = $this | 0;
       $cmp66 = ($call11 | 0) == 0;
       $spl_table_ = $this + 52 | 0;
       $i_045 = 0;
       L310 : while (1) {
        if ((__ZN10ime_pinyin11Utf16Reader8readlineEPtj($utf16_reader, $arraydecay, 512) | 0) == 0) {
         $lemma_num_0 = $i_045;
         break L308;
        }
        HEAP32[$to_tokenize >> 2] = $arraydecay;
        $call19 = _utf16_strtok($arraydecay, $token_size, $to_tokenize) | 0;
        if (($call19 | 0) == 0) {
         label = 284;
         break;
        }
        $call27 = _utf16_strlen($call19) | 0;
        L317 : do {
         if ($call27 >>> 0 > 8) {
          $i_1 = $i_045 - 1 | 0;
         } else {
          if ($call27 >>> 0 > 4) {
           $i_1 = $i_045 - 1 | 0;
           break;
          }
          $arraydecay35 = (HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 8 | 0;
          _utf16_strcpy($arraydecay35, $call19) | 0;
          HEAP8[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 116 | 0] = HEAP32[$token_size >> 2] & 255;
          $call41 = _utf16_strtok(HEAP32[$to_tokenize >> 2] | 0, $token_size, $to_tokenize) | 0;
          if (($call41 | 0) == 0) {
           label = 294;
           break L310;
          }
          $call49 = +_utf16_atof($call41);
          HEAPF32[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 120 >> 2] = $call49;
          do {
           if ($call27 >>> 0 > 1) {
            if (+HEAPF32[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 120 >> 2] >= 60.0) {
             break;
            }
            $i_1 = $i_045 - 1 | 0;
            break L317;
           }
          } while (0);
          $call61 = _utf16_strtok(HEAP32[$to_tokenize >> 2] | 0, $token_size, $to_tokenize) | 0;
          if (($call61 | 0) == 0) {
           label = 302;
           break L310;
          }
          $call65 = _utf16_atoi($call61) | 0;
          do {
           if ($cmp66) {
            label = 307;
           } else {
            $8 = HEAP32[$valid_hzs_num >> 2] | 0;
            if (($8 | 0) == 0) {
             label = 307;
             break;
            }
            $9 = HEAP32[$lemma_arr_ >> 2] | 0;
            if (__ZN10ime_pinyin11DictBuilder18str_in_hanzis_listEPKtjS2_j(0, $call11, $8, $9 + ($i_045 * 124 | 0) + 8 | 0, HEAPU8[$9 + ($i_045 * 124 | 0) + 116 | 0] | 0) | 0) {
             $hz_pos_0 = 0;
             break;
            }
            $i_1 = $i_045 - 1 | 0;
            break L317;
           }
          } while (0);
          do {
           if ((label | 0) == 307) {
            label = 0;
            if (($call65 | 0) == 0) {
             $hz_pos_0 = 0;
             break;
            }
            $i_1 = $i_045 - 1 | 0;
            break L317;
           }
          } while (0);
          while (1) {
           if ($hz_pos_0 >>> 0 >= (HEAPU8[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 116 | 0] | 0) >>> 0) {
            $spelling_not_support_0_off0 = 1;
            break;
           }
           $call95 = _utf16_strtok(HEAP32[$to_tokenize >> 2] | 0, $token_size, $to_tokenize) | 0;
           if (($call95 | 0) == 0) {
            label = 315;
            break L310;
           }
           if ((_utf16_strlen($call95) | 0) >>> 0 >= 7) {
            label = 319;
            break L310;
           }
           _utf16_strcpy_tochar((HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 60 + ($hz_pos_0 * 7 | 0) | 0, $call95) | 0;
           __ZN10ime_pinyin11DictBuilder19format_spelling_strEPc(0, (HEAP32[$lemma_arr_ >> 2] | 0) + ($i_045 * 124 | 0) + 60 + ($hz_pos_0 * 7 | 0) | 0);
           $17 = HEAP32[$lemma_arr_ >> 2] | 0;
           if (__ZN10ime_pinyin13SpellingTable12put_spellingEPKcd(HEAP32[$spl_table_ >> 2] | 0, $17 + ($i_045 * 124 | 0) + 60 + ($hz_pos_0 * 7 | 0) | 0, +HEAPF32[$17 + ($i_045 * 124 | 0) + 120 >> 2]) | 0) {
            $hz_pos_0 = $hz_pos_0 + 1 | 0;
           } else {
            $spelling_not_support_0_off0 = 0;
            break;
           }
          }
          $i_1 = (($spelling_not_support_0_off0 & (_utf16_strtok(HEAP32[$to_tokenize >> 2] | 0, $token_size, $to_tokenize) | 0) == 0 ^ 1) << 31 >> 31) + $i_045 | 0;
         }
        } while (0);
        $inc143 = $i_1 + 1 | 0;
        if ($inc143 >>> 0 < $max_item >>> 0) {
         $i_045 = $inc143;
        } else {
         $lemma_num_0 = 24e4;
         break L308;
        }
       }
       if ((label | 0) == 294) {
        __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
        __ZN10ime_pinyin11Utf16Reader5closeEv($utf16_reader) | 0;
        $retval_0 = 0;
        break L301;
       } else if ((label | 0) == 284) {
        __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
        __ZN10ime_pinyin11Utf16Reader5closeEv($utf16_reader) | 0;
        $retval_0 = 0;
        break L301;
       } else if ((label | 0) == 302) {
        ___assert_func(4408, 448, 7776, 1344);
        return 0;
       } else if ((label | 0) == 315) {
        __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
        __ZN10ime_pinyin11Utf16Reader5closeEv($utf16_reader) | 0;
        $retval_0 = 0;
        break L301;
       } else if ((label | 0) == 319) {
        ___assert_func(4408, 475, 7776, 1096);
        return 0;
       }
      }
     } while (0);
     if (($call11 | 0) != 0) {
      __ZdaPv($call11);
     }
     __ZN10ime_pinyin11Utf16Reader5closeEv($utf16_reader) | 0;
     $retval_0 = $lemma_num_0;
    } else {
     $retval_0 = 0;
    }
   } while (0);
   __ZN10ime_pinyin11Utf16ReaderD2Ev($utf16_reader);
   $retval_1 = $retval_0;
   STACKTOP = sp;
   return $retval_1 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder10build_dictEPKcS2_PNS_8DictTrieE($this, $fn_raw, $fn_validhzs, $dict_trie) {
   $this = $this | 0;
   $fn_raw = $fn_raw | 0;
   $fn_validhzs = $fn_validhzs | 0;
   $dict_trie = $dict_trie | 0;
   var $spl_item_size = 0, $spl_num = 0, $is_pre = 0, $call = 0, $lemma_num_ = 0, $spl_table_ = 0, $call7 = 0, $call11 = 0, $1 = 0, $2 = 0, $call13 = 0.0, $lemma_arr_ = 0, $spl_parser_ = 0, $arraydecay34 = 0, $arraydecay35 = 0, $i_049 = 0, $hz_pos_047 = 0, $8 = 0, $arraydecay = 0, $scis_num_ = 0, $17 = 0, $lemma_arr_63 = 0, $call69 = 0, $23 = 0, $24 = 0, $lma_nds_used_num_le0_ = 0, $lma_nodes_le0_ = 0, $call80 = 0, $34$0 = 0, $root_ = 0, $lma_nds_used_num_ge1_ = 0, $40$0 = 0, $nodes_ge1_ = 0, $homo_idx_num_eq1_ = 0, $homo_idx_num_gt1_ = 0, $top_lmas_num_ = 0, $add89 = 0, $mul = 0, $call90 = 0, $lma_idx_buf_ = 0, $53 = 0, $55 = 0, $mul109 = 0, $58 = 0, $60 = 0, $mul112 = 0, $homo_idx_buf_ = 0, $add116_lcssa = 0, $top_lmas_ = 0, $pos_043 = 0, $inc123 = 0, $add116 = 0, $pos125_040 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 40 | 0;
   $spl_item_size = sp | 0;
   $spl_num = sp + 8 | 0;
   $is_pre = sp + 32 | 0;
   if (($fn_raw | 0) == 0 | ($dict_trie | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin11DictBuilder13read_raw_dictEPKcS2_j($this, $fn_raw, $fn_validhzs, 24e4) | 0;
   $lemma_num_ = $this + 4 | 0;
   HEAP32[$lemma_num_ >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $spl_table_ = $this + 52 | 0;
   $call7 = __ZN10ime_pinyin13SpellingTable7arrangeEPjS1_(HEAP32[$spl_table_ >> 2] | 0, $spl_item_size, $spl_num) | 0;
   if (($call7 | 0) == 0) {
    __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call11 = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $1 = HEAP32[$spl_item_size >> 2] | 0;
   $2 = HEAP32[$spl_num >> 2] | 0;
   $call13 = +__ZN10ime_pinyin13SpellingTable19get_score_amplifierEv(HEAP32[$spl_table_ >> 2] | 0);
   if (!(__ZN10ime_pinyin12SpellingTrie9constructEPKcjjfh($call11, $call7, $1, $2, $call13, __ZN10ime_pinyin13SpellingTable17get_average_scoreEv(HEAP32[$spl_table_ >> 2] | 0) | 0) | 0)) {
    __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   L386 : do {
    if ((HEAP32[$lemma_num_ >> 2] | 0) != 0) {
     $lemma_arr_ = $this | 0;
     $spl_parser_ = $this + 56 | 0;
     $arraydecay34 = sp + 16 | 0;
     $arraydecay35 = sp + 24 | 0;
     $i_049 = 0;
     L388 : while (1) {
      if ((HEAP8[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_049 * 124 | 0) + 116 | 0] | 0) != 0) {
       $hz_pos_047 = 0;
       do {
        HEAP8[$is_pre] = 1;
        $8 = HEAP32[$spl_parser_ >> 2] | 0;
        $arraydecay = (HEAP32[$lemma_arr_ >> 2] | 0) + ($i_049 * 124 | 0) + 60 + ($hz_pos_047 * 7 | 0) | 0;
        if ((__ZN10ime_pinyin14SpellingParser14splstr_to_idxsEPKctPtS3_tRb($8, $arraydecay, (_strlen($arraydecay | 0) | 0) & 65535, $arraydecay34, $arraydecay35, 2, $is_pre) | 0) << 16 >> 16 != 1) {
         label = 346;
         break L388;
        }
        if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt($call11, HEAP16[$arraydecay34 >> 1] | 0) | 0) {
         if ((__ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($call11, HEAP16[$arraydecay34 >> 1] | 0, $arraydecay34) | 0) << 16 >> 16 == 0) {
          label = 349;
          break L388;
         }
        }
        HEAP16[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_049 * 124 | 0) + 42 + ($hz_pos_047 << 1) >> 1] = HEAP16[$arraydecay34 >> 1] | 0;
        $hz_pos_047 = $hz_pos_047 + 1 | 0;
       } while ($hz_pos_047 >>> 0 < (HEAPU8[(HEAP32[$lemma_arr_ >> 2] | 0) + ($i_049 * 124 | 0) + 116 | 0] | 0) >>> 0);
      }
      $i_049 = $i_049 + 1 | 0;
      if ($i_049 >>> 0 >= (HEAP32[$lemma_num_ >> 2] | 0) >>> 0) {
       break L386;
      }
     }
     if ((label | 0) == 349) {
      ___assert_func(4408, 556, 7912, 752);
      return 0;
     } else if ((label | 0) == 346) {
      ___assert_func(4408, 552, 7912, 920);
      return 0;
     }
    }
   } while (0);
   __ZN10ime_pinyin11DictBuilder17sort_lemmas_by_hzEv($this) | 0;
   $scis_num_ = $this + 12 | 0;
   HEAP32[$scis_num_ >> 2] = __ZN10ime_pinyin11DictBuilder10build_scisEv($this) | 0;
   $17 = __Znwj(128) | 0;
   __ZN10ime_pinyin8DictListC2Ev($17);
   HEAP32[$dict_trie + 4 >> 2] = $17;
   $lemma_arr_63 = $this | 0;
   if (!(__ZN10ime_pinyin8DictList9init_listEPKNS_14SingleCharItemEjPKNS_10LemmaEntryEj($17, HEAP32[$this + 8 >> 2] | 0, HEAP32[$scis_num_ >> 2] | 0, HEAP32[$lemma_arr_63 >> 2] | 0, HEAP32[$lemma_num_ >> 2] | 0) | 0)) {
    ___assert_func(4408, 572, 7912, 600);
    return 0;
   }
   $call69 = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $23 = HEAP32[$lemma_arr_63 >> 2] | 0;
   $24 = HEAP32[$lemma_num_ >> 2] | 0;
   __ZN10ime_pinyin5NGram13build_unigramEPNS_10LemmaEntryEjj($call69, $23, $24, (HEAP32[$23 + (($24 - 1 | 0) * 124 | 0) + 4 >> 2] | 0) + 1 | 0) | 0;
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E(HEAP32[$lemma_arr_63 >> 2] | 0, HEAP32[$lemma_num_ >> 2] | 0, 124, 6);
   __ZN10ime_pinyin11DictBuilder14get_top_lemmasEv($this);
   __ZN10ime_pinyin11DictBuilder9stat_initEv($this);
   $lma_nds_used_num_le0_ = $this + 24 | 0;
   HEAP32[$lma_nds_used_num_le0_ >> 2] = 1;
   $lma_nodes_le0_ = $this + 16 | 0;
   $call80 = __ZN10ime_pinyin11DictBuilder16construct_subsetEPvPNS_10LemmaEntryEjjj($this, HEAP32[$lma_nodes_le0_ >> 2] | 0, HEAP32[$lemma_arr_63 >> 2] | 0, 0, HEAP32[$lemma_num_ >> 2] | 0, 0) | 0;
   if (!$call80) {
    __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $34$0 = _llvm_umul_with_overflow_i32(HEAP32[$lma_nds_used_num_le0_ >> 2] | 0, 16) | 0;
   $root_ = $dict_trie + 12 | 0;
   HEAP32[$root_ >> 2] = __Znaj(tempRet0 ? -1 : $34$0) | 0;
   $lma_nds_used_num_ge1_ = $this + 28 | 0;
   $40$0 = _llvm_umul_with_overflow_i32(HEAP32[$lma_nds_used_num_ge1_ >> 2] | 0, 10) | 0;
   $nodes_ge1_ = $dict_trie + 16 | 0;
   HEAP32[$nodes_ge1_ >> 2] = __Znaj(tempRet0 ? -1 : $40$0) | 0;
   $homo_idx_num_eq1_ = $this + 36 | 0;
   $homo_idx_num_gt1_ = $this + 40 | 0;
   $top_lmas_num_ = $this + 48 | 0;
   $add89 = (HEAP32[$homo_idx_num_gt1_ >> 2] | 0) + (HEAP32[$homo_idx_num_eq1_ >> 2] | 0) + (HEAP32[$top_lmas_num_ >> 2] | 0) | 0;
   $mul = $add89 * 3 | 0;
   $call90 = __Znaj($mul) | 0;
   $lma_idx_buf_ = $dict_trie + 32 | 0;
   HEAP32[$lma_idx_buf_ >> 2] = $call90;
   if ((HEAP32[$root_ >> 2] | 0) == 0) {
    ___assert_func(4408, 606, 7912, 4376);
    return 0;
   }
   if (($call90 | 0) == 0) {
    ___assert_func(4408, 607, 7912, 4256);
    return 0;
   }
   HEAP32[$dict_trie + 24 >> 2] = HEAP32[$lma_nds_used_num_le0_ >> 2];
   HEAP32[$dict_trie + 28 >> 2] = HEAP32[$lma_nds_used_num_ge1_ >> 2];
   HEAP32[$dict_trie + 36 >> 2] = $mul;
   HEAP32[$dict_trie + 44 >> 2] = HEAP32[$top_lmas_num_ >> 2];
   $53 = HEAP32[$root_ >> 2] | 0;
   $55 = HEAP32[$lma_nodes_le0_ >> 2] | 0;
   $mul109 = HEAP32[$lma_nds_used_num_le0_ >> 2] << 4;
   _memcpy($53 | 0, $55 | 0, $mul109) | 0;
   $58 = HEAP32[$nodes_ge1_ >> 2] | 0;
   $60 = HEAP32[$this + 20 >> 2] | 0;
   $mul112 = (HEAP32[$lma_nds_used_num_ge1_ >> 2] | 0) * 10 | 0;
   _memcpy($58 | 0, $60 | 0, $mul112) | 0;
   if ((HEAP32[$homo_idx_num_gt1_ >> 2] | 0) == (-(HEAP32[$homo_idx_num_eq1_ >> 2] | 0) | 0)) {
    $add116_lcssa = 0;
   } else {
    $homo_idx_buf_ = $this + 32 | 0;
    $pos_043 = 0;
    while (1) {
     __ZN10ime_pinyin11DictBuilder13id_to_charbufEPhj(0, (HEAP32[$lma_idx_buf_ >> 2] | 0) + ($pos_043 * 3 | 0) | 0, HEAP32[(HEAP32[$homo_idx_buf_ >> 2] | 0) + ($pos_043 << 2) >> 2] | 0);
     $inc123 = $pos_043 + 1 | 0;
     $add116 = (HEAP32[$homo_idx_num_gt1_ >> 2] | 0) + (HEAP32[$homo_idx_num_eq1_ >> 2] | 0) | 0;
     if ($inc123 >>> 0 < $add116 >>> 0) {
      $pos_043 = $inc123;
     } else {
      $add116_lcssa = $add116;
      break;
     }
    }
   }
   if ($add116_lcssa >>> 0 < $add89 >>> 0) {
    $top_lmas_ = $this + 44 | 0;
    $pos125_040 = $add116_lcssa;
    do {
     __ZN10ime_pinyin11DictBuilder13id_to_charbufEPhj(0, (HEAP32[$lma_idx_buf_ >> 2] | 0) + ($pos125_040 * 3 | 0) | 0, HEAP32[(HEAP32[$top_lmas_ >> 2] | 0) + (($pos125_040 - (HEAP32[$homo_idx_num_eq1_ >> 2] | 0) - (HEAP32[$homo_idx_num_gt1_ >> 2] | 0) | 0) * 124 | 0) + 4 >> 2] | 0);
     $pos125_040 = $pos125_040 + 1 | 0;
    } while ($pos125_040 >>> 0 < $add89 >>> 0);
   }
   __ZN10ime_pinyin11DictBuilder13free_resourceEv($this);
   $retval_0 = $call80;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder13id_to_charbufEPhj($this, $buf, $id) {
   $this = $this | 0;
   $buf = $buf | 0;
   $id = $id | 0;
   if (($buf | 0) == 0) {
    return;
   }
   HEAP8[$buf] = $id & 255;
   HEAP8[$buf + 1 | 0] = $id >>> 8 & 255;
   HEAP8[$buf + 2 | 0] = $id >>> 16 & 255;
   return;
  }
  function __ZN10ime_pinyin11DictBuilder14set_son_offsetEPNS_10LmaNodeGE1Ej($this, $node, $offset) {
   $this = $this | 0;
   $node = $node | 0;
   $offset = $offset | 0;
   HEAP16[$node >> 1] = $offset & 65535;
   HEAP8[$node + 8 | 0] = $offset >>> 16 & 255;
   return;
  }
  function __ZN10ime_pinyin11DictBuilder22set_homo_id_buf_offsetEPNS_10LmaNodeGE1Ej($this, $node, $offset) {
   $this = $this | 0;
   $node = $node | 0;
   $offset = $offset | 0;
   HEAP16[$node + 2 >> 1] = $offset & 65535;
   HEAP8[$node + 9 | 0] = $offset >>> 16 & 255;
   return;
  }
  function __ZN10ime_pinyin11DictBuilder9stat_initEv($this) {
   $this = $this | 0;
   _memset($this + 60 | 0, 0, 268);
   return;
  }
  function __ZN10ime_pinyin11DictBuilder10build_scisEv($this) {
   $this = $this | 0;
   var $key = 0, $scis_ = 0, $lemma_num_ = 0, $scis_num_ = 0, $call = 0, $6 = 0, $10 = 0, $lemma_arr_ = 0, $pos_049 = 0, $15 = 0, $conv = 0, $cmp42 = 0, $hzpos_047 = 0, $24 = 0, $call36 = 0, $36 = 0, $pos63_044 = 0, $unique_scis_num_043 = 0, $52 = 0, $sub = 0, $61 = 0, $62 = 0, $63 = 0, $64$1 = 0, $call99 = 0, $70 = 0, $unique_scis_num_1 = 0, $inc106 = 0, $unique_scis_num_0_lcssa = 0, $lemma_arr_115 = 0, $hz127 = 0, $76 = 0, $77 = 0, $pos109_040 = 0, $79 = 0, $conv118 = 0, $hzpos119_038 = 0, $83 = 0, $bf_value138 = 0, $call140 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $key = sp | 0;
   $scis_ = $this + 8 | 0;
   if ((HEAP32[$scis_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $lemma_num_ = $this + 4 | 0;
   $scis_num_ = $this + 12 | 0;
   if (HEAP32[$lemma_num_ >> 2] << 3 >>> 0 > (HEAP32[$scis_num_ >> 2] | 0) >>> 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   HEAPF32[HEAP32[$scis_ >> 2] >> 2] = 0.0;
   HEAP16[(HEAP32[$scis_ >> 2] | 0) + 4 >> 1] = 0;
   $6 = (HEAP32[$scis_ >> 2] | 0) + 6 | 0;
   HEAP16[$6 >> 1] = HEAP16[$6 >> 1] & 31;
   $10 = (HEAP32[$scis_ >> 2] | 0) + 6 | 0;
   HEAP16[$10 >> 1] = HEAP16[$10 >> 1] & -32;
   HEAP32[$scis_num_ >> 2] = 1;
   if ((HEAP32[$lemma_num_ >> 2] | 0) != 0) {
    $lemma_arr_ = $this | 0;
    $pos_049 = 0;
    do {
     $15 = HEAP8[(HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_049 * 124 | 0) + 116 | 0] | 0;
     $conv = $15 & 255;
     if ($15 << 24 >> 24 != 0) {
      $cmp42 = $15 << 24 >> 24 == 1;
      $hzpos_047 = 0;
      do {
       HEAP16[(HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) + 4 >> 1] = HEAP16[(HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_049 * 124 | 0) + 8 + ($hzpos_047 << 1) >> 1] | 0;
       $24 = (HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) + 6 | 0;
       HEAP16[$24 >> 1] = HEAP16[$24 >> 1] & 31 | HEAP16[(HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_049 * 124 | 0) + 42 + ($hzpos_047 << 1) >> 1] << 5;
       $call36 = __ZNK10ime_pinyin12SpellingTrie12full_to_halfEt($call, (HEAPU16[(HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) + 6 >> 1] | 0) >>> 5) | 0;
       $36 = (HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) + 6 | 0;
       HEAP16[$36 >> 1] = HEAP16[$36 >> 1] & -32 | $call36 & 31;
       if ($cmp42) {
        HEAPF32[(HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) >> 2] = +HEAPF32[(HEAP32[$lemma_arr_ >> 2] | 0) + ($pos_049 * 124 | 0) + 120 >> 2];
       } else {
        HEAPF32[(HEAP32[$scis_ >> 2] | 0) + (HEAP32[$scis_num_ >> 2] << 3) >> 2] = 9.999999974752427e-7;
       }
       HEAP32[$scis_num_ >> 2] = (HEAP32[$scis_num_ >> 2] | 0) + 1;
       $hzpos_047 = $hzpos_047 + 1 | 0;
      } while ($hzpos_047 >>> 0 < $conv >>> 0);
     }
     $pos_049 = $pos_049 + 1 | 0;
    } while ($pos_049 >>> 0 < (HEAP32[$lemma_num_ >> 2] | 0) >>> 0);
   }
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E(HEAP32[$scis_ >> 2] | 0, HEAP32[$scis_num_ >> 2] | 0, 8, 50);
   if ((HEAP32[$scis_num_ >> 2] | 0) >>> 0 > 1) {
    $unique_scis_num_043 = 1;
    $pos63_044 = 1;
    while (1) {
     $52 = HEAP32[$scis_ >> 2] | 0;
     $sub = $pos63_044 - 1 | 0;
     if ((HEAP16[$52 + ($pos63_044 << 3) + 4 >> 1] | 0) == (HEAP16[$52 + ($sub << 3) + 4 >> 1] | 0)) {
      if ((HEAPU16[$52 + ($pos63_044 << 3) + 6 >> 1] | 0) >>> 5 << 16 >> 16 == (HEAPU16[$52 + ($sub << 3) + 6 >> 1] | 0) >>> 5 << 16 >> 16) {
       $unique_scis_num_1 = $unique_scis_num_043;
      } else {
       label = 398;
      }
     } else {
      label = 398;
     }
     if ((label | 0) == 398) {
      label = 0;
      $61 = HEAP32[$scis_ >> 2] | 0;
      $62 = $61 + ($pos63_044 << 3) | 0;
      $63 = $61 + ($unique_scis_num_043 << 3) | 0;
      $64$1 = HEAP32[$62 + 4 >> 2] | 0;
      HEAP32[$63 >> 2] = HEAP32[$62 >> 2];
      HEAP32[$63 + 4 >> 2] = $64$1;
      $call99 = __ZNK10ime_pinyin12SpellingTrie12full_to_halfEt($call, (HEAPU16[(HEAP32[$scis_ >> 2] | 0) + ($pos63_044 << 3) + 6 >> 1] | 0) >>> 5) | 0;
      $70 = (HEAP32[$scis_ >> 2] | 0) + ($unique_scis_num_043 << 3) + 6 | 0;
      HEAP16[$70 >> 1] = HEAP16[$70 >> 1] & -32 | $call99 & 31;
      $unique_scis_num_1 = $unique_scis_num_043 + 1 | 0;
     }
     $inc106 = $pos63_044 + 1 | 0;
     if ($inc106 >>> 0 < (HEAP32[$scis_num_ >> 2] | 0) >>> 0) {
      $unique_scis_num_043 = $unique_scis_num_1;
      $pos63_044 = $inc106;
     } else {
      $unique_scis_num_0_lcssa = $unique_scis_num_1;
      break;
     }
    }
   } else {
    $unique_scis_num_0_lcssa = 1;
   }
   HEAP32[$scis_num_ >> 2] = $unique_scis_num_0_lcssa;
   L465 : do {
    if ((HEAP32[$lemma_num_ >> 2] | 0) != 0) {
     $lemma_arr_115 = $this | 0;
     $hz127 = $key + 4 | 0;
     $76 = $key + 6 | 0;
     $77 = $key;
     $pos109_040 = 0;
     L467 : while (1) {
      $79 = HEAP8[(HEAP32[$lemma_arr_115 >> 2] | 0) + ($pos109_040 * 124 | 0) + 116 | 0] | 0;
      $conv118 = $79 & 255;
      if ($79 << 24 >> 24 != 0) {
       $hzpos119_038 = 0;
       do {
        HEAP16[$hz127 >> 1] = HEAP16[(HEAP32[$lemma_arr_115 >> 2] | 0) + ($pos109_040 * 124 | 0) + 8 + ($hzpos119_038 << 1) >> 1] | 0;
        $83 = HEAP16[(HEAP32[$lemma_arr_115 >> 2] | 0) + ($pos109_040 * 124 | 0) + 42 + ($hzpos119_038 << 1) >> 1] | 0;
        HEAP16[$76 >> 1] = HEAP16[$76 >> 1] & 31 | $83 << 5;
        $bf_value138 = (__ZNK10ime_pinyin12SpellingTrie12full_to_halfEt($call, $83 & 2047) | 0) & 31;
        HEAP16[$76 >> 1] = HEAP16[$76 >> 1] & -32 | $bf_value138;
        $call140 = __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($77, HEAP32[$scis_ >> 2] | 0, $unique_scis_num_0_lcssa, 8, 34) | 0;
        if (($call140 | 0) == 0) {
         break L467;
        }
        HEAP16[(HEAP32[$lemma_arr_115 >> 2] | 0) + ($pos109_040 * 124 | 0) + 26 + ($hzpos119_038 << 1) >> 1] = ($call140 - (HEAP32[$scis_ >> 2] | 0) | 0) >>> 3 & 65535;
        HEAP16[(HEAP32[$lemma_arr_115 >> 2] | 0) + ($pos109_040 * 124 | 0) + 42 + ($hzpos119_038 << 1) >> 1] = (HEAPU16[$call140 + 6 >> 1] | 0) >>> 5;
        $hzpos119_038 = $hzpos119_038 + 1 | 0;
       } while ($hzpos119_038 >>> 0 < $conv118 >>> 0);
      }
      $pos109_040 = $pos109_040 + 1 | 0;
      if ($pos109_040 >>> 0 >= (HEAP32[$lemma_num_ >> 2] | 0) >>> 0) {
       break L465;
      }
     }
     ___assert_func(4408, 763, 7864, 4048);
     return 0;
    }
   } while (0);
   $retval_0 = HEAP32[$scis_num_ >> 2] | 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder16construct_subsetEPvPNS_10LemmaEntryEjjj($this, $parent, $lemma_arr, $item_start, $item_end, $level) {
   $this = $this | 0;
   $parent = $parent | 0;
   $lemma_arr = $lemma_arr | 0;
   $item_start = $item_start | 0;
   $item_end = $item_end | 0;
   $level = $level | 0;
   var $lemma_arr_ = 0, $add = 0, $parent_son_num_0192 = 0, $spl_idx_node_0191 = 0, $i_0190 = 0, $2 = 0, $parent_son_num_0_inc = 0, $inc11 = 0, $parent_son_num_0_lcssa = 0, $inc12 = 0, $arrayidx14 = 0, $arrayidx20 = 0, $arrayidx22 = 0, $sonbufs_num1_ = 0, $sonbufs_numgt1_ = 0, $total_lma_node_num_ = 0, $cmp30 = 0, $lma_nds_used_num_le0_ = 0, $10 = 0, $11 = 0, $lma_nds_used_num_ge1_ = 0, $14 = 0, $15 = 0, $lma_nds_used_num_ge1_56 = 0, $19 = 0, $20 = 0, $son_1st_le0_0 = 0, $son_1st_ge1_0 = 0, $22 = 0, $23 = 0, $add74 = 0, $_ = 0, $homo_num_1_neg171 = 0, $homo_idx_num_eq1_ = 0, $homo_idx_num_gt1_ = 0, $arrayidx170 = 0, $homo_idx_buf_ = 0, $homo_idx_num_eq1_123 = 0, $homo_idx_num_gt1_125 = 0, $arrayidx153 = 0, $arrayidx159 = 0, $homo_idx_num_eq1_115 = 0, $homo_idx_num_gt1_116 = 0, $homo_num_1_neg183 = 0, $spl_idx_node_2182 = 0, $i81_0180 = 0, $item_start_next_0177 = 0, $homo_num_1175 = 0, $son_pos_0174 = 0, $allson_noson_0_off0173 = 0, $25 = 0, $26 = 0, $add_ptr107 = 0, $add_ptr113 = 0, $node_cur_le0_0 = 0, $node_cur_ge1_0 = 0, $34 = 0, $35 = 0, $36 = 0, $add_ptr126_sum = 0, $homo_pos_0155 = 0, $next_parent_0 = 0, $add168 = 0, $allson_noson_1_off0 = 0, $allson_noson_2_off0 = 0, $son_pos_1 = 0, $homo_num_3 = 0, $item_start_next_1 = 0, $spl_idx_node_3 = 0, $inc183 = 0, $homo_num_1_neg = 0, $homo_num_1_neg_lcssa = 0, $spl_idx_node_2_lcssa = 0, $item_start_next_0_lcssa = 0, $homo_num_1_lcssa = 0, $son_pos_0_lcssa = 0, $allson_noson_0_off0_lcssa = 0, $add_ptr189 = 0, $homo_idx_num_eq1_191 = 0, $add_ptr199 = 0, $homo_idx_num_gt1_202 = 0, $node_cur_le0185_0 = 0, $node_cur_ge1186_0 = 0, $51 = 0, $52 = 0, $53 = 0, $add_ptr214_sum = 0, $homo_pos233_0153 = 0, $arrayidx245 = 0, $arrayidx252 = 0, $next_parent258_0 = 0, $add263 = 0, $arrayidx267 = 0, $arrayidx271 = 0, $arrayidx273 = 0, $retval_0 = 0, label = 0;
   if (!($level >>> 0 < 8 & $item_end >>> 0 > $item_start >>> 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lemma_arr_ = $this | 0;
   $add = $item_start + 1 | 0;
   if ($add >>> 0 < $item_end >>> 0) {
    $i_0190 = $add;
    $spl_idx_node_0191 = HEAP16[(HEAP32[$lemma_arr_ >> 2] | 0) + ($item_start * 124 | 0) + 42 + ($level << 1) >> 1] | 0;
    $parent_son_num_0192 = 0;
    while (1) {
     $2 = HEAP16[$lemma_arr + ($i_0190 * 124 | 0) + 42 + ($level << 1) >> 1] | 0;
     $parent_son_num_0_inc = ($2 << 16 >> 16 != $spl_idx_node_0191 << 16 >> 16) + $parent_son_num_0192 | 0;
     $inc11 = $i_0190 + 1 | 0;
     if ($inc11 >>> 0 < $item_end >>> 0) {
      $i_0190 = $inc11;
      $spl_idx_node_0191 = $2;
      $parent_son_num_0192 = $parent_son_num_0_inc;
     } else {
      $parent_son_num_0_lcssa = $parent_son_num_0_inc;
      break;
     }
    }
   } else {
    $parent_son_num_0_lcssa = 0;
   }
   $inc12 = $parent_son_num_0_lcssa + 1 | 0;
   if ($level >>> 0 >= 8) {
    ___assert_func(4408, 803, 7616, 3816);
    return 0;
   }
   $arrayidx14 = $this + 60 + ($level << 2) | 0;
   if ($inc12 >>> 0 > (HEAP32[$arrayidx14 >> 2] | 0) >>> 0) {
    HEAP32[$arrayidx14 >> 2] = $inc12;
   }
   $arrayidx20 = $this + 124 + ($level << 2) | 0;
   HEAP32[$arrayidx20 >> 2] = (HEAP32[$arrayidx20 >> 2] | 0) + $inc12;
   $arrayidx22 = $this + 188 + ($level << 2) | 0;
   HEAP32[$arrayidx22 >> 2] = (HEAP32[$arrayidx22 >> 2] | 0) + 1;
   if (($parent_son_num_0_lcssa | 0) == 0) {
    $sonbufs_num1_ = $this + 316 | 0;
    HEAP32[$sonbufs_num1_ >> 2] = (HEAP32[$sonbufs_num1_ >> 2] | 0) + 1;
   } else {
    $sonbufs_numgt1_ = $this + 320 | 0;
    HEAP32[$sonbufs_numgt1_ >> 2] = (HEAP32[$sonbufs_numgt1_ >> 2] | 0) + 1;
   }
   $total_lma_node_num_ = $this + 324 | 0;
   HEAP32[$total_lma_node_num_ >> 2] = (HEAP32[$total_lma_node_num_ >> 2] | 0) + $inc12;
   $cmp30 = ($level | 0) == 0;
   do {
    if ($cmp30) {
     $lma_nds_used_num_le0_ = $this + 24 | 0;
     HEAP32[$parent >> 2] = HEAP32[$lma_nds_used_num_le0_ >> 2];
     $10 = HEAP32[$this + 16 >> 2] | 0;
     $11 = HEAP32[$lma_nds_used_num_le0_ >> 2] | 0;
     HEAP32[$lma_nds_used_num_le0_ >> 2] = $11 + $inc12;
     if ($inc12 >>> 0 < 65536) {
      HEAP16[$parent + 10 >> 1] = $inc12 & 65535;
      $son_1st_ge1_0 = 0;
      $son_1st_le0_0 = $10 + ($11 << 4) | 0;
      break;
     } else {
      ___assert_func(4408, 827, 7616, 3640);
      return 0;
     }
    } else {
     if (($level | 0) == 1) {
      $lma_nds_used_num_ge1_ = $this + 28 | 0;
      HEAP32[$parent >> 2] = HEAP32[$lma_nds_used_num_ge1_ >> 2];
      $14 = HEAP32[$this + 20 >> 2] | 0;
      $15 = HEAP32[$lma_nds_used_num_ge1_ >> 2] | 0;
      HEAP32[$lma_nds_used_num_ge1_ >> 2] = $15 + $inc12;
      if ($inc12 >>> 0 < 65536) {
       HEAP16[$parent + 10 >> 1] = $inc12 & 65535;
       $son_1st_ge1_0 = $14 + ($15 * 10 | 0) | 0;
       $son_1st_le0_0 = 0;
       break;
      } else {
       ___assert_func(4408, 836, 7616, 3640);
       return 0;
      }
     } else {
      $lma_nds_used_num_ge1_56 = $this + 28 | 0;
      __ZN10ime_pinyin11DictBuilder14set_son_offsetEPNS_10LmaNodeGE1Ej(0, $parent, HEAP32[$lma_nds_used_num_ge1_56 >> 2] | 0);
      $19 = HEAP32[$this + 20 >> 2] | 0;
      $20 = HEAP32[$lma_nds_used_num_ge1_56 >> 2] | 0;
      HEAP32[$lma_nds_used_num_ge1_56 >> 2] = $20 + $inc12;
      if ($inc12 >>> 0 < 256) {
       HEAP8[$parent + 6 | 0] = $inc12 & 255;
       $son_1st_ge1_0 = $19 + ($20 * 10 | 0) | 0;
       $son_1st_le0_0 = 0;
       break;
      } else {
       ___assert_func(4408, 845, 7616, 3528);
       return 0;
      }
     }
    }
   } while (0);
   $22 = HEAP32[$lemma_arr_ >> 2] | 0;
   $23 = HEAP16[$22 + ($item_start * 124 | 0) + 42 + ($level << 1) >> 1] | 0;
   $add74 = $level + 1 | 0;
   $_ = (HEAP16[$22 + ($item_start * 124 | 0) + 42 + ($add74 << 1) >> 1] | 0) == 0 | 0;
   $homo_num_1_neg171 = -$_ | 0;
   L512 : do {
    if ($add >>> 0 < $item_end >>> 0) {
     $homo_idx_num_eq1_ = $this + 36 | 0;
     $homo_idx_num_gt1_ = $this + 40 | 0;
     $arrayidx170 = $this + 156 + ($level << 2) | 0;
     $homo_idx_buf_ = $this + 32 | 0;
     $homo_idx_num_eq1_123 = $this + 36 | 0;
     $homo_idx_num_gt1_125 = $this + 40 | 0;
     $arrayidx153 = $this + 92 + ($level << 2) | 0;
     $arrayidx159 = $this + 284 + ($level << 2) | 0;
     $homo_idx_num_eq1_115 = $this + 36 | 0;
     $homo_idx_num_gt1_116 = $this + 40 | 0;
     $allson_noson_0_off0173 = 1;
     $son_pos_0174 = 0;
     $homo_num_1175 = $_;
     $item_start_next_0177 = $item_start;
     $i81_0180 = $add;
     $spl_idx_node_2182 = $23;
     $homo_num_1_neg183 = $homo_num_1_neg171;
     while (1) {
      $25 = HEAP32[$lemma_arr_ >> 2] | 0;
      $26 = HEAP16[$25 + ($i81_0180 * 124 | 0) + 42 + ($level << 1) >> 1] | 0;
      if ($26 << 16 >> 16 == $spl_idx_node_2182 << 16 >> 16) {
       $spl_idx_node_3 = $spl_idx_node_2182;
       $item_start_next_1 = $item_start_next_0177;
       $homo_num_3 = ((HEAP16[$25 + ($i81_0180 * 124 | 0) + 42 + ($add74 << 1) >> 1] | 0) == 0) + $homo_num_1175 | 0;
       $son_pos_1 = $son_pos_0174;
       $allson_noson_2_off0 = $allson_noson_0_off0173;
      } else {
       if ($cmp30) {
        $add_ptr107 = $son_1st_le0_0 + ($son_pos_0174 << 4) | 0;
        HEAP16[$son_1st_le0_0 + ($son_pos_0174 << 4) + 8 >> 1] = $spl_idx_node_2182;
        HEAP32[$son_1st_le0_0 + ($son_pos_0174 << 4) + 4 >> 2] = (HEAP32[$homo_idx_num_gt1_ >> 2] | 0) + (HEAP32[$homo_idx_num_eq1_ >> 2] | 0);
        HEAP32[$add_ptr107 >> 2] = 0;
        HEAP32[$homo_idx_num_eq1_ >> 2] = (HEAP32[$homo_idx_num_eq1_ >> 2] | 0) + $homo_num_1175;
        $node_cur_ge1_0 = 0;
        $node_cur_le0_0 = $add_ptr107;
       } else {
        $add_ptr113 = $son_1st_ge1_0 + ($son_pos_0174 * 10 | 0) | 0;
        HEAP16[$son_1st_ge1_0 + ($son_pos_0174 * 10 | 0) + 4 >> 1] = $spl_idx_node_2182;
        __ZN10ime_pinyin11DictBuilder22set_homo_id_buf_offsetEPNS_10LmaNodeGE1Ej(0, $add_ptr113, (HEAP32[$homo_idx_num_gt1_116 >> 2] | 0) + (HEAP32[$homo_idx_num_eq1_115 >> 2] | 0) | 0);
        __ZN10ime_pinyin11DictBuilder14set_son_offsetEPNS_10LmaNodeGE1Ej(0, $add_ptr113, 0);
        HEAP32[$homo_idx_num_gt1_116 >> 2] = (HEAP32[$homo_idx_num_gt1_116 >> 2] | 0) + $homo_num_1175;
        $node_cur_ge1_0 = $add_ptr113;
        $node_cur_le0_0 = 0;
       }
       if (($homo_num_1175 | 0) != 0) {
        $34 = HEAP32[$homo_idx_buf_ >> 2] | 0;
        $35 = HEAP32[$homo_idx_num_eq1_123 >> 2] | 0;
        $36 = HEAP32[$homo_idx_num_gt1_125 >> 2] | 0;
        if ($cmp30) {
         if ($homo_num_1175 >>> 0 >= 65536) {
          label = 444;
          break;
         }
         HEAP16[$node_cur_le0_0 + 12 >> 1] = $homo_num_1175 & 65535;
        } else {
         if ($homo_num_1175 >>> 0 >= 256) {
          label = 447;
          break;
         }
         HEAP8[$node_cur_ge1_0 + 7 | 0] = $homo_num_1175 & 255;
        }
        if (($homo_num_1175 | 0) != 0) {
         $add_ptr126_sum = $35 + $homo_num_1_neg183 + $36 | 0;
         $homo_pos_0155 = 0;
         do {
          HEAP32[$34 + ($add_ptr126_sum + $homo_pos_0155 << 2) >> 2] = HEAP32[(HEAP32[$lemma_arr_ >> 2] | 0) + (($homo_pos_0155 + $item_start_next_0177 | 0) * 124 | 0) + 4 >> 2];
          $homo_pos_0155 = $homo_pos_0155 + 1 | 0;
         } while ($homo_pos_0155 >>> 0 < $homo_num_1175 >>> 0);
        }
        if ($homo_num_1175 >>> 0 > (HEAP32[$arrayidx153 >> 2] | 0) >>> 0) {
         HEAP32[$arrayidx153 >> 2] = $homo_num_1175;
        }
        HEAP32[$arrayidx159 >> 2] = (HEAP32[$arrayidx159 >> 2] | 0) + $homo_num_1175;
       }
       if (($i81_0180 - $item_start_next_0177 | 0) >>> 0 > $homo_num_1175 >>> 0) {
        if ($cmp30) {
         $next_parent_0 = $node_cur_le0_0;
        } else {
         $next_parent_0 = $node_cur_ge1_0;
        }
        $add168 = $item_start_next_0177 + $homo_num_1175 | 0;
        __ZN10ime_pinyin11DictBuilder16construct_subsetEPvPNS_10LemmaEntryEjjj($this, $next_parent_0, $lemma_arr, $add168, $i81_0180, $add74) | 0;
        HEAP32[$arrayidx170 >> 2] = (HEAP32[$arrayidx170 >> 2] | 0) + 1;
        $allson_noson_1_off0 = 0;
       } else {
        $allson_noson_1_off0 = $allson_noson_0_off0173;
       }
       $spl_idx_node_3 = $26;
       $item_start_next_1 = $i81_0180;
       $homo_num_3 = (HEAP16[$25 + ($i81_0180 * 124 | 0) + 42 + ($add74 << 1) >> 1] | 0) == 0 | 0;
       $son_pos_1 = $son_pos_0174 + 1 | 0;
       $allson_noson_2_off0 = $allson_noson_1_off0;
      }
      $inc183 = $i81_0180 + 1 | 0;
      $homo_num_1_neg = -$homo_num_3 | 0;
      if ($inc183 >>> 0 < $item_end >>> 0) {
       $allson_noson_0_off0173 = $allson_noson_2_off0;
       $son_pos_0174 = $son_pos_1;
       $homo_num_1175 = $homo_num_3;
       $item_start_next_0177 = $item_start_next_1;
       $i81_0180 = $inc183;
       $spl_idx_node_2182 = $spl_idx_node_3;
       $homo_num_1_neg183 = $homo_num_1_neg;
      } else {
       $allson_noson_0_off0_lcssa = $allson_noson_2_off0;
       $son_pos_0_lcssa = $son_pos_1;
       $homo_num_1_lcssa = $homo_num_3;
       $item_start_next_0_lcssa = $item_start_next_1;
       $spl_idx_node_2_lcssa = $spl_idx_node_3;
       $homo_num_1_neg_lcssa = $homo_num_1_neg;
       break L512;
      }
     }
     if ((label | 0) == 444) {
      ___assert_func(4408, 893, 7616, 3376);
      return 0;
     } else if ((label | 0) == 447) {
      ___assert_func(4408, 896, 7616, 3264);
      return 0;
     }
    } else {
     $allson_noson_0_off0_lcssa = 1;
     $son_pos_0_lcssa = 0;
     $homo_num_1_lcssa = $_;
     $item_start_next_0_lcssa = $item_start;
     $spl_idx_node_2_lcssa = $23;
     $homo_num_1_neg_lcssa = $homo_num_1_neg171;
    }
   } while (0);
   if ($cmp30) {
    $add_ptr189 = $son_1st_le0_0 + ($son_pos_0_lcssa << 4) | 0;
    HEAP16[$son_1st_le0_0 + ($son_pos_0_lcssa << 4) + 8 >> 1] = $spl_idx_node_2_lcssa;
    $homo_idx_num_eq1_191 = $this + 36 | 0;
    HEAP32[$son_1st_le0_0 + ($son_pos_0_lcssa << 4) + 4 >> 2] = (HEAP32[$this + 40 >> 2] | 0) + (HEAP32[$homo_idx_num_eq1_191 >> 2] | 0);
    HEAP32[$add_ptr189 >> 2] = 0;
    HEAP32[$homo_idx_num_eq1_191 >> 2] = (HEAP32[$homo_idx_num_eq1_191 >> 2] | 0) + $homo_num_1_lcssa;
    $node_cur_ge1186_0 = 0;
    $node_cur_le0185_0 = $add_ptr189;
   } else {
    $add_ptr199 = $son_1st_ge1_0 + ($son_pos_0_lcssa * 10 | 0) | 0;
    HEAP16[$son_1st_ge1_0 + ($son_pos_0_lcssa * 10 | 0) + 4 >> 1] = $spl_idx_node_2_lcssa;
    $homo_idx_num_gt1_202 = $this + 40 | 0;
    __ZN10ime_pinyin11DictBuilder22set_homo_id_buf_offsetEPNS_10LmaNodeGE1Ej(0, $add_ptr199, (HEAP32[$homo_idx_num_gt1_202 >> 2] | 0) + (HEAP32[$this + 36 >> 2] | 0) | 0);
    __ZN10ime_pinyin11DictBuilder14set_son_offsetEPNS_10LmaNodeGE1Ej(0, $add_ptr199, 0);
    HEAP32[$homo_idx_num_gt1_202 >> 2] = (HEAP32[$homo_idx_num_gt1_202 >> 2] | 0) + $homo_num_1_lcssa;
    $node_cur_ge1186_0 = $add_ptr199;
    $node_cur_le0185_0 = 0;
   }
   if (($homo_num_1_lcssa | 0) != 0) {
    $51 = HEAP32[$this + 32 >> 2] | 0;
    $52 = HEAP32[$this + 36 >> 2] | 0;
    $53 = HEAP32[$this + 40 >> 2] | 0;
    do {
     if ($cmp30) {
      if ($homo_num_1_lcssa >>> 0 < 65536) {
       HEAP16[$node_cur_le0185_0 + 12 >> 1] = $homo_num_1_lcssa & 65535;
       break;
      } else {
       ___assert_func(4408, 962, 7616, 3376);
       return 0;
      }
     } else {
      if ($homo_num_1_lcssa >>> 0 < 256) {
       HEAP8[$node_cur_ge1186_0 + 7 | 0] = $homo_num_1_lcssa & 255;
       break;
      } else {
       ___assert_func(4408, 965, 7616, 3264);
       return 0;
      }
     }
    } while (0);
    if (($homo_num_1_lcssa | 0) != 0) {
     $add_ptr214_sum = $52 + $homo_num_1_neg_lcssa + $53 | 0;
     $homo_pos233_0153 = 0;
     do {
      HEAP32[$51 + ($add_ptr214_sum + $homo_pos233_0153 << 2) >> 2] = HEAP32[$lemma_arr + (($homo_pos233_0153 + $item_start_next_0_lcssa | 0) * 124 | 0) + 4 >> 2];
      $homo_pos233_0153 = $homo_pos233_0153 + 1 | 0;
     } while ($homo_pos233_0153 >>> 0 < $homo_num_1_lcssa >>> 0);
    }
    $arrayidx245 = $this + 92 + ($level << 2) | 0;
    if ($homo_num_1_lcssa >>> 0 > (HEAP32[$arrayidx245 >> 2] | 0) >>> 0) {
     HEAP32[$arrayidx245 >> 2] = $homo_num_1_lcssa;
    }
    $arrayidx252 = $this + 284 + ($level << 2) | 0;
    HEAP32[$arrayidx252 >> 2] = (HEAP32[$arrayidx252 >> 2] | 0) + $homo_num_1_lcssa;
   }
   do {
    if (($item_end - $item_start_next_0_lcssa | 0) >>> 0 > $homo_num_1_lcssa >>> 0) {
     if ($cmp30) {
      $next_parent258_0 = $node_cur_le0185_0;
     } else {
      $next_parent258_0 = $node_cur_ge1186_0;
     }
     $add263 = $item_start_next_0_lcssa + $homo_num_1_lcssa | 0;
     __ZN10ime_pinyin11DictBuilder16construct_subsetEPvPNS_10LemmaEntryEjjj($this, $next_parent258_0, $lemma_arr, $add263, $item_end, $add74) | 0;
     $arrayidx267 = $this + 156 + ($level << 2) | 0;
     HEAP32[$arrayidx267 >> 2] = (HEAP32[$arrayidx267 >> 2] | 0) + 1;
    } else {
     if (!$allson_noson_0_off0_lcssa) {
      break;
     }
     $arrayidx271 = $this + 220 + ($level << 2) | 0;
     HEAP32[$arrayidx271 >> 2] = (HEAP32[$arrayidx271 >> 2] | 0) + 1;
     $arrayidx273 = $this + 252 + ($level << 2) | 0;
     HEAP32[$arrayidx273 >> 2] = (HEAP32[$arrayidx273 >> 2] | 0) + $inc12;
    }
   } while (0);
   if (($son_pos_0_lcssa + 1 | 0) == ($inc12 | 0)) {
    $retval_0 = 1;
    return $retval_0 | 0;
   } else {
    ___assert_func(4408, 1003, 7616, 3144);
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12AtomDictBaseC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8368;
   return;
  }
  function __ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, $id_offset) {
   $this = $this | 0;
   $id_offset = $id_offset | 0;
   var $mul = 0, $0 = 0;
   $mul = $id_offset * 3 | 0;
   $0 = HEAP32[$this + 32 >> 2] | 0;
   return HEAPU8[(HEAP32[$this + 32 >> 2] | 0) + $mul | 0] | 0 | (HEAPU8[$0 + ($mul + 1) | 0] | 0 | (HEAPU8[$0 + ($mul + 2) | 0] | 0) << 8) << 8 | 0;
  }
  function __ZN10ime_pinyin11DictBuilder10stat_printEv($this) {
   $this = $this | 0;
   var sp = 0;
   sp = STACKTOP;
   _puts(72) | 0;
   _puts(48) | 0;
   _printf(2936, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 60 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 64 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 68 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 72 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 76 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 80 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 84 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 88 >> 2], tempInt) | 0) | 0;
   _puts(40) | 0;
   _printf(2552, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 92 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 96 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 100 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 104 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 108 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 112 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 116 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 120 >> 2], tempInt) | 0) | 0;
   _putchar(10) | 0;
   _printf(2408, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 124 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 128 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 132 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 136 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 140 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 144 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 148 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 152 >> 2], tempInt) | 0) | 0;
   _puts(32) | 0;
   _printf(2320, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 156 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 160 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 164 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 168 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 172 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 176 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 180 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 184 >> 2], tempInt) | 0) | 0;
   _putchar(10) | 0;
   _printf(2264, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 188 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 192 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 196 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 200 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 204 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 208 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 212 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 216 >> 2], tempInt) | 0) | 0;
   _puts(24) | 0;
   _printf(2208, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 220 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 224 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 228 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 232 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 236 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 240 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 244 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 248 >> 2], tempInt) | 0) | 0;
   _puts(16) | 0;
   _printf(2080, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 252 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 256 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 260 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 264 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 268 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 272 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 276 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 280 >> 2], tempInt) | 0) | 0;
   _puts(8) | 0;
   _printf(2032, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 284 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 288 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 292 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 296 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 300 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 304 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 308 >> 2], tempInt) | 0) | 0;
   _printf(2840, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 312 >> 2], tempInt) | 0) | 0;
   _putchar(10) | 0;
   _printf(1936, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 316 >> 2], tempInt) | 0) | 0;
   _printf(1800, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP32[$this + 320 >> 2], tempInt) | 0) | 0;
   _printf(1656, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = (HEAP32[$this + 324 >> 2] | 0) + 1, tempInt) | 0) | 0;
   STACKTOP = sp;
   return;
  }
  function __ZN10ime_pinyin8DictTrieC2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin12AtomDictBaseC2Ev($this | 0);
   HEAP32[$this >> 2] = 8272;
   HEAP32[$this + 8 >> 2] = __ZN10ime_pinyin12SpellingTrie14get_cpinstanceEv() | 0;
   HEAP32[$this + 4 >> 2] = 0;
   HEAP32[$this + 56 >> 2] = 0;
   _memset($this + 12 | 0, 0, 40);
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[$this >> 2] | 0) + 20 >> 2] & 15]($this, 0, 1);
   return;
  }
  function __ZN10ime_pinyin8DictTrieD0Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin8DictTrieD2Ev($this);
   __ZdlPv($this);
   return;
  }
  function __ZN10ime_pinyin8DictTrieD2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8272;
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   return;
  }
  function __ZN10ime_pinyin8DictTrie13free_resourceEb($this, $free_dict_list) {
   $this = $this | 0;
   $free_dict_list = $free_dict_list | 0;
   var $root_ = 0, $0 = 0, $splid_le0_index_ = 0, $2 = 0, $nodes_ge1_ = 0, $4 = 0, $dict_list_ = 0, $6 = 0, $parsing_marks_ = 0, $10 = 0, $mile_stones_ = 0, $12 = 0, $14 = 0, $vtable = 0, $vfn = 0, $15 = 0;
   $root_ = $this + 12 | 0;
   $0 = HEAP32[$root_ >> 2] | 0;
   if (($0 | 0) != 0) {
    _free($0);
   }
   HEAP32[$root_ >> 2] = 0;
   $splid_le0_index_ = $this + 20 | 0;
   $2 = HEAP32[$splid_le0_index_ >> 2] | 0;
   if (($2 | 0) != 0) {
    _free($2);
   }
   HEAP32[$splid_le0_index_ >> 2] = 0;
   $nodes_ge1_ = $this + 16 | 0;
   $4 = HEAP32[$nodes_ge1_ >> 2] | 0;
   if (($4 | 0) != 0) {
    _free($4);
   }
   HEAP32[$nodes_ge1_ >> 2] = 0;
   if ($free_dict_list) {
    $dict_list_ = $this + 4 | 0;
    $6 = HEAP32[$dict_list_ >> 2] | 0;
    if (($6 | 0) != 0) {
     __ZN10ime_pinyin8DictListD2Ev($6);
     __ZdlPv($6 | 0);
    }
    HEAP32[$dict_list_ >> 2] = 0;
   }
   $parsing_marks_ = $this + 48 | 0;
   $10 = HEAP32[$parsing_marks_ >> 2] | 0;
   if (($10 | 0) != 0) {
    __ZdaPv($10 | 0);
   }
   HEAP32[$parsing_marks_ >> 2] = 0;
   $mile_stones_ = $this + 56 | 0;
   $12 = HEAP32[$mile_stones_ >> 2] | 0;
   if (($12 | 0) == 0) {
    HEAP32[$mile_stones_ >> 2] = 0;
    $14 = $this;
    $vtable = HEAP32[$14 >> 2] | 0;
    $vfn = $vtable + 20 | 0;
    $15 = HEAP32[$vfn >> 2] | 0;
    FUNCTION_TABLE_viii[$15 & 15]($this, 0, 1);
    return;
   }
   __ZdaPv($12);
   HEAP32[$mile_stones_ >> 2] = 0;
   $14 = $this;
   $vtable = HEAP32[$14 >> 2] | 0;
   $vfn = $vtable + 20 | 0;
   $15 = HEAP32[$vfn >> 2] | 0;
   FUNCTION_TABLE_viii[$15 & 15]($this, 0, 1);
   return;
  }
  function __ZN10ime_pinyin8DictTrie10build_dictEPKcS2_($this, $fn_raw, $fn_validhzs) {
   $this = $this | 0;
   $fn_raw = $fn_raw | 0;
   $fn_validhzs = $fn_validhzs | 0;
   var $0 = 0;
   $0 = __Znwj(328) | 0;
   __ZN10ime_pinyin11DictBuilderC2Ev($0);
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   return __ZN10ime_pinyin11DictBuilder10build_dictEPKcS2_PNS_8DictTrieE($0, $fn_raw, $fn_validhzs, $this) | 0;
  }
  function __ZN10ime_pinyin8DictTrie9save_dictEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $lma_node_num_le0_ = 0, $lma_node_num_ge1_ = 0, $lma_idx_buf_len_ = 0, $call18 = 0, $call24 = 0, $call30 = 0, $retval_0 = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_node_num_le0_ = $this + 24 | 0;
   if ((_fwrite($lma_node_num_le0_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_node_num_ge1_ = $this + 28 | 0;
   if ((_fwrite($lma_node_num_ge1_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_idx_buf_len_ = $this + 36 | 0;
   if ((_fwrite($lma_idx_buf_len_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($this + 44 | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call18 = _fwrite(HEAP32[$this + 12 >> 2] | 0, 16, HEAP32[$lma_node_num_le0_ >> 2] | 0, $fp | 0) | 0;
   if (($call18 | 0) != (HEAP32[$lma_node_num_le0_ >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call24 = _fwrite(HEAP32[$this + 16 >> 2] | 0, 10, HEAP32[$lma_node_num_ge1_ >> 2] | 0, $fp | 0) | 0;
   if (($call24 | 0) != (HEAP32[$lma_node_num_ge1_ >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call30 = _fwrite(HEAP32[$this + 32 >> 2] | 0, 1, HEAP32[$lma_idx_buf_len_ >> 2] | 0, $fp | 0) | 0;
   $retval_0 = ($call30 | 0) == (HEAP32[$lma_idx_buf_len_ >> 2] | 0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie9save_dictEPKc($this, $filename) {
   $this = $this | 0;
   $filename = $filename | 0;
   var $dict_list_ = 0, $call = 0, $call6 = 0, $call7 = 0, $retval_0 = 0;
   if (($filename | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 12 >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $dict_list_ = $this + 4 | 0;
   if ((HEAP32[$dict_list_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $call6 = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $call7 = _fopen($filename | 0, 1648) | 0;
   if (($call7 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   do {
    if (__ZN10ime_pinyin12SpellingTrie13save_spl_trieEP7__sFILE($call, $call7) | 0) {
     if (!(__ZN10ime_pinyin8DictList9save_listEP7__sFILE(HEAP32[$dict_list_ >> 2] | 0, $call7) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin8DictTrie9save_dictEP7__sFILE($this, $call7) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin5NGram10save_ngramEP7__sFILE($call6, $call7) | 0)) {
      break;
     }
     _fclose($call7 | 0) | 0;
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   _fclose($call7 | 0) | 0;
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie9load_dictEPKcjj($this, $filename, $start_id, $end_id) {
   $this = $this | 0;
   $filename = $filename | 0;
   $start_id = $start_id | 0;
   $end_id = $end_id | 0;
   var $call = 0, $call6 = 0, $0 = 0, $dict_list_ = 0, $call12 = 0, $call13 = 0, $retval_0 = 0;
   if (!(($filename | 0) != 0 & $end_id >>> 0 > $start_id >>> 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = _fopen($filename | 0, 1464) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   $call6 = __Znwj(128) | 0;
   $0 = $call6;
   __ZN10ime_pinyin8DictListC2Ev($0);
   $dict_list_ = $this + 4 | 0;
   HEAP32[$dict_list_ >> 2] = $0;
   if (($call6 | 0) == 0) {
    _fclose($call | 0) | 0;
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call12 = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $call13 = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   do {
    if (__ZN10ime_pinyin12SpellingTrie13load_spl_trieEP7__sFILE($call12, $call) | 0) {
     if (!(__ZN10ime_pinyin8DictList9load_listEP7__sFILE(HEAP32[$dict_list_ >> 2] | 0, $call) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin8DictTrie9load_dictEP7__sFILE($this, $call) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin5NGram10load_ngramEP7__sFILE($call13, $call) | 0)) {
      break;
     }
     if ((HEAP32[$this + 40 >> 2] | 0) >>> 0 > (1 - $start_id + $end_id | 0) >>> 0) {
      break;
     }
     _fclose($call | 0) | 0;
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   _fclose($call | 0) | 0;
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie12load_dict_fdEilljj($this, $sys_fd, $start_offset, $length, $start_id, $end_id) {
   $this = $this | 0;
   $sys_fd = $sys_fd | 0;
   $start_offset = $start_offset | 0;
   $length = $length | 0;
   $start_id = $start_id | 0;
   $end_id = $end_id | 0;
   var $call = 0, $call13 = 0, $0 = 0, $dict_list_ = 0, $call19 = 0, $call20 = 0, $retval_0 = 0;
   if (!(($length | 0) > 0 & ($start_offset | 0) > -1 & $end_id >>> 0 > $start_id >>> 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = _fdopen($sys_fd | 0, 1464) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fseek($call | 0, $start_offset | 0, 0) | 0) == -1) {
    _fclose($call | 0) | 0;
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   $call13 = __Znwj(128) | 0;
   $0 = $call13;
   __ZN10ime_pinyin8DictListC2Ev($0);
   $dict_list_ = $this + 4 | 0;
   HEAP32[$dict_list_ >> 2] = $0;
   if (($call13 | 0) == 0) {
    _fclose($call | 0) | 0;
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call19 = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $call20 = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   do {
    if (__ZN10ime_pinyin12SpellingTrie13load_spl_trieEP7__sFILE($call19, $call) | 0) {
     if (!(__ZN10ime_pinyin8DictList9load_listEP7__sFILE(HEAP32[$dict_list_ >> 2] | 0, $call) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin8DictTrie9load_dictEP7__sFILE($this, $call) | 0)) {
      break;
     }
     if (!(__ZN10ime_pinyin5NGram10load_ngramEP7__sFILE($call20, $call) | 0)) {
      break;
     }
     if ((_ftell($call | 0) | 0) < ($length + $start_offset | 0)) {
      break;
     }
     if ((HEAP32[$this + 40 >> 2] | 0) >>> 0 > (1 - $start_id + $end_id | 0) >>> 0) {
      break;
     }
     _fclose($call | 0) | 0;
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 1);
   _fclose($call | 0) | 0;
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie15fill_lpi_bufferEPNS_10LmaPsbItemEjPNS_10LmaNodeLE0E($this, $lpi_items, $lpi_max, $node) {
   $this = $this | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $node = $node | 0;
   var $call = 0, $homo_idx_buf_off = 0, $num_of_homo = 0, $lpi_num_0 = 0, $bf_value = 0, $2 = 0, $inc = 0, $lpi_num_1 = 0, label = 0;
   $call = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $homo_idx_buf_off = $node + 4 | 0;
   $num_of_homo = $node + 12 | 0;
   $lpi_num_0 = 0;
   while (1) {
    if ($lpi_num_0 >>> 0 >= (HEAPU16[$num_of_homo >> 1] | 0) >>> 0) {
     $lpi_num_1 = $lpi_num_0;
     label = 602;
     break;
    }
    $bf_value = (__ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, (HEAP32[$homo_idx_buf_off >> 2] | 0) + $lpi_num_0 | 0) | 0) & 16777215;
    $2 = $lpi_items + ($lpi_num_0 << 3) | 0;
    HEAP32[$2 >> 2] = $bf_value | HEAP32[$2 >> 2] & -268435456 | 16777216;
    HEAP16[$lpi_items + ($lpi_num_0 << 3) + 4 >> 1] = ~~+__ZN10ime_pinyin5NGram11get_uni_psbEj($call, $bf_value);
    $inc = $lpi_num_0 + 1 | 0;
    if ($inc >>> 0 < $lpi_max >>> 0) {
     $lpi_num_0 = $inc;
    } else {
     $lpi_num_1 = $inc;
     label = 601;
     break;
    }
   }
   if ((label | 0) == 602) {
    return $lpi_num_1 | 0;
   } else if ((label | 0) == 601) {
    return $lpi_num_1 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie9load_dictEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $lma_node_num_le0_ = 0, $lma_node_num_ge1_ = 0, $lma_idx_buf_len_ = 0, $top_lmas_num_ = 0, $root_ = 0, $nodes_ge1_ = 0, $lma_idx_buf_ = 0, $call29 = 0, $add = 0, $splid_le0_index_ = 0, $parsing_marks_ = 0, $mile_stones_ = 0, $18 = 0, $call57 = 0, $call64 = 0, $call71 = 0, $i_034 = 0, $last_pos_033_off0 = 0, $last_splid_032 = 0, $36 = 0, $last_pos_0_lcssa = 0, $last_splid_0_lcssa = 0, $conv10624 = 0, $add107 = 0, $conv117 = 0, $splid_030 = 0, $inc = 0, $39 = 0, $_lcssa = 0, $42 = 0, $inc99 = 0, $conv10627 = 0, $splid101_026 = 0, $sub111 = 0, $splid101_0 = 0, $conv106 = 0, $retval_0 = 0, label = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_node_num_le0_ = $this + 24 | 0;
   if ((_fread($lma_node_num_le0_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_node_num_ge1_ = $this + 28 | 0;
   if ((_fread($lma_node_num_ge1_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_idx_buf_len_ = $this + 36 | 0;
   if ((_fread($lma_idx_buf_len_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $top_lmas_num_ = $this + 44 | 0;
   if ((_fread($top_lmas_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$top_lmas_num_ >> 2] | 0) >>> 0 >= (HEAP32[$lma_idx_buf_len_ >> 2] | 0) >>> 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 0);
   $root_ = $this + 12 | 0;
   HEAP32[$root_ >> 2] = _malloc(HEAP32[$lma_node_num_le0_ >> 2] << 4) | 0;
   $nodes_ge1_ = $this + 16 | 0;
   HEAP32[$nodes_ge1_ >> 2] = _malloc((HEAP32[$lma_node_num_ge1_ >> 2] | 0) * 10 | 0) | 0;
   $lma_idx_buf_ = $this + 32 | 0;
   HEAP32[$lma_idx_buf_ >> 2] = _malloc(HEAP32[$lma_idx_buf_len_ >> 2] | 0) | 0;
   HEAP32[$this + 40 >> 2] = ((HEAP32[$lma_idx_buf_len_ >> 2] | 0) >>> 0) / 3 | 0;
   $call29 = __ZN10ime_pinyin12SpellingTrie16get_spelling_numEv(__ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0) | 0;
   $add = $call29 + 1 | 0;
   if ((HEAP32[$lma_node_num_le0_ >> 2] | 0) >>> 0 > $add >>> 0) {
    ___assert_func(3680, 196, 4672, 2640);
    return 0;
   }
   $splid_le0_index_ = $this + 20 | 0;
   HEAP32[$splid_le0_index_ >> 2] = _malloc($add << 1) | 0;
   $parsing_marks_ = $this + 48 | 0;
   HEAP32[$parsing_marks_ >> 2] = __Znaj(2400) | 0;
   $mile_stones_ = $this + 56 | 0;
   HEAP32[$mile_stones_ >> 2] = __Znaj(400) | 0;
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[$this >> 2] | 0) + 20 >> 2] & 15]($this, 0, 1);
   $18 = HEAP32[$root_ >> 2] | 0;
   do {
    if (($18 | 0) != 0) {
     if ((HEAP32[$nodes_ge1_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$lma_idx_buf_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$splid_le0_index_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$parsing_marks_ >> 2] | 0) == 0) {
      break;
     }
     if ((HEAP32[$mile_stones_ >> 2] | 0) == 0) {
      break;
     }
     $call57 = _fread($18 | 0, 16, HEAP32[$lma_node_num_le0_ >> 2] | 0, $fp | 0) | 0;
     if (($call57 | 0) != (HEAP32[$lma_node_num_le0_ >> 2] | 0)) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $call64 = _fread(HEAP32[$nodes_ge1_ >> 2] | 0, 10, HEAP32[$lma_node_num_ge1_ >> 2] | 0, $fp | 0) | 0;
     if (($call64 | 0) != (HEAP32[$lma_node_num_ge1_ >> 2] | 0)) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $call71 = _fread(HEAP32[$lma_idx_buf_ >> 2] | 0, 1, HEAP32[$lma_idx_buf_len_ >> 2] | 0, $fp | 0) | 0;
     if (($call71 | 0) != (HEAP32[$lma_idx_buf_len_ >> 2] | 0)) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     if ((HEAP32[$lma_node_num_le0_ >> 2] | 0) >>> 0 > 1) {
      $last_splid_032 = 30;
      $last_pos_033_off0 = 0;
      $i_034 = 1;
      while (1) {
       $36 = HEAP16[(HEAP32[$root_ >> 2] | 0) + ($i_034 << 4) + 8 >> 1] | 0;
       if (($last_splid_032 & 65535) < ($36 & 65535)) {
        $splid_030 = $last_splid_032;
        while (1) {
         HEAP16[(HEAP32[$splid_le0_index_ >> 2] | 0) + (($splid_030 & 65535) - 30 << 1) >> 1] = $last_pos_033_off0;
         $inc = $splid_030 + 1 & 65535;
         $39 = HEAP16[(HEAP32[$root_ >> 2] | 0) + ($i_034 << 4) + 8 >> 1] | 0;
         if (($inc & 65535) < ($39 & 65535)) {
          $splid_030 = $inc;
         } else {
          $_lcssa = $39;
          break;
         }
        }
       } else {
        $_lcssa = $36;
       }
       HEAP16[(HEAP32[$splid_le0_index_ >> 2] | 0) + (($_lcssa & 65535) - 30 << 1) >> 1] = $i_034 & 65535;
       $42 = HEAP16[(HEAP32[$root_ >> 2] | 0) + ($i_034 << 4) + 8 >> 1] | 0;
       $inc99 = $i_034 + 1 | 0;
       if ($inc99 >>> 0 < (HEAP32[$lma_node_num_le0_ >> 2] | 0) >>> 0) {
        $last_splid_032 = $42;
        $last_pos_033_off0 = $i_034 & 65535;
        $i_034 = $inc99;
       } else {
        break;
       }
      }
      $last_splid_0_lcssa = $42 + 1 & 65535;
      $last_pos_0_lcssa = $i_034;
     } else {
      $last_splid_0_lcssa = 31;
      $last_pos_0_lcssa = 0;
     }
     $conv10624 = $last_splid_0_lcssa & 65535;
     $add107 = $call29 + 31 | 0;
     if ($conv10624 >>> 0 >= $add107 >>> 0) {
      $retval_0 = 1;
      return $retval_0 | 0;
     }
     $conv117 = $last_pos_0_lcssa + 1 & 65535;
     $splid101_026 = $last_splid_0_lcssa;
     $conv10627 = $conv10624;
     while (1) {
      $sub111 = $conv10627 - 30 | 0;
      if ($sub111 >>> 0 >= $add >>> 0) {
       label = 629;
       break;
      }
      HEAP16[(HEAP32[$splid_le0_index_ >> 2] | 0) + ($sub111 << 1) >> 1] = $conv117;
      $splid101_0 = $splid101_026 + 1 & 65535;
      $conv106 = $splid101_0 & 65535;
      if ($conv106 >>> 0 < $add107 >>> 0) {
       $splid101_026 = $splid101_0;
       $conv10627 = $conv106;
      } else {
       $retval_0 = 1;
       label = 642;
       break;
      }
     }
     if ((label | 0) == 629) {
      ___assert_func(3680, 238, 4672, 1696);
      return 0;
     } else if ((label | 0) == 642) {
      return $retval_0 | 0;
     }
    }
   } while (0);
   __ZN10ime_pinyin8DictTrie13free_resourceEb($this, 0);
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie16reset_milestonesEtt($this, $from_step, $from_handle) {
   $this = $this | 0;
   $from_step = $from_step | 0;
   $from_handle = $from_handle | 0;
   var $mile_stones_pos_5 = 0;
   if ($from_step << 16 >> 16 == 0) {
    HEAP16[$this + 52 >> 1] = 0;
    HEAP16[$this + 60 >> 1] = 1;
    return;
   }
   if ($from_handle << 16 >> 16 == 0) {
    return;
   }
   $mile_stones_pos_5 = $this + 60 | 0;
   if ((HEAPU16[$mile_stones_pos_5 >> 1] | 0) <= ($from_handle & 65535)) {
    return;
   }
   HEAP16[$mile_stones_pos_5 >> 1] = $from_handle;
   HEAP16[$this + 52 >> 1] = HEAP16[(HEAP32[$this + 56 >> 2] | 0) + (($from_handle & 65535) << 2) >> 1] | 0;
   return;
  }
  function __ZN10ime_pinyin8DictTrie23get_homo_idx_buf_offsetEPKNS_10LmaNodeGE1E($this, $node) {
   $this = $this | 0;
   $node = $node | 0;
   return (HEAPU8[$node + 9 | 0] | 0) << 16 | (HEAPU16[$node + 2 >> 1] | 0) | 0;
  }
  function __ZN10ime_pinyin8DictTrie14get_son_offsetEPKNS_10LmaNodeGE1E($this, $node) {
   $this = $this | 0;
   $node = $node | 0;
   return (HEAPU8[$node + 8 | 0] | 0) << 16 | (HEAPU16[$node >> 1] | 0) | 0;
  }
  function __ZN10ime_pinyin8DictTrie15fill_lpi_bufferEPNS_10LmaPsbItemEjjPNS_10LmaNodeGE1Et($this, $lpi_items, $lpi_max, $homo_buf_off, $node, $lma_len) {
   $this = $this | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $homo_buf_off = $homo_buf_off | 0;
   $node = $node | 0;
   $lma_len = $lma_len | 0;
   var $call = 0, $num_of_homo = 0, $0 = 0, $lpi_num_0 = 0, $bf_value = 0, $2 = 0, $inc = 0, $lpi_num_1 = 0, label = 0;
   $call = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $num_of_homo = $node + 7 | 0;
   $0 = ($lma_len & 65535) << 24 & 251658240;
   $lpi_num_0 = 0;
   while (1) {
    if ($lpi_num_0 >>> 0 >= (HEAPU8[$num_of_homo] | 0) >>> 0) {
     $lpi_num_1 = $lpi_num_0;
     label = 661;
     break;
    }
    $bf_value = (__ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, $lpi_num_0 + $homo_buf_off | 0) | 0) & 16777215;
    $2 = $lpi_items + ($lpi_num_0 << 3) | 0;
    HEAP32[$2 >> 2] = $bf_value | $0 | HEAP32[$2 >> 2] & -268435456;
    HEAP16[$lpi_items + ($lpi_num_0 << 3) + 4 >> 1] = ~~+__ZN10ime_pinyin5NGram11get_uni_psbEj($call, $bf_value);
    $inc = $lpi_num_0 + 1 | 0;
    if ($inc >>> 0 < $lpi_max >>> 0) {
     $lpi_num_0 = $inc;
    } else {
     $lpi_num_1 = $inc;
     label = 660;
     break;
    }
   }
   if ((label | 0) == 660) {
    return $lpi_num_1 | 0;
   } else if ((label | 0) == 661) {
    return $lpi_num_1 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie11extend_dictEtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) {
   $this = $this | 0;
   $from_handle = $from_handle | 0;
   $dep = $dep | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $lpi_num = $lpi_num | 0;
   var $0 = 0, $retval_0 = 0;
   if (($dep | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $0 = HEAP16[$dep + 80 >> 1] | 0;
   if ($from_handle << 16 >> 16 == 0) {
    if ($0 << 16 >> 16 != 0) {
     ___assert_func(3680, 375, 5296, 1152);
     return 0;
    }
    $retval_0 = __ZN10ime_pinyin8DictTrie12extend_dict0EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) | 0;
    return $retval_0 | 0;
   }
   if ($0 << 16 >> 16 == 1) {
    $retval_0 = __ZN10ime_pinyin8DictTrie12extend_dict1EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) | 0;
    return $retval_0 | 0;
   } else {
    $retval_0 = __ZN10ime_pinyin8DictTrie12extend_dict2EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) | 0;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie12extend_dict0EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) {
   $this = $this | 0;
   $from_handle = $from_handle | 0;
   $dep = $dep | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $lpi_num = $lpi_num | 0;
   var $1 = 0, $2 = 0, $3 = 0, $call5 = 0, $root_ = 0, $conv6 = 0, $5 = 0, $conv8 = 0, $conv10 = 0, $add = 0, $conv14 = 0, $son_1st_off = 0, $mile_stones_pos_ = 0, $parsing_marks_pos_ = 0, $parsing_marks_ = 0, $8 = 0, $mile_stones_ = 0, $sub87 = 0, $spl_trie_ = 0, $son_pos_0 = 0, $ret_handle_0 = 0, $10 = 0, $add_ptr = 0, $spl_idx = 0, $11 = 0, $14 = 0, $call44 = 0, $18 = 0, $20 = 0, $26 = 0, $35 = 0, $ret_handle_1 = 0, $ret_handle_2 = 0, label = 0;
   if (!(($dep | 0) != 0 & $from_handle << 16 >> 16 == 0)) {
    ___assert_func(3680, 391, 5168, 976);
    return 0;
   }
   HEAP32[$lpi_num >> 2] = 0;
   $1 = HEAP16[$dep + (HEAPU16[$dep + 80 >> 1] << 1) >> 1] | 0;
   $2 = HEAP16[$dep + 88 >> 1] | 0;
   $3 = HEAP16[$dep + 90 >> 1] | 0;
   $call5 = __ZN10ime_pinyin8LpiCache9is_cachedEt(__ZN10ime_pinyin8LpiCache12get_instanceEv() | 0, $1) | 0;
   $root_ = $this + 12 | 0;
   $conv6 = $2 & 65535;
   $5 = HEAP32[$this + 20 >> 2] | 0;
   $conv8 = HEAPU16[$5 + ($conv6 - 30 << 1) >> 1] | 0;
   $conv10 = $3 & 65535;
   $add = $conv10 + $conv6 | 0;
   $conv14 = HEAPU16[$5 + ($add - 30 << 1) >> 1] | 0;
   $son_1st_off = HEAP32[$root_ >> 2] | 0;
   $mile_stones_pos_ = $this + 60 | 0;
   $parsing_marks_pos_ = $this + 52 | 0;
   $parsing_marks_ = $this + 48 | 0;
   $8 = $conv10 << 24;
   $mile_stones_ = $this + 56 | 0;
   $sub87 = $add - 1 | 0;
   $spl_trie_ = $this + 8 | 0;
   $ret_handle_0 = 0;
   $son_pos_0 = $conv8;
   while (1) {
    if ($son_pos_0 >>> 0 >= $conv14 >>> 0) {
     $ret_handle_2 = $ret_handle_0;
     label = 693;
     break;
    }
    if ((HEAP32[$son_1st_off >> 2] | 0) != 1) {
     label = 680;
     break;
    }
    $10 = HEAP32[$root_ >> 2] | 0;
    $add_ptr = $10 + ($son_pos_0 << 4) | 0;
    $spl_idx = $10 + ($son_pos_0 << 4) + 8 | 0;
    $11 = HEAP16[$spl_idx >> 1] | 0;
    if (!(($11 & 65535) >= ($2 & 65535) & ($11 & 65535 | 0) < ($add | 0))) {
     label = 682;
     break;
    }
    do {
     if (!$call5) {
      if ((HEAP32[$lpi_num >> 2] | 0) >>> 0 >= $lpi_max >>> 0) {
       break;
      }
      if (!(($son_pos_0 | 0) == ($conv8 | 0) | (__ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt(HEAP32[$spl_trie_ >> 2] | 0, $1) | 0) ^ 1)) {
       break;
      }
      $14 = HEAP32[$lpi_num >> 2] | 0;
      $call44 = __ZN10ime_pinyin8DictTrie15fill_lpi_bufferEPNS_10LmaPsbItemEjPNS_10LmaNodeLE0E($this, $lpi_items + ($14 << 3) | 0, $lpi_max - $14 | 0, $add_ptr) | 0;
      HEAP32[$lpi_num >> 2] = (HEAP32[$lpi_num >> 2] | 0) + $call44;
     }
    } while (0);
    do {
     if ((HEAP16[$spl_idx >> 1] | 0) == $2 << 16 >> 16) {
      if ((HEAPU16[$mile_stones_pos_ >> 1] | 0) >= 100) {
       $ret_handle_1 = $ret_handle_0;
       break;
      }
      $18 = HEAP16[$parsing_marks_pos_ >> 1] | 0;
      if (($18 & 65535) >= 600) {
       $ret_handle_1 = $ret_handle_0;
       break;
      }
      $20 = (HEAP32[$parsing_marks_ >> 2] | 0) + (($18 & 65535) << 2) | 0;
      HEAP32[$20 >> 2] = HEAP32[$20 >> 2] & -16777216 | $son_pos_0 & 16777215;
      $26 = (HEAP32[$parsing_marks_ >> 2] | 0) + (HEAPU16[$parsing_marks_pos_ >> 1] << 2) | 0;
      HEAP32[$26 >> 2] = HEAP32[$26 >> 2] & 16777215 | $8;
      HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) >> 1] = HEAP16[$parsing_marks_pos_ >> 1] | 0;
      HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) + 2 >> 1] = 1;
      $35 = HEAP16[$mile_stones_pos_ >> 1] | 0;
      HEAP16[$parsing_marks_pos_ >> 1] = (HEAP16[$parsing_marks_pos_ >> 1] | 0) + 1 & 65535;
      HEAP16[$mile_stones_pos_ >> 1] = (HEAP16[$mile_stones_pos_ >> 1] | 0) + 1 & 65535;
      $ret_handle_1 = $35;
     } else {
      $ret_handle_1 = $ret_handle_0;
     }
    } while (0);
    if ((HEAPU16[$spl_idx >> 1] | 0) < ($sub87 | 0)) {
     $ret_handle_0 = $ret_handle_1;
     $son_pos_0 = $son_pos_0 + 1 | 0;
    } else {
     $ret_handle_2 = $ret_handle_1;
     label = 694;
     break;
    }
   }
   if ((label | 0) == 680) {
    ___assert_func(3680, 408, 5168, 824);
    return 0;
   } else if ((label | 0) == 682) {
    ___assert_func(3680, 410, 5168, 624);
    return 0;
   } else if ((label | 0) == 693) {
    return $ret_handle_2 | 0;
   } else if ((label | 0) == 694) {
    return $ret_handle_2 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie12extend_dict1EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) {
   $this = $this | 0;
   $from_handle = $from_handle | 0;
   $dep = $dep | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $lpi_num = $lpi_num | 0;
   var $conv = 0, $mile_stones_pos_ = 0, $1 = 0, $2 = 0, $mile_stones_ = 0, $3 = 0, $mark_num = 0, $mark_start = 0, $parsing_marks_ = 0, $root_ = 0, $lma_node_num_ge1_ = 0, $nodes_ge1_ = 0, $conv37 = 0, $sub60 = 0, $add44 = 0, $parsing_marks_pos_ = 0, $ret_val_045 = 0, $h_pos_044 = 0, $p_mark_sroa_0_0_copyload = 0, $8 = 0, $bf_clear21 = 0, $conv1741 = 0, $ret_val_140 = 0, $ext_pos_039 = 0, $9 = 0, $add_ptr22_sum = 0, $num_of_son = 0, $son_1st_off = 0, $found_start_0 = 0, $found_num_0 = 0, $son_pos_0 = 0, $11 = 0, $13 = 0, $add_ptr34_sum = 0, $add_ptr35 = 0, $spl_idx = 0, $14 = 0, $15 = 0, $call49 = 0, $found_start_2 = 0, $found_num_1 = 0, $20 = 0, $23 = 0, $29 = 0, $ret_val_2 = 0, $inc103 = 0, $conv17 = 0, $ret_val_1_lcssa = 0, $inc106 = 0, $41 = 0, $ret_handle_0 = 0, label = 0;
   if (($dep | 0) == 0) {
    ___assert_func(3680, 450, 5040, 464);
    return 0;
   }
   $conv = $from_handle & 65535;
   if ($from_handle << 16 >> 16 == 0) {
    ___assert_func(3680, 450, 5040, 464);
    return 0;
   }
   $mile_stones_pos_ = $this + 60 | 0;
   if ((HEAPU16[$mile_stones_pos_ >> 1] | 0) <= ($from_handle & 65535)) {
    ___assert_func(3680, 450, 5040, 464);
    return 0;
   }
   $1 = HEAP16[$dep + 88 >> 1] | 0;
   $2 = HEAP16[$dep + 90 >> 1] | 0;
   $mile_stones_ = $this + 56 | 0;
   $3 = HEAP32[$mile_stones_ >> 2] | 0;
   $mark_num = $3 + ($conv << 2) + 2 | 0;
   if ((HEAP16[$mark_num >> 1] | 0) == 0) {
    $ret_handle_0 = 0;
    return $ret_handle_0 | 0;
   }
   $mark_start = $3 + ($conv << 2) | 0;
   $parsing_marks_ = $this + 48 | 0;
   $root_ = $this + 12 | 0;
   $lma_node_num_ge1_ = $this + 28 | 0;
   $nodes_ge1_ = $this + 16 | 0;
   $conv37 = $1 & 65535;
   $sub60 = $conv37 - 1 + ($2 & 65535) | 0;
   $add44 = ($2 & 65535) + $conv37 | 0;
   $parsing_marks_pos_ = $this + 52 | 0;
   $h_pos_044 = 0;
   $ret_val_045 = 0;
   L852 : while (1) {
    $p_mark_sroa_0_0_copyload = HEAP32[(HEAP32[$parsing_marks_ >> 2] | 0) + ((HEAPU16[$mark_start >> 1] | 0) + ($h_pos_044 & 65535) << 2) >> 2] | 0;
    $8 = $p_mark_sroa_0_0_copyload >>> 24;
    if (($8 | 0) == 0) {
     $ret_val_1_lcssa = $ret_val_045;
    } else {
     $bf_clear21 = $p_mark_sroa_0_0_copyload & 16777215;
     $ext_pos_039 = 0;
     $ret_val_140 = $ret_val_045;
     $conv1741 = 0;
     while (1) {
      $9 = HEAP32[$root_ >> 2] | 0;
      $add_ptr22_sum = $conv1741 + $bf_clear21 | 0;
      $num_of_son = $9 + ($add_ptr22_sum << 4) + 10 | 0;
      $son_1st_off = $9 + ($add_ptr22_sum << 4) | 0;
      $son_pos_0 = 0;
      $found_num_0 = 0;
      $found_start_0 = 0;
      while (1) {
       if ($son_pos_0 >>> 0 >= (HEAPU16[$num_of_son >> 1] | 0) >>> 0) {
        $ret_val_2 = $ret_val_140;
        break;
       }
       $11 = HEAP32[$son_1st_off >> 2] | 0;
       if ($11 >>> 0 > (HEAP32[$lma_node_num_ge1_ >> 2] | 0) >>> 0) {
        label = 706;
        break L852;
       }
       $13 = HEAP32[$nodes_ge1_ >> 2] | 0;
       $add_ptr34_sum = $11 + $son_pos_0 | 0;
       $add_ptr35 = $13 + ($add_ptr34_sum * 10 | 0) | 0;
       $spl_idx = $13 + ($add_ptr34_sum * 10 | 0) + 4 | 0;
       $14 = HEAP16[$spl_idx >> 1] | 0;
       if (($14 & 65535) >= ($1 & 65535) & ($14 & 65535 | 0) < ($add44 | 0)) {
        $15 = HEAP32[$lpi_num >> 2] | 0;
        if ($15 >>> 0 < $lpi_max >>> 0) {
         $call49 = __ZN10ime_pinyin8DictTrie15fill_lpi_bufferEPNS_10LmaPsbItemEjjPNS_10LmaNodeGE1Et($this, $lpi_items + ($15 << 3) | 0, $lpi_max - $15 | 0, __ZN10ime_pinyin8DictTrie23get_homo_idx_buf_offsetEPKNS_10LmaNodeGE1E(0, $add_ptr35) | 0, $add_ptr35, 2) | 0;
         HEAP32[$lpi_num >> 2] = (HEAP32[$lpi_num >> 2] | 0) + $call49;
        }
        $found_num_1 = $found_num_0 + 1 | 0;
        $found_start_2 = ($found_num_0 | 0) == 0 ? $son_pos_0 : $found_start_0;
       } else {
        $found_num_1 = $found_num_0;
        $found_start_2 = $found_start_0;
       }
       if ((HEAPU16[$spl_idx >> 1] | 0) >= ($sub60 | 0)) {
        label = 713;
        break;
       }
       if (($son_pos_0 | 0) == ((HEAPU16[$num_of_son >> 1] | 0) - 1 | 0)) {
        label = 713;
        break;
       } else {
        $son_pos_0 = $son_pos_0 + 1 | 0;
        $found_num_0 = $found_num_1;
        $found_start_0 = $found_start_2;
       }
      }
      do {
       if ((label | 0) == 713) {
        label = 0;
        if (($found_num_1 | 0) == 0) {
         $ret_val_2 = $ret_val_140;
         break;
        }
        do {
         if ((HEAPU16[$mile_stones_pos_ >> 1] | 0) < 100) {
          $20 = HEAP16[$parsing_marks_pos_ >> 1] | 0;
          if (($20 & 65535) >= 600) {
           break;
          }
          $23 = (HEAP32[$parsing_marks_ >> 2] | 0) + (($20 & 65535) << 2) | 0;
          HEAP32[$23 >> 2] = HEAP32[$23 >> 2] & -16777216 | (HEAP32[$son_1st_off >> 2] | 0) + $found_start_2 & 16777215;
          $29 = (HEAP32[$parsing_marks_ >> 2] | 0) + (HEAPU16[$parsing_marks_pos_ >> 1] << 2) | 0;
          HEAP32[$29 >> 2] = HEAP32[$29 >> 2] & 16777215 | $found_num_1 << 24;
          if (($ret_val_140 | 0) == 0) {
           HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) >> 1] = HEAP16[$parsing_marks_pos_ >> 1] | 0;
          }
          HEAP16[$parsing_marks_pos_ >> 1] = (HEAP16[$parsing_marks_pos_ >> 1] | 0) + 1 & 65535;
         }
        } while (0);
        $ret_val_2 = $ret_val_140 + 1 | 0;
       }
      } while (0);
      $inc103 = $ext_pos_039 + 1 & 65535;
      $conv17 = $inc103 & 65535;
      if ($conv17 >>> 0 < $8 >>> 0) {
       $ext_pos_039 = $inc103;
       $ret_val_140 = $ret_val_2;
       $conv1741 = $conv17;
      } else {
       $ret_val_1_lcssa = $ret_val_2;
       break;
      }
     }
    }
    $inc106 = $h_pos_044 + 1 & 65535;
    if (($inc106 & 65535) < (HEAPU16[$mark_num >> 1] | 0)) {
     $h_pos_044 = $inc106;
     $ret_val_045 = $ret_val_1_lcssa;
    } else {
     break;
    }
   }
   if ((label | 0) == 706) {
    ___assert_func(3680, 472, 5040, 4312);
    return 0;
   }
   if (($ret_val_1_lcssa | 0) == 0) {
    $ret_handle_0 = 0;
    return $ret_handle_0 | 0;
   }
   HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) + 2 >> 1] = $ret_val_1_lcssa & 65535;
   $41 = HEAP16[$mile_stones_pos_ >> 1] | 0;
   HEAP16[$mile_stones_pos_ >> 1] = $41 + 1 & 65535;
   $ret_handle_0 = $41;
   return $ret_handle_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie12extend_dict2EtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) {
   $this = $this | 0;
   $from_handle = $from_handle | 0;
   $dep = $dep | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $lpi_num = $lpi_num | 0;
   var $conv = 0, $mile_stones_pos_ = 0, $1 = 0, $2 = 0, $mile_stones_ = 0, $3 = 0, $mark_num = 0, $mark_start = 0, $parsing_marks_ = 0, $nodes_ge1_ = 0, $conv40 = 0, $sub67 = 0, $add47 = 0, $splids_extended = 0, $parsing_marks_pos_ = 0, $ret_val_046 = 0, $h_pos_045 = 0, $p_mark_sroa_0_0_copyload = 0, $8 = 0, $bf_clear21 = 0, $conv1742 = 0, $ret_val_141 = 0, $ext_pos_040 = 0, $9 = 0, $add_ptr22_sum = 0, $add_ptr24 = 0, $num_of_son = 0, $son_1st_off_l = 0, $son_1st_off_h = 0, $found_start_0 = 0, $found_num_0 = 0, $son_pos_0 = 0, $13 = 0, $add_ptr37_sum = 0, $add_ptr38 = 0, $spl_idx = 0, $14 = 0, $15 = 0, $call51 = 0, $call56 = 0, $found_start_2 = 0, $found_num_1 = 0, $21 = 0, $add85 = 0, $23 = 0, $29 = 0, $ret_val_2 = 0, $inc111 = 0, $conv17 = 0, $ret_val_1_lcssa = 0, $inc114 = 0, $41 = 0, $ret_handle_0 = 0, label = 0;
   if (($dep | 0) == 0) {
    ___assert_func(3680, 528, 4912, 464);
    return 0;
   }
   $conv = $from_handle & 65535;
   if ($from_handle << 16 >> 16 == 0) {
    ___assert_func(3680, 528, 4912, 464);
    return 0;
   }
   $mile_stones_pos_ = $this + 60 | 0;
   if ((HEAPU16[$mile_stones_pos_ >> 1] | 0) <= ($from_handle & 65535)) {
    ___assert_func(3680, 528, 4912, 464);
    return 0;
   }
   $1 = HEAP16[$dep + 88 >> 1] | 0;
   $2 = HEAP16[$dep + 90 >> 1] | 0;
   $mile_stones_ = $this + 56 | 0;
   $3 = HEAP32[$mile_stones_ >> 2] | 0;
   $mark_num = $3 + ($conv << 2) + 2 | 0;
   if ((HEAP16[$mark_num >> 1] | 0) == 0) {
    $ret_handle_0 = 0;
    return $ret_handle_0 | 0;
   }
   $mark_start = $3 + ($conv << 2) | 0;
   $parsing_marks_ = $this + 48 | 0;
   $nodes_ge1_ = $this + 16 | 0;
   $conv40 = $1 & 65535;
   $sub67 = $conv40 - 1 + ($2 & 65535) | 0;
   $add47 = ($2 & 65535) + $conv40 | 0;
   $splids_extended = $dep + 80 | 0;
   $parsing_marks_pos_ = $this + 52 | 0;
   $h_pos_045 = 0;
   $ret_val_046 = 0;
   L901 : while (1) {
    $p_mark_sroa_0_0_copyload = HEAP32[(HEAP32[$parsing_marks_ >> 2] | 0) + ((HEAPU16[$mark_start >> 1] | 0) + ($h_pos_045 & 65535) << 2) >> 2] | 0;
    $8 = $p_mark_sroa_0_0_copyload >>> 24;
    if (($8 | 0) == 0) {
     $ret_val_1_lcssa = $ret_val_046;
    } else {
     $bf_clear21 = $p_mark_sroa_0_0_copyload & 16777215;
     $ext_pos_040 = 0;
     $ret_val_141 = $ret_val_046;
     $conv1742 = 0;
     while (1) {
      $9 = HEAP32[$nodes_ge1_ >> 2] | 0;
      $add_ptr22_sum = $conv1742 + $bf_clear21 | 0;
      $add_ptr24 = $9 + ($add_ptr22_sum * 10 | 0) | 0;
      $num_of_son = $9 + ($add_ptr22_sum * 10 | 0) + 6 | 0;
      $son_1st_off_l = $add_ptr24 | 0;
      $son_1st_off_h = $9 + ($add_ptr22_sum * 10 | 0) + 8 | 0;
      $son_pos_0 = 0;
      $found_num_0 = 0;
      $found_start_0 = 0;
      while (1) {
       if ($son_pos_0 >>> 0 >= (HEAPU8[$num_of_son] | 0) >>> 0) {
        $ret_val_2 = $ret_val_141;
        break;
       }
       if ((HEAP16[$son_1st_off_l >> 1] | 0) == 0) {
        if ((HEAP8[$son_1st_off_h] | 0) == 0) {
         label = 743;
         break L901;
        }
       }
       $13 = HEAP32[$nodes_ge1_ >> 2] | 0;
       $add_ptr37_sum = (__ZN10ime_pinyin8DictTrie14get_son_offsetEPKNS_10LmaNodeGE1E(0, $add_ptr24) | 0) + $son_pos_0 | 0;
       $add_ptr38 = $13 + ($add_ptr37_sum * 10 | 0) | 0;
       $spl_idx = $13 + ($add_ptr37_sum * 10 | 0) + 4 | 0;
       $14 = HEAP16[$spl_idx >> 1] | 0;
       if (($14 & 65535) >= ($1 & 65535) & ($14 & 65535 | 0) < ($add47 | 0)) {
        $15 = HEAP32[$lpi_num >> 2] | 0;
        if ($15 >>> 0 < $lpi_max >>> 0) {
         $call51 = __ZN10ime_pinyin8DictTrie23get_homo_idx_buf_offsetEPKNS_10LmaNodeGE1E(0, $add_ptr38) | 0;
         $call56 = __ZN10ime_pinyin8DictTrie15fill_lpi_bufferEPNS_10LmaPsbItemEjjPNS_10LmaNodeGE1Et($this, $lpi_items + ($15 << 3) | 0, $lpi_max - $15 | 0, $call51, $add_ptr38, (HEAP16[$splids_extended >> 1] | 0) + 1 & 65535) | 0;
         HEAP32[$lpi_num >> 2] = (HEAP32[$lpi_num >> 2] | 0) + $call56;
        }
        $found_num_1 = $found_num_0 + 1 | 0;
        $found_start_2 = ($found_num_0 | 0) == 0 ? $son_pos_0 : $found_start_0;
       } else {
        $found_num_1 = $found_num_0;
        $found_start_2 = $found_start_0;
       }
       if ((HEAPU16[$spl_idx >> 1] | 0) >= ($sub67 | 0)) {
        label = 750;
        break;
       }
       if (($son_pos_0 | 0) == ((HEAPU8[$num_of_son] | 0) - 1 | 0)) {
        label = 750;
        break;
       } else {
        $son_pos_0 = $son_pos_0 + 1 | 0;
        $found_num_0 = $found_num_1;
        $found_start_0 = $found_start_2;
       }
      }
      do {
       if ((label | 0) == 750) {
        label = 0;
        if (($found_num_1 | 0) == 0) {
         $ret_val_2 = $ret_val_141;
         break;
        }
        do {
         if ((HEAPU16[$mile_stones_pos_ >> 1] | 0) < 100) {
          $21 = HEAP16[$parsing_marks_pos_ >> 1] | 0;
          if (($21 & 65535) >= 600) {
           break;
          }
          $add85 = (__ZN10ime_pinyin8DictTrie14get_son_offsetEPKNS_10LmaNodeGE1E(0, $add_ptr24) | 0) + $found_start_2 | 0;
          $23 = (HEAP32[$parsing_marks_ >> 2] | 0) + (($21 & 65535) << 2) | 0;
          HEAP32[$23 >> 2] = HEAP32[$23 >> 2] & -16777216 | $add85 & 16777215;
          $29 = (HEAP32[$parsing_marks_ >> 2] | 0) + (HEAPU16[$parsing_marks_pos_ >> 1] << 2) | 0;
          HEAP32[$29 >> 2] = HEAP32[$29 >> 2] & 16777215 | $found_num_1 << 24;
          if (($ret_val_141 | 0) == 0) {
           HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) >> 1] = HEAP16[$parsing_marks_pos_ >> 1] | 0;
          }
          HEAP16[$parsing_marks_pos_ >> 1] = (HEAP16[$parsing_marks_pos_ >> 1] | 0) + 1 & 65535;
         }
        } while (0);
        $ret_val_2 = $ret_val_141 + 1 | 0;
       }
      } while (0);
      $inc111 = $ext_pos_040 + 1 & 65535;
      $conv17 = $inc111 & 65535;
      if ($conv17 >>> 0 < $8 >>> 0) {
       $ext_pos_040 = $inc111;
       $ret_val_141 = $ret_val_2;
       $conv1742 = $conv17;
      } else {
       $ret_val_1_lcssa = $ret_val_2;
       break;
      }
     }
    }
    $inc114 = $h_pos_045 + 1 & 65535;
    if (($inc114 & 65535) < (HEAPU16[$mark_num >> 1] | 0)) {
     $h_pos_045 = $inc114;
     $ret_val_046 = $ret_val_1_lcssa;
    } else {
     break;
    }
   }
   if ((label | 0) == 743) {
    ___assert_func(3680, 551, 4912, 4112);
    return 0;
   }
   if (($ret_val_1_lcssa | 0) == 0) {
    $ret_handle_0 = 0;
    return $ret_handle_0 | 0;
   }
   HEAP16[(HEAP32[$mile_stones_ >> 2] | 0) + (HEAPU16[$mile_stones_pos_ >> 1] << 2) + 2 >> 1] = $ret_val_1_lcssa & 65535;
   $41 = HEAP16[$mile_stones_pos_ >> 1] | 0;
   HEAP16[$mile_stones_pos_ >> 1] = $41 + 1 & 65535;
   $ret_handle_0 = $41;
   return $ret_handle_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie10try_extendEPKttj($this, $splids, $splid_num, $id_lemma) {
   $this = $this | 0;
   $splids = $splids | 0;
   $splid_num = $splid_num | 0;
   $id_lemma = $id_lemma | 0;
   var $str = 0, $4 = 0, $nodes_ge1_52 = 0, $lma_node_num_ge1_ = 0, $nodes_ge1_ = 0, $conv650 = 0, $node_049 = 0, $pos_048 = 0, $node_son_047 = 0, $node_son35_046 = 0, $5 = 0, $6 = 0, $son_1st_off = 0, $arrayidx23 = 0, $son_pos_0 = 0, $node_son_1 = 0, $7 = 0, $9 = 0, $add_ptr19_sum = 0, $add_ptr21 = 0, $node_son_2 = 0, $13 = 0, $14 = 0, $conv41 = 0, $son_1st_off_l = 0, $16 = 0, $arrayidx59 = 0, $son_pos36_0 = 0, $node_son35_1 = 0, $conv38 = 0, $19 = 0, $add_ptr53_sum = 0, $add_ptr55 = 0, $node_son35_2 = 0, $node_son35_3 = 0, $node_son_3 = 0, $node_1_in = 0, $node_1 = 0, $inc76 = 0, $node_0_lcssa = 0, $conv83 = 0, $25 = 0, $26 = 0, $arraydecay = 0, $homo_pos_0 = 0, $call87 = 0, $29 = 0, $conv99 = 0, $homo_pos100_0 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $str = sp | 0;
   if ($splid_num << 16 >> 16 == 0 | ($splids | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $4 = (HEAP32[$this + 12 >> 2] | 0) + (HEAPU16[(HEAP32[$this + 20 >> 2] | 0) + ((HEAPU16[$splids >> 1] | 0) - 30 << 1) >> 1] << 4) | 0;
   L943 : do {
    if (($splid_num & 65535) > 1) {
     $nodes_ge1_52 = $this + 16 | 0;
     $lma_node_num_ge1_ = $this + 28 | 0;
     $nodes_ge1_ = $this + 16 | 0;
     $node_son35_046 = 0;
     $node_son_047 = 0;
     $pos_048 = 1;
     $node_049 = $4;
     $conv650 = 1;
     L945 : while (1) {
      if ($pos_048 << 16 >> 16 == 1) {
       $5 = $node_049 + 10 | 0;
       $6 = HEAP16[$5 >> 1] | 0;
       $son_1st_off = $node_049;
       $arrayidx23 = $splids + ($conv650 << 1) | 0;
       $node_son_1 = $node_son_047;
       $son_pos_0 = 0;
       while (1) {
        if (($son_pos_0 & 65535) >= ($6 & 65535)) {
         $node_son_2 = $node_son_1;
         break;
        }
        $7 = HEAP32[$son_1st_off >> 2] | 0;
        if ($7 >>> 0 > (HEAP32[$lma_node_num_ge1_ >> 2] | 0) >>> 0) {
         label = 775;
         break L945;
        }
        $9 = HEAP32[$nodes_ge1_ >> 2] | 0;
        $add_ptr19_sum = $7 + ($son_pos_0 & 65535) | 0;
        $add_ptr21 = $9 + ($add_ptr19_sum * 10 | 0) | 0;
        if ((HEAP16[$9 + ($add_ptr19_sum * 10 | 0) + 4 >> 1] | 0) == (HEAP16[$arrayidx23 >> 1] | 0)) {
         $node_son_2 = $add_ptr21;
         break;
        } else {
         $node_son_1 = $add_ptr21;
         $son_pos_0 = $son_pos_0 + 1 & 65535;
        }
       }
       if (($son_pos_0 & 65535) < (HEAPU16[$5 >> 1] | 0)) {
        $node_1_in = $node_son_2;
        $node_son_3 = $node_son_2;
        $node_son35_3 = $node_son35_046;
       } else {
        $retval_0 = 0;
        label = 794;
        break;
       }
      } else {
       $13 = $node_049;
       $14 = $node_049 + 6 | 0;
       $conv41 = HEAPU8[$14] | 0;
       $son_1st_off_l = $node_049;
       $16 = $node_049 + 8 | 0;
       $arrayidx59 = $splids + ($conv650 << 1) | 0;
       $node_son35_1 = $node_son35_046;
       $son_pos36_0 = 0;
       while (1) {
        $conv38 = $son_pos36_0 & 65535;
        if ($conv38 >>> 0 >= $conv41 >>> 0) {
         $node_son35_2 = $node_son35_1;
         break;
        }
        if ((HEAP16[$son_1st_off_l >> 1] | 0) == 0) {
         if ((HEAP8[$16] | 0) == 0) {
          label = 782;
          break L945;
         }
        }
        $19 = HEAP32[$nodes_ge1_52 >> 2] | 0;
        $add_ptr53_sum = (__ZN10ime_pinyin8DictTrie14get_son_offsetEPKNS_10LmaNodeGE1E(0, $13) | 0) + $conv38 | 0;
        $add_ptr55 = $19 + ($add_ptr53_sum * 10 | 0) | 0;
        if ((HEAP16[$19 + ($add_ptr53_sum * 10 | 0) + 4 >> 1] | 0) == (HEAP16[$arrayidx59 >> 1] | 0)) {
         $node_son35_2 = $add_ptr55;
         break;
        } else {
         $node_son35_1 = $add_ptr55;
         $son_pos36_0 = $son_pos36_0 + 1 & 65535;
        }
       }
       if ($conv38 >>> 0 < (HEAPU8[$14] | 0) >>> 0) {
        $node_1_in = $node_son35_2;
        $node_son_3 = $node_son_047;
        $node_son35_3 = $node_son35_2;
       } else {
        $retval_0 = 0;
        label = 796;
        break;
       }
      }
      $node_1 = $node_1_in;
      $inc76 = $pos_048 + 1 & 65535;
      if (($inc76 & 65535) < ($splid_num & 65535)) {
       $node_son35_046 = $node_son35_3;
       $node_son_047 = $node_son_3;
       $pos_048 = $inc76;
       $node_049 = $node_1;
       $conv650 = $inc76 & 65535;
      } else {
       $node_0_lcssa = $node_1;
       break L943;
      }
     }
     if ((label | 0) == 796) {
      STACKTOP = sp;
      return $retval_0 | 0;
     } else if ((label | 0) == 794) {
      STACKTOP = sp;
      return $retval_0 | 0;
     } else if ((label | 0) == 775) {
      ___assert_func(3680, 616, 5424, 3944);
      return 0;
     } else if ((label | 0) == 782) {
      ___assert_func(3680, 632, 5424, 3704);
      return 0;
     }
    } else {
     $node_0_lcssa = $4;
    }
   } while (0);
   if ($splid_num << 16 >> 16 == 1) {
    $conv83 = HEAPU16[$node_0_lcssa + 12 >> 1] | 0;
    $25 = $node_0_lcssa + 4 | 0;
    $26 = $this;
    $arraydecay = $str | 0;
    $homo_pos_0 = 0;
    while (1) {
     if ($homo_pos_0 >>> 0 >= $conv83 >>> 0) {
      $retval_0 = 0;
      label = 797;
      break;
     }
     $call87 = __ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, (HEAP32[$25 >> 2] | 0) + $homo_pos_0 | 0) | 0;
     FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$26 >> 2] | 0) + 32 >> 2] & 31]($this, $call87, $arraydecay, 2) | 0;
     if (($call87 | 0) == ($id_lemma | 0)) {
      $retval_0 = 1;
      label = 798;
      break;
     } else {
      $homo_pos_0 = $homo_pos_0 + 1 | 0;
     }
    }
    if ((label | 0) == 797) {
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 798) {
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } else {
    $29 = $node_0_lcssa;
    $conv99 = HEAPU8[$node_0_lcssa + 7 | 0] | 0;
    $homo_pos100_0 = 0;
    while (1) {
     if ($homo_pos100_0 >>> 0 >= $conv99 >>> 0) {
      $retval_0 = 0;
      label = 799;
      break;
     }
     if ((__ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, (__ZN10ime_pinyin8DictTrie23get_homo_idx_buf_offsetEPKNS_10LmaNodeGE1E(0, $29) | 0) + $homo_pos100_0 | 0) | 0) == ($id_lemma | 0)) {
      $retval_0 = 1;
      label = 800;
      break;
     } else {
      $homo_pos100_0 = $homo_pos100_0 + 1 | 0;
     }
    }
    if ((label | 0) == 799) {
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 800) {
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie10close_dictEv($this) {
   $this = $this | 0;
   return 1;
  }
  function __ZN10ime_pinyin8DictTrie16number_of_lemmasEv($this) {
   $this = $this | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie9put_lemmaEPtS1_tt($this, $lemma_str, $splids, $lemma_len, $count) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   $count = $count | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie12update_lemmaEjsb($this, $lemma_id, $delta_count, $selected) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   $delta_count = $delta_count | 0;
   $selected = $selected | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie12get_lemma_idEPtS1_t($this, $lemma_str, $splids, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie15get_lemma_scoreEj($this, $lemma_id) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie15get_lemma_scoreEPtS1_t($this, $lemma_str, $splids, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie12remove_lemmaEj($this, $lemma_id) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie21get_total_lemma_countEv($this) {
   $this = $this | 0;
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie11flush_cacheEv($this) {
   $this = $this | 0;
   return;
  }
  function __ZN10ime_pinyin12AtomDictBaseD1Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch22reset_pointers_to_nullEv($this) {
   $this = $this | 0;
   HEAP32[$this + 12 >> 2] = 0;
   HEAP32[$this + 16 >> 2] = 0;
   HEAP32[$this + 20 >> 2] = 0;
   HEAP32[$this + 76 >> 2] = 0;
   HEAP32[$this + 80 >> 2] = 0;
   HEAP32[$this + 88 >> 2] = 0;
   HEAP32[$this + 96 >> 2] = 0;
   HEAP32[$this + 100 >> 2] = 0;
   HEAP32[$this + 104 >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin8DictTrie13get_lemma_strEjPtt($this, $id_lemma, $str_buf, $str_max) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $str_buf = $str_buf | 0;
   $str_max = $str_max | 0;
   return __ZN10ime_pinyin8DictList13get_lemma_strEjPtt(HEAP32[$this + 4 >> 2] | 0, $id_lemma, $str_buf, $str_max) | 0;
  }
  function __ZN10ime_pinyin8DictTrie31set_total_lemma_count_of_othersEj($this, $count) {
   $this = $this | 0;
   $count = $count | 0;
   __ZN10ime_pinyin5NGram23set_total_freq_none_sysEj(__ZN10ime_pinyin5NGram12get_instanceEv() | 0, $count);
   return;
  }
  function __ZN10ime_pinyin8DictTrie17convert_to_hanzisEPtt($this, $str, $str_len) {
   $this = $this | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   __ZN10ime_pinyin8DictList17convert_to_hanzisEPtt(HEAP32[$this + 4 >> 2] | 0, $str, $str_len);
   return;
  }
  function __ZN10ime_pinyin8DictTrie19convert_to_scis_idsEPtt($this, $str, $str_len) {
   $this = $this | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   __ZN10ime_pinyin8DictList19convert_to_scis_idsEPtt(HEAP32[$this + 4 >> 2] | 0, $str, $str_len);
   return;
  }
  function __ZN10ime_pinyin8DictTrie12get_lemma_idEPKtt($this, $lemma_str, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $lemma_len = $lemma_len | 0;
   var $retval_0 = 0;
   if (($lemma_str | 0) == 0 | ($lemma_len & 65535) > 8) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin8DictList12get_lemma_idEPKtt(HEAP32[$this + 4 >> 2] | 0, $lemma_str, $lemma_len) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictTrie16predict_top_lmasEjPNS_12NPredictItemEjj($this, $his_len, $npre_items, $npre_max, $b4_used) {
   $this = $this | 0;
   $his_len = $his_len | 0;
   $npre_items = $npre_items | 0;
   $npre_max = $npre_max | 0;
   $b4_used = $b4_used | 0;
   var $call = 0, $top_lmas_num_ = 0, $sub = 0, $dict_list_ = 0, $conv10 = 0, $arraydecay20 = 0, $_in = 0, $item_num_0_ph18 = 0, $top_lmas_pos_0_ph17 = 0, $2 = 0, $top_lmas_pos_0 = 0, $call4 = 0, $inc = 0, $item_num_0_ph14 = 0, label = 0;
   $call = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $top_lmas_num_ = $this + 44 | 0;
   $sub = (((HEAP32[$this + 36 >> 2] | 0) >>> 0) / 3 | 0) - (HEAP32[$top_lmas_num_ >> 2] | 0) | 0;
   $dict_list_ = $this + 4 | 0;
   if (($npre_max | 0) == 0) {
    $item_num_0_ph14 = 0;
    return $item_num_0_ph14 | 0;
   }
   $conv10 = $his_len & 65535;
   $top_lmas_pos_0_ph17 = 0;
   $item_num_0_ph18 = 0;
   $_in = $npre_items;
   $arraydecay20 = $npre_items + 4 | 0;
   L1009 : while (1) {
    $2 = $_in;
    $top_lmas_pos_0 = $top_lmas_pos_0_ph17;
    do {
     if ($top_lmas_pos_0 >>> 0 >= (HEAP32[$top_lmas_num_ >> 2] | 0) >>> 0) {
      $item_num_0_ph14 = $item_num_0_ph18;
      label = 829;
      break L1009;
     }
     _memset($2 | 0, 0, 20);
     $call4 = __ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, $sub + $top_lmas_pos_0 | 0) | 0;
     $top_lmas_pos_0 = $top_lmas_pos_0 + 1 | 0;
    } while ((__ZN10ime_pinyin8DictList13get_lemma_strEjPtt(HEAP32[$dict_list_ >> 2] | 0, $call4, $arraydecay20, 7) | 0) << 16 >> 16 == 0);
    HEAPF32[$_in >> 2] = +__ZN10ime_pinyin5NGram11get_uni_psbEj($call, $call4);
    HEAP16[$npre_items + ($item_num_0_ph18 * 20 | 0) + 18 >> 1] = $conv10;
    $inc = $item_num_0_ph18 + 1 | 0;
    if ($inc >>> 0 < $npre_max >>> 0) {
     $top_lmas_pos_0_ph17 = $top_lmas_pos_0;
     $item_num_0_ph18 = $inc;
     $_in = $npre_items + ($inc * 20 | 0) | 0;
     $arraydecay20 = $npre_items + ($inc * 20 | 0) + 4 | 0;
    } else {
     $item_num_0_ph14 = $inc;
     label = 831;
     break;
    }
   }
   if ((label | 0) == 829) {
    return $item_num_0_ph14 | 0;
   } else if ((label | 0) == 831) {
    return $item_num_0_ph14 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie7predictEPKttPNS_12NPredictItemEjj($this, $last_hzs, $hzs_len, $npre_items, $npre_max, $b4_used) {
   $this = $this | 0;
   $last_hzs = $last_hzs | 0;
   $hzs_len = $hzs_len | 0;
   $npre_items = $npre_items | 0;
   $npre_max = $npre_max | 0;
   $b4_used = $b4_used | 0;
   return __ZN10ime_pinyin8DictList7predictEPKttPNS_12NPredictItemEjj(HEAP32[$this + 4 >> 2] | 0, $last_hzs, $hzs_len, $npre_items, $npre_max, $b4_used) | 0;
  }
  function __ZN10ime_pinyin12AtomDictBaseD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearchC2Ev($this) {
   $this = $this | 0;
   HEAP8[$this | 0] = 0;
   HEAP32[$this + 4 >> 2] = __ZN10ime_pinyin12SpellingTrie14get_cpinstanceEv() | 0;
   __ZN10ime_pinyin12MatrixSearch22reset_pointers_to_nullEv($this);
   HEAP32[$this + 72 >> 2] = 0;
   HEAP16[$this + 84 >> 1] = 0;
   HEAP16[$this + 92 >> 1] = 0;
   HEAP8[$this + 8 | 0] = 1;
   HEAP8[$this + 728 | 0] = 0;
   HEAP32[$this + 24 >> 2] = 39;
   HEAP32[$this + 28 >> 2] = 40;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearchD2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin12MatrixSearch13free_resourceEv($this);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch13free_resourceEv($this) {
   $this = $this | 0;
   var $0 = 0, $3 = 0, $6 = 0, $8 = 0;
   $0 = HEAP32[$this + 12 >> 2] | 0;
   if (($0 | 0) != 0) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$0 >> 2] | 0) + 4 >> 2] & 127]($0);
   }
   $3 = HEAP32[$this + 16 >> 2] | 0;
   if (($3 | 0) != 0) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$3 >> 2] | 0) + 4 >> 2] & 127]($3);
   }
   $6 = HEAP32[$this + 20 >> 2] | 0;
   if (($6 | 0) != 0) {
    __ZdlPv($6);
   }
   $8 = HEAP32[$this + 76 >> 2] | 0;
   if (($8 | 0) == 0) {
    __ZN10ime_pinyin12MatrixSearch22reset_pointers_to_nullEv($this);
    return;
   }
   __ZdaPv($8);
   __ZN10ime_pinyin12MatrixSearch22reset_pointers_to_nullEv($this);
   return;
  }
  function __ZN10ime_pinyin8DictTrie8get_lpisEPKttPNS_10LmaPsbItemEj($this, $splid_str, $splid_str_len, $lma_buf, $max_lma_buf) {
   $this = $this | 0;
   $splid_str = $splid_str | 0;
   $splid_str_len = $splid_str_len | 0;
   $lma_buf = $lma_buf | 0;
   $max_lma_buf = $max_lma_buf | 0;
   var $node_buf1 = 0, $id_start = 0, $conv = 0, $root_ = 0, $0 = 0, $spl_trie_ = 0, $splid_le0_index_ = 0, $lma_node_num_ge1_ = 0, $nodes_ge1_ = 0, $nodes_ge1_165 = 0, $node_fr_le0_0_ph203 = 0, $node_to_le0_0_ph202 = 0, $node_fr_ge1_0_ph201 = 0, $node_to_ge1_0_ph200 = 0, $node_fr_num_0_ph199 = 0, $spl_pos_0_ph198 = 0, $node_fr_le0_0195 = 0, $node_to_le0_0194 = 0, $node_to_ge1_0193 = 0, $node_fr_num_0192 = 0, $spl_pos_0191 = 0, $arrayidx9 = 0, $call14 = 0, $id_num_0 = 0, $add191 = 0, $conv177 = 0, $cmp24 = 0, $conv32 = 0, $add = 0, $add66 = 0, $add125 = 0, $conv111 = 0, $node_to_num_1140 = 0, $node_fr_pos_0139 = 0, $8 = 0, $conv28 = 0, $11 = 0, $conv36 = 0, $son_1st_off = 0, $son_pos_0 = 0, $node_to_num_2 = 0, $15 = 0, $spl_idx = 0, $16 = 0, $17 = 0, $node_to_num_3 = 0, $node_to_num_4 = 0, $inc73 = 0, $inc75 = 0, $node_to_num_5134 = 0, $node_fr_pos83_0133 = 0, $21 = 0, $num_of_son = 0, $son_1st_off94 = 0, $son_pos89_0 = 0, $node_to_num_6 = 0, $23 = 0, $25 = 0, $add_ptr101_sum = 0, $add_ptr102 = 0, $spl_idx103 = 0, $26 = 0, $27 = 0, $node_to_num_7 = 0, $node_to_num_8 = 0, $inc134 = 0, $inc136 = 0, $spl_pos_0_ph_be = 0, $node_fr_num_0_ph_be = 0, $node_to_ge1_0_ph_be = 0, $node_to_le0_0_ph_be = 0, $node_fr_le0_0_ph_be = 0, $node_to_num_9145 = 0, $node_fr_pos144_0144 = 0, $31 = 0, $num_of_son152 = 0, $son_1st_off_l = 0, $son_1st_off_h = 0, $son_pos150_0 = 0, $node_to_num_10 = 0, $35 = 0, $add_ptr167_sum = 0, $add_ptr168 = 0, $spl_idx169 = 0, $36 = 0, $37 = 0, $node_to_num_11 = 0, $node_to_num_12 = 0, $inc200 = 0, $inc202 = 0, $spl_pos_2 = 0, $node_to_num_14 = 0, $call215 = 0, $node_to_num_15 = 0, $cmp228 = 0, $sub246 = 0, $42 = 0, $sub278 = 0, $lma_num_0 = 0, $node_pos_0 = 0, $43 = 0, $conv232 = 0, $homo_idx_buf_off = 0, $homo_pos_0 = 0, $add236 = 0, $bf_value = 0, $46 = 0, $51 = 0, $conv256 = 0, $homo_pos257_0 = 0, $add262 = 0, $bf_value267 = 0, $53 = 0, $num_of_homo_0 = 0, $add286 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 1608 | 0;
   $node_buf1 = sp | 0;
   $id_start = sp + 1600 | 0;
   $conv = $splid_str_len & 65535;
   if (($splid_str_len & 65535) > 8) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $root_ = $this + 12 | 0;
   $0 = HEAP32[$root_ >> 2] | 0;
   HEAP32[$node_buf1 >> 2] = $0;
   if (($0 | 0) == 0 | $splid_str_len << 16 >> 16 == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $spl_trie_ = $this + 8 | 0;
   $splid_le0_index_ = $this + 20 | 0;
   $lma_node_num_ge1_ = $this + 28 | 0;
   $nodes_ge1_ = $this + 16 | 0;
   $nodes_ge1_165 = $this + 16 | 0;
   $spl_pos_0_ph198 = 0;
   $node_fr_num_0_ph199 = 1;
   $node_to_ge1_0_ph200 = 0;
   $node_fr_ge1_0_ph201 = 0;
   $node_to_le0_0_ph202 = sp + 800 | 0;
   $node_fr_le0_0_ph203 = $node_buf1;
   L1043 : while (1) {
    $spl_pos_0191 = $spl_pos_0_ph198;
    $node_fr_num_0192 = $node_fr_num_0_ph199;
    $node_to_ge1_0193 = $node_to_ge1_0_ph200;
    $node_to_le0_0194 = $node_to_le0_0_ph202;
    $node_fr_le0_0195 = $node_fr_le0_0_ph203;
    while (1) {
     $arrayidx9 = $splid_str + ($spl_pos_0191 << 1) | 0;
     HEAP16[$id_start >> 1] = HEAP16[$arrayidx9 >> 1] | 0;
     if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arrayidx9 >> 1] | 0) | 0) {
      $call14 = __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arrayidx9 >> 1] | 0, $id_start) | 0;
      if ($call14 << 16 >> 16 == 0) {
       label = 853;
       break L1043;
      } else {
       $id_num_0 = $call14;
      }
     } else {
      $id_num_0 = 1;
     }
     if (($spl_pos_0191 | 0) == 1) {
      label = 859;
      break;
     } else if (($spl_pos_0191 | 0) != 0) {
      label = 855;
      break;
     }
     if (($node_fr_num_0192 | 0) == 0) {
      $retval_0 = 0;
      label = 920;
      break L1043;
     }
     $cmp24 = ($node_fr_num_0192 | 0) == 1;
     $conv32 = $id_num_0 & 65535;
     $add = $conv32 - 30 | 0;
     $add66 = $conv32 - 1 | 0;
     $node_fr_pos_0139 = 0;
     $node_to_num_1140 = 0;
     while (1) {
      $8 = HEAP32[$node_fr_le0_0195 + ($node_fr_pos_0139 << 2) >> 2] | 0;
      if (!(($8 | 0) == (HEAP32[$root_ >> 2] | 0) & $cmp24)) {
       label = 862;
       break L1043;
      }
      $conv28 = HEAPU16[$id_start >> 1] | 0;
      $11 = HEAP32[$splid_le0_index_ >> 2] | 0;
      $conv36 = HEAPU16[$11 + ($add + $conv28 << 1) >> 1] | 0;
      $son_1st_off = $8 | 0;
      $node_to_num_2 = $node_to_num_1140;
      $son_pos_0 = HEAPU16[$11 + ($conv28 - 30 << 1) >> 1] | 0;
      while (1) {
       if ($son_pos_0 >>> 0 >= $conv36 >>> 0) {
        $node_to_num_4 = $node_to_num_2;
        break;
       }
       if ((HEAP32[$son_1st_off >> 2] | 0) != 1) {
        label = 866;
        break L1043;
       }
       $15 = HEAP32[$root_ >> 2] | 0;
       $spl_idx = $15 + ($son_pos_0 << 4) + 8 | 0;
       $16 = HEAP16[$spl_idx >> 1] | 0;
       $17 = HEAP16[$id_start >> 1] | 0;
       if (($16 & 65535) < ($17 & 65535)) {
        label = 914;
        break L1043;
       }
       if (($16 & 65535 | 0) >= (($17 & 65535) + $conv32 | 0)) {
        label = 915;
        break L1043;
       }
       if ($node_to_num_2 >>> 0 < 200) {
        HEAP32[$node_to_le0_0194 + ($node_to_num_2 << 2) >> 2] = $15 + ($son_pos_0 << 4);
        $node_to_num_3 = $node_to_num_2 + 1 | 0;
       } else {
        $node_to_num_3 = $node_to_num_2;
       }
       if ((HEAPU16[$spl_idx >> 1] | 0) < ($add66 + (HEAPU16[$id_start >> 1] | 0) | 0)) {
        $node_to_num_2 = $node_to_num_3;
        $son_pos_0 = $son_pos_0 + 1 | 0;
       } else {
        $node_to_num_4 = $node_to_num_3;
        break;
       }
      }
      $inc73 = $node_fr_pos_0139 + 1 | 0;
      if ($inc73 >>> 0 < $node_fr_num_0192 >>> 0) {
       $node_fr_pos_0139 = $inc73;
       $node_to_num_1140 = $node_to_num_4;
      } else {
       break;
      }
     }
     $inc75 = $spl_pos_0191 + 1 | 0;
     if ($inc75 >>> 0 >= $conv >>> 0 | ($node_to_num_4 | 0) == 0) {
      $node_to_num_14 = $node_to_num_4;
      $spl_pos_2 = $inc75;
      label = 899;
      break L1043;
     }
     if ($inc75 >>> 0 < $conv >>> 0) {
      $spl_pos_0191 = $inc75;
      $node_fr_num_0192 = $node_to_num_4;
      $node_to_ge1_0193 = $node_fr_le0_0195;
      $node_fr_le0_0195 = $node_to_le0_0194;
      $node_to_le0_0194 = 0;
     } else {
      $retval_0 = 0;
      label = 922;
      break L1043;
     }
    }
    if ((label | 0) == 855) {
     label = 0;
     if (($node_fr_num_0192 | 0) == 0) {
      $retval_0 = 0;
      label = 916;
      break;
     }
     $add191 = ($id_num_0 & 65535) - 1 | 0;
     $conv177 = $id_num_0 & 65535;
     $node_fr_pos144_0144 = 0;
     $node_to_num_9145 = 0;
     while (1) {
      $31 = HEAP32[$node_fr_ge1_0_ph201 + ($node_fr_pos144_0144 << 2) >> 2] | 0;
      $num_of_son152 = $31 + 6 | 0;
      $son_1st_off_l = $31 | 0;
      $son_1st_off_h = $31 + 8 | 0;
      $node_to_num_10 = $node_to_num_9145;
      $son_pos150_0 = 0;
      while (1) {
       if ($son_pos150_0 >>> 0 >= (HEAPU8[$num_of_son152] | 0) >>> 0) {
        $node_to_num_12 = $node_to_num_10;
        break;
       }
       if ((HEAP16[$son_1st_off_l >> 1] | 0) == 0) {
        if ((HEAP8[$son_1st_off_h] | 0) == 0) {
         label = 892;
         break L1043;
        }
       }
       $35 = HEAP32[$nodes_ge1_165 >> 2] | 0;
       $add_ptr167_sum = (__ZN10ime_pinyin8DictTrie14get_son_offsetEPKNS_10LmaNodeGE1E(0, $31) | 0) + $son_pos150_0 | 0;
       $add_ptr168 = $35 + ($add_ptr167_sum * 10 | 0) | 0;
       $spl_idx169 = $35 + ($add_ptr167_sum * 10 | 0) + 4 | 0;
       $36 = HEAP16[$spl_idx169 >> 1] | 0;
       $37 = HEAP16[$id_start >> 1] | 0;
       do {
        if (($36 & 65535) < ($37 & 65535)) {
         $node_to_num_11 = $node_to_num_10;
        } else {
         if (!(($36 & 65535 | 0) < (($37 & 65535) + $conv177 | 0) & $node_to_num_10 >>> 0 < 200)) {
          $node_to_num_11 = $node_to_num_10;
          break;
         }
         HEAP32[$node_to_ge1_0193 + ($node_to_num_10 << 2) >> 2] = $add_ptr168;
         $node_to_num_11 = $node_to_num_10 + 1 | 0;
        }
       } while (0);
       if ((HEAPU16[$spl_idx169 >> 1] | 0) < ($add191 + (HEAPU16[$id_start >> 1] | 0) | 0)) {
        $node_to_num_10 = $node_to_num_11;
        $son_pos150_0 = $son_pos150_0 + 1 | 0;
       } else {
        $node_to_num_12 = $node_to_num_11;
        break;
       }
      }
      $inc200 = $node_fr_pos144_0144 + 1 | 0;
      if ($inc200 >>> 0 < $node_fr_num_0192 >>> 0) {
       $node_fr_pos144_0144 = $inc200;
       $node_to_num_9145 = $node_to_num_12;
      } else {
       break;
      }
     }
     $inc202 = $spl_pos_0191 + 1 | 0;
     if ($inc202 >>> 0 >= $conv >>> 0 | ($node_to_num_12 | 0) == 0) {
      $node_to_num_14 = $node_to_num_12;
      $spl_pos_2 = $inc202;
      label = 899;
      break;
     } else {
      $node_fr_le0_0_ph_be = $node_fr_le0_0195;
      $node_to_le0_0_ph_be = $node_to_le0_0194;
      $node_to_ge1_0_ph_be = $node_fr_ge1_0_ph201;
      $node_fr_num_0_ph_be = $node_to_num_12;
      $spl_pos_0_ph_be = $inc202;
     }
    } else if ((label | 0) == 859) {
     label = 0;
     if (($node_fr_num_0192 | 0) == 0) {
      $retval_0 = 0;
      label = 921;
      break;
     }
     $add125 = ($id_num_0 & 65535) - 1 | 0;
     $conv111 = $id_num_0 & 65535;
     $node_fr_pos83_0133 = 0;
     $node_to_num_5134 = 0;
     while (1) {
      $21 = HEAP32[$node_fr_le0_0195 + ($node_fr_pos83_0133 << 2) >> 2] | 0;
      $num_of_son = $21 + 10 | 0;
      $son_1st_off94 = $21 | 0;
      $node_to_num_6 = $node_to_num_5134;
      $son_pos89_0 = 0;
      while (1) {
       if ($son_pos89_0 >>> 0 >= (HEAPU16[$num_of_son >> 1] | 0) >>> 0) {
        $node_to_num_8 = $node_to_num_6;
        break;
       }
       $23 = HEAP32[$son_1st_off94 >> 2] | 0;
       if ($23 >>> 0 > (HEAP32[$lma_node_num_ge1_ >> 2] | 0) >>> 0) {
        label = 879;
        break L1043;
       }
       $25 = HEAP32[$nodes_ge1_ >> 2] | 0;
       $add_ptr101_sum = $23 + $son_pos89_0 | 0;
       $add_ptr102 = $25 + ($add_ptr101_sum * 10 | 0) | 0;
       $spl_idx103 = $25 + ($add_ptr101_sum * 10 | 0) + 4 | 0;
       $26 = HEAP16[$spl_idx103 >> 1] | 0;
       $27 = HEAP16[$id_start >> 1] | 0;
       do {
        if (($26 & 65535) < ($27 & 65535)) {
         $node_to_num_7 = $node_to_num_6;
        } else {
         if (!(($26 & 65535 | 0) < (($27 & 65535) + $conv111 | 0) & $node_to_num_6 >>> 0 < 200)) {
          $node_to_num_7 = $node_to_num_6;
          break;
         }
         HEAP32[$node_to_ge1_0193 + ($node_to_num_6 << 2) >> 2] = $add_ptr102;
         $node_to_num_7 = $node_to_num_6 + 1 | 0;
        }
       } while (0);
       if ((HEAPU16[$spl_idx103 >> 1] | 0) < ($add125 + (HEAPU16[$id_start >> 1] | 0) | 0)) {
        $node_to_num_6 = $node_to_num_7;
        $son_pos89_0 = $son_pos89_0 + 1 | 0;
       } else {
        $node_to_num_8 = $node_to_num_7;
        break;
       }
      }
      $inc134 = $node_fr_pos83_0133 + 1 | 0;
      if ($inc134 >>> 0 < $node_fr_num_0192 >>> 0) {
       $node_fr_pos83_0133 = $inc134;
       $node_to_num_5134 = $node_to_num_8;
      } else {
       break;
      }
     }
     $inc136 = $spl_pos_0191 + 1 | 0;
     if ($inc136 >>> 0 >= $conv >>> 0 | ($node_to_num_8 | 0) == 0) {
      $node_to_num_14 = $node_to_num_8;
      $spl_pos_2 = $inc136;
      label = 899;
      break;
     }
     $node_fr_le0_0_ph_be = 0;
     $node_to_le0_0_ph_be = 0;
     $node_to_ge1_0_ph_be = $node_fr_le0_0195;
     $node_fr_num_0_ph_be = $node_to_num_8;
     $spl_pos_0_ph_be = $inc136;
    }
    if ($spl_pos_0_ph_be >>> 0 < $conv >>> 0) {
     $spl_pos_0_ph198 = $spl_pos_0_ph_be;
     $node_fr_num_0_ph199 = $node_fr_num_0_ph_be;
     $node_to_ge1_0_ph200 = $node_to_ge1_0_ph_be;
     $node_fr_ge1_0_ph201 = $node_to_ge1_0193;
     $node_to_le0_0_ph202 = $node_to_le0_0_ph_be;
     $node_fr_le0_0_ph203 = $node_fr_le0_0_ph_be;
    } else {
     $retval_0 = 0;
     label = 919;
     break;
    }
   }
   if ((label | 0) == 866) {
    ___assert_func(3680, 708, 4720, 824);
    return 0;
   } else if ((label | 0) == 862) {
    ___assert_func(3680, 703, 4720, 3440);
    return 0;
   } else if ((label | 0) == 892) {
    ___assert_func(3680, 768, 4720, 4112);
    return 0;
   } else if ((label | 0) == 853) {
    ___assert_func(3680, 696, 4720, 3600);
    return 0;
   } else if ((label | 0) == 879) {
    ___assert_func(3680, 737, 4720, 4312);
    return 0;
   } else if ((label | 0) == 899) {
    if (($node_to_num_14 | 0) == 0) {
     $retval_0 = 0;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
    $call215 = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
    do {
     if ($splid_str_len << 16 >> 16 == 1) {
      if (!(__ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt(HEAP32[$this + 8 >> 2] | 0, HEAP16[$splid_str >> 1] | 0) | 0)) {
       $node_to_num_15 = $node_to_num_14;
       break;
      }
      $node_to_num_15 = ($node_to_num_14 | 0) != 0 | 0;
     } else {
      $node_to_num_15 = $node_to_num_14;
     }
    } while (0);
    $cmp228 = $spl_pos_2 >>> 0 < 2;
    $sub246 = $max_lma_buf - 1 | 0;
    $42 = $conv << 24 & 251658240;
    $sub278 = $max_lma_buf - 1 | 0;
    $node_pos_0 = 0;
    $lma_num_0 = 0;
    while (1) {
     if ($node_pos_0 >>> 0 >= $node_to_num_15 >>> 0) {
      $retval_0 = $lma_num_0;
      label = 924;
      break;
     }
     L1117 : do {
      if ($cmp228) {
       $43 = HEAP32[$node_to_le0_0194 + ($node_pos_0 << 2) >> 2] | 0;
       $conv232 = HEAPU16[$43 + 12 >> 1] | 0;
       $homo_idx_buf_off = $43 + 4 | 0;
       $homo_pos_0 = 0;
       while (1) {
        if ($homo_pos_0 >>> 0 >= $conv232 >>> 0) {
         $num_of_homo_0 = $conv232;
         break L1117;
        }
        $add236 = $homo_pos_0 + $lma_num_0 | 0;
        $bf_value = (__ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, (HEAP32[$homo_idx_buf_off >> 2] | 0) + $homo_pos_0 | 0) | 0) & 16777215;
        $46 = $lma_buf + ($add236 << 3) | 0;
        HEAP32[$46 >> 2] = $bf_value | HEAP32[$46 >> 2] & -268435456 | 16777216;
        HEAP16[$lma_buf + ($add236 << 3) + 4 >> 1] = ~~+__ZN10ime_pinyin5NGram11get_uni_psbEj($call215, $bf_value);
        if ($add236 >>> 0 < $sub246 >>> 0) {
         $homo_pos_0 = $homo_pos_0 + 1 | 0;
        } else {
         $num_of_homo_0 = $conv232;
         break;
        }
       }
      } else {
       $51 = HEAP32[$node_to_ge1_0193 + ($node_pos_0 << 2) >> 2] | 0;
       $conv256 = HEAPU8[$51 + 7 | 0] | 0;
       $homo_pos257_0 = 0;
       while (1) {
        if ($homo_pos257_0 >>> 0 >= $conv256 >>> 0) {
         $num_of_homo_0 = $conv256;
         break L1117;
        }
        $add262 = $homo_pos257_0 + $lma_num_0 | 0;
        $bf_value267 = (__ZN10ime_pinyin8DictTrie12get_lemma_idEj($this, (__ZN10ime_pinyin8DictTrie23get_homo_idx_buf_offsetEPKNS_10LmaNodeGE1E(0, $51) | 0) + $homo_pos257_0 | 0) | 0) & 16777215;
        $53 = $lma_buf + ($add262 << 3) | 0;
        HEAP32[$53 >> 2] = $bf_value267 | $42 | HEAP32[$53 >> 2] & -268435456;
        HEAP16[$lma_buf + ($add262 << 3) + 4 >> 1] = ~~+__ZN10ime_pinyin5NGram11get_uni_psbEj($call215, $bf_value267);
        if ($add262 >>> 0 < $sub278 >>> 0) {
         $homo_pos257_0 = $homo_pos257_0 + 1 | 0;
        } else {
         $num_of_homo_0 = $conv256;
         break;
        }
       }
      }
     } while (0);
     $add286 = $num_of_homo_0 + $lma_num_0 | 0;
     if ($add286 >>> 0 < $max_lma_buf >>> 0) {
      $node_pos_0 = $node_pos_0 + 1 | 0;
      $lma_num_0 = $add286;
     } else {
      $retval_0 = $max_lma_buf;
      label = 925;
      break;
     }
    }
    if ((label | 0) == 924) {
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 925) {
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } else if ((label | 0) == 914) {
    ___assert_func(3680, 711, 4720, 3304);
    return 0;
   } else if ((label | 0) == 915) {
    ___assert_func(3680, 711, 4720, 3304);
    return 0;
   } else if ((label | 0) == 916) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 919) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 920) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 921) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 922) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictTrie16get_lemma_splidsEjPttb($this, $id_lemma, $splids, $splids_max, $arg_valid) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $splids = $splids | 0;
   $splids_max = $splids_max | 0;
   $arg_valid = $arg_valid | 0;
   var $lma_str = 0, $spl_mtrx = 0, $spl_start = 0, $call = 0, $spl_trie_ = 0, $_in43 = 0, $try_num_0_lcssa = 0, $cmp6344 = 0, $conv652 = 0, $pos_051 = 0, $try_num_050 = 0, $arrayidx11 = 0, $cond_off0 = 0, $9 = 0, $call37 = 0, $cand_splids_this_0 = 0, $inc = 0, $phitmp = 0, $try_pos_0 = 0, $conv6147 = 0, $pos59_046 = 0, $mod_045 = 0, $12 = 0, $sub72 = 0, $mul86 = 0, $inc89 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 128 | 0;
   $lma_str = sp | 0;
   $spl_mtrx = sp + 24 | 0;
   $spl_start = sp + 104 | 0;
   $call = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$this >> 2] | 0) + 32 >> 2] & 31]($this, $id_lemma, $lma_str | 0, 9) | 0;
   if (!($call << 16 >> 16 == $splids_max << 16 >> 16 | (($call & 65535) > ($splids_max & 65535) | $arg_valid) ^ 1)) {
    ___assert_func(3680, 861, 4816, 3200);
    return 0;
   }
   HEAP16[$spl_start >> 1] = 0;
   L1141 : do {
    if ($call << 16 >> 16 == 0) {
     $try_num_0_lcssa = 1;
    } else {
     $spl_trie_ = $this + 8 | 0;
     $_in43 = $this + 4 | 0;
     $try_num_050 = 1;
     $pos_051 = 0;
     $conv652 = 0;
     while (1) {
      do {
       if ($arg_valid) {
        $arrayidx11 = $splids + ($conv652 << 1) | 0;
        if (__ZNK10ime_pinyin12SpellingTrie10is_full_idEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arrayidx11 >> 1] | 0) | 0) {
         HEAP16[$spl_mtrx + ((HEAPU16[$spl_start + ($conv652 << 1) >> 1] | 0) << 1) >> 1] = HEAP16[$arrayidx11 >> 1] | 0;
         $cand_splids_this_0 = 1;
         break;
        } else {
         $cond_off0 = HEAP16[$splids + ($conv652 << 1) >> 1] | 0;
         label = 935;
         break;
        }
       } else {
        $cond_off0 = 0;
        label = 935;
       }
      } while (0);
      if ((label | 0) == 935) {
       label = 0;
       $9 = HEAP16[$spl_start + ($conv652 << 1) >> 1] | 0;
       $call37 = __ZN10ime_pinyin8DictList20get_splids_for_hanziEttPtt(HEAP32[$_in43 >> 2] | 0, HEAP16[$lma_str + ($conv652 << 1) >> 1] | 0, $cond_off0, $spl_mtrx + (($9 & 65535) << 1) | 0, 40 - $9 & 65535) | 0;
       if ($call37 << 16 >> 16 == 0) {
        break;
       } else {
        $cand_splids_this_0 = $call37;
       }
      }
      HEAP16[$spl_start + ($conv652 + 1 << 1) >> 1] = (HEAP16[$spl_start + ($conv652 << 1) >> 1] | 0) + $cand_splids_this_0 & 65535;
      $inc = $pos_051 + 1 & 65535;
      $phitmp = (Math_imul($cand_splids_this_0 & 65535, $try_num_050) | 0) & 65535;
      if (($inc & 65535) < ($call & 65535)) {
       $try_num_050 = $phitmp;
       $pos_051 = $inc;
       $conv652 = $inc & 65535;
      } else {
       $try_num_0_lcssa = $phitmp;
       break L1141;
      }
     }
     ___assert_func(3680, 877, 4816, 3112);
     return 0;
    }
   } while (0);
   $cmp6344 = $call << 16 >> 16 == 0;
   $try_pos_0 = 0;
   while (1) {
    if (($try_pos_0 & 65535) >>> 0 >= $try_num_0_lcssa >>> 0) {
     $retval_0 = 0;
     label = 944;
     break;
    }
    if (!$cmp6344) {
     $mod_045 = 1;
     $pos59_046 = 0;
     $conv6147 = 0;
     while (1) {
      $12 = HEAP16[$spl_start + ($conv6147 << 1) >> 1] | 0;
      $sub72 = (HEAP16[$spl_start + ($conv6147 + 1 << 1) >> 1] | 0) - $12 & 65535;
      HEAP16[$splids + ($conv6147 << 1) >> 1] = HEAP16[$spl_mtrx + (((((($try_pos_0 & 65535) / ($mod_045 & 65535) | 0) & 65535) % ($sub72 & 65535) | 0) & 65535) + ($12 & 65535) << 1) >> 1] | 0;
      $mul86 = Math_imul($sub72, $mod_045) | 0;
      $inc89 = $pos59_046 + 1 & 65535;
      if (($inc89 & 65535) < ($call & 65535)) {
       $mod_045 = $mul86;
       $pos59_046 = $inc89;
       $conv6147 = $inc89 & 65535;
      } else {
       break;
      }
     }
    }
    if (__ZN10ime_pinyin8DictTrie10try_extendEPKttj($this, $splids, $call, $id_lemma) | 0) {
     $retval_0 = $call;
     label = 943;
     break;
    } else {
     $try_pos_0 = $try_pos_0 + 1 & 65535;
    }
   }
   if ((label | 0) == 944) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 943) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12MatrixSearch12set_max_lensEjj($this, $max_sps_len, $max_hzs_len) {
   $this = $this | 0;
   $max_sps_len = $max_sps_len | 0;
   $max_hzs_len = $max_hzs_len | 0;
   if (($max_sps_len | 0) != 0) {
    HEAP32[$this + 24 >> 2] = $max_sps_len;
   }
   if (($max_hzs_len | 0) == 0) {
    return;
   }
   HEAP32[$this + 28 >> 2] = $max_hzs_len;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch16set_xi_an_switchEb($this, $xi_an_enabled) {
   $this = $this | 0;
   $xi_an_enabled = $xi_an_enabled | 0;
   HEAP8[$this + 8 | 0] = $xi_an_enabled & 1;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch16get_xi_an_switchEv($this) {
   $this = $this | 0;
   return (HEAP8[$this + 8 | 0] & 1) != 0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch14alloc_resourceEv($this) {
   $this = $this | 0;
   var $0 = 0, $dict_trie_ = 0, $call2 = 0, $user_dict_ = 0, $3 = 0, $spl_parser_ = 0, $div = 0, $div10 = 0, $div12 = 0, $add = 0, $add15 = 0, $add16 = 0, $4$0 = 0, $call17 = 0, $share_buf_ = 0, $retval_0 = 0;
   __ZN10ime_pinyin12MatrixSearch13free_resourceEv($this);
   $0 = __Znwj(64) | 0;
   __ZN10ime_pinyin8DictTrieC2Ev($0);
   $dict_trie_ = $this + 12 | 0;
   HEAP32[$dict_trie_ >> 2] = $0;
   $call2 = __Znwj(1132) | 0;
   __ZN10ime_pinyin8UserDictC2Ev($call2);
   $user_dict_ = $this + 16 | 0;
   HEAP32[$user_dict_ >> 2] = $call2;
   $3 = __Znwj(4) | 0;
   __ZN10ime_pinyin14SpellingParserC2Ev($3);
   $spl_parser_ = $this + 20 | 0;
   HEAP32[$spl_parser_ >> 2] = $3;
   $div = (__ZN10ime_pinyin15align_to_size_tEj(3200) | 0) >>> 2;
   $div10 = (__ZN10ime_pinyin15align_to_size_tEj(9600) | 0) >>> 2;
   $div12 = (__ZN10ime_pinyin15align_to_size_tEj(480) | 0) >>> 2;
   $add = $div10 + $div | 0;
   $add15 = $add + $div12 | 0;
   $add16 = $add15 + ((__ZN10ime_pinyin15align_to_size_tEj(92) | 0) >>> 2) | 0;
   $4$0 = _llvm_umul_with_overflow_i32($add16 | 0, 4) | 0;
   $call17 = __Znaj(tempRet0 ? -1 : $4$0) | 0;
   $share_buf_ = $this + 76 | 0;
   HEAP32[$share_buf_ >> 2] = $call17;
   if ((HEAP32[$dict_trie_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$user_dict_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$spl_parser_ >> 2] | 0) == 0 | ($call17 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP32[$this + 80 >> 2] = $call17;
   HEAP32[$this + 88 >> 2] = (HEAP32[$share_buf_ >> 2] | 0) + ($div << 2);
   HEAP32[$this + 96 >> 2] = (HEAP32[$share_buf_ >> 2] | 0) + ($add << 2);
   HEAP32[$this + 100 >> 2] = (HEAP32[$share_buf_ >> 2] | 0) + ($add15 << 2);
   HEAP32[$this + 104 >> 2] = HEAP32[$share_buf_ >> 2];
   HEAP32[$this + 108 >> 2] = ($add16 << 2 >>> 0) / 20 | 0;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch4initEPKcS2_($this, $fn_sys_dict, $fn_usr_dict) {
   $this = $this | 0;
   $fn_sys_dict = $fn_sys_dict | 0;
   $fn_usr_dict = $fn_usr_dict | 0;
   var $0 = 0, $user_dict_ = 0, $3 = 0, $call10 = 0, $6 = 0, $retval_0 = 0;
   if (($fn_sys_dict | 0) == 0 | ($fn_usr_dict | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin12MatrixSearch14alloc_resourceEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $0 = HEAP32[$this + 12 >> 2] | 0;
   if (!(FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$0 >> 2] | 0) + 8 >> 2] & 31]($0, $fn_sys_dict, 1, 5e5) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $user_dict_ = $this + 16 | 0;
   $3 = HEAP32[$user_dict_ >> 2] | 0;
   $call10 = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$3 >> 2] | 0) + 8 >> 2] & 31]($3, $fn_usr_dict, 500001, 6e5) | 0;
   $6 = HEAP32[$user_dict_ >> 2] | 0;
   if ($call10) {
    FUNCTION_TABLE_vii[HEAP32[(HEAP32[$6 >> 2] | 0) + 72 >> 2] & 15]($6, 1e8);
   } else {
    if (($6 | 0) != 0) {
     FUNCTION_TABLE_vi[HEAP32[(HEAP32[$6 >> 2] | 0) + 4 >> 2] & 127]($6);
    }
    HEAP32[$user_dict_ >> 2] = 0;
   }
   __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
   HEAP8[$this | 0] = 1;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) {
   $this = $this | 0;
   var $mtrx_nd_pool_used_ = 0, $matrix_ = 0, $6 = 0, $conv10 = 0, $add_ptr = 0, $12 = 0, $17 = 0, $21 = 0, $24 = 0, $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP32[$this + 72 >> 2] = 0;
   $mtrx_nd_pool_used_ = $this + 84 | 0;
   HEAP16[$mtrx_nd_pool_used_ >> 1] = 0;
   HEAP16[$this + 92 >> 1] = 0;
   $matrix_ = $this + 96 | 0;
   HEAP16[HEAP32[$matrix_ >> 2] >> 1] = HEAP16[$mtrx_nd_pool_used_ >> 1] | 0;
   HEAP16[(HEAP32[$matrix_ >> 2] | 0) + 4 >> 1] = 1;
   HEAP16[$mtrx_nd_pool_used_ >> 1] = (HEAP16[$mtrx_nd_pool_used_ >> 1] | 0) + 1 & 65535;
   $6 = HEAP32[$this + 80 >> 2] | 0;
   $conv10 = HEAPU16[HEAP32[$matrix_ >> 2] >> 1] | 0;
   $add_ptr = $6 + ($conv10 << 4) | 0;
   HEAP32[$add_ptr >> 2] = 0;
   HEAPF32[$6 + ($conv10 << 4) + 4 >> 2] = 0.0;
   HEAP32[$6 + ($conv10 << 4) + 8 >> 2] = 0;
   HEAP16[$6 + ($conv10 << 4) + 14 >> 1] = 0;
   HEAP16[$6 + ($conv10 << 4) + 12 >> 1] = -1;
   HEAP16[(HEAP32[$matrix_ >> 2] | 0) + 2 >> 1] = 0;
   $12 = (HEAP32[$matrix_ >> 2] | 0) + 6 | 0;
   HEAP16[$12 >> 1] = HEAP16[$12 >> 1] & -32768;
   $17 = (HEAP32[$matrix_ >> 2] | 0) + 6 | 0;
   HEAP16[$17 >> 1] = HEAP16[$17 >> 1] | -32768;
   HEAP32[(HEAP32[$matrix_ >> 2] | 0) + 8 >> 2] = $add_ptr;
   HEAP16[$this + 116 >> 1] = 0;
   HEAP32[$this + 356 >> 2] = 0;
   HEAP16[$this + 736 >> 1] = 0;
   HEAP32[$this + 896 >> 2] = 0;
   $21 = HEAP32[$this + 12 >> 2] | 0;
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[$21 >> 2] | 0) + 20 >> 2] & 15]($21, 0, 0);
   $24 = HEAP32[$this + 16 >> 2] | 0;
   if (($24 | 0) == 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[$24 >> 2] | 0) + 20 >> 2] & 15]($24, 0, 0);
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch7init_fdEillPKc($this, $sys_fd, $start_offset, $length, $fn_usr_dict) {
   $this = $this | 0;
   $sys_fd = $sys_fd | 0;
   $start_offset = $start_offset | 0;
   $length = $length | 0;
   $fn_usr_dict = $fn_usr_dict | 0;
   var $user_dict_ = 0, $1 = 0, $call7 = 0, $4 = 0, $retval_0 = 0;
   if (($fn_usr_dict | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin12MatrixSearch14alloc_resourceEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8DictTrie12load_dict_fdEilljj(HEAP32[$this + 12 >> 2] | 0, $sys_fd, $start_offset, $length, 1, 5e5) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $user_dict_ = $this + 16 | 0;
   $1 = HEAP32[$user_dict_ >> 2] | 0;
   $call7 = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$1 >> 2] | 0) + 8 >> 2] & 31]($1, $fn_usr_dict, 500001, 6e5) | 0;
   $4 = HEAP32[$user_dict_ >> 2] | 0;
   if ($call7) {
    FUNCTION_TABLE_vii[HEAP32[(HEAP32[$4 >> 2] | 0) + 72 >> 2] & 15]($4, 1e8);
   } else {
    if (($4 | 0) != 0) {
     FUNCTION_TABLE_vi[HEAP32[(HEAP32[$4 >> 2] | 0) + 4 >> 2] & 127]($4);
    }
    HEAP32[$user_dict_ >> 2] = 0;
   }
   __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
   HEAP8[$this | 0] = 1;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch5closeEv($this) {
   $this = $this | 0;
   __ZN10ime_pinyin12MatrixSearch11flush_cacheEv($this);
   __ZN10ime_pinyin12MatrixSearch13free_resourceEv($this);
   HEAP8[$this | 0] = 0;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch11flush_cacheEv($this) {
   $this = $this | 0;
   var $0 = 0;
   $0 = HEAP32[$this + 16 >> 2] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   FUNCTION_TABLE_vi[HEAP32[(HEAP32[$0 >> 2] | 0) + 76 >> 2] & 127]($0);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch12reset_searchEv($this) {
   $this = $this | 0;
   var $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch10del_in_pysEjj($this, $start, $len) {
   $this = $this | 0;
   $start = $start | 0;
   $len = $len | 0;
   var $sub = 0, $start_addr_07 = 0, $arrayidx = 0, $inc = 0, label = 0;
   $sub = 40 - $len | 0;
   if ($sub >>> 0 > $start >>> 0) {
    $start_addr_07 = $start;
   } else {
    return;
   }
   while (1) {
    $arrayidx = $this + 32 + $start_addr_07 | 0;
    if ((HEAP8[$arrayidx] | 0) == 0) {
     label = 1022;
     break;
    }
    HEAP8[$arrayidx] = HEAP8[$start_addr_07 + $len + ($this + 32) | 0] | 0;
    $inc = $start_addr_07 + 1 | 0;
    if ($inc >>> 0 < $sub >>> 0) {
     $start_addr_07 = $inc;
    } else {
     label = 1020;
     break;
    }
   }
   if ((label | 0) == 1020) {
    return;
   } else if ((label | 0) == 1022) {
    return;
   }
  }
  function __ZN10ime_pinyin12MatrixSearch8add_charEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   var $retval_0 = 0;
   if (!(__ZN10ime_pinyin12MatrixSearch16prepare_add_charEc($this, $ch) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch15add_char_qwertyEv($this) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch6searchEPKcj($this, $py, $py_len) {
   $this = $this | 0;
   $py = $py | 0;
   $py_len = $py_len | 0;
   var $_py_len = 0, $pys_decoded_len_ = 0, $2 = 0, $ch_pos_0 = 0, $3 = 0, $add_ptr = 0, $add_ptr21 = 0, $sub = 0, $ch_pos_1 = 0, $spl_id_num_ = 0, $py_len_addr_124 = 0, $retval_0 = 0, label = 0;
   if ((HEAP8[$this | 0] & 1) == 0 | ($py | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $_py_len = $py_len >>> 0 > 39 ? 39 : $py_len;
   $pys_decoded_len_ = $this + 72 | 0;
   $2 = HEAP32[$pys_decoded_len_ >> 2] | 0;
   $ch_pos_0 = 0;
   while (1) {
    if ($ch_pos_0 >>> 0 >= $2 >>> 0) {
     break;
    }
    $3 = HEAP8[$py + $ch_pos_0 | 0] | 0;
    if ($3 << 24 >> 24 == 0) {
     break;
    }
    if ($3 << 24 >> 24 == (HEAP8[$this + 32 + $ch_pos_0 | 0] | 0)) {
     $ch_pos_0 = $ch_pos_0 + 1 | 0;
    } else {
     break;
    }
   }
   __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $ch_pos_0, ($ch_pos_0 | 0) != (HEAP32[$pys_decoded_len_ >> 2] | 0), 0, 0) | 0;
   $add_ptr = $this + 32 + $ch_pos_0 | 0;
   $add_ptr21 = $py + $ch_pos_0 | 0;
   $sub = $_py_len - $ch_pos_0 | 0;
   _memcpy($add_ptr | 0, $add_ptr21 | 0, $sub) | 0;
   HEAP8[$this + 32 + $_py_len | 0] = 0;
   $ch_pos_1 = $ch_pos_0;
   while (1) {
    if ((HEAP8[$this + 32 + $ch_pos_1 | 0] | 0) == 0) {
     break;
    }
    if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, HEAP8[$py + $ch_pos_1 | 0] | 0) | 0) {
     $ch_pos_1 = $ch_pos_1 + 1 | 0;
    } else {
     label = 1036;
     break;
    }
   }
   if ((label | 0) == 1036) {
    HEAP32[$pys_decoded_len_ >> 2] = $ch_pos_1;
   }
   __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this);
   $spl_id_num_ = $this + 732 | 0;
   if ((HEAP32[$spl_id_num_ >> 2] | 0) >>> 0 > 9) {
    $py_len_addr_124 = $_py_len;
    do {
     $py_len_addr_124 = $py_len_addr_124 - 1 | 0;
     __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $py_len_addr_124, 0, 0, 0) | 0;
     HEAP8[$this + 32 + $py_len_addr_124 | 0] = 0;
     __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this);
    } while ((HEAP32[$spl_id_num_ >> 2] | 0) >>> 0 > 9);
   }
   __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this);
   $retval_0 = $ch_pos_1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $ch_pos, $clear_fixed_this_step, $clear_dmi_this_step, $clear_mtrx_this_step) {
   $this = $this | 0;
   $ch_pos = $ch_pos | 0;
   $clear_fixed_this_step = $clear_fixed_this_step | 0;
   $clear_dmi_this_step = $clear_dmi_this_step | 0;
   $clear_mtrx_this_step = $clear_mtrx_this_step | 0;
   var $pys_decoded_len_ = 0, $cmp6 = 0, $3 = 0, $add = 0, $10 = 0, $dict_handles_to_clear_1 = 0, $16 = 0, $conv40 = 0, $20 = 0, $sub = 0, $matrix_54 = 0, $24 = 0, $31 = 0, $34 = 0, $sub85 = 0, $matrix_86 = 0, $39 = 0, $43 = 0, $fixed_hzs_ = 0, $fixed_ch_pos_0_ph = 0, $matrix_130 = 0, $50 = 0, $fixed_ch_pos_0 = 0, $cmp133 = 0, $fixed_lmas_ = 0, $52 = 0, $conv141114 = 0, $54 = 0, $inc = 0, $conv141 = 0, $conv141_lcssa = 0, $56 = 0, $conv157110 = 0, $58 = 0, $59 = 0, $inc162 = 0, $conv157 = 0, $61 = 0, $_lcssa = 0, $conv157_lcssa = 0, $cmp177 = 0, $or_cond85 = 0, $62 = 0, $dict_handles_to_clear174_0 = 0, $add200 = 0, $69 = 0, $dict_handles_to_clear174_1 = 0, $75 = 0, $conv224 = 0, $79 = 0, $sub241 = 0, $83 = 0, $90 = 0, $93 = 0, $sub276 = 0, $98 = 0, $102 = 0, $conv306105 = 0, $conv306108 = 0, $re_pos_0107 = 0, $inc311 = 0, $conv306 = 0, $arrayidx317 = 0, $sublma_num = 0, $length366 = 0, $conv321104 = 0, $subpos_0103 = 0, $108 = 0, $add329 = 0, $arrayidx332 = 0, $109 = 0, $splpos_0100 = 0, $conv334101 = 0, $dmi_c_phrase_ = 0, $length386 = 0, $c_py_pos_0 = 0, $116 = 0, $idxprom420 = 0, $120 = 0, $retval_0 = 0, label = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $pys_decoded_len_ = $this + 72 | 0;
   if ((HEAP32[$pys_decoded_len_ >> 2] | 0) >>> 0 < $ch_pos >>> 0 | $ch_pos >>> 0 > 39) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $cmp6 = ($ch_pos | 0) == 0;
   if ($cmp6) {
    __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   do {
    if ($clear_dmi_this_step) {
     $3 = HEAP32[$this + 96 >> 2] | 0;
     if ((HEAP16[$3 + ($ch_pos * 12 | 0) + 6 >> 1] & 32767) == 0) {
      HEAP32[$pys_decoded_len_ >> 2] = $ch_pos;
      label = 1059;
      break;
     } else {
      $dict_handles_to_clear_1 = (HEAP32[$this + 88 >> 2] | 0) + ((HEAPU16[$3 + ($ch_pos * 12 | 0) + 2 >> 1] | 0) * 12 | 0) | 0;
      label = 1055;
      break;
     }
    } else {
     if ((HEAP32[$pys_decoded_len_ >> 2] | 0) >>> 0 <= $ch_pos >>> 0 | $clear_dmi_this_step) {
      HEAP32[$pys_decoded_len_ >> 2] = $ch_pos;
      label = 1060;
      break;
     }
     $add = $ch_pos + 1 | 0;
     $10 = HEAP32[$this + 96 >> 2] | 0;
     if ((HEAP16[$10 + ($add * 12 | 0) + 6 >> 1] & 32767) == 0) {
      label = 1058;
      break;
     }
     $dict_handles_to_clear_1 = (HEAP32[$this + 88 >> 2] | 0) + ((HEAPU16[$10 + ($add * 12 | 0) + 2 >> 1] | 0) * 12 | 0) | 0;
     label = 1055;
    }
   } while (0);
   do {
    if ((label | 0) == 1055) {
     if (($dict_handles_to_clear_1 | 0) == 0) {
      label = 1058;
      break;
     }
     $16 = HEAP32[$this + 12 >> 2] | 0;
     $conv40 = $ch_pos & 65535;
     FUNCTION_TABLE_viii[HEAP32[(HEAP32[$16 >> 2] | 0) + 20 >> 2] & 15]($16, $conv40, HEAP16[$dict_handles_to_clear_1 >> 1] | 0);
     $20 = HEAP32[$this + 16 >> 2] | 0;
     if (($20 | 0) == 0) {
      label = 1058;
      break;
     }
     FUNCTION_TABLE_viii[HEAP32[(HEAP32[$20 >> 2] | 0) + 20 >> 2] & 15]($20, $conv40, HEAP16[$dict_handles_to_clear_1 + 2 >> 1] | 0);
     label = 1058;
    }
   } while (0);
   if ((label | 0) == 1058) {
    HEAP32[$pys_decoded_len_ >> 2] = $ch_pos;
    if ($clear_dmi_this_step) {
     label = 1059;
    } else {
     label = 1060;
    }
   }
   if ((label | 0) == 1059) {
    $sub = $ch_pos - 1 | 0;
    $matrix_54 = $this + 96 | 0;
    $24 = HEAP32[$matrix_54 >> 2] | 0;
    HEAP16[$this + 92 >> 1] = (HEAP16[$24 + ($sub * 12 | 0) + 6 >> 1] & 32767) + (HEAP16[$24 + ($sub * 12 | 0) + 2 >> 1] | 0) & 65535;
    $31 = (HEAP32[$matrix_54 >> 2] | 0) + ($ch_pos * 12 | 0) + 6 | 0;
    HEAP16[$31 >> 1] = HEAP16[$31 >> 1] & -32768;
   } else if ((label | 0) == 1060) {
    $34 = HEAP32[$this + 96 >> 2] | 0;
    HEAP16[$this + 92 >> 1] = (HEAP16[$34 + ($ch_pos * 12 | 0) + 6 >> 1] & 32767) + (HEAP16[$34 + ($ch_pos * 12 | 0) + 2 >> 1] | 0) & 65535;
   }
   if ($clear_mtrx_this_step) {
    $sub85 = $ch_pos - 1 | 0;
    $matrix_86 = $this + 96 | 0;
    $39 = HEAP32[$matrix_86 >> 2] | 0;
    HEAP16[$this + 84 >> 1] = (HEAP16[$39 + ($sub85 * 12 | 0) + 4 >> 1] | 0) + (HEAP16[$39 + ($sub85 * 12 | 0) >> 1] | 0) & 65535;
    HEAP16[(HEAP32[$matrix_86 >> 2] | 0) + ($ch_pos * 12 | 0) + 4 >> 1] = 0;
   } else {
    $43 = HEAP32[$this + 96 >> 2] | 0;
    HEAP16[$this + 84 >> 1] = (HEAP16[$43 + ($ch_pos * 12 | 0) + 4 >> 1] | 0) + (HEAP16[$43 + ($ch_pos * 12 | 0) >> 1] | 0) & 65535;
   }
   $fixed_hzs_ = $this + 896 | 0;
   if ((HEAP32[$fixed_hzs_ >> 2] | 0) == 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   do {
    if ((HEAP32[$this + 196 >> 2] | 0) == 16777215) {
     if ((HEAPU16[$this + 736 + ((HEAPU16[$this + 724 >> 1] | 0) << 1) >> 1] | 0) >>> 0 <= $ch_pos >>> 0) {
      break;
     }
     if ((HEAP32[$fixed_hzs_ >> 2] | 0) == 0) {
      $retval_0 = 1;
      return $retval_0 | 0;
     }
     $arrayidx317 = $this + 196 | 0;
     if ((HEAP32[$arrayidx317 >> 2] | 0) != 16777215) {
      $retval_0 = 1;
      return $retval_0 | 0;
     }
     $sublma_num = $this + 720 | 0;
     if ((HEAP32[$sublma_num >> 2] | 0) != 0) {
      $length366 = $this + 724 | 0;
      $subpos_0103 = 0;
      $conv321104 = 0;
      do {
       $108 = HEAP16[$this + 640 + ($conv321104 << 1) >> 1] | 0;
       $add329 = $conv321104 + 1 | 0;
       $arrayidx332 = $this + 640 + ($add329 << 1) | 0;
       $109 = HEAP16[$arrayidx332 >> 1] | 0;
       if (($108 & 65535) < ($109 & 65535)) {
        $splpos_0100 = $108;
        do {
         $conv334101 = $splpos_0100 & 65535;
         do {
          if ((HEAPU16[$this + 480 + ($conv334101 << 1) >> 1] | 0) >>> 0 <= $ch_pos >>> 0) {
           if ((HEAPU16[$this + 480 + ($conv334101 + 1 << 1) >> 1] | 0) >>> 0 <= $ch_pos >>> 0) {
            break;
           }
           HEAP16[$this + 560 + ($conv334101 << 1) >> 1] = 0;
           HEAP16[$arrayidx332 >> 1] = $splpos_0100;
           HEAP32[$sublma_num >> 2] = $add329;
           HEAP16[$length366 >> 1] = $splpos_0100;
           if ($splpos_0100 << 16 >> 16 != $108 << 16 >> 16) {
            break;
           }
           HEAP32[$sublma_num >> 2] = $conv321104;
          }
         } while (0);
         $splpos_0100 = $splpos_0100 + 1 & 65535;
        } while (($splpos_0100 & 65535) < ($109 & 65535));
       }
       $subpos_0103 = $subpos_0103 + 1 & 65535;
       $conv321104 = $subpos_0103 & 65535;
      } while ($conv321104 >>> 0 < (HEAP32[$sublma_num >> 2] | 0) >>> 0);
     }
     __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
     $dmi_c_phrase_ = $this + 728 | 0;
     HEAP8[$dmi_c_phrase_] = 1;
     $length386 = $this + 724 | 0;
     $c_py_pos_0 = 0;
     while (1) {
      if (($c_py_pos_0 & 65535) >= (HEAPU16[$this + 736 + ((HEAPU16[$length386 >> 1] | 0) << 1) >> 1] | 0)) {
       break;
      }
      if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, HEAP8[($c_py_pos_0 & 65535) + ($this + 32) | 0] | 0) | 0) {
       $c_py_pos_0 = $c_py_pos_0 + 1 & 65535;
      } else {
       label = 1112;
       break;
      }
     }
     if ((label | 0) == 1112) {
      ___assert_func(1184, 393, 7224, 1632);
      return 0;
     }
     HEAP8[$dmi_c_phrase_] = 0;
     HEAP32[$this + 112 >> 2] = 1;
     HEAP32[$this + 356 >> 2] = 1;
     HEAP8[$this + 360 | 0] = 0;
     $116 = HEAP16[$length386 >> 1] | 0;
     HEAP32[$fixed_hzs_ >> 2] = $116 & 65535;
     HEAP16[$this + 118 >> 1] = $116;
     HEAP32[$arrayidx317 >> 2] = 16777215;
     $idxprom420 = HEAPU16[$this + 736 + (HEAP32[$fixed_hzs_ >> 2] << 1) >> 1] | 0;
     $120 = HEAP32[$this + 96 >> 2] | 0;
     HEAP32[$120 + ($idxprom420 * 12 | 0) + 8 >> 2] = (HEAP32[$this + 80 >> 2] | 0) + ((HEAPU16[$120 + ($idxprom420 * 12 | 0) >> 1] | 0) << 4);
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   if ($clear_fixed_this_step) {
    $fixed_ch_pos_0_ph = $cmp6 ? 0 : $ch_pos - 1 | 0;
   } else {
    $fixed_ch_pos_0_ph = $ch_pos;
   }
   $matrix_130 = $this + 96 | 0;
   $50 = HEAP32[$matrix_130 >> 2] | 0;
   $fixed_ch_pos_0 = $fixed_ch_pos_0_ph;
   while (1) {
    $cmp133 = ($fixed_ch_pos_0 | 0) == 0;
    if ((HEAP32[$50 + ($fixed_ch_pos_0 * 12 | 0) + 8 >> 2] | 0) != 0 | $cmp133) {
     break;
    } else {
     $fixed_ch_pos_0 = $fixed_ch_pos_0 - 1 | 0;
    }
   }
   $fixed_lmas_ = $this + 356 | 0;
   HEAP32[$fixed_lmas_ >> 2] = 0;
   HEAP32[$fixed_hzs_ >> 2] = 0;
   do {
    if (!$cmp133) {
     $52 = HEAP32[$fixed_hzs_ >> 2] | 0;
     $conv141114 = HEAPU16[$this + 736 + ($52 << 1) >> 1] | 0;
     if ($conv141114 >>> 0 < $fixed_ch_pos_0 >>> 0) {
      $54 = $52;
      while (1) {
       $inc = $54 + 1 | 0;
       HEAP32[$fixed_hzs_ >> 2] = $inc;
       $conv141 = HEAPU16[$this + 736 + ($inc << 1) >> 1] | 0;
       if ($conv141 >>> 0 < $fixed_ch_pos_0 >>> 0) {
        $54 = $inc;
       } else {
        $conv141_lcssa = $conv141;
        break;
       }
      }
     } else {
      $conv141_lcssa = $conv141114;
     }
     if (($conv141_lcssa | 0) != ($fixed_ch_pos_0 | 0)) {
      ___assert_func(1184, 308, 7224, 3480);
      return 0;
     }
     $56 = HEAP32[$fixed_lmas_ >> 2] | 0;
     $conv157110 = HEAPU16[$this + 116 + ($56 << 1) >> 1] | 0;
     $58 = HEAP32[$fixed_hzs_ >> 2] | 0;
     if ($conv157110 >>> 0 < $58 >>> 0) {
      $59 = $56;
      while (1) {
       $inc162 = $59 + 1 | 0;
       HEAP32[$fixed_lmas_ >> 2] = $inc162;
       $conv157 = HEAPU16[$this + 116 + ($inc162 << 1) >> 1] | 0;
       $61 = HEAP32[$fixed_hzs_ >> 2] | 0;
       if ($conv157 >>> 0 < $61 >>> 0) {
        $59 = $inc162;
       } else {
        $conv157_lcssa = $conv157;
        $_lcssa = $61;
        break;
       }
      }
     } else {
      $conv157_lcssa = $conv157110;
      $_lcssa = $58;
     }
     if (($conv157_lcssa | 0) == ($_lcssa | 0)) {
      break;
     }
     ___assert_func(1184, 312, 7224, 2456);
     return 0;
    }
   } while (0);
   $cmp177 = ($fixed_ch_pos_0 | 0) == ($ch_pos | 0);
   $or_cond85 = $cmp177 & $clear_dmi_this_step;
   do {
    if ($or_cond85) {
     $62 = HEAP32[$matrix_130 >> 2] | 0;
     if ((HEAP16[$62 + ($fixed_ch_pos_0 * 12 | 0) + 6 >> 1] & 32767) == 0) {
      $dict_handles_to_clear174_0 = 0;
      break;
     }
     $dict_handles_to_clear174_0 = (HEAP32[$this + 88 >> 2] | 0) + ((HEAPU16[$62 + ($fixed_ch_pos_0 * 12 | 0) + 2 >> 1] | 0) * 12 | 0) | 0;
    } else {
     $dict_handles_to_clear174_0 = 0;
    }
   } while (0);
   do {
    if ((HEAP32[$pys_decoded_len_ >> 2] | 0) >>> 0 <= $fixed_ch_pos_0 >>> 0 | $clear_dmi_this_step) {
     $dict_handles_to_clear174_1 = $dict_handles_to_clear174_0;
     label = 1086;
    } else {
     $add200 = $fixed_ch_pos_0 + 1 | 0;
     $69 = HEAP32[$matrix_130 >> 2] | 0;
     if ((HEAP16[$69 + ($add200 * 12 | 0) + 6 >> 1] & 32767) == 0) {
      break;
     }
     $dict_handles_to_clear174_1 = (HEAP32[$this + 88 >> 2] | 0) + ((HEAPU16[$69 + ($add200 * 12 | 0) + 2 >> 1] | 0) * 12 | 0) | 0;
     label = 1086;
    }
   } while (0);
   do {
    if ((label | 0) == 1086) {
     if (($dict_handles_to_clear174_1 | 0) == 0) {
      break;
     }
     $75 = HEAP32[$this + 12 >> 2] | 0;
     $conv224 = $fixed_ch_pos_0 & 65535;
     FUNCTION_TABLE_viii[HEAP32[(HEAP32[$75 >> 2] | 0) + 20 >> 2] & 15]($75, $conv224, HEAP16[$dict_handles_to_clear174_1 >> 1] | 0);
     $79 = HEAP32[$this + 16 >> 2] | 0;
     if (($79 | 0) == 0) {
      break;
     }
     FUNCTION_TABLE_viii[HEAP32[(HEAP32[$79 >> 2] | 0) + 20 >> 2] & 15]($79, $conv224, HEAP16[$dict_handles_to_clear174_1 + 2 >> 1] | 0);
    }
   } while (0);
   HEAP32[$pys_decoded_len_ >> 2] = $fixed_ch_pos_0;
   if ($or_cond85) {
    $sub241 = $fixed_ch_pos_0 - 1 | 0;
    $83 = HEAP32[$matrix_130 >> 2] | 0;
    HEAP16[$this + 92 >> 1] = (HEAP16[$83 + ($sub241 * 12 | 0) + 6 >> 1] & 32767) + (HEAP16[$83 + ($sub241 * 12 | 0) + 2 >> 1] | 0) & 65535;
    $90 = (HEAP32[$matrix_130 >> 2] | 0) + ($fixed_ch_pos_0 * 12 | 0) + 6 | 0;
    HEAP16[$90 >> 1] = HEAP16[$90 >> 1] & -32768;
   } else {
    $93 = HEAP32[$matrix_130 >> 2] | 0;
    HEAP16[$this + 92 >> 1] = (HEAP16[$93 + ($fixed_ch_pos_0 * 12 | 0) + 6 >> 1] & 32767) + (HEAP16[$93 + ($fixed_ch_pos_0 * 12 | 0) + 2 >> 1] | 0) & 65535;
   }
   if ($cmp177 & $clear_mtrx_this_step) {
    $sub276 = $fixed_ch_pos_0 - 1 | 0;
    $98 = HEAP32[$matrix_130 >> 2] | 0;
    HEAP16[$this + 84 >> 1] = (HEAP16[$98 + ($sub276 * 12 | 0) + 4 >> 1] | 0) + (HEAP16[$98 + ($sub276 * 12 | 0) >> 1] | 0) & 65535;
    HEAP16[(HEAP32[$matrix_130 >> 2] | 0) + ($fixed_ch_pos_0 * 12 | 0) + 4 >> 1] = 0;
   } else {
    $102 = HEAP32[$matrix_130 >> 2] | 0;
    HEAP16[$this + 84 >> 1] = (HEAP16[$102 + ($fixed_ch_pos_0 * 12 | 0) + 4 >> 1] | 0) + (HEAP16[$102 + ($fixed_ch_pos_0 * 12 | 0) >> 1] | 0) & 65535;
   }
   $conv306105 = $fixed_ch_pos_0 & 65535;
   if ($conv306105 >>> 0 >= $ch_pos >>> 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $re_pos_0107 = $fixed_ch_pos_0 & 65535;
   $conv306108 = $conv306105;
   while (1) {
    __ZN10ime_pinyin12MatrixSearch8add_charEc($this, HEAP8[$this + 32 + $conv306108 | 0] | 0) | 0;
    $inc311 = $re_pos_0107 + 1 & 65535;
    $conv306 = $inc311 & 65535;
    if ($conv306 >>> 0 < $ch_pos >>> 0) {
     $re_pos_0107 = $inc311;
     $conv306108 = $conv306;
    } else {
     $retval_0 = 1;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this) {
   $this = $this | 0;
   var $sent_len = 0, $fixed_hzs_ = 0, $sub = 0, $lma_size_max_0 = 0, $call = 0, $2 = 0, $lpi_total_ = 0, $lpi_num_full_match_013 = 0, $pfullsent_112 = 0, $lma_size_011 = 0, $4 = 0, $cmp22 = 0, $call23 = 0, $pfullsent_2 = 0, $lpi_num_full_match_1 = 0, $dec = 0, $lpi_num_full_match_0_lcssa = 0, $7 = 0, $8 = 0, $sub38 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 32 | 0;
   $sent_len = sp + 24 | 0;
   $fixed_hzs_ = $this + 896 | 0;
   $sub = (HEAP32[$this + 732 >> 2] | 0) - (HEAP32[$fixed_hzs_ >> 2] | 0) | 0;
   $lma_size_max_0 = $sub >>> 0 < 8 ? $sub & 65535 : 8;
   $call = __ZN10ime_pinyin12MatrixSearch14get_candidate0EPtjS1_b($this, sp | 0, 9, $sent_len, 1) | 0;
   $2 = HEAP16[$sent_len >> 1] | 0;
   $lpi_total_ = $this + 12500 | 0;
   HEAP32[$lpi_total_ >> 2] = 0;
   if ($lma_size_max_0 << 16 >> 16 == 0) {
    $lpi_num_full_match_0_lcssa = 0;
    $7 = $this + 900 + ($lpi_num_full_match_0_lcssa << 3) | 0;
    $8 = HEAP32[$lpi_total_ >> 2] | 0;
    $sub38 = $8 - $lpi_num_full_match_0_lcssa | 0;
    __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($7, $sub38, 8, 20);
    STACKTOP = sp;
    return;
   }
   $lma_size_011 = $lma_size_max_0;
   $pfullsent_112 = ($2 & 65535) > 8 ? 0 : $call;
   $lpi_num_full_match_013 = 0;
   while (1) {
    $4 = HEAP32[$lpi_total_ >> 2] | 0;
    $cmp22 = $lma_size_011 << 16 >> 16 == $lma_size_max_0 << 16 >> 16;
    $call23 = __ZN10ime_pinyin12MatrixSearch8get_lpisEPKtjPNS_10LmaPsbItemEjS2_b($this, $this + 816 + (HEAP32[$fixed_hzs_ >> 2] << 1) | 0, $lma_size_011 & 65535, $this + 900 + ($4 << 3) | 0, 1450 - $4 | 0, $pfullsent_112, $cmp22) | 0;
    if (($call23 | 0) == 0) {
     $pfullsent_2 = $pfullsent_112;
    } else {
     HEAP32[$lpi_total_ >> 2] = (HEAP32[$lpi_total_ >> 2] | 0) + $call23;
     $pfullsent_2 = 0;
    }
    if ($cmp22) {
     $lpi_num_full_match_1 = HEAP32[$lpi_total_ >> 2] | 0;
    } else {
     $lpi_num_full_match_1 = $lpi_num_full_match_013;
    }
    $dec = $lma_size_011 - 1 & 65535;
    if ($dec << 16 >> 16 == 0) {
     $lpi_num_full_match_0_lcssa = $lpi_num_full_match_1;
     break;
    } else {
     $lma_size_011 = $dec;
     $pfullsent_112 = $pfullsent_2;
     $lpi_num_full_match_013 = $lpi_num_full_match_1;
    }
   }
   $7 = $this + 900 + ($lpi_num_full_match_0_lcssa << 3) | 0;
   $8 = HEAP32[$lpi_total_ >> 2] | 0;
   $sub38 = $8 - $lpi_num_full_match_0_lcssa | 0;
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($7, $sub38, 8, 20);
   STACKTOP = sp;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this) {
   $this = $this | 0;
   var $lma_id_num_ = 0, $spl_id_num_ = 0, $pys_decoded_len_ = 0, $2 = 0, $matrix_ = 0, $fixed_lmas_ = 0, $fixed_hzs_ = 0, $mtrx_nd_pool_ = 0, $add_ptr = 0, $dmi_pool_ = 0, $dmi_pool_41 = 0, $mtrx_nd_093 = 0, $12 = 0, $15 = 0, $phitmp = 0, $step37 = 0, $conv3491_in = 0, $conv3491 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = 0, $pos_087 = 0, $sub83 = 0, $add84 = 0, $43 = 0, $44 = 0, $arrayidx96 = 0, $xor55 = 0, $arrayidx108 = 0, $arrayidx134 = 0, $xor13658 = 0, $arrayidx147 = 0, $65 = 0, $66 = 0, $_lcssa = 0, $pos264_066 = 0, $67 = 0, $68 = 0, $69 = 0, $pos166_078 = 0, $sub181 = 0, $add188 = 0, $70 = 0, $71 = 0, $arrayidx200 = 0, $xor20252 = 0, $arrayidx213 = 0, $arrayidx238 = 0, $xor239 = 0, $arrayidx248 = 0, $92 = 0, $pos264_069 = 0, $pos264_0_in68 = 0, $93 = 0, $arrayidx279 = 0, $94 = 0, $storemerge = 0, $pos264_0 = 0, $98 = 0, $pos311_0 = 0, label = 0;
   $lma_id_num_ = $this + 112 | 0;
   HEAP32[$lma_id_num_ >> 2] = 0;
   HEAP16[$this + 116 >> 1] = 0;
   $spl_id_num_ = $this + 732 | 0;
   HEAP32[$spl_id_num_ >> 2] = 0;
   HEAP16[$this + 736 >> 1] = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    return;
   }
   $pys_decoded_len_ = $this + 72 | 0;
   $2 = HEAP32[$pys_decoded_len_ >> 2] | 0;
   if (($2 | 0) == 0) {
    return;
   }
   $matrix_ = $this + 96 | 0;
   if ((HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($2 * 12 | 0) + 4 >> 1] | 0) == 0) {
    return;
   }
   $fixed_lmas_ = $this + 356 | 0;
   HEAP32[$lma_id_num_ >> 2] = HEAP32[$fixed_lmas_ >> 2];
   $fixed_hzs_ = $this + 896 | 0;
   HEAP32[$spl_id_num_ >> 2] = HEAP32[$fixed_hzs_ >> 2];
   $mtrx_nd_pool_ = $this + 80 | 0;
   $add_ptr = (HEAP32[$mtrx_nd_pool_ >> 2] | 0) + (HEAPU16[(HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) >> 1] << 4) | 0;
   L1417 : do {
    if (($add_ptr | 0) != (HEAP32[$mtrx_nd_pool_ >> 2] | 0)) {
     $dmi_pool_ = $this + 88 | 0;
     $dmi_pool_41 = $this + 88 | 0;
     $mtrx_nd_093 = $add_ptr;
     do {
      $12 = HEAP32[$fixed_hzs_ >> 2] | 0;
      if (($12 | 0) != 0) {
       if ((HEAPU16[$mtrx_nd_093 + 14 >> 1] | 0) <= (HEAPU16[$this + 736 + ($12 << 1) >> 1] | 0)) {
        break L1417;
       }
      }
      $15 = HEAP16[$mtrx_nd_093 + 12 >> 1] | 0;
      if ($15 << 16 >> 16 != -1) {
       $phitmp = (HEAPU8[(HEAP32[$dmi_pool_ >> 2] | 0) + (($15 & 65535) * 12 | 0) + 9 | 0] | 0) >>> 1 & 255;
       $step37 = $mtrx_nd_093 + 14 | 0;
       $conv3491_in = $15;
       do {
        $conv3491 = $conv3491_in & 65535;
        HEAP16[$this + 736 + ((HEAP32[$spl_id_num_ >> 2] | 0) + 1 << 1) >> 1] = ((HEAP16[$step37 >> 1] | 0) - $phitmp & 65535) + ((HEAPU8[(HEAP32[$dmi_pool_41 >> 2] | 0) + ($conv3491 * 12 | 0) + 9 | 0] | 0) >>> 1 & 255) & 65535;
        HEAP16[$this + 816 + (HEAP32[$spl_id_num_ >> 2] << 1) >> 1] = HEAP16[(HEAP32[$dmi_pool_41 >> 2] | 0) + ($conv3491 * 12 | 0) + 6 >> 1] | 0;
        HEAP32[$spl_id_num_ >> 2] = (HEAP32[$spl_id_num_ >> 2] | 0) + 1;
        $conv3491_in = HEAP16[(HEAP32[$dmi_pool_41 >> 2] | 0) + ($conv3491 * 12 | 0) + 4 >> 1] | 0;
       } while ($conv3491_in << 16 >> 16 != -1);
      }
      HEAP16[$this + 116 + ((HEAP32[$lma_id_num_ >> 2] | 0) + 1 << 1) >> 1] = HEAP32[$spl_id_num_ >> 2] & 65535;
      HEAP32[$this + 196 + (HEAP32[$lma_id_num_ >> 2] << 2) >> 2] = HEAP32[$mtrx_nd_093 >> 2];
      HEAP32[$lma_id_num_ >> 2] = (HEAP32[$lma_id_num_ >> 2] | 0) + 1;
      $mtrx_nd_093 = HEAP32[$mtrx_nd_093 + 8 >> 2] | 0;
     } while (($mtrx_nd_093 | 0) != (HEAP32[$mtrx_nd_pool_ >> 2] | 0));
    }
   } while (0);
   $39 = HEAP32[$fixed_hzs_ >> 2] | 0;
   $40 = HEAP32[$spl_id_num_ >> 2] | 0;
   if ($39 >>> 0 < (((1 - $39 + $40 | 0) >>> 1) + $39 | 0) >>> 0) {
    $pos_087 = $39;
    $42 = $39;
    $41 = $40;
    while (1) {
     $sub83 = $42 - $pos_087 + $41 | 0;
     $add84 = $pos_087 + 1 | 0;
     if (($sub83 | 0) != ($add84 | 0)) {
      $arrayidx96 = $this + 736 + ($add84 << 1) | 0;
      $xor55 = HEAP16[$arrayidx96 >> 1] ^ HEAP16[$this + 736 + ($sub83 << 1) >> 1];
      HEAP16[$arrayidx96 >> 1] = $xor55;
      $arrayidx108 = $this + 736 + ((HEAP32[$spl_id_num_ >> 2] | 0) - $pos_087 + (HEAP32[$fixed_hzs_ >> 2] | 0) << 1) | 0;
      HEAP16[$arrayidx108 >> 1] = HEAP16[$arrayidx108 >> 1] ^ $xor55;
      HEAP16[$arrayidx96 >> 1] = HEAP16[$arrayidx96 >> 1] ^ HEAP16[$this + 736 + ((HEAP32[$spl_id_num_ >> 2] | 0) - $pos_087 + (HEAP32[$fixed_hzs_ >> 2] | 0) << 1) >> 1];
      $arrayidx134 = $this + 816 + ($pos_087 << 1) | 0;
      $xor13658 = HEAP16[$arrayidx134 >> 1] ^ HEAP16[$this + 816 + ((HEAP32[$spl_id_num_ >> 2] | 0) + ~$pos_087 + (HEAP32[$fixed_hzs_ >> 2] | 0) << 1) >> 1];
      HEAP16[$arrayidx134 >> 1] = $xor13658;
      $arrayidx147 = $this + 816 + ((HEAP32[$spl_id_num_ >> 2] | 0) + ~$pos_087 + (HEAP32[$fixed_hzs_ >> 2] | 0) << 1) | 0;
      HEAP16[$arrayidx147 >> 1] = HEAP16[$arrayidx147 >> 1] ^ $xor13658;
      HEAP16[$arrayidx134 >> 1] = HEAP16[$arrayidx134 >> 1] ^ HEAP16[$this + 816 + ((HEAP32[$spl_id_num_ >> 2] | 0) + ~$pos_087 + (HEAP32[$fixed_hzs_ >> 2] | 0) << 1) >> 1];
     }
     $43 = HEAP32[$fixed_hzs_ >> 2] | 0;
     $44 = HEAP32[$spl_id_num_ >> 2] | 0;
     if ($add84 >>> 0 < (((1 - $43 + $44 | 0) >>> 1) + $43 | 0) >>> 0) {
      $pos_087 = $add84;
      $42 = $43;
      $41 = $44;
     } else {
      break;
     }
    }
   }
   $65 = HEAP32[$fixed_lmas_ >> 2] | 0;
   $66 = HEAP32[$lma_id_num_ >> 2] | 0;
   L1437 : do {
    if ($65 >>> 0 < (((1 - $65 + $66 | 0) >>> 1) + $65 | 0) >>> 0) {
     $pos166_078 = $65;
     $69 = $65;
     $68 = $66;
     while (1) {
      $sub181 = $69 - $pos166_078 + $68 | 0;
      if (($sub181 - 1 | 0) >>> 0 < $pos166_078 >>> 0) {
       break;
      }
      $add188 = $pos166_078 + 1 | 0;
      if ($sub181 >>> 0 > $add188 >>> 0) {
       $arrayidx200 = $this + 116 + ($add188 << 1) | 0;
       $xor20252 = HEAP16[$arrayidx200 >> 1] ^ HEAP16[$this + 116 + ($69 - $pos166_078 + $68 << 1) >> 1];
       HEAP16[$arrayidx200 >> 1] = $xor20252;
       $arrayidx213 = $this + 116 + ((HEAP32[$lma_id_num_ >> 2] | 0) - $pos166_078 + (HEAP32[$fixed_lmas_ >> 2] | 0) << 1) | 0;
       HEAP16[$arrayidx213 >> 1] = HEAP16[$arrayidx213 >> 1] ^ $xor20252;
       HEAP16[$arrayidx200 >> 1] = HEAP16[$arrayidx200 >> 1] ^ HEAP16[$this + 116 + ((HEAP32[$lma_id_num_ >> 2] | 0) - $pos166_078 + (HEAP32[$fixed_lmas_ >> 2] | 0) << 1) >> 1];
       $arrayidx238 = $this + 196 + ($pos166_078 << 2) | 0;
       $xor239 = HEAP32[$arrayidx238 >> 2] ^ HEAP32[$this + 196 + ((HEAP32[$lma_id_num_ >> 2] | 0) + ~$pos166_078 + (HEAP32[$fixed_lmas_ >> 2] | 0) << 2) >> 2];
       HEAP32[$arrayidx238 >> 2] = $xor239;
       $arrayidx248 = $this + 196 + ((HEAP32[$lma_id_num_ >> 2] | 0) + ~$pos166_078 + (HEAP32[$fixed_lmas_ >> 2] | 0) << 2) | 0;
       HEAP32[$arrayidx248 >> 2] = HEAP32[$arrayidx248 >> 2] ^ $xor239;
       HEAP32[$arrayidx238 >> 2] = HEAP32[$arrayidx238 >> 2] ^ HEAP32[$this + 196 + ((HEAP32[$lma_id_num_ >> 2] | 0) + ~$pos166_078 + (HEAP32[$fixed_lmas_ >> 2] | 0) << 2) >> 2];
      }
      $70 = HEAP32[$fixed_lmas_ >> 2] | 0;
      $71 = HEAP32[$lma_id_num_ >> 2] | 0;
      if ($add188 >>> 0 < (((1 - $70 + $71 | 0) >>> 1) + $70 | 0) >>> 0) {
       $pos166_078 = $add188;
       $69 = $70;
       $68 = $71;
      } else {
       $_lcssa = $70;
       break L1437;
      }
     }
     ___assert_func(1184, 1360, 7e3, 2592);
    } else {
     $_lcssa = $65;
    }
   } while (0);
   $pos264_066 = $_lcssa + 1 | 0;
   $67 = HEAP32[$lma_id_num_ >> 2] | 0;
   if ($pos264_066 >>> 0 <= $67 >>> 0) {
    $pos264_0_in68 = $_lcssa;
    $pos264_069 = $pos264_066;
    $92 = $67;
    while (1) {
     $93 = HEAP16[$this + 116 + ($pos264_0_in68 << 1) >> 1] | 0;
     $arrayidx279 = $this + 116 + ($pos264_069 << 1) | 0;
     $94 = HEAP16[$arrayidx279 >> 1] | 0;
     if ($pos264_069 >>> 0 < $92 >>> 0) {
      $storemerge = ($94 + $93 & 65535) - (HEAP16[$this + 116 + ($pos264_0_in68 + 2 << 1) >> 1] | 0) & 65535;
     } else {
      $storemerge = ($94 + $93 & 65535) - (HEAP16[$this + 116 + (HEAP32[$fixed_lmas_ >> 2] << 1) >> 1] | 0) & 65535;
     }
     HEAP16[$arrayidx279 >> 1] = $storemerge;
     $pos264_0 = $pos264_069 + 1 | 0;
     $98 = HEAP32[$lma_id_num_ >> 2] | 0;
     if ($pos264_0 >>> 0 > $98 >>> 0) {
      break;
     } else {
      $pos264_0_in68 = $pos264_069;
      $pos264_069 = $pos264_0;
      $92 = $98;
     }
    }
   }
   HEAP32[$fixed_hzs_ >> 2] = 0;
   $pos311_0 = HEAP32[$spl_id_num_ >> 2] | 0;
   while (1) {
    if (($pos311_0 | 0) == 0) {
     label = 1169;
     break;
    }
    if ((HEAP32[(HEAP32[$matrix_ >> 2] | 0) + ((HEAPU16[$this + 736 + ($pos311_0 << 1) >> 1] | 0) * 12 | 0) + 8 >> 2] | 0) == 0) {
     $pos311_0 = $pos311_0 - 1 | 0;
    } else {
     break;
    }
   }
   if ((label | 0) == 1169) {
    return;
   }
   HEAP32[$fixed_hzs_ >> 2] = $pos311_0;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch9delsearchEjbb($this, $pos, $is_pos_in_splid, $clear_fixed_this_step) {
   $this = $this | 0;
   $pos = $pos | 0;
   $is_pos_in_splid = $is_pos_in_splid | 0;
   $clear_fixed_this_step = $clear_fixed_this_step | 0;
   var $pys_decoded_len_ = 0, $2 = 0, $reset_pos_0 = 0, $4 = 0, $fixed_lmas_ = 0, $7 = 0, $sublma_num = 0, $dec = 0, $16 = 0, $arrayidx58 = 0, $conv62 = 0, $sub = 0, $conv69 = 0, $conv84 = 0, $sub85 = 0, $reset_pos_1 = 0, $length94 = 0, $dmi_c_phrase_ = 0, $c_py_pos_0 = 0, $conv110 = 0, $29 = 0, $fixed_hzs_ = 0, $idxprom139 = 0, $33 = 0, $reset_pos_131 = 0, $reset_pos_2 = 0, $35 = 0, $retval_0 = 0, label = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $pys_decoded_len_ = $this + 72 | 0;
   $2 = HEAP32[$pys_decoded_len_ >> 2] | 0;
   if ($2 >>> 0 <= $pos >>> 0) {
    __ZN10ime_pinyin12MatrixSearch10del_in_pysEjj($this, $pos, 1);
    $reset_pos_0 = HEAP32[$pys_decoded_len_ >> 2] | 0;
    while (1) {
     $4 = HEAP8[$this + 32 + $reset_pos_0 | 0] | 0;
     if ($4 << 24 >> 24 == 0) {
      break;
     }
     if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, $4) | 0) {
      $reset_pos_0 = $reset_pos_0 + 1 | 0;
     } else {
      label = 1175;
      break;
     }
    }
    if ((label | 0) == 1175) {
     HEAP32[$pys_decoded_len_ >> 2] = $reset_pos_0;
    }
    __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this);
    __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this);
    $retval_0 = HEAP32[$pys_decoded_len_ >> 2] | 0;
    return $retval_0 | 0;
   }
   do {
    if ($is_pos_in_splid) {
     if ((HEAP32[$this + 732 >> 2] | 0) >>> 0 <= $pos >>> 0) {
      $retval_0 = $2;
      return $retval_0 | 0;
     }
     $arrayidx58 = $this + 736 + ($pos + 1 << 1) | 0;
     $conv62 = HEAPU16[$this + 736 + ($pos << 1) >> 1] | 0;
     $sub = (HEAPU16[$arrayidx58 >> 1] | 0) - $conv62 | 0;
     __ZN10ime_pinyin12MatrixSearch10del_in_pysEjj($this, $conv62, $sub);
     $conv69 = HEAPU16[$this + 116 + (HEAP32[$this + 356 >> 2] << 1) >> 1] | 0;
     if ($conv69 >>> 0 <= $pos >>> 0) {
      $reset_pos_131 = (HEAPU16[$arrayidx58 >> 1] | 0) - $sub | 0;
      label = 1198;
      break;
     }
     $conv84 = HEAPU16[$this + 736 + ($conv69 << 1) >> 1] | 0;
     $sub85 = $conv84 - $sub | 0;
     if (($conv84 | 0) == ($sub | 0)) {
      $reset_pos_1 = $sub85;
      label = 1189;
      break;
     }
     __ZN10ime_pinyin12MatrixSearch16merge_fixed_lmasEj($this, $pos);
     $reset_pos_1 = $sub85;
     label = 1189;
    } else {
     $fixed_lmas_ = $this + 356 | 0;
     $7 = HEAP32[$fixed_lmas_ >> 2] | 0;
     do {
      if (($7 | 0) != 0) {
       if ((HEAPU16[$this + 736 + (HEAPU16[$this + 116 + ($7 << 1) >> 1] << 1) >> 1] | 0) >>> 0 <= $pos >>> 0) {
        break;
       }
       $retval_0 = HEAP32[$pys_decoded_len_ >> 2] | 0;
       return $retval_0 | 0;
      }
     } while (0);
     __ZN10ime_pinyin12MatrixSearch10del_in_pysEjj($this, $pos, 1);
     if ((HEAPU16[$this + 736 + (HEAPU16[$this + 116 + (HEAP32[$fixed_lmas_ >> 2] << 1) >> 1] << 1) >> 1] | 0) != ($pos | 0)) {
      $reset_pos_131 = $pos;
      label = 1198;
      break;
     }
     if ((HEAP32[$this + 196 >> 2] | 0) != 16777215 | $clear_fixed_this_step ^ 1) {
      $reset_pos_131 = $pos;
      label = 1198;
      break;
     }
     $sublma_num = $this + 720 | 0;
     $dec = (HEAP32[$sublma_num >> 2] | 0) - 1 | 0;
     HEAP32[$sublma_num >> 2] = $dec;
     $16 = HEAP16[$this + 640 + ($dec << 1) >> 1] | 0;
     HEAP16[$this + 724 >> 1] = $16;
     $reset_pos_1 = HEAPU16[$this + 736 + (($16 & 65535) << 1) >> 1] | 0;
     label = 1189;
    }
   } while (0);
   do {
    if ((label | 0) == 1189) {
     if (($reset_pos_1 | 0) == 0) {
      $reset_pos_131 = 0;
      label = 1198;
      break;
     }
     $length94 = $this + 724 | 0;
     if ((HEAP16[$length94 >> 1] | 0) == 0) {
      ___assert_func(1184, 552, 6584, 1360);
      return 0;
     }
     if (($reset_pos_1 | 0) != (HEAPU16[$this + 480 + (HEAPU16[$this + 640 + (HEAP32[$this + 720 >> 2] << 1) >> 1] << 1) >> 1] | 0)) {
      ___assert_func(1184, 552, 6584, 1360);
      return 0;
     }
     __ZN10ime_pinyin12MatrixSearch13reset_search0Ev($this) | 0;
     $dmi_c_phrase_ = $this + 728 | 0;
     HEAP8[$dmi_c_phrase_] = 1;
     $c_py_pos_0 = 0;
     while (1) {
      $conv110 = $c_py_pos_0 & 65535;
      if ($conv110 >>> 0 >= $reset_pos_1 >>> 0) {
       label = 1197;
       break;
      }
      if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, HEAP8[$this + 32 + $conv110 | 0] | 0) | 0) {
       $c_py_pos_0 = $c_py_pos_0 + 1 & 65535;
      } else {
       label = 1196;
       break;
      }
     }
     if ((label | 0) == 1196) {
      ___assert_func(1184, 563, 6584, 1632);
      return 0;
     } else if ((label | 0) == 1197) {
      HEAP8[$dmi_c_phrase_] = 0;
      HEAP32[$this + 112 >> 2] = 1;
      HEAP32[$this + 356 >> 2] = 1;
      HEAP8[$this + 360 | 0] = 0;
      $29 = HEAP16[$length94 >> 1] | 0;
      $fixed_hzs_ = $this + 896 | 0;
      HEAP32[$fixed_hzs_ >> 2] = $29 & 65535;
      HEAP16[$this + 118 >> 1] = $29;
      HEAP32[$this + 196 >> 2] = 16777215;
      $idxprom139 = HEAPU16[$this + 736 + (HEAP32[$fixed_hzs_ >> 2] << 1) >> 1] | 0;
      $33 = HEAP32[$this + 96 >> 2] | 0;
      HEAP32[$33 + ($idxprom139 * 12 | 0) + 8 >> 2] = (HEAP32[$this + 80 >> 2] | 0) + (HEAPU16[$33 + ($idxprom139 * 12 | 0) >> 1] << 4);
      $reset_pos_2 = $reset_pos_1;
      break;
     }
    }
   } while (0);
   if ((label | 0) == 1198) {
    __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $reset_pos_131, $clear_fixed_this_step, 0, 0) | 0;
    $reset_pos_2 = $reset_pos_131;
   }
   while (1) {
    $35 = HEAP8[$this + 32 + $reset_pos_2 | 0] | 0;
    if ($35 << 24 >> 24 == 0) {
     break;
    }
    if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, $35) | 0) {
     $reset_pos_2 = $reset_pos_2 + 1 | 0;
    } else {
     label = 1201;
     break;
    }
   }
   if ((label | 0) == 1201) {
    HEAP32[$pys_decoded_len_ >> 2] = $reset_pos_2;
   }
   __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this);
   __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this);
   $retval_0 = HEAP32[$pys_decoded_len_ >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv($this) {
   $this = $this | 0;
   var $2 = 0, $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[$this + 72 >> 2] | 0;
   if (($2 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP16[(HEAP32[$this + 96 >> 2] | 0) + ($2 * 12 | 0) + 4 >> 1] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = (HEAP32[$this + 12500 >> 2] | 0) + 1 | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch13get_candidateEjPtj($this, $cand_id, $cand_str, $max_len) {
   $this = $this | 0;
   $cand_id = $cand_id | 0;
   $cand_str = $cand_str | 0;
   $max_len = $max_len | 0;
   var $s = 0, $dec = 0, $5 = 0, $conv = 0, $s_len_0 = 0, $conv24 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 24 | 0;
   $s = sp | 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 72 >> 2] | 0) == 0 | ($cand_str | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (($cand_id | 0) == 0) {
    $retval_0 = __ZN10ime_pinyin12MatrixSearch14get_candidate0EPtjS1_b($this, $cand_str, $max_len, 0, 0) | 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 12500 >> 2] | 0) == 0) {
    $retval_0 = __ZN10ime_pinyin12MatrixSearch14get_candidate0EPtjS1_b($this, $cand_str, $max_len, 0, 0) | 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $dec = $cand_id - 1 | 0;
   $5 = HEAP32[$this + 900 + ($dec << 3) >> 2] | 0;
   $conv = $5 >>> 24 & 15;
   if (($conv & 65535) > 1) {
    $s_len_0 = __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, $5 & 16777215, $s | 0, 9) | 0;
   } else {
    HEAP16[$s >> 1] = HEAP16[$this + 900 + ($dec << 3) + 6 >> 1] | 0;
    HEAP16[$s + 2 >> 1] = 0;
    $s_len_0 = $conv;
   }
   $conv24 = $s_len_0 & 65535;
   if (!($s_len_0 << 16 >> 16 != 0 & $conv24 >>> 0 < $max_len >>> 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _utf16_strncpy($cand_str, $s | 0, $conv24) | 0;
   HEAP16[$cand_str + ($conv24 << 1) >> 1] = 0;
   $retval_0 = $cand_str;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch14get_candidate0EPtjS1_b($this, $cand_str, $max_len, $retstr_len, $only_unfixed) {
   $this = $this | 0;
   $cand_str = $cand_str | 0;
   $max_len = $max_len | 0;
   $retstr_len = $retstr_len | 0;
   $only_unfixed = $only_unfixed | 0;
   var $idxs = 0, $str = 0, $0 = 0, $1 = 0, $add_ptr = 0, $id_num_0_lcssa = 0, $arraydecay = 0, $fixed_hzs_ = 0, $fixed_hzs_33 = 0, $mtrx_nd_035 = 0, $id_num_034 = 0, $inc = 0, $6 = 0, $id_num_1 = 0, $ret_pos_0 = 0, $dec = 0, $7 = 0, $call = 0, $conv15 = 0, $sub23 = 0, $add_ptr29 = 0, $9 = 0, $add_ptr38 = 0, $ret_pos_1 = 0, $cmp57 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 184 | 0;
   $idxs = sp | 0;
   $str = sp + 160 | 0;
   $0 = HEAP32[$this + 72 >> 2] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $1 = HEAP32[$this + 96 >> 2] | 0;
   if ((HEAP16[$1 + ($0 * 12 | 0) + 4 >> 1] | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $add_ptr = (HEAP32[$this + 80 >> 2] | 0) + (HEAPU16[$1 + ($0 * 12 | 0) >> 1] << 4) | 0;
   if (($add_ptr | 0) == 0) {
    $id_num_0_lcssa = 0;
   } else {
    $id_num_034 = 0;
    $mtrx_nd_035 = $add_ptr;
    while (1) {
     HEAP32[$idxs + ($id_num_034 << 2) >> 2] = HEAP32[$mtrx_nd_035 >> 2];
     $inc = $id_num_034 + 1 | 0;
     $6 = HEAP32[$mtrx_nd_035 + 8 >> 2] | 0;
     if (($6 | 0) == 0) {
      $id_num_0_lcssa = $inc;
      break;
     } else {
      $id_num_034 = $inc;
      $mtrx_nd_035 = $6;
     }
    }
   }
   $arraydecay = $str | 0;
   $fixed_hzs_ = $this + 896 | 0;
   $fixed_hzs_33 = $this + 896 | 0;
   $ret_pos_0 = 0;
   $id_num_1 = $id_num_0_lcssa;
   L1561 : while (1) {
    $dec = $id_num_1 - 1 | 0;
    $7 = HEAP32[$idxs + ($dec << 2) >> 2] | 0;
    if (($7 | 0) == 0) {
     $ret_pos_1 = $ret_pos_0;
    } else {
     $call = __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, $7, $arraydecay, 9) | 0;
     $conv15 = $call & 65535;
     if ($call << 16 >> 16 == 0) {
      $retval_0 = 0;
      label = 1263;
      break;
     }
     $sub23 = $max_len - $ret_pos_0 | 0;
     do {
      if ($only_unfixed) {
       if (((HEAP32[$fixed_hzs_ >> 2] | 0) + $sub23 | 0) >>> 0 <= $conv15 >>> 0) {
        $retval_0 = 0;
        label = 1264;
        break L1561;
       }
       $9 = HEAP32[$fixed_hzs_33 >> 2] | 0;
       if ($ret_pos_0 >>> 0 < $9 >>> 0) {
        break;
       }
       $add_ptr38 = $cand_str + ($ret_pos_0 - $9 << 1) | 0;
       _utf16_strncpy($add_ptr38, $arraydecay, $conv15) | 0;
      } else {
       if ($sub23 >>> 0 <= $conv15 >>> 0) {
        $retval_0 = 0;
        label = 1265;
        break L1561;
       }
       $add_ptr29 = $cand_str + ($ret_pos_0 << 1) | 0;
       _utf16_strncpy($add_ptr29, $arraydecay, $conv15) | 0;
      }
     } while (0);
     $ret_pos_1 = $conv15 + $ret_pos_0 | 0;
    }
    if (($dec | 0) == 0) {
     label = 1253;
     break;
    } else {
     $ret_pos_0 = $ret_pos_1;
     $id_num_1 = $dec;
    }
   }
   if ((label | 0) == 1263) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 1264) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 1265) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 1253) {
    $cmp57 = ($retstr_len | 0) != 0;
    if ($only_unfixed) {
     if ($cmp57) {
      HEAP16[$retstr_len >> 1] = $ret_pos_1 - (HEAP32[$this + 896 >> 2] | 0) & 65535;
     }
     HEAP16[$cand_str + ($ret_pos_1 - (HEAP32[$this + 896 >> 2] | 0) << 1) >> 1] = 0;
     $retval_0 = $cand_str;
     STACKTOP = sp;
     return $retval_0 | 0;
    } else {
     if ($cmp57) {
      HEAP16[$retstr_len >> 1] = $ret_pos_1 & 65535;
     }
     HEAP16[$cand_str + ($ret_pos_1 << 1) >> 1] = 0;
     $retval_0 = $cand_str;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   }
   return 0;
  }
  function __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, $id_lemma, $str_buf, $str_max) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $str_buf = $str_buf | 0;
   $str_max = $str_max | 0;
   var $0 = 0, $3 = 0, $7 = 0, $sub = 0, $str_len_0 = 0, $arraydecay = 0, $conv28 = 0, $retval_0 = 0;
   if (__ZN10ime_pinyin15is_system_lemmaEj($id_lemma) | 0) {
    $0 = HEAP32[$this + 12 >> 2] | 0;
    $retval_0 = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$0 >> 2] | 0) + 32 >> 2] & 31]($0, $id_lemma, $str_buf, $str_max) | 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin13is_user_lemmaEj($id_lemma) | 0)) {
    if (($str_max & 65535) < 2 | (__ZN10ime_pinyin18is_composing_lemmaEj($id_lemma) | 0) ^ 1) {
     $retval_0 = 0;
     return $retval_0 | 0;
    }
    $7 = HEAP16[$this + 640 + (HEAP32[$this + 720 >> 2] << 1) >> 1] | 0;
    $sub = ($str_max & 65535) - 1 | 0;
    $str_len_0 = ($7 & 65535 | 0) > ($sub | 0) ? $sub & 65535 : $7;
    $arraydecay = $this + 560 | 0;
    $conv28 = $str_len_0 & 65535;
    _utf16_strncpy($str_buf, $arraydecay, $conv28) | 0;
    HEAP16[$str_buf + ($conv28 << 1) >> 1] = 0;
    $retval_0 = $str_len_0;
    return $retval_0 | 0;
   }
   $3 = HEAP32[$this + 16 >> 2] | 0;
   if (($3 | 0) == 0) {
    HEAP16[$str_buf >> 1] = 0;
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $retval_0 = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$3 >> 2] | 0) + 32 >> 2] & 31]($3, $id_lemma, $str_buf, $str_max) | 0;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12MatrixSearch16update_dict_freqEv($this) {
   $this = $this | 0;
   var $0 = 0, $call = 0, $3 = 0;
   $0 = HEAP32[$this + 16 >> 2] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   $call = FUNCTION_TABLE_ii[HEAP32[(HEAP32[$0 >> 2] | 0) + 68 >> 2] & 31]($0) | 0;
   $3 = HEAP32[$this + 12 >> 2] | 0;
   FUNCTION_TABLE_vii[HEAP32[(HEAP32[$3 >> 2] | 0) + 72 >> 2] & 15]($3, $call);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch16get_lemma_splidsEjPttb($this, $id_lemma, $splids, $splids_max, $arg_valid) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $splids = $splids | 0;
   $splids_max = $splids_max | 0;
   $arg_valid = $arg_valid | 0;
   var $spl_trie_ = 0, $splid_num_0 = 0, $splid_num_1 = 0, $2 = 0, $5 = 0, $length = 0, $spl_trie_45 = 0, $pos_0 = 0, $conv34 = 0, $10 = 0, $retval_0 = 0, label = 0;
   do {
    if ($arg_valid) {
     $spl_trie_ = $this + 4 | 0;
     $splid_num_0 = 0;
     while (1) {
      if (($splid_num_0 & 65535) >= ($splids_max & 65535)) {
       break;
      }
      if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$splids + (($splid_num_0 & 65535) << 1) >> 1] | 0) | 0) {
       break;
      } else {
       $splid_num_0 = $splid_num_0 + 1 & 65535;
      }
     }
     if ($splid_num_0 << 16 >> 16 == $splids_max << 16 >> 16) {
      $retval_0 = $splid_num_0;
     } else {
      $splid_num_1 = $splid_num_0;
      break;
     }
     return $retval_0 | 0;
    } else {
     $splid_num_1 = 0;
    }
   } while (0);
   if (__ZN10ime_pinyin15is_system_lemmaEj($id_lemma) | 0) {
    $2 = HEAP32[$this + 12 >> 2] | 0;
    $retval_0 = FUNCTION_TABLE_iiiiii[HEAP32[(HEAP32[$2 >> 2] | 0) + 36 >> 2] & 15]($2, $id_lemma, $splids, $splids_max, $arg_valid) | 0;
    return $retval_0 | 0;
   }
   if (__ZN10ime_pinyin13is_user_lemmaEj($id_lemma) | 0) {
    $5 = HEAP32[$this + 16 >> 2] | 0;
    if (($5 | 0) == 0) {
     $retval_0 = 0;
     return $retval_0 | 0;
    }
    $retval_0 = FUNCTION_TABLE_iiiiii[HEAP32[(HEAP32[$5 >> 2] | 0) + 36 >> 2] & 15]($5, $id_lemma, $splids, $splids_max, $arg_valid) | 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin18is_composing_lemmaEj($id_lemma) | 0)) {
    $retval_0 = $splid_num_1;
    return $retval_0 | 0;
   }
   $length = $this + 724 | 0;
   if ((HEAPU16[$length >> 1] | 0) > ($splids_max & 65535)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spl_trie_45 = $this + 4 | 0;
   $pos_0 = 0;
   while (1) {
    $conv34 = $pos_0 & 65535;
    if (($pos_0 & 65535) >= (HEAPU16[$length >> 1] | 0)) {
     $retval_0 = $splid_num_1;
     label = 1310;
     break;
    }
    $10 = HEAP16[$this + 400 + ($conv34 << 1) >> 1] | 0;
    HEAP16[$splids + ($conv34 << 1) >> 1] = $10;
    if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_45 >> 2] | 0, $10) | 0) {
     $retval_0 = 0;
     label = 1305;
     break;
    } else {
     $pos_0 = $pos_0 + 1 & 65535;
    }
   }
   if ((label | 0) == 1310) {
    return $retval_0 | 0;
   } else if ((label | 0) == 1305) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12MatrixSearch15debug_print_dmiEtt($this, $dmi_pos, $nest_level) {
   $this = $this | 0;
   $dmi_pos = $dmi_pos | 0;
   $nest_level = $nest_level | 0;
   var $conv = 0, $1 = 0, $cmp5 = 0, $2 = 0, $conv22 = 0, $call24 = 0, $spl_id = 0, $call25 = 0, $conv27 = 0, sp = 0;
   sp = STACKTOP;
   $conv = $dmi_pos & 65535;
   if ((HEAPU16[$this + 92 >> 1] | 0) <= ($dmi_pos & 65535)) {
    STACKTOP = sp;
    return;
   }
   $1 = HEAP32[$this + 88 >> 2] | 0;
   $cmp5 = $nest_level << 16 >> 16 == 1;
   if ($cmp5) {
    _printf(768, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $conv, tempInt) | 0) | 0;
   }
   $2 = $1 + ($conv * 12 | 0) + 8 | 0;
   if ((HEAP8[$2] & 126) > 1) {
    __ZN10ime_pinyin12MatrixSearch15debug_print_dmiEtt($this, HEAP16[$1 + ($conv * 12 | 0) + 4 >> 1] | 0, $nest_level + 1 & 65535);
   }
   _printf(616, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = HEAP8[$2] & 127, tempInt) | 0) | 0;
   $conv22 = HEAPU16[$1 + ($conv * 12 | 0) + 2 >> 1] | 0;
   _printf(440, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAP32[tempInt >> 2] = HEAPU16[$1 + ($conv * 12 | 0) >> 1] | 0, HEAP32[tempInt + 8 >> 2] = $conv22, tempInt) | 0) | 0;
   $call24 = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $spl_id = $1 + ($conv * 12 | 0) + 6 | 0;
   $call25 = __ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($call24, HEAP16[$spl_id >> 1] | 0) | 0;
   $conv27 = HEAPU16[$spl_id >> 1] | 0;
   _printf(4288, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAP32[tempInt >> 2] = $call25, HEAP32[tempInt + 8 >> 2] = $conv27, tempInt) | 0) | 0;
   _printf(4064, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = (HEAPU8[$1 + ($conv * 12 | 0) + 9 | 0] | 0) >>> 1 & 255, tempInt) | 0) | 0;
   if (!$cmp5) {
    STACKTOP = sp;
    return;
   }
   _printf(3864, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $conv, tempInt) | 0) | 0;
   STACKTOP = sp;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch25try_add_cand0_to_userdictEv($this) {
   $this = $this | 0;
   var $call = 0, $fixed_lmas_ = 0, $conv27 = 0, $modified_0_off026 = 0, $pos_025 = 0, $lma_id_from_024 = 0, $cmp9_not = 0, $lma_id_from_1 = 0, $modified_1_off0 = 0, $_modified_1_off0 = 0, $inc = 0, $conv = 0, $conv_lcssa = 0, $modified_0_off0_lcssa = 0, $pos_0_lcssa = 0, $lma_id_from_0_lcssa = 0;
   $call = __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv($this) | 0;
   if (!((HEAP32[$this + 896 >> 2] | 0) != 0 & ($call | 0) == 1)) {
    return 1;
   }
   $fixed_lmas_ = $this + 356 | 0;
   if ((HEAP32[$fixed_lmas_ >> 2] | 0) == 0) {
    $lma_id_from_0_lcssa = 0;
    $pos_0_lcssa = 0;
    $modified_0_off0_lcssa = 1;
    $conv_lcssa = 0;
   } else {
    $lma_id_from_024 = 0;
    $pos_025 = 0;
    $modified_0_off026 = 0;
    $conv27 = 0;
    while (1) {
     $cmp9_not = ((HEAPU16[$this + 116 + ($conv27 + 1 << 1) >> 1] | 0) - (HEAPU16[$this + 116 + (($lma_id_from_024 & 65535) << 1) >> 1] | 0) | 0) < 9;
     if ($cmp9_not | $modified_0_off026 ^ 1) {
      $modified_1_off0 = $cmp9_not & $modified_0_off026;
      $lma_id_from_1 = $cmp9_not ? $lma_id_from_024 : $pos_025;
     } else {
      __ZN10ime_pinyin12MatrixSearch19add_lma_to_userdictEttf($this, $lma_id_from_024, $pos_025, 0.0) | 0;
      $modified_1_off0 = 0;
      $lma_id_from_1 = $pos_025;
     }
     $_modified_1_off0 = (HEAP8[$this + 360 + $conv27 | 0] | 0) == 0 | $modified_1_off0;
     $inc = $pos_025 + 1 & 65535;
     $conv = $inc & 65535;
     if ($conv >>> 0 < (HEAP32[$fixed_lmas_ >> 2] | 0) >>> 0) {
      $lma_id_from_024 = $lma_id_from_1;
      $pos_025 = $inc;
      $modified_0_off026 = $_modified_1_off0;
      $conv27 = $conv;
     } else {
      break;
     }
    }
    $lma_id_from_0_lcssa = $lma_id_from_1;
    $pos_0_lcssa = $inc;
    $modified_0_off0_lcssa = $_modified_1_off0 ^ 1;
    $conv_lcssa = $conv;
   }
   if (((HEAPU16[$this + 116 + ($conv_lcssa << 1) >> 1] | 0) - (HEAPU16[$this + 116 + (($lma_id_from_0_lcssa & 65535) << 1) >> 1] | 0) | 0) < 2 | $modified_0_off0_lcssa) {
    return 1;
   }
   __ZN10ime_pinyin12MatrixSearch19add_lma_to_userdictEttf($this, $lma_id_from_0_lcssa, $pos_0_lcssa, 0.0) | 0;
   return 1;
  }
  function __ZN10ime_pinyin12MatrixSearch16merge_fixed_lmasEj($this, $del_spl_pos) {
   $this = $this | 0;
   $del_spl_pos = $del_spl_pos | 0;
   var $fixed_lmas_ = 0, $spl_id_num_ = 0, $sub = 0, $spl_start_ = 0, $sub549 = 0, $pos_073 = 0, $add9 = 0, $8 = 0, $9 = 0, $mul = 0, $11 = 0, $12 = 0, $mul32 = 0, $sublma_num137 = 0, $bp_0 = 0, $sublma_num45 = 0, $conv4964 = 0, $conv54 = 0, $add56 = 0, $arrayidx88 = 0, $conv4968 = 0, $phrase_len_067 = 0, $pos47_066 = 0, $arrayidx53 = 0, $19 = 0, $arrayidx60 = 0, $call = 0, $add112 = 0, $inc115 = 0, $conv49 = 0, $phrase_len_0_lcssa = 0, $conv13571 = 0, $pos133_070 = 0, $arrayidx143 = 0, $31 = 0, $phrase_len_1 = 0, $sublma_num180 = 0, $add189 = 0, $conv17861 = 0, $pos176_060 = 0, $length197 = 0, $conv20353 = 0, $pos201_052 = 0, $del_a_sub_0_off051 = 0, $arrayidx212 = 0, $42 = 0, $43 = 0, label = 0;
   $fixed_lmas_ = $this + 356 | 0;
   if ((HEAP32[$fixed_lmas_ >> 2] | 0) == 0) {
    return;
   }
   $spl_id_num_ = $this + 732 | 0;
   $sub = (HEAP32[$spl_id_num_ >> 2] | 0) - 1 | 0;
   HEAP32[$spl_id_num_ >> 2] = $sub;
   $spl_start_ = $this + 736 | 0;
   L1678 : do {
    if ($sub >>> 0 >= $del_spl_pos >>> 0) {
     $sub549 = (HEAP16[$this + 736 + ($del_spl_pos << 1) >> 1] | 0) - (HEAP16[$this + 736 + ($del_spl_pos + 1 << 1) >> 1] | 0) & 65535;
     $pos_073 = $del_spl_pos;
     while (1) {
      $add9 = $pos_073 + 1 | 0;
      HEAP16[$this + 736 + ($pos_073 << 1) >> 1] = $sub549 + (HEAP16[$this + 736 + ($add9 << 1) >> 1] | 0) & 65535;
      if (($pos_073 | 0) == (HEAP32[$spl_id_num_ >> 2] | 0)) {
       break L1678;
      }
      HEAP16[$this + 816 + ($pos_073 << 1) >> 1] = HEAP16[$this + 816 + ($add9 << 1) >> 1] | 0;
      if ($add9 >>> 0 > (HEAP32[$spl_id_num_ >> 2] | 0) >>> 0) {
       break;
      } else {
       $pos_073 = $add9;
      }
     }
    }
   } while (0);
   $8 = $this + 400 | 0;
   $9 = $this + 816 | 0;
   $mul = HEAP32[$spl_id_num_ >> 2] << 1;
   _memcpy($8 | 0, $9 | 0, $mul) | 0;
   $11 = $this + 480 | 0;
   $12 = $spl_start_;
   $mul32 = (HEAP32[$spl_id_num_ >> 2] << 1) + 2 | 0;
   _memcpy($11 | 0, $12 | 0, $mul32) | 0;
   do {
    if ((HEAP32[$fixed_lmas_ >> 2] | 0) >>> 0 > 1) {
     label = 1342;
    } else {
     if ((HEAP32[$this + 196 >> 2] | 0) != 16777215) {
      label = 1342;
      break;
     }
     $sublma_num137 = $this + 720 | 0;
     $pos133_070 = 0;
     $conv13571 = 0;
     do {
      $arrayidx143 = $this + 640 + ($conv13571 << 1) | 0;
      $31 = HEAP16[$arrayidx143 >> 1] | 0;
      if (($31 & 65535) >>> 0 > $del_spl_pos >>> 0) {
       HEAP16[$arrayidx143 >> 1] = $31 - 1 & 65535;
      }
      $pos133_070 = $pos133_070 + 1 & 65535;
      $conv13571 = $pos133_070 & 65535;
     } while ($conv13571 >>> 0 <= (HEAP32[$sublma_num137 >> 2] | 0) >>> 0);
     $phrase_len_1 = HEAP16[$this + 724 >> 1] | 0;
    }
   } while (0);
   do {
    if ((label | 0) == 1342) {
     if ((HEAP32[$this + 196 >> 2] | 0) == 16777215) {
      $bp_0 = 1;
     } else {
      HEAP32[$this + 720 >> 2] = 0;
      $bp_0 = 0;
     }
     $sublma_num45 = $this + 720 | 0;
     $conv4964 = $bp_0 & 65535;
     L1698 : do {
      if ($conv4964 >>> 0 > (HEAP32[$fixed_lmas_ >> 2] | 0) >>> 0) {
       $phrase_len_0_lcssa = 0;
      } else {
       $conv54 = HEAP32[$sublma_num45 >> 2] & 65535;
       $add56 = $conv54 - ($bp_0 & 65535) | 0;
       $arrayidx88 = $this + 640 + ($conv54 << 1) | 0;
       $pos47_066 = $bp_0;
       $phrase_len_067 = 0;
       $conv4968 = $conv4964;
       while (1) {
        $arrayidx53 = $this + 116 + ($conv4968 << 1) | 0;
        $19 = HEAP16[$arrayidx53 >> 1] | 0;
        $arrayidx60 = $this + 640 + ($add56 + $conv4968 << 1) | 0;
        HEAP16[$arrayidx60 >> 1] = $19;
        if ((HEAPU16[$arrayidx53 >> 1] | 0) >>> 0 > $del_spl_pos >>> 0) {
         HEAP16[$arrayidx60 >> 1] = $19 - 1 & 65535;
        }
        if (($conv4968 | 0) == (HEAP32[$fixed_lmas_ >> 2] | 0)) {
         $phrase_len_0_lcssa = $phrase_len_067;
         break L1698;
        }
        $call = __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, HEAP32[$this + 196 + ($conv4968 << 2) >> 2] | 0, $this + 560 + ((HEAPU16[$arrayidx88 >> 1] | 0) + ($phrase_len_067 & 65535) << 1) | 0, 40 - $phrase_len_067 & 65535) | 0;
        if (($call & 65535 | 0) != ((HEAPU16[$this + 116 + ($conv4968 + 1 << 1) >> 1] | 0) - (HEAPU16[$arrayidx53 >> 1] | 0) | 0)) {
         break;
        }
        $add112 = $call + $phrase_len_067 & 65535;
        $inc115 = $pos47_066 + 1 & 65535;
        $conv49 = $inc115 & 65535;
        if ($conv49 >>> 0 > (HEAP32[$fixed_lmas_ >> 2] | 0) >>> 0) {
         $phrase_len_0_lcssa = $add112;
         break L1698;
        } else {
         $pos47_066 = $inc115;
         $phrase_len_067 = $add112;
         $conv4968 = $conv49;
        }
       }
       ___assert_func(1184, 1245, 6944, 2984);
      }
     } while (0);
     if ($phrase_len_0_lcssa << 16 >> 16 == (HEAP16[$this + 116 + (HEAP32[$fixed_lmas_ >> 2] << 1) >> 1] | 0)) {
      HEAP16[$this + 724 >> 1] = $phrase_len_0_lcssa;
      HEAP32[$sublma_num45 >> 2] = (HEAP32[$fixed_lmas_ >> 2] | 0) - ($bp_0 & 65535) + (HEAP32[$sublma_num45 >> 2] | 0);
      $phrase_len_1 = $phrase_len_0_lcssa;
      break;
     } else {
      ___assert_func(1184, 1248, 6944, 2848);
     }
    }
   } while (0);
   if (($phrase_len_1 << 16 >> 16 | 0) == 0) {
    ___assert_func(1184, 1260, 6944, 2736);
   } else if (($phrase_len_1 << 16 >> 16 | 0) == 1) {
    HEAP32[$fixed_lmas_ >> 2] = 0;
    return;
   } else {
    $sublma_num180 = $this + 720 | 0;
    if ((HEAPU16[$this + 640 + (HEAP32[$sublma_num180 >> 2] << 1) >> 1] | 0) != ($del_spl_pos | 0)) {
     $add189 = $del_spl_pos + 1 | 0;
     $pos176_060 = 0;
     $conv17861 = 0;
     do {
      HEAP16[$this + 560 + ($conv17861 + $del_spl_pos << 1) >> 1] = HEAP16[$this + 560 + ($add189 + $conv17861 << 1) >> 1] | 0;
      $pos176_060 = $pos176_060 + 1 & 65535;
      $conv17861 = $pos176_060 & 65535;
     } while ($conv17861 >>> 0 < ((HEAPU16[$this + 640 + (HEAP32[$sublma_num180 >> 2] << 1) >> 1] | 0) - $del_spl_pos | 0) >>> 0);
    }
    $length197 = $this + 724 | 0;
    HEAP16[$length197 >> 1] = (HEAP16[$length197 >> 1] | 0) - 1 & 65535;
    if ((HEAP32[$sublma_num180 >> 2] | 0) == 0) {
     return;
    } else {
     $del_a_sub_0_off051 = 0;
     $pos201_052 = 1;
     $conv20353 = 1;
    }
    do {
     $arrayidx212 = $this + 640 + ($conv20353 - 1 << 1) | 0;
     $42 = HEAP16[$this + 640 + ($conv20353 << 1) >> 1] | 0;
     $del_a_sub_0_off051 = (HEAP16[$arrayidx212 >> 1] | 0) == $42 << 16 >> 16 | $del_a_sub_0_off051;
     if ($del_a_sub_0_off051) {
      HEAP16[$arrayidx212 >> 1] = $42;
     }
     $pos201_052 = $pos201_052 + 1 & 65535;
     $conv20353 = $pos201_052 & 65535;
     $43 = HEAP32[$sublma_num180 >> 2] | 0;
    } while ($conv20353 >>> 0 <= $43 >>> 0);
    if (!$del_a_sub_0_off051) {
     return;
    }
    HEAP32[$sublma_num180 >> 2] = $43 - 1;
    return;
   }
  }
  function __ZN10ime_pinyin12MatrixSearch19add_lma_to_userdictEttf($this, $lma_fr, $lma_to, $score) {
   $this = $this | 0;
   $lma_fr = $lma_fr | 0;
   $lma_to = $lma_to | 0;
   $score = +$score;
   var $word_str = 0, $spl_ids = 0, $user_dict_ = 0, $spl_id_fr_027 = 0, $pos_026 = 0, $conv428 = 0, $1 = 0, $2 = 0, $4 = 0, $6 = 0, $sub18 = 0, $conv20 = 0, $add_ptr = 0, $add50 = 0, $inc = 0, $spl_id_fr_0_lcssa30 = 0, $7 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 40 | 0;
   $word_str = sp | 0;
   $spl_ids = sp + 24 | 0;
   if ((($lma_to & 65535) - ($lma_fr & 65535) | 0) < 2) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $user_dict_ = $this + 16 | 0;
   if ((HEAP32[$user_dict_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   do {
    if (($lma_fr & 65535) < ($lma_to & 65535)) {
     $pos_026 = $lma_fr;
     $spl_id_fr_027 = 0;
     while (1) {
      $conv428 = $pos_026 & 65535;
      $1 = HEAP32[$this + 196 + ($conv428 << 2) >> 2] | 0;
      if (__ZN10ime_pinyin13is_user_lemmaEj($1) | 0) {
       $2 = HEAP32[$user_dict_ >> 2] | 0;
       $4 = HEAP32[(HEAP32[$2 >> 2] | 0) + 48 >> 2] | 0;
       FUNCTION_TABLE_iiiii[$4 & 31]($2, $1, 1, 1) | 0;
      }
      $6 = HEAP16[$this + 116 + ($conv428 << 1) >> 1] | 0;
      $sub18 = (HEAP16[$this + 116 + ($conv428 + 1 << 1) >> 1] | 0) - $6 & 65535;
      $conv20 = $spl_id_fr_027 & 65535;
      $add_ptr = $spl_ids + ($conv20 << 1) | 0;
      _utf16_strncpy($add_ptr, $this + 816 + (($6 & 65535) << 1) | 0, $sub18 & 65535) | 0;
      if ((__ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, $1, $word_str + ($conv20 << 1) | 0, 9 - $spl_id_fr_027 & 65535) | 0) << 16 >> 16 != $sub18 << 16 >> 16) {
       label = 1383;
       break;
      }
      if ((__ZN10ime_pinyin12MatrixSearch16get_lemma_splidsEjPttb($this, $1, $add_ptr, $sub18, 1) | 0) << 16 >> 16 != $sub18 << 16 >> 16) {
       $retval_0 = 0;
       label = 1393;
       break;
      }
      $add50 = $sub18 + $spl_id_fr_027 & 65535;
      $inc = $pos_026 + 1 & 65535;
      if (($inc & 65535) < ($lma_to & 65535)) {
       $pos_026 = $inc;
       $spl_id_fr_027 = $add50;
      } else {
       label = 1386;
       break;
      }
     }
     if ((label | 0) == 1386) {
      if (($add50 & 65535) < 9) {
       $spl_id_fr_0_lcssa30 = $add50;
       break;
      }
      ___assert_func(1184, 682, 6808, 944);
      return 0;
     } else if ((label | 0) == 1383) {
      ___assert_func(1184, 672, 6808, 1136);
      return 0;
     } else if ((label | 0) == 1393) {
      STACKTOP = sp;
      return $retval_0 | 0;
     }
    } else {
     $spl_id_fr_0_lcssa30 = 0;
    }
   } while (0);
   $7 = HEAP32[$user_dict_ >> 2] | 0;
   $retval_0 = (FUNCTION_TABLE_iiiiii[HEAP32[(HEAP32[$7 >> 2] | 0) + 44 >> 2] & 15]($7, $word_str | 0, $spl_ids | 0, $spl_id_fr_0_lcssa30, 1) | 0) != 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch9match_dmiEjPtt($this, $step_to, $spl_ids, $spl_id_num) {
   $this = $this | 0;
   $step_to = $step_to | 0;
   $spl_ids = $spl_ids | 0;
   $spl_id_num = $spl_id_num | 0;
   var $matrix_ = 0, $5 = 0, $dmi_pool_ = 0, $9 = 0, $conv19 = 0, $cmp2614 = 0, $sub = 0, $10 = 0, $dmi_pos_022 = 0, $add_ptr_sum = 0, $spl_pos_016 = 0, $dmi_015 = 0, $inc = 0, $inc49 = 0, $20 = 0, $retval_0 = 0, label = 0;
   if ((HEAP32[$this + 72 >> 2] | 0) >>> 0 < $step_to >>> 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $matrix_ = $this + 96 | 0;
   if ((HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($step_to * 12 | 0) + 6 >> 1] & 32767) == 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $5 = HEAP32[$matrix_ >> 2] | 0;
   if ((HEAP16[$5 + ($step_to * 12 | 0) + 6 >> 1] & 32767) == 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $dmi_pool_ = $this + 88 | 0;
   $9 = HEAP32[$dmi_pool_ >> 2] | 0;
   $conv19 = $spl_id_num & 65535;
   $cmp2614 = $spl_id_num << 16 >> 16 == 0;
   $sub = $conv19 - 1 | 0;
   $dmi_pos_022 = 0;
   $10 = $5;
   L1767 : while (1) {
    $add_ptr_sum = (HEAPU16[$10 + ($step_to * 12 | 0) + 2 >> 1] | 0) + ($dmi_pos_022 & 65535) | 0;
    L1769 : do {
     if ((HEAP8[$9 + ($add_ptr_sum * 12 | 0) + 8 | 0] & 127 | 0) == ($conv19 | 0)) {
      if ($cmp2614) {
       break L1767;
      }
      $dmi_015 = $9 + ($add_ptr_sum * 12 | 0) | 0;
      $spl_pos_016 = 0;
      while (1) {
       if ((HEAP16[$spl_ids + ($sub - ($spl_pos_016 & 65535) << 1) >> 1] | 0) != (HEAP16[$dmi_015 + 6 >> 1] | 0)) {
        break L1769;
       }
       $inc = $spl_pos_016 + 1 & 65535;
       if (($inc & 65535) < ($spl_id_num & 65535)) {
        $dmi_015 = (HEAP32[$dmi_pool_ >> 2] | 0) + ((HEAPU16[$dmi_015 + 4 >> 1] | 0) * 12 | 0) | 0;
        $spl_pos_016 = $inc;
       } else {
        break L1767;
       }
      }
     }
    } while (0);
    $inc49 = $dmi_pos_022 + 1 & 65535;
    $20 = HEAP32[$matrix_ >> 2] | 0;
    if (($inc49 & 65535) < (HEAP16[$20 + ($step_to * 12 | 0) + 6 >> 1] & 32767)) {
     $dmi_pos_022 = $inc49;
     $10 = $20;
    } else {
     $retval_0 = -1;
     label = 1410;
     break;
    }
   }
   if ((label | 0) == 1410) {
    return $retval_0 | 0;
   }
   $retval_0 = (HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($step_to * 12 | 0) + 2 >> 1] | 0) + $dmi_pos_022 & 65535;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch12get_fixedlenEv($this) {
   $this = $this | 0;
   var $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 72 >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP32[$this + 896 >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch8fill_dmiEPNS_13DictMatchInfoEPtttthbhh($this, $dmi, $handles, $dmi_fr, $spl_id, $node_num, $dict_level, $splid_end_split, $splstr_len, $all_full_id) {
   $this = $this | 0;
   $dmi = $dmi | 0;
   $handles = $handles | 0;
   $dmi_fr = $dmi_fr | 0;
   $spl_id = $spl_id | 0;
   $node_num = $node_num | 0;
   $dict_level = $dict_level | 0;
   $splid_end_split = $splid_end_split | 0;
   $splstr_len = $splstr_len | 0;
   $all_full_id = $all_full_id | 0;
   var $2 = 0, $9 = 0;
   HEAP16[$dmi >> 1] = HEAP16[$handles >> 1] | 0;
   HEAP16[$dmi + 2 >> 1] = HEAP16[$handles + 2 >> 1] | 0;
   HEAP16[$dmi + 4 >> 1] = $dmi_fr;
   HEAP16[$dmi + 6 >> 1] = $spl_id;
   $2 = $dmi + 8 | 0;
   HEAP8[$2] = HEAP8[$2] & -128 | $dict_level & 127;
   HEAP8[$dmi + 9 | 0] = $splstr_len << 1 | $splid_end_split & 1;
   $9 = $dmi + 10 | 0;
   HEAP8[$9] = HEAP8[$9] & -2 | $all_full_id & 1;
   HEAP8[$2] = HEAP8[$2] & 127;
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch16prepare_add_charEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   var $pys_decoded_len_ = 0, $dmi_pool_used_ = 0, $inc = 0, $5 = 0, $retval_0 = 0;
   $pys_decoded_len_ = $this + 72 | 0;
   if ((HEAP32[$pys_decoded_len_ >> 2] | 0) >>> 0 > 38) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin14SpellingParser17is_valid_to_parseEc(HEAP32[$this + 20 >> 2] | 0, $ch) | 0 | $ch << 24 >> 24 == 39)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $dmi_pool_used_ = $this + 92 | 0;
   if ((HEAPU16[$dmi_pool_used_ >> 1] | 0) > 799) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP8[(HEAP32[$pys_decoded_len_ >> 2] | 0) + ($this + 32) | 0] = $ch;
   $inc = (HEAP32[$pys_decoded_len_ >> 2] | 0) + 1 | 0;
   HEAP32[$pys_decoded_len_ >> 2] = $inc;
   $5 = HEAP32[$this + 96 >> 2] | 0;
   HEAP16[$5 + ($inc * 12 | 0) >> 1] = HEAP16[$this + 84 >> 1] | 0;
   HEAP16[$5 + ($inc * 12 | 0) + 4 >> 1] = 0;
   HEAP16[$5 + ($inc * 12 | 0) + 2 >> 1] = HEAP16[$dmi_pool_used_ >> 1] | 0;
   HEAP16[$5 + ($inc * 12 | 0) + 6 >> 1] = 0;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch11is_split_atEt($this, $pos) {
   $this = $this | 0;
   $pos = $pos | 0;
   return (__ZN10ime_pinyin14SpellingParser17is_valid_to_parseEc(HEAP32[$this + 20 >> 2] | 0, HEAP8[($pos & 65535) - 1 + ($this + 32) | 0] | 0) | 0) ^ 1 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch6chooseEj($this, $cand_id) {
   $this = $this | 0;
   $cand_id = $cand_id | 0;
   var $lpi_item26 = 0, $lpi_item26_sub = 0, $tmpcast = 0, $pys_decoded_len_ = 0, $3 = 0, $idxprom = 0, $6 = 0, $fixed_lmas_ = 0, $8 = 0, $lma_id_num_ = 0, $9 = 0, $pos_028 = 0, $inc = 0, $10 = 0, $_lcssa = 0, $arrayidx19 = 0, $13 = 0, $15 = 0, $16 = 0, $dec = 0, $19 = 0, $bf_clear = 0, $20 = 0, $bf_clear43 = 0, $22 = 0, $24 = 0, $fixed_hzs_56 = 0, $25 = 0, $26 = 0, $conv63 = 0, $28 = 0, $matrix_66 = 0, $call72 = 0, $38 = 0, $40 = 0, $fixed_lmas_101 = 0, $43 = 0, $46 = 0, $step_to_0 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $lpi_item26 = sp | 0;
   $lpi_item26_sub = $lpi_item26 | 0;
   $tmpcast = $lpi_item26;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $pys_decoded_len_ = $this + 72 | 0;
   if ((HEAP32[$pys_decoded_len_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (($cand_id | 0) == 0) {
    $3 = HEAP32[$this + 732 >> 2] | 0;
    HEAP32[$this + 896 >> 2] = $3;
    $idxprom = HEAPU16[$this + 736 + ($3 << 1) >> 1] | 0;
    $6 = HEAP32[$this + 96 >> 2] | 0;
    HEAP32[$6 + ($idxprom * 12 | 0) + 8 >> 2] = (HEAP32[$this + 80 >> 2] | 0) + ((HEAPU16[$6 + ($idxprom * 12 | 0) >> 1] | 0) << 4);
    $fixed_lmas_ = $this + 356 | 0;
    $8 = HEAP32[$fixed_lmas_ >> 2] | 0;
    $lma_id_num_ = $this + 112 | 0;
    $9 = HEAP32[$lma_id_num_ >> 2] | 0;
    if ($8 >>> 0 < $9 >>> 0) {
     $pos_028 = $8;
     while (1) {
      HEAP8[$this + 360 + $pos_028 | 0] = 1;
      $inc = $pos_028 + 1 | 0;
      $10 = HEAP32[$lma_id_num_ >> 2] | 0;
      if ($inc >>> 0 < $10 >>> 0) {
       $pos_028 = $inc;
      } else {
       $_lcssa = $10;
       break;
      }
     }
    } else {
     $_lcssa = $9;
    }
    HEAP32[$fixed_lmas_ >> 2] = $_lcssa;
    HEAP32[$this + 12500 >> 2] = 0;
    do {
     if ((HEAP32[$lma_id_num_ >> 2] | 0) == 1) {
      $arrayidx19 = $this + 196 | 0;
      if (!(__ZN10ime_pinyin13is_user_lemmaEj(HEAP32[$arrayidx19 >> 2] | 0) | 0)) {
       break;
      }
      $13 = HEAP32[$this + 16 >> 2] | 0;
      if (($13 | 0) == 0) {
       break;
      }
      $15 = HEAP32[(HEAP32[$13 >> 2] | 0) + 48 >> 2] | 0;
      $16 = HEAP32[$arrayidx19 >> 2] | 0;
      FUNCTION_TABLE_iiiii[$15 & 31]($13, $16, 1, 1) | 0;
     } else {
      if ((HEAP32[$this + 16 >> 2] | 0) == 0) {
       break;
      }
      __ZN10ime_pinyin12MatrixSearch25try_add_cand0_to_userdictEv($this) | 0;
     }
    } while (0);
    __ZN10ime_pinyin12MatrixSearch16update_dict_freqEv($this);
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $dec = $cand_id - 1 | 0;
   $19 = HEAP32[$this + 900 + ($dec << 3) >> 2] | 0;
   $bf_clear = $19 & 16777215;
   $20 = HEAP16[$this + 900 + ($dec << 3) + 4 >> 1] | 0;
   $bf_clear43 = $19 >>> 24 & 15;
   if (($bf_clear43 | 0) == 0) {
    ___assert_func(1184, 819, 6760, 3664);
    return 0;
   }
   if (__ZN10ime_pinyin13is_user_lemmaEj($bf_clear) | 0) {
    $22 = HEAP32[$this + 16 >> 2] | 0;
    if (($22 | 0) != 0) {
     $24 = HEAP32[(HEAP32[$22 >> 2] | 0) + 48 >> 2] | 0;
     FUNCTION_TABLE_iiiii[$24 & 31]($22, $bf_clear, 1, 1) | 0;
    }
    __ZN10ime_pinyin12MatrixSearch16update_dict_freqEv($this);
   }
   $fixed_hzs_56 = $this + 896 | 0;
   $25 = HEAP32[$fixed_hzs_56 >> 2] | 0;
   $26 = HEAP16[$this + 736 + ($25 << 1) >> 1] | 0;
   $conv63 = HEAPU16[$this + 736 + ($25 + $bf_clear43 << 1) >> 1] | 0;
   $28 = HEAP32[$pys_decoded_len_ >> 2] | 0;
   __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $conv63, 0, 0, 1) | 0;
   $matrix_66 = $this + 96 | 0;
   HEAP16[(HEAP32[$matrix_66 >> 2] | 0) + ($conv63 * 12 | 0) + 4 >> 1] = 0;
   HEAP16[$lpi_item26 + 4 >> 1] = $20;
   HEAP32[$lpi_item26_sub >> 2] = HEAP32[$lpi_item26_sub >> 2] & -16777216 | $bf_clear;
   $call72 = __ZN10ime_pinyin12MatrixSearch9match_dmiEjPtt($this, $conv63, $this + 816 + (HEAP32[$fixed_hzs_56 >> 2] << 1) | 0, $bf_clear43 & 65535) | 0;
   if ($call72 << 16 >> 16 == -1) {
    ___assert_func(1184, 851, 6760, 3552);
    return 0;
   }
   __ZN10ime_pinyin12MatrixSearch14extend_mtrx_ndEPNS_10MatrixNodeEPNS_10LmaPsbItemEjtj($this, HEAP32[(HEAP32[$matrix_66 >> 2] | 0) + (($26 & 65535) * 12 | 0) + 8 >> 2] | 0, $tmpcast, 1, $call72, $conv63) | 0;
   $38 = HEAP32[$matrix_66 >> 2] | 0;
   HEAP32[$38 + ($conv63 * 12 | 0) + 8 >> 2] = (HEAP32[$this + 80 >> 2] | 0) + ((HEAPU16[$38 + ($conv63 * 12 | 0) >> 1] | 0) << 4);
   $40 = HEAP32[$matrix_66 >> 2] | 0;
   HEAP16[$this + 84 >> 1] = (HEAP16[$40 + ($conv63 * 12 | 0) + 4 >> 1] | 0) + (HEAP16[$40 + ($conv63 * 12 | 0) >> 1] | 0) & 65535;
   $fixed_lmas_101 = $this + 356 | 0;
   $43 = HEAP32[$fixed_lmas_101 >> 2] | 0;
   HEAP8[$this + 360 + $43 | 0] = ($bf_clear | 0) == (HEAP32[$this + 196 + ($43 << 2) >> 2] | 0) | 0;
   HEAP32[$this + 196 + (HEAP32[$fixed_lmas_101 >> 2] << 2) >> 2] = $bf_clear;
   $46 = HEAP32[$fixed_lmas_101 >> 2] | 0;
   HEAP16[$this + 116 + ($46 + 1 << 1) >> 1] = (HEAPU16[$this + 116 + ($46 << 1) >> 1] | 0) + $bf_clear43 & 65535;
   HEAP32[$fixed_lmas_101 >> 2] = (HEAP32[$fixed_lmas_101 >> 2] | 0) + 1;
   HEAP32[$fixed_hzs_56 >> 2] = (HEAP32[$fixed_hzs_56 >> 2] | 0) + $bf_clear43;
   $step_to_0 = $conv63;
   while (1) {
    if (($step_to_0 | 0) == ($28 | 0)) {
     break;
    }
    if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, HEAP8[$this + 32 + $step_to_0 | 0] | 0) | 0) {
     $step_to_0 = $step_to_0 + 1 | 0;
    } else {
     label = 1452;
     break;
    }
   }
   if ((label | 0) == 1452) {
    ___assert_func(1184, 871, 6760, 3432);
    return 0;
   }
   do {
    if ((HEAP32[$fixed_hzs_56 >> 2] | 0) >>> 0 < (HEAP32[$this + 732 >> 2] | 0) >>> 0) {
     __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this);
    } else {
     HEAP32[$this + 12500 >> 2] = 0;
     if ((HEAP32[$this + 16 >> 2] | 0) == 0) {
      break;
     }
     __ZN10ime_pinyin12MatrixSearch25try_add_cand0_to_userdictEv($this) | 0;
    }
   } while (0);
   $retval_0 = __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv($this) | 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch14extend_mtrx_ndEPNS_10MatrixNodeEPNS_10LmaPsbItemEjtj($this, $mtrx_nd, $lpi_items, $lpi_num, $dmi_fr, $res_row) {
   $this = $this | 0;
   $mtrx_nd = $mtrx_nd | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_num = $lpi_num | 0;
   $dmi_fr = $dmi_fr | 0;
   $res_row = $res_row | 0;
   var $matrix_ = 0, $lpi_num_addr_0 = 0, $3 = 0, $conv12 = 0, $add_ptr = 0, $score14 = 0, $conv50 = 0, $sub_ptr_rhs_cast = 0, $score20 = 0, $pos_039 = 0, $arrayidx15 = 0, $add = 0.0, $10 = 0, $conv28 = 0, $add_ptr_sum = 0, $add_ptr29 = 0, $replace_0_off036 = 0, $mtrx_nd_res_035 = 0, $add_ptr31 = 0, $12 = 0, $13 = 0, $mtrx_nd_res_0_lcssa45 = 0, $mtrx_nd_res_0_lcssa43 = 0, $mtrx_nd_num54 = 0, $19 = 0, $retval_0 = 0, label = 0;
   if (($mtrx_nd | 0) == 0) {
    ___assert_func(1184, 1589, 7112, 2360);
    return 0;
   }
   $matrix_ = $this + 96 | 0;
   HEAP32[(HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) + 8 >> 2] = 0;
   if ((HEAPU16[$this + 84 >> 1] | 0) > 194) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lpi_num_addr_0 = (HEAP16[$mtrx_nd + 14 >> 1] | 0) == 0 & $lpi_num >>> 0 > 5 ? 5 : $lpi_num;
   $3 = HEAP32[$this + 80 >> 2] | 0;
   $conv12 = HEAPU16[(HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) >> 1] | 0;
   $add_ptr = $3 + ($conv12 << 4) | 0;
   L1854 : do {
    if (($lpi_num_addr_0 | 0) != 0) {
     $score14 = $mtrx_nd + 4 | 0;
     $conv50 = $res_row & 65535;
     $sub_ptr_rhs_cast = $add_ptr;
     $score20 = $3 + ($conv12 << 4) + 4 | 0;
     $pos_039 = 0;
     do {
      $arrayidx15 = $lpi_items + ($pos_039 << 3) | 0;
      $add = +HEAPF32[$score14 >> 2] + +(HEAPU16[$lpi_items + ($pos_039 << 3) + 4 >> 1] | 0);
      if (($pos_039 | 0) != 0) {
       if ($add + -8.0e3 > +HEAPF32[$score20 >> 2]) {
        break L1854;
       }
      }
      $10 = HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) + 4 >> 1] | 0;
      $conv28 = $10 & 65535;
      $add_ptr_sum = $conv28 + $conv12 | 0;
      $add_ptr29 = $3 + ($add_ptr_sum << 4) | 0;
      L1861 : do {
       if (($add_ptr_sum | 0) > ($conv12 | 0)) {
        $mtrx_nd_res_035 = $add_ptr29;
        $replace_0_off036 = 0;
        while (1) {
         $add_ptr31 = $mtrx_nd_res_035 - 16 | 0;
         if ($add >= +HEAPF32[$mtrx_nd_res_035 - 16 + 4 >> 2]) {
          break;
         }
         if ($mtrx_nd_res_035 - $sub_ptr_rhs_cast >> 4 >>> 0 < 5) {
          $12 = $mtrx_nd_res_035;
          $13 = $add_ptr31;
          HEAP32[$12 >> 2] = HEAP32[$13 >> 2];
          HEAP32[$12 + 4 >> 2] = HEAP32[$13 + 4 >> 2];
          HEAP32[$12 + 8 >> 2] = HEAP32[$13 + 8 >> 2];
          HEAP32[$12 + 12 >> 2] = HEAP32[$13 + 12 >> 2];
         }
         if ($add_ptr31 >>> 0 > $add_ptr >>> 0) {
          $mtrx_nd_res_035 = $add_ptr31;
          $replace_0_off036 = 1;
         } else {
          $mtrx_nd_res_0_lcssa43 = $add_ptr31;
          label = 1478;
          break L1861;
         }
        }
        if ($replace_0_off036) {
         $mtrx_nd_res_0_lcssa43 = $mtrx_nd_res_035;
         label = 1478;
        } else {
         $mtrx_nd_res_0_lcssa45 = $mtrx_nd_res_035;
         label = 1476;
        }
       } else {
        $mtrx_nd_res_0_lcssa45 = $add_ptr29;
        label = 1476;
       }
      } while (0);
      do {
       if ((label | 0) == 1476) {
        label = 0;
        if (($10 & 65535) >= 5) {
         break;
        }
        if (((HEAPU16[(HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) >> 1] | 0) + $conv28 | 0) >>> 0 < 200) {
         $mtrx_nd_res_0_lcssa43 = $mtrx_nd_res_0_lcssa45;
         label = 1478;
        }
       }
      } while (0);
      do {
       if ((label | 0) == 1478) {
        label = 0;
        HEAP32[$mtrx_nd_res_0_lcssa43 >> 2] = HEAP32[$arrayidx15 >> 2] & 16777215;
        HEAPF32[$mtrx_nd_res_0_lcssa43 + 4 >> 2] = $add;
        HEAP32[$mtrx_nd_res_0_lcssa43 + 8 >> 2] = $mtrx_nd;
        HEAP16[$mtrx_nd_res_0_lcssa43 + 12 >> 1] = $dmi_fr;
        HEAP16[$mtrx_nd_res_0_lcssa43 + 14 >> 1] = $conv50;
        $mtrx_nd_num54 = (HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) + 4 | 0;
        $19 = HEAP16[$mtrx_nd_num54 >> 1] | 0;
        if (($19 & 65535) >= 5) {
         break;
        }
        HEAP16[$mtrx_nd_num54 >> 1] = $19 + 1 & 65535;
       }
      } while (0);
      $pos_039 = $pos_039 + 1 | 0;
     } while ($pos_039 >>> 0 < $lpi_num_addr_0 >>> 0);
    }
   } while (0);
   $retval_0 = HEAPU16[(HEAP32[$matrix_ >> 2] | 0) + ($res_row * 12 | 0) + 4 >> 1] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch18cancel_last_choiceEv($this) {
   $this = $this | 0;
   var $fixed_hzs_ = 0, $3 = 0, $6 = 0, $8 = 0, $conv7 = 0, $storemerge = 0, $step_start_0 = 0, $13 = 0, $retval_0 = 0, label = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 72 >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $fixed_hzs_ = $this + 896 | 0;
   $3 = HEAP32[$fixed_hzs_ >> 2] | 0;
   do {
    if (($3 | 0) != 0) {
     $6 = HEAP32[(HEAP32[$this + 96 >> 2] | 0) + ((HEAPU16[$this + 736 + ($3 << 1) >> 1] | 0) * 12 | 0) + 8 >> 2] | 0;
     if (($6 | 0) == 0) {
      ___assert_func(1184, 895, 6888, 3280);
      return 0;
     }
     $8 = HEAP16[(HEAP32[$6 + 8 >> 2] | 0) + 14 >> 1] | 0;
     $conv7 = $8 & 65535;
     if ($8 << 16 >> 16 == 0) {
      $storemerge = 0;
     } else {
      $storemerge = $3 - (HEAP8[(HEAP32[$this + 88 >> 2] | 0) + ((HEAPU16[$6 + 12 >> 1] | 0) * 12 | 0) + 8 | 0] & 127) | 0;
     }
     HEAP32[$fixed_hzs_ >> 2] = $storemerge;
     __ZN10ime_pinyin12MatrixSearch12reset_searchEjbbb($this, $conv7, 0, 0, 0) | 0;
     $step_start_0 = $conv7;
     while (1) {
      $13 = HEAP8[$this + 32 + $step_start_0 | 0] | 0;
      if ($13 << 24 >> 24 == 0) {
       label = 1496;
       break;
      }
      if (__ZN10ime_pinyin12MatrixSearch8add_charEc($this, $13) | 0) {
       $step_start_0 = $step_start_0 + 1 | 0;
      } else {
       label = 1495;
       break;
      }
     }
     if ((label | 0) == 1495) {
      ___assert_func(1184, 910, 6888, 3432);
      return 0;
     } else if ((label | 0) == 1496) {
      __ZN10ime_pinyin12MatrixSearch18prepare_candidatesEv($this);
      break;
     }
    }
   } while (0);
   $retval_0 = __ZN10ime_pinyin12MatrixSearch17get_candidate_numEv($this) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch15add_char_qwertyEv($this) {
   $this = $this | 0;
   var $is_pre = 0, $pys_decoded_len_ = 0, $matrix_ = 0, $fixed_hzs_ = 0, $dmi_c_phrase_ = 0, $spl_parser_ = 0, $dmi_pool_ = 0, $dep_68 = 0, $spl_trie_ = 0, $dep_74 = 0, $spl_trie_194 = 0, $lpi_total_ = 0, $mtrx_nd_pool_ = 0, $arraydecay290 = 0, $dmi_pool_used_292 = 0, $dmi_c_phrase_217 = 0, $dmi_pool_used_236 = 0, $dmi_pool_used_ = 0, $dmi_c_phrase_147 = 0, $dep_ = 0, $dmi_c_phrase_116 = 0, $xi_an_enabled_ = 0, $conv117 = 0, $spl_matched_0_off0116 = 0, $longest_ext_0115 = 0, $ext_len_0112 = 0, $2 = 0, $11 = 0, $sub24 = 0, $conv25 = 0, $conv30 = 0, $call = 0, $spl_matched_0_off0_ = 0, $call54 = 0, $21 = 0, $22 = 0, $conv6096 = 0, $add72101 = 0, $frombool191 = 0, $add72107 = 0, $conv60106 = 0, $dmi_pos_0105 = 0, $longest_ext_1104 = 0, $26 = 0, $add_ptr77 = 0, $27 = 0, $dmi_0 = 0, $dep_77 = 0, $46 = 0, $bf_clear145 = 0, $49 = 0, $conv146 = 0, $d_081 = 0, $prev_ids_num_080 = 0, $dec = 0, $52 = 0, $add_ptr171 = 0, $prev_ids_num_1 = 0, $cmp14272 = 0, $dep_71 = 0, $56 = 0, $call200 = 0, $call212 = 0, $73 = 0, $79 = 0, $80 = 0, $88 = 0, $conv257 = 0, $fr_row_0 = 0, $idxprom269 = 0, $95 = 0, $96 = 0, $conv27482 = 0, $conv27491 = 0, $mtrx_nd_pos_090 = 0, $longest_ext_289 = 0, $ext_len_0_longest_ext_2 = 0, $inc = 0, $conv274 = 0, $102 = 0, $longest_ext_4 = 0, $inc305 = 0, $conv60 = 0, $105 = 0, $add72 = 0, $longest_ext_5 = 0, $spl_matched_2_off0 = 0, $dec308 = 0, $spl_matched_0_off0_lcssa = 0, $mtrx_nd_pool_used_ = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $is_pre = sp | 0;
   $pys_decoded_len_ = $this + 72 | 0;
   $matrix_ = $this + 96 | 0;
   HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) + 4 >> 1] = 0;
   $fixed_hzs_ = $this + 896 | 0;
   $dmi_c_phrase_ = $this + 728 | 0;
   $spl_parser_ = $this + 20 | 0;
   $dmi_pool_ = $this + 88 | 0;
   $dep_68 = $this + 100 | 0;
   $spl_trie_ = $this + 4 | 0;
   $dep_74 = $this + 100 | 0;
   $spl_trie_194 = $this + 4 | 0;
   $lpi_total_ = $this + 12500 | 0;
   $mtrx_nd_pool_ = $this + 80 | 0;
   $arraydecay290 = $this + 900 | 0;
   $dmi_pool_used_292 = $this + 92 | 0;
   $dmi_c_phrase_217 = $this + 728 | 0;
   $dmi_pool_used_236 = $this + 92 | 0;
   $dmi_pool_used_ = $this + 92 | 0;
   $dmi_c_phrase_147 = $this + 728 | 0;
   $dep_ = $this + 100 | 0;
   $dmi_c_phrase_116 = $this + 728 | 0;
   $xi_an_enabled_ = $this + 8 | 0;
   $ext_len_0112 = 7;
   $longest_ext_0115 = 0;
   $spl_matched_0_off0116 = 0;
   $conv117 = 7;
   L1902 : while (1) {
    $2 = HEAP32[$pys_decoded_len_ >> 2] | 0;
    L1904 : do {
     if ($conv117 >>> 0 > ($2 - (HEAPU16[$this + 736 + (HEAP32[$fixed_hzs_ >> 2] << 1) >> 1] | 0) | 0) >>> 0) {
      $spl_matched_2_off0 = $spl_matched_0_off0116;
      $longest_ext_5 = $longest_ext_0115;
     } else {
      do {
       if (!(($ext_len_0112 & 65535) < 2 | $longest_ext_0115 << 16 >> 16 == 0)) {
        if ((HEAP16[(HEAP32[$matrix_ >> 2] | 0) + (($2 - $conv117 | 0) * 12 | 0) + 6 >> 1] | 0) <= -1) {
         break;
        }
        if ((HEAP8[$xi_an_enabled_] & 1) == 0) {
         $spl_matched_0_off0_lcssa = $spl_matched_0_off0116;
         label = 1550;
         break L1902;
        } else {
         $spl_matched_2_off0 = $spl_matched_0_off0116;
         $longest_ext_5 = $longest_ext_0115;
         break L1904;
        }
       }
      } while (0);
      $11 = HEAP32[$pys_decoded_len_ >> 2] | 0;
      $sub24 = $11 - $conv117 | 0;
      $conv25 = $sub24 & 65535;
      $conv30 = $sub24 & 65535;
      if ((HEAPU16[$this + 736 + (HEAP32[$fixed_hzs_ >> 2] << 1) >> 1] | 0) >>> 0 > $conv30 >>> 0) {
       $spl_matched_2_off0 = $spl_matched_0_off0116;
       $longest_ext_5 = $longest_ext_0115;
       break;
      }
      if ((HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($conv30 * 12 | 0) + 4 >> 1] | 0) == 0) {
       if ((HEAP8[$dmi_c_phrase_] & 1) == 0) {
        $spl_matched_2_off0 = $spl_matched_0_off0116;
        $longest_ext_5 = $longest_ext_0115;
        break;
       }
      }
      HEAP8[$is_pre] = 0;
      $call = __ZN10ime_pinyin14SpellingParser16get_splid_by_strEPKctPb(HEAP32[$spl_parser_ >> 2] | 0, $this + 32 + $conv30 | 0, $ext_len_0112, $is_pre) | 0;
      $spl_matched_0_off0_ = $spl_matched_0_off0116 | (HEAP8[$is_pre] & 1) != 0;
      if ($call << 16 >> 16 == 0) {
       $spl_matched_2_off0 = $spl_matched_0_off0_;
       $longest_ext_5 = $longest_ext_0115;
       break;
      }
      $call54 = __ZN10ime_pinyin12MatrixSearch11is_split_atEt($this, $11 & 65535) | 0;
      $21 = HEAP32[$matrix_ >> 2] | 0;
      $22 = HEAP16[$21 + ($conv30 * 12 | 0) + 2 >> 1] | 0;
      $conv6096 = $22 & 65535;
      $add72101 = (HEAP16[$21 + ($conv30 * 12 | 0) + 6 >> 1] & 32767) + ($22 & 65535) | 0;
      if (($conv6096 | 0) >= ($add72101 + 1 | 0)) {
       $spl_matched_2_off0 = $spl_matched_0_off0_;
       $longest_ext_5 = $longest_ext_0115;
       break;
      }
      $frombool191 = $call54 & 1;
      $longest_ext_1104 = $longest_ext_0115;
      $dmi_pos_0105 = $22;
      $conv60106 = $conv6096;
      $add72107 = $add72101;
      while (1) {
       $26 = HEAP32[$dmi_pool_ >> 2] | 0;
       $add_ptr77 = $26 + ($conv60106 * 12 | 0) | 0;
       do {
        if (($conv60106 | 0) == ($add72107 | 0)) {
         $dmi_0 = 0;
         label = 1518;
        } else {
         $27 = HEAP32[$fixed_hzs_ >> 2] | 0;
         if (($27 | 0) != 0) {
          if (((HEAP32[$pys_decoded_len_ >> 2] | 0) - $conv117 - ((HEAPU8[$26 + ($conv60106 * 12 | 0) + 9 | 0] | 0) >>> 1 & 255) | 0) >>> 0 < (HEAPU16[$this + 736 + ($27 << 1) >> 1] | 0) >>> 0) {
           $longest_ext_4 = $longest_ext_1104;
           break;
          }
         }
         if ((HEAP8[$26 + ($conv60106 * 12 | 0) + 8 | 0] | 0) >= 0) {
          $dmi_0 = $add_ptr77;
          label = 1518;
          break;
         }
         if ((HEAP8[$dmi_c_phrase_116] & 1) == 0) {
          $longest_ext_4 = $longest_ext_1104;
         } else {
          $dmi_0 = $add_ptr77;
          label = 1518;
         }
        }
       } while (0);
       L1924 : do {
        if ((label | 0) == 1518) {
         label = 0;
         do {
          if (($longest_ext_1104 & 65535) > ($ext_len_0112 & 65535)) {
           if (($dmi_0 | 0) == 0) {
            if ((HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ($conv30 * 12 | 0) + 6 >> 1] | 0) > -1) {
             $longest_ext_4 = $longest_ext_1104;
             break L1924;
            }
            HEAP16[(HEAP32[$dep_68 >> 2] | 0) + 80 >> 1] = 0;
            $dep_71 = $dep_68;
            $cmp14272 = 1;
            break;
           } else {
            if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$dmi_0 + 6 >> 1] | 0) | 0) {
             $longest_ext_4 = $longest_ext_1104;
             break L1924;
            }
            HEAP16[(HEAP32[$dep_74 >> 2] | 0) + 80 >> 1] = 0;
            $dep_77 = $dep_74;
            label = 1525;
            break;
           }
          } else {
           HEAP16[(HEAP32[$dep_ >> 2] | 0) + 80 >> 1] = 0;
           if (($dmi_0 | 0) == 0) {
            $dep_71 = $dep_;
            $cmp14272 = 1;
           } else {
            $dep_77 = $dep_;
            label = 1525;
           }
          }
         } while (0);
         if ((label | 0) == 1525) {
          label = 0;
          $46 = $dmi_0 + 8 | 0;
          $bf_clear145 = HEAP8[$46] & 127;
          $49 = HEAP8[$dmi_c_phrase_147] & 1;
          if ($49 << 24 >> 24 == 0 & ($bf_clear145 & 255) > 7) {
           $longest_ext_4 = $longest_ext_1104;
           break;
          }
          $conv146 = $bf_clear145 & 255;
          if ($49 << 24 >> 24 != 0 & ($bf_clear145 & 255) > 39) {
           $longest_ext_4 = $longest_ext_1104;
           break;
          }
          L1938 : do {
           if (($dmi_0 | 0) == 0) {
            $prev_ids_num_1 = $conv146;
           } else {
            $prev_ids_num_080 = $conv146;
            $d_081 = $dmi_0;
            while (1) {
             $dec = $prev_ids_num_080 - 1 & 65535;
             HEAP16[(HEAP32[$dep_77 >> 2] | 0) + (($dec & 65535) << 1) >> 1] = HEAP16[$d_081 + 6 >> 1] | 0;
             $52 = HEAP16[$d_081 + 4 >> 1] | 0;
             if ($52 << 16 >> 16 == -1) {
              $prev_ids_num_1 = $dec;
              break L1938;
             }
             $add_ptr171 = (HEAP32[$dmi_pool_ >> 2] | 0) + (($52 & 65535) * 12 | 0) | 0;
             if (($add_ptr171 | 0) == 0) {
              $prev_ids_num_1 = $dec;
              break;
             } else {
              $prev_ids_num_080 = $dec;
              $d_081 = $add_ptr171;
             }
            }
           }
          } while (0);
          if ($prev_ids_num_1 << 16 >> 16 != 0) {
           label = 1531;
           break L1902;
          }
          HEAP16[(HEAP32[$dep_77 >> 2] | 0) + 80 >> 1] = HEAP8[$46] & 127;
          $dep_71 = $dep_77;
          $cmp14272 = 0;
         }
         $56 = HEAP32[$dep_71 >> 2] | 0;
         HEAP16[$56 + (HEAPU16[$56 + 80 >> 1] << 1) >> 1] = $call;
         HEAP16[(HEAP32[$dep_71 >> 2] | 0) + 82 >> 1] = $ext_len_0112;
         HEAP8[(HEAP32[$dep_71 >> 2] | 0) + 86 | 0] = $frombool191;
         HEAP16[(HEAP32[$dep_71 >> 2] | 0) + 90 >> 1] = 1;
         HEAP16[(HEAP32[$dep_71 >> 2] | 0) + 88 >> 1] = $call;
         if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_194 >> 2] | 0, $call) | 0) {
          $call200 = __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt(HEAP32[$spl_trie_194 >> 2] | 0, $call, (HEAP32[$dep_71 >> 2] | 0) + 88 | 0) | 0;
          HEAP16[(HEAP32[$dep_71 >> 2] | 0) + 90 >> 1] = $call200;
          if ((HEAP16[(HEAP32[$dep_71 >> 2] | 0) + 90 >> 1] | 0) == 0) {
           label = 1535;
           break L1902;
          }
         }
         $call212 = __ZN10ime_pinyin12MatrixSearch10extend_dmiEPNS_11DictExtParaEPNS_13DictMatchInfoE($this, HEAP32[$dep_71 >> 2] | 0, $dmi_0) | 0;
         do {
          if (($call212 & 65535 | 0) != 0) {
           if ((HEAP8[$dmi_c_phrase_217] & 1) != 0) {
            $73 = (HEAP32[$dmi_pool_ >> 2] | 0) + ((HEAPU16[$dmi_pool_used_ >> 1] | 0) * 12 | 0) + 8 | 0;
            HEAP8[$73] = HEAP8[$73] | -128;
           }
           $79 = (HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) + 6 | 0;
           $80 = HEAP16[$79 >> 1] | 0;
           HEAP16[$79 >> 1] = ($80 & 65535) + $call212 & 32767 | $80 & -32768;
           HEAP16[$dmi_pool_used_236 >> 1] = (HEAPU16[$dmi_pool_used_236 >> 1] | 0) + $call212 & 65535;
           if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$spl_trie_194 >> 2] | 0, $call) | 0) {
            break;
           }
           $88 = (HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) + 6 | 0;
           HEAP16[$88 >> 1] = HEAP16[$88 >> 1] | -32768;
          }
         } while (0);
         if ((HEAP32[$lpi_total_ >> 2] | 0) == 0) {
          $longest_ext_4 = $longest_ext_1104;
          break;
         }
         if ($cmp14272) {
          $fr_row_0 = $conv25;
         } else {
          $conv257 = (HEAPU8[$dmi_0 + 9 | 0] | 0) >>> 1 & 255;
          if ($conv30 >>> 0 < $conv257 >>> 0) {
           label = 1544;
           break L1902;
          }
          $fr_row_0 = $sub24 - $conv257 & 65535;
         }
         $idxprom269 = $fr_row_0 & 65535;
         $95 = HEAP32[$matrix_ >> 2] | 0;
         $96 = HEAP16[$95 + ($idxprom269 * 12 | 0) >> 1] | 0;
         $conv27482 = $96 & 65535;
         if (($conv27482 | 0) < ((HEAPU16[$95 + ($idxprom269 * 12 | 0) + 4 >> 1] | 0) + ($96 & 65535) | 0)) {
          $longest_ext_289 = $longest_ext_1104;
          $mtrx_nd_pos_090 = $96;
          $conv27491 = $conv27482;
         } else {
          $longest_ext_4 = $longest_ext_1104;
          break;
         }
         while (1) {
          __ZN10ime_pinyin12MatrixSearch14extend_mtrx_ndEPNS_10MatrixNodeEPNS_10LmaPsbItemEjtj($this, (HEAP32[$mtrx_nd_pool_ >> 2] | 0) + ($conv27491 << 4) | 0, $arraydecay290, HEAP32[$lpi_total_ >> 2] | 0, (HEAPU16[$dmi_pool_used_292 >> 1] | 0) - $call212 & 65535, HEAP32[$pys_decoded_len_ >> 2] | 0) | 0;
          $ext_len_0_longest_ext_2 = $longest_ext_289 << 16 >> 16 == 0 ? $ext_len_0112 : $longest_ext_289;
          $inc = $mtrx_nd_pos_090 + 1 & 65535;
          $conv274 = $inc & 65535;
          $102 = HEAP32[$matrix_ >> 2] | 0;
          if (($conv274 | 0) < ((HEAPU16[$102 + ($idxprom269 * 12 | 0) + 4 >> 1] | 0) + (HEAPU16[$102 + ($idxprom269 * 12 | 0) >> 1] | 0) | 0)) {
           $longest_ext_289 = $ext_len_0_longest_ext_2;
           $mtrx_nd_pos_090 = $inc;
           $conv27491 = $conv274;
          } else {
           $longest_ext_4 = $ext_len_0_longest_ext_2;
           break;
          }
         }
        }
       } while (0);
       $inc305 = $dmi_pos_0105 + 1 & 65535;
       $conv60 = $inc305 & 65535;
       $105 = HEAP32[$matrix_ >> 2] | 0;
       $add72 = (HEAP16[$105 + ($conv30 * 12 | 0) + 6 >> 1] & 32767) + (HEAPU16[$105 + ($conv30 * 12 | 0) + 2 >> 1] | 0) | 0;
       if (($conv60 | 0) < ($add72 + 1 | 0)) {
        $longest_ext_1104 = $longest_ext_4;
        $dmi_pos_0105 = $inc305;
        $conv60106 = $conv60;
        $add72107 = $add72;
       } else {
        $spl_matched_2_off0 = $spl_matched_0_off0_;
        $longest_ext_5 = $longest_ext_4;
        break;
       }
      }
     }
    } while (0);
    $dec308 = $ext_len_0112 - 1 & 65535;
    if ($dec308 << 16 >> 16 == 0) {
     $spl_matched_0_off0_lcssa = $spl_matched_2_off0;
     label = 1550;
     break;
    } else {
     $ext_len_0112 = $dec308;
     $longest_ext_0115 = $longest_ext_5;
     $spl_matched_0_off0116 = $spl_matched_2_off0;
     $conv117 = $dec308 & 65535;
    }
   }
   if ((label | 0) == 1535) {
    ___assert_func(1184, 1082, 7056, 3088);
    return 0;
   } else if ((label | 0) == 1531) {
    ___assert_func(1184, 1070, 7056, 3176);
    return 0;
   } else if ((label | 0) == 1550) {
    $mtrx_nd_pool_used_ = $this + 84 | 0;
    HEAP16[$mtrx_nd_pool_used_ >> 1] = (HEAP16[$mtrx_nd_pool_used_ >> 1] | 0) + (HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) + 4 >> 1] | 0) & 65535;
    if ((HEAP8[$this + 728 | 0] & 1) != 0) {
     $retval_0 = 1;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
    $retval_0 = $spl_matched_0_off0_lcssa | (HEAP16[(HEAP32[$matrix_ >> 2] | 0) + ((HEAP32[$pys_decoded_len_ >> 2] | 0) * 12 | 0) + 4 >> 1] | 0) != 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 1544) {
    ___assert_func(1184, 1106, 7056, 3056);
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12MatrixSearch10extend_dmiEPNS_11DictExtParaEPNS_13DictMatchInfoE($this, $dep, $dmi_s) {
   $this = $this | 0;
   $dep = $dep | 0;
   $dmi_s = $dmi_s | 0;
   var $lpi_num = 0, $handles = 0, $dmi_pool_used_ = 0, $call4 = 0, $splids_extended = 0, $3 = 0, $4 = 0, $cached_0_off0 = 0, $lpi_total_ = 0, $from_h_sroa_1_0 = 0, $from_h_sroa_0_0 = 0, $arrayidx23 = 0, $arrayidx24 = 0, $cmp28 = 0, $8 = 0, $call31 = 0, $12 = 0, $15 = 0, $call55 = 0, $20 = 0, $21 = 0, $add_ptr79 = 0, $tobool83 = 0, $conv84 = 0, $add91 = 0, $tobool94 = 0, $add100 = 0, $cond107_off0 = 0, $ret_val_0 = 0, $38 = 0, $arraydecay118 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $lpi_num = sp | 0;
   $handles = sp + 8 | 0;
   $dmi_pool_used_ = $this + 92 | 0;
   if ((HEAPU16[$dmi_pool_used_ >> 1] | 0) > 799) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ((HEAP8[$this + 728 | 0] & 1) != 0) {
    $retval_0 = __ZN10ime_pinyin12MatrixSearch12extend_dmi_cEPNS_11DictExtParaEPNS_13DictMatchInfoE($this, $dep, $dmi_s) | 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call4 = __ZN10ime_pinyin8LpiCache12get_instanceEv() | 0;
   $splids_extended = $dep + 80 | 0;
   $3 = HEAP16[$splids_extended >> 1] | 0;
   $4 = HEAP16[$dep + (($3 & 65535) << 1) >> 1] | 0;
   if ($3 << 16 >> 16 == 0) {
    $cached_0_off0 = __ZN10ime_pinyin8LpiCache9is_cachedEt($call4, $4) | 0;
   } else {
    $cached_0_off0 = 0;
   }
   $lpi_total_ = $this + 12500 | 0;
   HEAP32[$lpi_total_ >> 2] = 0;
   if ((HEAP16[$splids_extended >> 1] | 0) == 0) {
    $from_h_sroa_0_0 = 0;
    $from_h_sroa_1_0 = 0;
   } else {
    $from_h_sroa_0_0 = HEAP16[$dmi_s >> 1] | 0;
    $from_h_sroa_1_0 = HEAP16[$dmi_s + 2 >> 1] | 0;
   }
   HEAP32[$lpi_num >> 2] = 0;
   $arrayidx23 = $handles + 2 | 0;
   HEAP16[$arrayidx23 >> 1] = 0;
   $arrayidx24 = $handles | 0;
   HEAP16[$arrayidx24 >> 1] = 0;
   $cmp28 = ($dmi_s | 0) == 0;
   do {
    if ($from_h_sroa_0_0 << 16 >> 16 != 0 | $cmp28) {
     $8 = HEAP32[$this + 12 >> 2] | 0;
     $call31 = FUNCTION_TABLE_iiiiiii[HEAP32[(HEAP32[$8 >> 2] | 0) + 24 >> 2] & 15]($8, $from_h_sroa_0_0, $dep, $this + 900 | 0, 1450, $lpi_num) | 0;
     HEAP16[$arrayidx24 >> 1] = $call31;
     if ($call31 << 16 >> 16 == 0) {
      break;
     }
     HEAP32[$lpi_total_ >> 2] = HEAP32[$lpi_num >> 2];
    }
   } while (0);
   $12 = HEAP32[$this + 16 >> 2] | 0;
   do {
    if (($12 | 0) != 0) {
     if (!($from_h_sroa_1_0 << 16 >> 16 != 0 | $cmp28)) {
      break;
     }
     $15 = HEAP32[$lpi_total_ >> 2] | 0;
     $call55 = FUNCTION_TABLE_iiiiiii[HEAP32[(HEAP32[$12 >> 2] | 0) + 24 >> 2] & 15]($12, $from_h_sroa_1_0, $dep, $this + 900 + ($15 << 3) | 0, 1450 - $15 | 0, $lpi_num) | 0;
     HEAP16[$arrayidx23 >> 1] = $call55;
     if ($call55 << 16 >> 16 == 0) {
      break;
     }
     HEAP32[$lpi_total_ >> 2] = (HEAP32[$lpi_total_ >> 2] | 0) + (HEAP32[$lpi_num >> 2] | 0);
    }
   } while (0);
   if ((HEAP16[$arrayidx24 >> 1] | 0) == 0) {
    if ((HEAP16[$arrayidx23 >> 1] | 0) == 0) {
     $ret_val_0 = 0;
    } else {
     label = 1571;
    }
   } else {
    label = 1571;
   }
   do {
    if ((label | 0) == 1571) {
     $20 = HEAP16[$dmi_pool_used_ >> 1] | 0;
     if (($20 & 65535) > 799) {
      $retval_0 = 0;
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     $21 = HEAP32[$this + 88 >> 2] | 0;
     $add_ptr79 = $21 + (($20 & 65535) * 12 | 0) | 0;
     if ($cmp28) {
      $tobool83 = (HEAP8[$dep + 86 | 0] & 1) != 0;
      $conv84 = HEAP16[$dep + 82 >> 1] & 255;
      __ZN10ime_pinyin12MatrixSearch8fill_dmiEPNS_13DictMatchInfoEPtttthbhh(0, $add_ptr79, $arrayidx24, -1, $4, 0, 1, $tobool83, $conv84, (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0) & 1 ^ 1);
      $ret_val_0 = 1;
      break;
     }
     $add91 = (HEAP8[$dmi_s + 8 | 0] & 127) + 1 & 255;
     $tobool94 = (HEAP8[$dep + 86 | 0] & 1) != 0;
     $add100 = (HEAP16[$dep + 82 >> 1] & 255) + ((HEAPU8[$dmi_s + 9 | 0] | 0) >>> 1) & 255;
     if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0) {
      $cond107_off0 = 0;
     } else {
      $cond107_off0 = HEAP8[$dmi_s + 10 | 0] & 1;
     }
     __ZN10ime_pinyin12MatrixSearch8fill_dmiEPNS_13DictMatchInfoEPtttthbhh(0, $add_ptr79, $arrayidx24, (($dmi_s - $21 | 0) / 12 | 0) & 65535, $4, 0, $add91, $tobool94, $add100, $cond107_off0);
     $ret_val_0 = 1;
    }
   } while (0);
   if ($cached_0_off0) {
    if (!(__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0)) {
     ___assert_func(1184, 1545, 7376, 2520);
     return 0;
    }
    HEAP32[$lpi_total_ >> 2] = __ZN10ime_pinyin8LpiCache9get_cacheEtPNS_10LmaPsbItemEj($call4, $4, $this + 900 | 0, 1450) | 0;
    $retval_0 = $ret_val_0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $38 = HEAP32[$lpi_total_ >> 2] | 0;
   if (($38 | 0) == 0) {
    $retval_0 = $ret_val_0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $arraydecay118 = $this + 900 | 0;
   __ZN10ime_pinyin12MatrixSearch20QsortLmaPsbItemByPsbEPNS_10LmaPsbItemEj(0, $arraydecay118, $38);
   if (!$cmp28) {
    $retval_0 = $ret_val_0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (!(__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0)) {
    $retval_0 = $ret_val_0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP32[$lpi_total_ >> 2] = __ZN10ime_pinyin8LpiCache9put_cacheEtPNS_10LmaPsbItemEj($call4, $4, $arraydecay118, HEAP32[$lpi_total_ >> 2] | 0) | 0;
   $retval_0 = $ret_val_0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin7compareEPKvS1_($a, $b) {
   $a = $a | 0;
   $b = $b | 0;
   return (HEAP32[$a >> 2] | 0) - (HEAP32[$b >> 2] | 0) | 0;
  }
  function __ZN10ime_pinyin11comp_doubleEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0.0, $3 = 0.0, $retval_0 = 0;
   $1 = +HEAPF64[$p1 >> 3];
   $3 = +HEAPF64[$p2 >> 3];
   if ($1 < $3) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = $1 > $3 | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch9get_pystrEPj($this, $decoded_len) {
   $this = $this | 0;
   $decoded_len = $decoded_len | 0;
   var $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0 | ($decoded_len | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP32[$decoded_len >> 2] = HEAP32[$this + 72 >> 2];
   $retval_0 = $this + 32 | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch20QsortLmaPsbItemByPsbEPNS_10LmaPsbItemEj($this, $lma_buf, $num) {
   $this = $this | 0;
   $lma_buf = $lma_buf | 0;
   $num = $num | 0;
   var $0$0 = 0, $call = 0, $4 = 0, $pos_023 = 0, $6$0 = 0, $call3 = 0, $10 = 0, $11 = 0, $mul = 0, $index_021 = 0, $15 = 0, $16 = 0, $17$1 = 0;
   $0$0 = _llvm_umul_with_overflow_i32($num | 0, 4) | 0;
   $call = __Znaj(tempRet0 ? -1 : $0$0) | 0;
   $4 = $call;
   if (($num | 0) != 0) {
    $pos_023 = 0;
    do {
     HEAP32[$4 + ($pos_023 << 2) >> 2] = (HEAPU16[$lma_buf + ($pos_023 << 3) + 4 >> 1] | 0) << 15 | $pos_023;
     $pos_023 = $pos_023 + 1 | 0;
    } while ($pos_023 >>> 0 < $num >>> 0);
   }
   _qsort2($call | 0, $num | 0, 4, 36);
   $6$0 = _llvm_umul_with_overflow_i32($num | 0, 8) | 0;
   $call3 = __Znaj(tempRet0 ? -1 : $6$0) | 0;
   $10 = $call3;
   $11 = $lma_buf | 0;
   $mul = $num << 3;
   _memcpy($call3 | 0, $11 | 0, $mul) | 0;
   if (($num | 0) != 0) {
    $index_021 = 0;
    do {
     $15 = $10 + ((HEAP32[$4 + ($index_021 << 2) >> 2] & 32767) << 3) | 0;
     $16 = $lma_buf + ($index_021 << 3) | 0;
     $17$1 = HEAP32[$15 + 4 >> 2] | 0;
     HEAP32[$16 >> 2] = HEAP32[$15 >> 2];
     HEAP32[$16 + 4 >> 2] = $17$1;
     $index_021 = $index_021 + 1 | 0;
    } while ($index_021 >>> 0 < $num >>> 0);
   }
   if (($call | 0) != 0) {
    __ZdaPv($call);
   }
   if (($call3 | 0) == 0) {
    return;
   }
   __ZdaPv($call3);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch22QsortLmaPsbItemByHanziEPNS_10LmaPsbItemEj($this, $lma_buf, $num) {
   $this = $this | 0;
   $lma_buf = $lma_buf | 0;
   $num = $num | 0;
   var $0$0 = 0, $call = 0, $4 = 0, $pos_023 = 0, $6$0 = 0, $call3 = 0, $10 = 0, $11 = 0, $mul = 0, $index_021 = 0, $15 = 0, $16 = 0, $17$1 = 0;
   $0$0 = _llvm_umul_with_overflow_i32($num | 0, 4) | 0;
   $call = __Znaj(tempRet0 ? -1 : $0$0) | 0;
   $4 = $call;
   if (($num | 0) != 0) {
    $pos_023 = 0;
    do {
     HEAP32[$4 + ($pos_023 << 2) >> 2] = ((HEAPU16[$lma_buf + ($pos_023 << 3) + 6 >> 1] | 0) << 15) + $pos_023;
     $pos_023 = $pos_023 + 1 | 0;
    } while ($pos_023 >>> 0 < $num >>> 0);
   }
   _qsort2($call | 0, $num | 0, 4, 36);
   $6$0 = _llvm_umul_with_overflow_i32($num | 0, 8) | 0;
   $call3 = __Znaj(tempRet0 ? -1 : $6$0) | 0;
   $10 = $call3;
   $11 = $lma_buf | 0;
   $mul = $num << 3;
   _memcpy($call3 | 0, $11 | 0, $mul) | 0;
   if (($num | 0) != 0) {
    $index_021 = 0;
    do {
     $15 = $10 + ((HEAP32[$4 + ($index_021 << 2) >> 2] & 32767) << 3) | 0;
     $16 = $lma_buf + ($index_021 << 3) | 0;
     $17$1 = HEAP32[$15 + 4 >> 2] | 0;
     HEAP32[$16 >> 2] = HEAP32[$15 >> 2];
     HEAP32[$16 + 4 >> 2] = $17$1;
     $index_021 = $index_021 + 1 | 0;
    } while ($index_021 >>> 0 < $num >>> 0);
   }
   if (($call | 0) != 0) {
    __ZdaPv($call);
   }
   if (($call3 | 0) == 0) {
    return;
   }
   __ZdaPv($call3);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch13get_spl_startERPKt($this, $spl_start) {
   $this = $this | 0;
   $spl_start = $spl_start | 0;
   __ZN10ime_pinyin12MatrixSearch16get_spl_start_idEv($this);
   HEAP32[$spl_start >> 2] = $this + 736;
   return HEAP32[$this + 732 >> 2] | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch13inner_predictEPKttPA8_tj($this, $fixed_buf, $fixed_len, $predict_buf, $buf_len) {
   $this = $this | 0;
   $fixed_buf = $fixed_buf | 0;
   $fixed_len = $fixed_len | 0;
   $predict_buf = $predict_buf | 0;
   $buf_len = $buf_len | 0;
   var $npre_items_ = 0, $npre_items_len_ = 0, $conv = 0, $cmp4 = 0, $dict_trie_24 = 0, $user_dict_ = 0, $dict_trie_ = 0, $dict_trie_17 = 0, $len_051 = 0, $res_total_050 = 0, $sub = 0, $nlen_0 = 0, $nearest_n_word_0_off0 = 0, $res_total_1 = 0, $sub23 = 0, $8 = 0, $add_ptr28 = 0, $conv29 = 0, $call32 = 0, $12 = 0, $add_ptr44_sum = 0, $res_this_0 = 0, $add51 = 0, $dec = 0, $res_total_0_lcssa = 0, $call55 = 0, $buf_len_call55 = 0, $i_048 = 0;
   $npre_items_ = $this + 104 | 0;
   $npre_items_len_ = $this + 108 | 0;
   _memset(HEAP32[$npre_items_ >> 2] | 0, 0, (HEAP32[$npre_items_len_ >> 2] | 0) * 20 | 0 | 0);
   $conv = $fixed_len & 65535;
   if ($fixed_len << 16 >> 16 == 0) {
    $res_total_0_lcssa = 0;
   } else {
    $cmp4 = ($fixed_len & 65535) > 1;
    $dict_trie_24 = $this + 12 | 0;
    $user_dict_ = $this + 16 | 0;
    $dict_trie_ = $this + 12 | 0;
    $dict_trie_17 = $this + 12 | 0;
    $res_total_050 = 0;
    $len_051 = $conv;
    while (1) {
     $sub = (HEAP32[$npre_items_len_ >> 2] | 0) - $res_total_050 | 0;
     if ($cmp4 & ($len_051 | 0) == 1 & ($res_total_050 | 0) == 0) {
      $nlen_0 = 2;
      while (1) {
       if ($nlen_0 >>> 0 > $conv >>> 0) {
        $nearest_n_word_0_off0 = 0;
        break;
       }
       if ((__ZN10ime_pinyin8DictTrie12get_lemma_idEPKtt(HEAP32[$dict_trie_ >> 2] | 0, $fixed_buf + ($conv - $nlen_0 << 1) | 0, $nlen_0 & 65535) | 0) == 0) {
        $nlen_0 = $nlen_0 + 1 | 0;
       } else {
        $nearest_n_word_0_off0 = $len_051;
        break;
       }
      }
      $res_total_1 = (__ZN10ime_pinyin8DictTrie16predict_top_lmasEjPNS_12NPredictItemEjj(HEAP32[$dict_trie_17 >> 2] | 0, $nearest_n_word_0_off0, (HEAP32[$npre_items_ >> 2] | 0) + ($res_total_050 * 20 | 0) | 0, $sub, $res_total_050) | 0) + $res_total_050 | 0;
     } else {
      $res_total_1 = $res_total_050;
     }
     $sub23 = (HEAP32[$npre_items_len_ >> 2] | 0) - $res_total_1 | 0;
     $8 = HEAP32[$dict_trie_24 >> 2] | 0;
     $add_ptr28 = $fixed_buf + ($conv - $len_051 << 1) | 0;
     $conv29 = $len_051 & 65535;
     $call32 = FUNCTION_TABLE_iiiiiii[HEAP32[(HEAP32[$8 >> 2] | 0) + 40 >> 2] & 15]($8, $add_ptr28, $conv29, (HEAP32[$npre_items_ >> 2] | 0) + ($res_total_1 * 20 | 0) | 0, $sub23, $res_total_1) | 0;
     $12 = HEAP32[$user_dict_ >> 2] | 0;
     if (($12 | 0) == 0) {
      $res_this_0 = $call32;
     } else {
      $add_ptr44_sum = $call32 + $res_total_1 | 0;
      $res_this_0 = (FUNCTION_TABLE_iiiiiii[HEAP32[(HEAP32[$12 >> 2] | 0) + 40 >> 2] & 15]($12, $add_ptr28, $conv29, (HEAP32[$npre_items_ >> 2] | 0) + ($add_ptr44_sum * 20 | 0) | 0, $sub23 - $call32 | 0, $add_ptr44_sum) | 0) + $call32 | 0;
     }
     $add51 = $res_this_0 + $res_total_1 | 0;
     $dec = $len_051 - 1 | 0;
     if (($dec | 0) == 0) {
      $res_total_0_lcssa = $add51;
      break;
     } else {
      $res_total_050 = $add51;
      $len_051 = $dec;
     }
    }
   }
   $call55 = __ZN10ime_pinyin21remove_duplicate_npreEPNS_12NPredictItemEj(HEAP32[$npre_items_ >> 2] | 0, $res_total_0_lcssa) | 0;
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E(HEAP32[$npre_items_ >> 2] | 0, $call55, 20, 4);
   $buf_len_call55 = $call55 >>> 0 > $buf_len >>> 0 ? $buf_len : $call55;
   if (($buf_len_call55 | 0) == 0) {
    return $buf_len_call55 | 0;
   } else {
    $i_048 = 0;
   }
   do {
    _utf16_strncpy($predict_buf + ($i_048 << 4) | 0, (HEAP32[$npre_items_ >> 2] | 0) + ($i_048 * 20 | 0) + 4 | 0, 7) | 0;
    HEAP16[$predict_buf + ($i_048 << 4) + 14 >> 1] = 0;
    $i_048 = $i_048 + 1 | 0;
   } while ($i_048 >>> 0 < $buf_len_call55 >>> 0);
   return $buf_len_call55 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch12get_predictsEPKtPA8_tj($this, $fixed_buf, $predict_buf, $buf_len) {
   $this = $this | 0;
   $fixed_buf = $fixed_buf | 0;
   $predict_buf = $predict_buf | 0;
   $buf_len = $buf_len | 0;
   var $call = 0, $retval_0 = 0;
   $call = _utf16_strlen($fixed_buf) | 0;
   if (($call | 0) == 0 | $call >>> 0 > 7 | ($buf_len | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12MatrixSearch13inner_predictEPKttPA8_tj($this, $fixed_buf, $call & 65535, $predict_buf, $buf_len) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin15qsearch_nearestEPddii($code_book, $freq, $start, $end) {
   $code_book = $code_book | 0;
   $freq = +$freq;
   $start = $start | 0;
   $end = $end | 0;
   var $end_tr23 = 0, $start_tr22 = 0, $call = 0.0, $div = 0, $cmp11 = 0, $start_tr_div = 0, $div_end_tr = 0, $retval_0 = 0, label = 0;
   if (($start | 0) == ($end | 0)) {
    $retval_0 = $start;
    return $retval_0 | 0;
   } else {
    $start_tr22 = $start;
    $end_tr23 = $end;
   }
   while (1) {
    if (($start_tr22 + 1 | 0) == ($end_tr23 | 0)) {
     break;
    }
    $div = ($end_tr23 + $start_tr22 | 0) / 2 | 0;
    $cmp11 = +HEAPF64[$code_book + ($div << 3) >> 3] > $freq;
    $start_tr_div = $cmp11 ? $start_tr22 : $div;
    $div_end_tr = $cmp11 ? $div : $end_tr23;
    if (($start_tr_div | 0) == ($div_end_tr | 0)) {
     $retval_0 = $start_tr_div;
     label = 1654;
     break;
    } else {
     $start_tr22 = $start_tr_div;
     $end_tr23 = $div_end_tr;
    }
   }
   if ((label | 0) == 1654) {
    return $retval_0 | 0;
   }
   $call = +__ZN10ime_pinyin8distanceEdd($freq, +HEAPF64[$code_book + ($end_tr23 << 3) >> 3]);
   $retval_0 = $call > +__ZN10ime_pinyin8distanceEdd($freq, +HEAPF64[$code_book + ($start_tr22 << 3) >> 3]) ? $start_tr22 : $end_tr23;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8distanceEdd($freq, $code) {
   $freq = +$freq;
   $code = +$code;
   var $call = 0.0;
   $call = +Math_log(+$freq);
   return +(+Math_abs(+($call - +Math_log(+$code))) * $freq);
  }
  function __ZN10ime_pinyin15update_code_idxEPdjS0_Ph($freqs, $num, $code_book, $code_idx) {
   $freqs = $freqs | 0;
   $num = $num | 0;
   $code_book = $code_book | 0;
   $code_idx = $code_idx | 0;
   var $changed_010 = 0, $pos_09 = 0, $conv = 0, $arrayidx2 = 0, $changed_0_inc = 0, $inc6 = 0, $changed_0_lcssa = 0;
   if (($num | 0) == 0) {
    $changed_0_lcssa = 0;
    return $changed_0_lcssa | 0;
   } else {
    $pos_09 = 0;
    $changed_010 = 0;
   }
   while (1) {
    $conv = (__ZN10ime_pinyin15qsearch_nearestEPddii($code_book, +HEAPF64[$freqs + ($pos_09 << 3) >> 3], 0, 255) | 0) & 255;
    $arrayidx2 = $code_idx + $pos_09 | 0;
    $changed_0_inc = ((HEAP8[$arrayidx2] | 0) != $conv << 24 >> 24) + $changed_010 | 0;
    HEAP8[$arrayidx2] = $conv;
    $inc6 = $pos_09 + 1 | 0;
    if ($inc6 >>> 0 < $num >>> 0) {
     $pos_09 = $inc6;
     $changed_010 = $changed_0_inc;
    } else {
     $changed_0_lcssa = $changed_0_inc;
     break;
    }
   }
   return $changed_0_lcssa | 0;
  }
  function __ZN10ime_pinyin13iterate_codesEPdjS0_Ph($freqs, $num, $code_book, $code_idx) {
   $freqs = $freqs | 0;
   $num = $num | 0;
   $code_book = $code_book | 0;
   $code_idx = $code_idx | 0;
   var $delta_last_0 = 0.0, $iter_num_0 = 0, $call1 = 0.0, $call3 = 0.0, label = 0;
   $iter_num_0 = 1;
   $delta_last_0 = 0.0;
   while (1) {
    __ZN10ime_pinyin15update_code_idxEPdjS0_Ph($freqs, $num, $code_book, $code_idx) | 0;
    $call1 = +__ZN10ime_pinyin18recalculate_kernelEPdjS0_Ph($freqs, $num, $code_book, $code_idx);
    if ($iter_num_0 >>> 0 > 1) {
     if ($call1 == 0.0) {
      label = 1668;
      break;
     }
     $call3 = +Math_abs(+($delta_last_0 - $call1));
     if ($call3 / +Math_abs(+$call1) < 1.0e-9) {
      label = 1667;
      break;
     }
    }
    $iter_num_0 = $iter_num_0 + 1 | 0;
    $delta_last_0 = $call1;
   }
   if ((label | 0) == 1668) {
    return;
   } else if ((label | 0) == 1667) {
    return;
   }
  }
  function __ZN10ime_pinyin5NGramC2Ev($this) {
   $this = $this | 0;
   HEAP8[$this | 0] = 0;
   HEAP32[$this + 4 >> 2] = 0;
   _memset($this + 12 | 0, 0, 16);
   return;
  }
  function __ZN10ime_pinyin12MatrixSearch8get_lpisEPKtjPNS_10LmaPsbItemEjS2_b($this, $splid_str, $splid_str_len, $lma_buf, $max_lma_buf, $pfullsent, $sort_by_psb) {
   $this = $this | 0;
   $splid_str = $splid_str | 0;
   $splid_str_len = $splid_str_len | 0;
   $lma_buf = $lma_buf | 0;
   $max_lma_buf = $max_lma_buf | 0;
   $pfullsent = $pfullsent | 0;
   $sort_by_psb = $sort_by_psb | 0;
   var $hanzis = 0, $0 = 0, $conv = 0, $call = 0, $3 = 0, $num2_0 = 0, $add = 0, $arraydecay83 = 0, $add_ptr15 = 0, $6 = 0, $div = 0, $div_add = 0, $pos_0105 = 0, $arrayidx22 = 0, $8 = 0, $9 = 0, $10$1 = 0, $cmp61 = 0, $pos26_0102 = 0, $remain_num_0101 = 0, $sub34 = 0, $18 = 0, $19 = 0, $20$1 = 0, $23 = 0, $24 = 0, $25$1 = 0, $remain_num_1 = 0, $inc75 = 0, $pos77_0115 = 0, $cmp149 = 0, $arrayidx151 = 0, $cmp106 = 0, $arrayidx108 = 0, $pos91_0111 = 0, $remain_num90_0110 = 0, $hanzi98 = 0, $29 = 0, $sub100 = 0, $sub133 = 0, $39 = 0, $40 = 0, $41$1 = 0, $47 = 0, $48 = 0, $49$1 = 0, $remain_num90_1 = 0, $inc167 = 0, $num_1 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $hanzis = sp | 0;
   if ($splid_str_len >>> 0 > 8) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $0 = HEAP32[$this + 12 >> 2] | 0;
   $conv = $splid_str_len & 65535;
   $call = FUNCTION_TABLE_iiiiii[HEAP32[(HEAP32[$0 >> 2] | 0) + 28 >> 2] & 15]($0, $splid_str, $conv, $lma_buf, $max_lma_buf) | 0;
   $3 = HEAP32[$this + 16 >> 2] | 0;
   if (($3 | 0) == 0) {
    $num2_0 = 0;
   } else {
    $num2_0 = FUNCTION_TABLE_iiiiii[HEAP32[(HEAP32[$3 >> 2] | 0) + 28 >> 2] & 15]($3, $splid_str, $conv, $lma_buf + ($call << 3) | 0, $max_lma_buf - $call | 0) | 0;
   }
   $add = $num2_0 + $call | 0;
   if (($add | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   L2134 : do {
    if ($splid_str_len >>> 0 > 1) {
     $add_ptr15 = $lma_buf + ($add << 3) | 0;
     $6 = $add_ptr15;
     $div = ($max_lma_buf - $add << 3 >>> 0) / 28 | 0;
     if ($div >>> 0 <= $add >>> 0) {
      ___assert_func(1184, 1760, 6648, 2304);
      return 0;
     }
     $div_add = $add >>> 0 > $div >>> 0 ? $div : $add;
     if (($div_add | 0) == 0) {
      __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($add_ptr15 | 0, $div_add, 28, 26);
      $num_1 = 0;
      break;
     } else {
      $pos_0105 = 0;
     }
     do {
      $arrayidx22 = $lma_buf + ($pos_0105 << 3) | 0;
      $8 = $arrayidx22;
      $9 = $6 + ($pos_0105 * 28 | 0) | 0;
      $10$1 = HEAP32[$8 + 4 >> 2] | 0;
      HEAP32[$9 >> 2] = HEAP32[$8 >> 2];
      HEAP32[$9 + 4 >> 2] = $10$1;
      __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, HEAP32[$arrayidx22 >> 2] & 16777215, $6 + ($pos_0105 * 28 | 0) + 8 | 0, 9) | 0;
      $pos_0105 = $pos_0105 + 1 | 0;
     } while ($pos_0105 >>> 0 < $div_add >>> 0);
     __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($add_ptr15 | 0, $div_add, 28, 26);
     if (($div_add | 0) == 0) {
      $num_1 = 0;
      break;
     }
     $cmp61 = ($pfullsent | 0) == 0;
     $remain_num_0101 = 0;
     $pos26_0102 = 0;
     L2145 : while (1) {
      do {
       if (($pos26_0102 | 0) == 0) {
        label = 1691;
       } else {
        $sub34 = $pos26_0102 - 1 | 0;
        if ((_utf16_strcmp($6 + ($pos26_0102 * 28 | 0) + 8 | 0, $6 + ($sub34 * 28 | 0) + 8 | 0) | 0) != 0) {
         label = 1691;
         break;
        }
        if ((HEAPU16[$6 + ($pos26_0102 * 28 | 0) + 4 >> 1] | 0) >= (HEAPU16[$6 + ($sub34 * 28 | 0) + 4 >> 1] | 0)) {
         $remain_num_1 = $remain_num_0101;
         break;
        }
        if (($remain_num_0101 | 0) == 0) {
         break L2145;
        }
        $18 = $6 + ($pos26_0102 * 28 | 0) | 0;
        $19 = $lma_buf + ($remain_num_0101 - 1 << 3) | 0;
        $20$1 = HEAP32[$18 + 4 >> 2] | 0;
        HEAP32[$19 >> 2] = HEAP32[$18 >> 2];
        HEAP32[$19 + 4 >> 2] = $20$1;
        $remain_num_1 = $remain_num_0101;
       }
      } while (0);
      do {
       if ((label | 0) == 1691) {
        label = 0;
        if (!$cmp61) {
         if ((_utf16_strcmp($6 + ($pos26_0102 * 28 | 0) + 8 | 0, $pfullsent) | 0) == 0) {
          $remain_num_1 = $remain_num_0101;
          break;
         }
        }
        $23 = $6 + ($pos26_0102 * 28 | 0) | 0;
        $24 = $lma_buf + ($remain_num_0101 << 3) | 0;
        $25$1 = HEAP32[$23 + 4 >> 2] | 0;
        HEAP32[$24 >> 2] = HEAP32[$23 >> 2];
        HEAP32[$24 + 4 >> 2] = $25$1;
        $remain_num_1 = $remain_num_0101 + 1 | 0;
       }
      } while (0);
      $inc75 = $pos26_0102 + 1 | 0;
      if ($inc75 >>> 0 < $div_add >>> 0) {
       $remain_num_0101 = $remain_num_1;
       $pos26_0102 = $inc75;
      } else {
       $num_1 = $remain_num_1;
       break L2134;
      }
     }
     ___assert_func(1184, 1775, 6648, 2248);
     return 0;
    } else {
     if (($add | 0) == 0) {
      __ZN10ime_pinyin12MatrixSearch22QsortLmaPsbItemByHanziEPNS_10LmaPsbItemEj(0, $lma_buf, $add);
      $num_1 = 0;
      break;
     }
     $arraydecay83 = $hanzis | 0;
     $pos77_0115 = 0;
     do {
      __ZN10ime_pinyin12MatrixSearch13get_lemma_strEjPtt($this, HEAP32[$lma_buf + ($pos77_0115 << 3) >> 2] & 16777215, $arraydecay83, 2) | 0;
      HEAP16[$lma_buf + ($pos77_0115 << 3) + 6 >> 1] = HEAP16[$arraydecay83 >> 1] | 0;
      $pos77_0115 = $pos77_0115 + 1 | 0;
     } while ($pos77_0115 >>> 0 < $add >>> 0);
     __ZN10ime_pinyin12MatrixSearch22QsortLmaPsbItemByHanziEPNS_10LmaPsbItemEj(0, $lma_buf, $add);
     if (($add | 0) == 0) {
      $num_1 = 0;
      break;
     }
     $cmp149 = ($pfullsent | 0) == 0;
     $arrayidx151 = $pfullsent + 2 | 0;
     $cmp106 = ($pfullsent | 0) == 0;
     $arrayidx108 = $pfullsent + 2 | 0;
     $remain_num90_0110 = 0;
     $pos91_0111 = 0;
     L2167 : while (1) {
      L2169 : do {
       if (($pos91_0111 | 0) == 0) {
        label = 1709;
       } else {
        $hanzi98 = $lma_buf + ($pos91_0111 << 3) + 6 | 0;
        $29 = HEAP16[$hanzi98 >> 1] | 0;
        $sub100 = $pos91_0111 - 1 | 0;
        if ($29 << 16 >> 16 != (HEAP16[$lma_buf + ($sub100 << 3) + 6 >> 1] | 0)) {
         label = 1709;
         break;
        }
        do {
         if (!$cmp106) {
          if ((HEAP16[$arrayidx108 >> 1] | 0) != 0) {
           break;
          }
          if ($29 << 16 >> 16 == (HEAP16[$pfullsent >> 1] | 0)) {
           $remain_num90_1 = $remain_num90_0110;
           break L2169;
          }
         }
        } while (0);
        if ((HEAPU16[$lma_buf + ($pos91_0111 << 3) + 4 >> 1] | 0) >= (HEAPU16[$lma_buf + ($sub100 << 3) + 4 >> 1] | 0)) {
         $remain_num90_1 = $remain_num90_0110;
         break;
        }
        if (($remain_num90_0110 | 0) == 0) {
         label = 1705;
         break L2167;
        }
        $sub133 = $remain_num90_0110 - 1 | 0;
        if ((HEAP16[$lma_buf + ($sub133 << 3) + 6 >> 1] | 0) != (HEAP16[$hanzi98 >> 1] | 0)) {
         label = 1707;
         break L2167;
        }
        $39 = $lma_buf + ($pos91_0111 << 3) | 0;
        $40 = $lma_buf + ($sub133 << 3) | 0;
        $41$1 = HEAP32[$39 + 4 >> 2] | 0;
        HEAP32[$40 >> 2] = HEAP32[$39 >> 2];
        HEAP32[$40 + 4 >> 2] = $41$1;
        $remain_num90_1 = $remain_num90_0110;
       }
      } while (0);
      L2179 : do {
       if ((label | 0) == 1709) {
        label = 0;
        do {
         if (!$cmp149) {
          if ((HEAP16[$arrayidx151 >> 1] | 0) != 0) {
           break;
          }
          if ((HEAP16[$lma_buf + ($pos91_0111 << 3) + 6 >> 1] | 0) == (HEAP16[$pfullsent >> 1] | 0)) {
           $remain_num90_1 = $remain_num90_0110;
           break L2179;
          }
         }
        } while (0);
        $47 = $lma_buf + ($pos91_0111 << 3) | 0;
        $48 = $lma_buf + ($remain_num90_0110 << 3) | 0;
        $49$1 = HEAP32[$47 + 4 >> 2] | 0;
        HEAP32[$48 >> 2] = HEAP32[$47 >> 2];
        HEAP32[$48 + 4 >> 2] = $49$1;
        $remain_num90_1 = $remain_num90_0110 + 1 | 0;
       }
      } while (0);
      $inc167 = $pos91_0111 + 1 | 0;
      if ($inc167 >>> 0 < $add >>> 0) {
       $remain_num90_0110 = $remain_num90_1;
       $pos91_0111 = $inc167;
      } else {
       $num_1 = $remain_num90_1;
       break L2134;
      }
     }
     if ((label | 0) == 1705) {
      ___assert_func(1184, 1811, 6648, 2248);
      return 0;
     } else if ((label | 0) == 1707) {
      ___assert_func(1184, 1812, 6648, 2144);
      return 0;
     }
    }
   } while (0);
   if (!$sort_by_psb) {
    $retval_0 = $num_1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin12MatrixSearch20QsortLmaPsbItemByPsbEPNS_10LmaPsbItemEj(0, $lma_buf, $num_1);
   $retval_0 = $num_1;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12MatrixSearch12extend_dmi_cEPNS_11DictExtParaEPNS_13DictMatchInfoE($this, $dep, $dmi_s) {
   $this = $this | 0;
   $dep = $dep | 0;
   $dmi_s = $dmi_s | 0;
   var $lpi_total_ = 0, $2 = 0, $conv = 0, $length = 0, $4 = 0, $6 = 0, $add_ptr = 0, $arraydecay = 0, $tobool13 = 0, $conv14 = 0, $add = 0, $tobool22 = 0, $add28 = 0, $cond38_off0 = 0, $25 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $lpi_total_ = $this + 12500 | 0;
   HEAP32[$lpi_total_ >> 2] = 0;
   if ((HEAP8[$this + 728 | 0] & 1) == 0) {
    ___assert_func(1184, 1556, 7296, 2440);
    return 0;
   }
   $2 = HEAP16[$dep + 80 >> 1] | 0;
   $conv = $2 & 65535;
   $length = $this + 724 | 0;
   if (($2 & 65535) >= (HEAPU16[$length >> 1] | 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $4 = HEAP16[$dep + ($conv << 1) >> 1] | 0;
   if ($4 << 16 >> 16 != (HEAP16[$this + 400 + ($conv << 1) >> 1] | 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $6 = HEAP32[$this + 88 >> 2] | 0;
   $add_ptr = $6 + ((HEAPU16[$this + 92 >> 1] | 0) * 12 | 0) | 0;
   $arraydecay = sp | 0;
   if (($dmi_s | 0) == 0) {
    $tobool13 = (HEAP8[$dep + 86 | 0] & 1) != 0;
    $conv14 = HEAP16[$dep + 82 >> 1] & 255;
    __ZN10ime_pinyin12MatrixSearch8fill_dmiEPNS_13DictMatchInfoEPtttthbhh(0, $add_ptr, $arraydecay, -1, $4, 0, 1, $tobool13, $conv14, (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0) & 1 ^ 1);
   } else {
    $add = (HEAP8[$dmi_s + 8 | 0] & 127) + 1 & 255;
    $tobool22 = (HEAP8[$dep + 86 | 0] & 1) != 0;
    $add28 = (HEAP16[$dep + 82 >> 1] & 255) + ((HEAPU8[$dmi_s + 9 | 0] | 0) >>> 1) & 255;
    if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt(HEAP32[$this + 4 >> 2] | 0, $4) | 0) {
     $cond38_off0 = 0;
    } else {
     $cond38_off0 = HEAP8[$dmi_s + 10 | 0] & 1;
    }
    __ZN10ime_pinyin12MatrixSearch8fill_dmiEPNS_13DictMatchInfoEPtttthbhh(0, $add_ptr, $arraydecay, (($dmi_s - $6 | 0) / 12 | 0) & 65535, $4, 0, $add, $tobool22, $add28, $cond38_off0);
   }
   if (($conv | 0) != ((HEAPU16[$length >> 1] | 0) - 1 | 0)) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $25 = $this + 900 | 0;
   HEAP32[$25 >> 2] = HEAP32[$25 >> 2] | 16777215;
   HEAP16[$this + 904 >> 1] = 0;
   HEAP32[$lpi_total_ >> 2] = 1;
   $retval_0 = 1;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin18recalculate_kernelEPdjS0_Ph($freqs, $num, $code_book, $code_idx) {
   $freqs = $freqs | 0;
   $num = $num | 0;
   $code_book = $code_book | 0;
   $code_idx = $code_idx | 0;
   var $call = 0, $0 = 0, $tobool = 0, $call1 = 0, $1 = 0, $tobool2 = 0, $ret_0_lcssa = 0.0, $pos_029 = 0, $ret_028 = 0.0, $2 = 0.0, $arrayidx6 = 0, $idxprom = 0, $add = 0.0, $arrayidx12 = 0, $arrayidx16 = 0, $inc = 0, $code_026 = 0, $8 = 0, label = 0;
   $call = __Znaj(1024) | 0;
   $0 = $call;
   $tobool = ($call | 0) == 0;
   if ($tobool) {
    ___assert_func(4024, 79, 6240, 4232);
    return 0.0;
   }
   _memset($call | 0, 0, 1024);
   $call1 = __Znaj(2048) | 0;
   $1 = $call1;
   $tobool2 = ($call1 | 0) == 0;
   if ($tobool2) {
    ___assert_func(4024, 83, 6240, 2920);
    return 0.0;
   }
   _memset($call1 | 0, 0, 2048);
   if (($num | 0) == 0) {
    $ret_0_lcssa = 0.0;
   } else {
    $ret_028 = 0.0;
    $pos_029 = 0;
    while (1) {
     $2 = +HEAPF64[$freqs + ($pos_029 << 3) >> 3];
     $arrayidx6 = $code_idx + $pos_029 | 0;
     $idxprom = HEAPU8[$arrayidx6] | 0;
     $add = $ret_028 + +__ZN10ime_pinyin8distanceEdd($2, +HEAPF64[$code_book + ($idxprom << 3) >> 3]);
     $arrayidx12 = $1 + ($idxprom << 3) | 0;
     HEAPF64[$arrayidx12 >> 3] = $2 + +HEAPF64[$arrayidx12 >> 3];
     $arrayidx16 = $0 + ((HEAPU8[$arrayidx6] | 0) << 2) | 0;
     HEAP32[$arrayidx16 >> 2] = (HEAP32[$arrayidx16 >> 2] | 0) + 1;
     $inc = $pos_029 + 1 | 0;
     if ($inc >>> 0 < $num >>> 0) {
      $ret_028 = $add;
      $pos_029 = $inc;
     } else {
      $ret_0_lcssa = $add;
      break;
     }
    }
   }
   $code_026 = 0;
   do {
    $8 = HEAP32[$0 + ($code_026 << 2) >> 2] | 0;
    if (($8 | 0) == 0) {
     label = 1745;
     break;
    }
    HEAPF64[$code_book + ($code_026 << 3) >> 3] = +HEAPF64[$1 + ($code_026 << 3) >> 3] / +($8 >>> 0 >>> 0);
    $code_026 = $code_026 + 1 | 0;
   } while ($code_026 >>> 0 < 256);
   if ((label | 0) == 1745) {
    ___assert_func(4024, 94, 6240, 2008);
    return 0.0;
   }
   if (!$tobool) {
    __ZdaPv($call);
   }
   if ($tobool2) {
    return +$ret_0_lcssa;
   }
   __ZdaPv($call1);
   return +$ret_0_lcssa;
  }
  function __ZN10ime_pinyin15is_system_lemmaEj($lma_id) {
   $lma_id = $lma_id | 0;
   return $lma_id >>> 0 < 500001 & ($lma_id | 0) != 0 | 0;
  }
  function __ZN10ime_pinyin13is_user_lemmaEj($lma_id) {
   $lma_id = $lma_id | 0;
   return ($lma_id - 500001 | 0) >>> 0 < 1e5 | 0;
  }
  function __ZN10ime_pinyin18is_composing_lemmaEj($lma_id) {
   $lma_id = $lma_id | 0;
   return ($lma_id | 0) == 16777215 | 0;
  }
  function __ZN10ime_pinyin15align_to_size_tEj($size) {
   $size = $size | 0;
   return $size + 3 & -4 | 0;
  }
  function __ZN10ime_pinyin15cmp_lpi_with_idEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $bf_clear = 0, $bf_clear1 = 0, $retval_0 = 0;
   $bf_clear = HEAP32[$p1 >> 2] & 16777215;
   $bf_clear1 = HEAP32[$p2 >> 2] & 16777215;
   if ($bf_clear >>> 0 < $bf_clear1 >>> 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = $bf_clear >>> 0 > $bf_clear1 >>> 0 | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_1EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $retval_0 = 0;
   $1 = HEAP16[$p1 >> 1] | 0;
   $3 = HEAP16[$p2 >> 1] | 0;
   if (($1 & 65535) < ($3 & 65535)) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = ($1 & 65535) > ($3 & 65535) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin17cmp_npre_by_scoreEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $0 = 0.0, $1 = 0.0, $retval_0 = 0;
   $0 = +HEAPF32[$p1 >> 2];
   $1 = +HEAPF32[$p2 >> 2];
   if ($0 > $1) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $retval_0 = ($0 < $1) << 31 >> 31;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin5NGram11get_uni_psbEj($this, $lma_id) {
   $this = $this | 0;
   $lma_id = $lma_id | 0;
   return +(+((HEAPU16[(HEAP32[$this + 20 >> 2] | 0) + ((HEAPU8[(HEAP32[$this + 24 >> 2] | 0) + $lma_id | 0] | 0) << 1) >> 1] | 0) >>> 0) + +HEAPF32[$this + 12 >> 2]);
  }
  function __ZN10ime_pinyin16cmp_lpi_with_psbEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $retval_0 = 0;
   $1 = HEAP16[$p1 + 4 >> 1] | 0;
   $3 = HEAP16[$p2 + 4 >> 1] | 0;
   if (($1 & 65535) > ($3 & 65535)) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $retval_0 = (($1 & 65535) < ($3 & 65535)) << 31 >> 31;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin24cmp_lpi_with_unified_psbEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $mul = 0, $mul4 = 0, $retval_0 = 0;
   $mul = Math_imul((HEAP32[$p2 >> 2] | 0) >>> 24 & 15, HEAPU16[$p1 + 4 >> 1] | 0) | 0;
   $mul4 = Math_imul((HEAP32[$p1 >> 2] | 0) >>> 24 & 15, HEAPU16[$p2 + 4 >> 1] | 0) | 0;
   if ($mul >>> 0 < $mul4 >>> 0) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = $mul >>> 0 > $mul4 >>> 0 | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin18cmp_lpi_with_hanziEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $retval_0 = 0;
   $1 = HEAP16[$p1 + 6 >> 1] | 0;
   $3 = HEAP16[$p2 + 6 >> 1] | 0;
   if (($1 & 65535) < ($3 & 65535)) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   $retval_0 = ($1 & 65535) > ($3 & 65535) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin24cmp_npre_by_hislen_scoreEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $1 = 0, $3 = 0, $4 = 0.0, $5 = 0.0, $retval_0 = 0;
   $1 = HEAP16[$p1 + 18 >> 1] | 0;
   $3 = HEAP16[$p2 + 18 >> 1] | 0;
   do {
    if (($1 & 65535) < ($3 & 65535)) {
     $retval_0 = 1;
    } else {
     if (($1 & 65535) > ($3 & 65535)) {
      $retval_0 = -1;
      break;
     }
     $4 = +HEAPF32[$p1 >> 2];
     $5 = +HEAPF32[$p2 >> 2];
     if ($4 > $5) {
      $retval_0 = 1;
      break;
     }
     $retval_0 = ($4 < $5) << 31 >> 31;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin5NGramD2Ev($this) {
   $this = $this | 0;
   var $0 = 0, $1 = 0, $3 = 0;
   $0 = HEAP32[$this + 24 >> 2] | 0;
   if (($0 | 0) != 0) {
    _free($0);
   }
   $1 = HEAP32[$this + 16 >> 2] | 0;
   if (($1 | 0) != 0) {
    _free($1);
   }
   $3 = HEAP32[$this + 20 >> 2] | 0;
   if (($3 | 0) == 0) {
    return;
   }
   _free($3);
   return;
  }
  function __ZN10ime_pinyin5NGram12get_instanceEv() {
   var $1 = 0;
   if ((HEAP32[11854] | 0) == 0) {
    $1 = __Znwj(28) | 0;
    __ZN10ime_pinyin5NGramC2Ev($1);
    HEAP32[11854] = $1;
   }
   return HEAP32[11854] | 0;
  }
  function __ZN10ime_pinyin5NGram10save_ngramEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $idx_num_ = 0, $freq_codes_ = 0, $lma_freq_idx_ = 0, $call20 = 0, $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0 | ($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $idx_num_ = $this + 4 | 0;
   if ((HEAP32[$idx_num_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $freq_codes_ = $this + 20 | 0;
   if ((HEAP32[$freq_codes_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_freq_idx_ = $this + 24 | 0;
   if ((HEAP32[$lma_freq_idx_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($idx_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite(HEAP32[$freq_codes_ >> 2] | 0, 2, 256, $fp | 0) | 0) != 256) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call20 = _fwrite(HEAP32[$lma_freq_idx_ >> 2] | 0, 1, HEAP32[$idx_num_ >> 2] | 0, $fp | 0) | 0;
   $retval_0 = ($call20 | 0) == (HEAP32[$idx_num_ >> 2] | 0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin5NGram10load_ngramEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $initialized_ = 0, $idx_num_ = 0, $lma_freq_idx_ = 0, $1 = 0, $freq_codes_ = 0, $2 = 0, $call16 = 0, $call31 = 0, $retval_0 = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $initialized_ = $this | 0;
   HEAP8[$initialized_] = 0;
   $idx_num_ = $this + 4 | 0;
   if ((_fread($idx_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $lma_freq_idx_ = $this + 24 | 0;
   $1 = HEAP32[$lma_freq_idx_ >> 2] | 0;
   if (($1 | 0) != 0) {
    _free($1);
   }
   $freq_codes_ = $this + 20 | 0;
   $2 = HEAP32[$freq_codes_ >> 2] | 0;
   if (($2 | 0) != 0) {
    _free($2);
   }
   HEAP32[$lma_freq_idx_ >> 2] = _malloc(HEAP32[$idx_num_ >> 2] | 0) | 0;
   $call16 = _malloc(512) | 0;
   HEAP32[$freq_codes_ >> 2] = $call16;
   if ((HEAP32[$lma_freq_idx_ >> 2] | 0) == 0 | ($call16 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fread($call16 | 0, 2, 256, $fp | 0) | 0) != 256) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call31 = _fread(HEAP32[$lma_freq_idx_ >> 2] | 0, 1, HEAP32[$idx_num_ >> 2] | 0, $fp | 0) | 0;
   if (($call31 | 0) != (HEAP32[$idx_num_ >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP8[$initialized_] = 1;
   HEAP32[$this + 8 >> 2] = 0;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin5NGram23set_total_freq_none_sysEj($this, $freq_none_sys) {
   $this = $this | 0;
   $freq_none_sys = $freq_none_sys | 0;
   HEAP32[$this + 8 >> 2] = $freq_none_sys;
   if (($freq_none_sys | 0) == 0) {
    HEAPF32[$this + 12 >> 2] = 0.0;
    return;
   } else {
    HEAPF32[$this + 12 >> 2] = +Math_log(+(1.0e8 / +(($freq_none_sys + 1e8 | 0) >>> 0 >>> 0))) * -800.0;
    return;
   }
  }
  function __ZN10ime_pinyin5NGram20convert_psb_to_scoreEd($psb) {
   $psb = +$psb;
   var $conv = 0.0;
   $conv = +Math_log(+$psb) * -800.0;
   return +($conv > 16383.0 ? 16383.0 : $conv);
  }
  function __ZN10ime_pinyin17cmp_lpsi_with_strEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strcmp($p1 + 8 | 0, $p2 + 8 | 0) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_2EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 2) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_3EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 3) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_4EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 4) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_5EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 5) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_6EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 6) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_7EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 7) | 0;
  }
  function __ZN10ime_pinyin12cmp_hanzis_8EPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _utf16_strncmp($p1, $p2, 8) | 0;
  }
  function __ZN10ime_pinyin23cmp_npre_by_hanzi_scoreEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $call = 0, $0 = 0.0, $1 = 0.0, $retval_0 = 0;
   $call = _utf16_strncmp($p1 + 4 | 0, $p2 + 4 | 0, 7) | 0;
   if (($call | 0) != 0) {
    $retval_0 = $call;
    return $retval_0 | 0;
   }
   $0 = +HEAPF32[$p1 >> 2];
   $1 = +HEAPF32[$p2 >> 2];
   if ($0 > $1) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $retval_0 = ($0 < $1) << 31 >> 31;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin21remove_duplicate_npreEPNS_12NPredictItemEj($npre_items, $npre_num) {
   $npre_items = $npre_items | 0;
   $npre_num = $npre_num | 0;
   var $pos_018 = 0, $remain_num_017 = 0, $arrayidx = 0, $1 = 0, $2 = 0, $remain_num_1 = 0, $inc14 = 0, $retval_0 = 0;
   if (($npre_items | 0) == 0 | ($npre_num | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($npre_items, $npre_num, 20, 16);
   if ($npre_num >>> 0 > 1) {
    $remain_num_017 = 1;
    $pos_018 = 1;
   } else {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   while (1) {
    $arrayidx = $npre_items + ($pos_018 * 20 | 0) | 0;
    if ((_utf16_strncmp($npre_items + ($pos_018 * 20 | 0) + 4 | 0, $npre_items + (($remain_num_017 - 1 | 0) * 20 | 0) + 4 | 0, 7) | 0) == 0) {
     $remain_num_1 = $remain_num_017;
    } else {
     if (($remain_num_017 | 0) != ($pos_018 | 0)) {
      $1 = $npre_items + ($remain_num_017 * 20 | 0) | 0;
      $2 = $arrayidx;
      HEAP32[$1 >> 2] = HEAP32[$2 >> 2];
      HEAP32[$1 + 4 >> 2] = HEAP32[$2 + 4 >> 2];
      HEAP32[$1 + 8 >> 2] = HEAP32[$2 + 8 >> 2];
      HEAP32[$1 + 12 >> 2] = HEAP32[$2 + 12 >> 2];
      HEAP32[$1 + 16 >> 2] = HEAP32[$2 + 16 >> 2];
     }
     $remain_num_1 = $remain_num_017 + 1 | 0;
    }
    $inc14 = $pos_018 + 1 | 0;
    if ($inc14 >>> 0 < $npre_num >>> 0) {
     $remain_num_017 = $remain_num_1;
     $pos_018 = $inc14;
    } else {
     $retval_0 = $remain_num_1;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11compare_splEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   return _strcmp($p1 | 0, $p2 | 0) | 0;
  }
  function __ZN10ime_pinyin12SpellingTrieC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 0;
   HEAP32[$this + 4 >> 2] = 0;
   HEAP32[$this + 8 >> 2] = 0;
   HEAP32[$this + 20 >> 2] = 0;
   _memset($this + 36 | 0, 0, 20);
   HEAP32[11856] = 0;
   HEAP32[$this + 24 >> 2] = 0;
   HEAP32[$this + 280 >> 2] = 0;
   __ZN10ime_pinyin12SpellingTrie14szm_enable_shmEb($this, 1);
   __ZN10ime_pinyin12SpellingTrie13szm_enable_ymEb($this, 1);
   HEAP32[$this + 284 >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin12SpellingTrie14szm_enable_shmEb($this, $enable) {
   $this = $this | 0;
   $enable = $enable | 0;
   var $conv10 = 0, $ch_09 = 0, $arrayidx = 0, $inc = 0, $conv1113 = 0, $ch9_012 = 0, $arrayidx18 = 0, $inc26 = 0;
   if ($enable) {
    $ch_09 = 65;
    $conv10 = 65;
    while (1) {
     if (__ZNK10ime_pinyin12SpellingTrie15is_shengmu_charEc(0, $ch_09) | 0) {
      $arrayidx = 10952 + ($conv10 - 65) | 0;
      HEAP8[$arrayidx] = HEAP8[$arrayidx] | 4;
     }
     $inc = $ch_09 + 1 & 255;
     if ($inc << 24 >> 24 < 91) {
      $ch_09 = $inc;
      $conv10 = $inc << 24 >> 24;
     } else {
      break;
     }
    }
    return;
   } else {
    $ch9_012 = 65;
    $conv1113 = 65;
    while (1) {
     if (__ZNK10ime_pinyin12SpellingTrie15is_shengmu_charEc(0, $ch9_012) | 0) {
      $arrayidx18 = 10952 + ($conv1113 - 65) | 0;
      HEAP8[$arrayidx18] = HEAP8[$arrayidx18] & -5;
     }
     $inc26 = $ch9_012 + 1 & 255;
     if ($inc26 << 24 >> 24 < 91) {
      $ch9_012 = $inc26;
      $conv1113 = $inc26 << 24 >> 24;
     } else {
      break;
     }
    }
    return;
   }
  }
  function __ZN10ime_pinyin12SpellingTrie13szm_enable_ymEb($this, $enable) {
   $this = $this | 0;
   $enable = $enable | 0;
   var $conv10 = 0, $ch_09 = 0, $arrayidx = 0, $inc = 0, $conv1113 = 0, $ch9_012 = 0, $arrayidx18 = 0, $inc26 = 0;
   if ($enable) {
    $ch_09 = 65;
    $conv10 = 65;
    while (1) {
     if (__ZNK10ime_pinyin12SpellingTrie13is_yunmu_charEc(0, $ch_09) | 0) {
      $arrayidx = 10952 + ($conv10 - 65) | 0;
      HEAP8[$arrayidx] = HEAP8[$arrayidx] | 4;
     }
     $inc = $ch_09 + 1 & 255;
     if ($inc << 24 >> 24 < 91) {
      $ch_09 = $inc;
      $conv10 = $inc << 24 >> 24;
     } else {
      break;
     }
    }
    return;
   } else {
    $ch9_012 = 65;
    $conv1113 = 65;
    while (1) {
     if (__ZNK10ime_pinyin12SpellingTrie13is_yunmu_charEc(0, $ch9_012) | 0) {
      $arrayidx18 = 10952 + ($conv1113 - 65) | 0;
      HEAP8[$arrayidx18] = HEAP8[$arrayidx18] & -5;
     }
     $inc26 = $ch9_012 + 1 & 255;
     if ($inc26 << 24 >> 24 < 91) {
      $ch9_012 = $inc26;
      $conv1113 = $inc26 << 24 >> 24;
     } else {
      break;
     }
    }
    return;
   }
  }
  function __ZN10ime_pinyin5NGram13build_unigramEPNS_10LemmaEntryEjj($this, $lemma_arr, $lemma_num, $next_idx_unused) {
   $this = $this | 0;
   $lemma_arr = $lemma_arr | 0;
   $lemma_num = $lemma_num | 0;
   $next_idx_unused = $next_idx_unused | 0;
   var $0$0 = 0, $call = 0, $4 = 0, $cmp5 = 0, $total_freq_078 = 0.0, $idx_now_077 = 0, $pos_076 = 0, $5 = 0, $inc = 0, $6 = 0.0, $storemerge = 0.0, $idx_now_1 = 0, $total_freq_1 = 0.0, $inc26 = 0, $total_freq_0_lcssa = 0.0, $idx_now_0_lcssa = 0, $add27 = 0, $idx_num_ = 0, $pos33_072 = 0, $arrayidx38 = 0, $div = 0.0, $freq_codes_df_ = 0, $10 = 0, $call55 = 0, $11 = 0, $12 = 0, $freq_codes_ = 0, $14 = 0, $call65 = 0, $15 = 0, $16 = 0, $code_pos_069 = 0, $freq_pos_068 = 0, $inc99 = 0, $freq_pos_1_ph = 0, $arrayidx78 = 0, $20 = 0.0, $i_0 = 0, $lma_freq_idx_ = 0, $25 = 0, $call105 = 0, $27 = 0, $code_pos116_066 = 0, $conv126 = 0, $retval_0 = 0;
   if (($lemma_arr | 0) == 0 | ($lemma_num | 0) == 0 | $next_idx_unused >>> 0 < 2) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $0$0 = _llvm_umul_with_overflow_i32($next_idx_unused | 0, 8) | 0;
   $call = __Znaj(tempRet0 ? -1 : $0$0) | 0;
   $4 = $call;
   $cmp5 = ($call | 0) == 0;
   if ($cmp5) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAPF64[$4 >> 3] = .3;
   L2413 : do {
    if (($lemma_num | 0) == 0) {
     $idx_now_0_lcssa = 0;
     $total_freq_0_lcssa = .3;
    } else {
     $pos_076 = 0;
     $idx_now_077 = 0;
     $total_freq_078 = .3;
     while (1) {
      $5 = HEAP32[$lemma_arr + ($pos_076 * 124 | 0) + 4 >> 2] | 0;
      if (($5 | 0) == ($idx_now_077 | 0)) {
       $total_freq_1 = $total_freq_078;
       $idx_now_1 = $idx_now_077;
      } else {
       $inc = $idx_now_077 + 1 | 0;
       if (($5 | 0) != ($inc | 0)) {
        break;
       }
       $6 = +HEAPF32[$lemma_arr + ($pos_076 * 124 | 0) + 120 >> 2];
       $storemerge = $6 > 0.0 ? $6 : .3;
       HEAPF64[$4 + ($inc << 3) >> 3] = $storemerge;
       $total_freq_1 = $total_freq_078 + $storemerge;
       $idx_now_1 = $inc;
      }
      $inc26 = $pos_076 + 1 | 0;
      if ($inc26 >>> 0 < $lemma_num >>> 0) {
       $pos_076 = $inc26;
       $idx_now_077 = $idx_now_1;
       $total_freq_078 = $total_freq_1;
      } else {
       $idx_now_0_lcssa = $idx_now_1;
       $total_freq_0_lcssa = $total_freq_1;
       break L2413;
      }
     }
     ___assert_func(4024, 262, 6152, 1576);
     return 0;
    }
   } while (0);
   $add27 = $idx_now_0_lcssa + 1 | 0;
   $idx_num_ = $this + 4 | 0;
   HEAP32[$idx_num_ >> 2] = $add27;
   if (($add27 | 0) != ($next_idx_unused | 0)) {
    ___assert_func(4024, 273, 6152, 1312);
    return 0;
   }
   L2425 : do {
    if ((HEAP32[$idx_num_ >> 2] | 0) != 0) {
     $pos33_072 = 0;
     while (1) {
      $arrayidx38 = $4 + ($pos33_072 << 3) | 0;
      $div = +HEAPF64[$arrayidx38 >> 3] / $total_freq_0_lcssa;
      HEAPF64[$arrayidx38 >> 3] = $div;
      if ($div <= 0.0) {
       break;
      }
      $pos33_072 = $pos33_072 + 1 | 0;
      if ($pos33_072 >>> 0 >= (HEAP32[$idx_num_ >> 2] | 0) >>> 0) {
       break L2425;
      }
     }
     ___assert_func(4024, 277, 6152, 1080);
     return 0;
    }
   } while (0);
   $freq_codes_df_ = $this + 16 | 0;
   $10 = HEAP32[$freq_codes_df_ >> 2] | 0;
   do {
    if (($10 | 0) == 0) {
     $call55 = __Znaj(2048) | 0;
     $11 = $call55;
     HEAP32[$freq_codes_df_ >> 2] = $11;
     if (($call55 | 0) != 0) {
      $12 = $11;
      break;
     }
     ___assert_func(4024, 285, 6152, 904);
     return 0;
    } else {
     $12 = $10;
    }
   } while (0);
   _memset($12 | 0, 0, 2048);
   $freq_codes_ = $this + 20 | 0;
   $14 = HEAP32[$freq_codes_ >> 2] | 0;
   do {
    if (($14 | 0) == 0) {
     $call65 = __Znaj(512) | 0;
     $15 = $call65;
     HEAP32[$freq_codes_ >> 2] = $15;
     if (($call65 | 0) != 0) {
      $16 = $15;
      break;
     }
     ___assert_func(4024, 290, 6152, 736);
     return 0;
    } else {
     $16 = $14;
    }
   } while (0);
   _memset($16 | 0, 0, 512);
   $freq_pos_068 = 0;
   $code_pos_069 = 0;
   while (1) {
    $freq_pos_1_ph = $freq_pos_068;
    L2441 : while (1) {
     $arrayidx78 = $4 + ($freq_pos_1_ph << 3) | 0;
     $20 = +HEAPF64[$arrayidx78 >> 3];
     $i_0 = 0;
     while (1) {
      if ($i_0 >>> 0 >= $code_pos_069 >>> 0) {
       break L2441;
      }
      if (+HEAPF64[(HEAP32[$freq_codes_df_ >> 2] | 0) + ($i_0 << 3) >> 3] == $20) {
       break;
      } else {
       $i_0 = $i_0 + 1 | 0;
      }
     }
     $freq_pos_1_ph = $freq_pos_1_ph + 1 | 0;
    }
    HEAPF64[(HEAP32[$freq_codes_df_ >> 2] | 0) + ($code_pos_069 << 3) >> 3] = +HEAPF64[$arrayidx78 >> 3];
    $inc99 = $code_pos_069 + 1 | 0;
    if ($inc99 >>> 0 < 256) {
     $freq_pos_068 = $freq_pos_1_ph + 1 | 0;
     $code_pos_069 = $inc99;
    } else {
     break;
    }
   }
   __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E(HEAP32[$freq_codes_df_ >> 2] | 0, 256, 8, 2);
   $lma_freq_idx_ = $this + 24 | 0;
   $25 = HEAP32[$lma_freq_idx_ >> 2] | 0;
   do {
    if (($25 | 0) == 0) {
     $call105 = __Znaj(HEAP32[$idx_num_ >> 2] | 0) | 0;
     HEAP32[$lma_freq_idx_ >> 2] = $call105;
     if (($call105 | 0) != 0) {
      $27 = $call105;
      break;
     }
     ___assert_func(4024, 317, 6152, 584);
     return 0;
    } else {
     $27 = $25;
    }
   } while (0);
   __ZN10ime_pinyin13iterate_codesEPdjS0_Ph($4, HEAP32[$idx_num_ >> 2] | 0, HEAP32[$freq_codes_df_ >> 2] | 0, $27);
   if ($cmp5) {
    $code_pos116_066 = 0;
   } else {
    __ZdaPv($call);
    $code_pos116_066 = 0;
   }
   do {
    $conv126 = ~~+__ZN10ime_pinyin5NGram20convert_psb_to_scoreEd(+HEAPF64[(HEAP32[$freq_codes_df_ >> 2] | 0) + ($code_pos116_066 << 3) >> 3]);
    HEAP16[(HEAP32[$freq_codes_ >> 2] | 0) + ($code_pos116_066 << 1) >> 1] = $conv126;
    $code_pos116_066 = $code_pos116_066 + 1 | 0;
   } while ($code_pos116_066 >>> 0 < 256);
   HEAP8[$this | 0] = 1;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie10is_half_idEt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   return ($splid & 65535) < 30 & $splid << 16 >> 16 != 0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie14szm_is_enabledEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   return (HEAP8[10952 + (($ch << 24 >> 24) - 65) | 0] & 4) != 0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie13is_yunmu_charEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   return (HEAP8[10952 + (($ch << 24 >> 24) - 65) | 0] & 2) != 0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie10is_full_idEt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   if (($splid & 65535) < 30) {
    return 0;
   } else {
    return ($splid & 65535) >>> 0 < ((HEAP32[$this + 8 >> 2] | 0) + 30 | 0) >>> 0 | 0;
   }
   return 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie12full_to_halfEt($this, $full_id) {
   $this = $this | 0;
   $full_id = $full_id | 0;
   var $conv = 0, $retval_0 = 0;
   if ((HEAP32[$this + 44 >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $conv = $full_id & 65535;
   if (($full_id & 65535) < 30) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ($conv >>> 0 > ((HEAP32[$this + 8 >> 2] | 0) + 30 | 0) >>> 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP16[(HEAP32[$this + 280 >> 2] | 0) + ($conv - 30 << 1) >> 1] | 0;
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   var $conv = 0, $retval_0 = 0;
   $conv = $splid & 65535;
   if ($splid << 16 >> 16 == 0 | ($splid & 65535) > 29) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((538968080 >>> ($conv >>> 0) & 1 | 0) != 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = (HEAP8[10952 + ((HEAP8[10920 + $conv | 0] | 0) - 65) | 0] & 2) != 0;
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie15is_shengmu_charEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   return (HEAP8[10952 + (($ch << 24 >> 24) - 65) | 0] & 1) != 0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie14is_szm_enabledEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   return (HEAP8[10952 + (($ch << 24 >> 24) - 65) | 0] & 4) != 0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie13half2full_numEt($this, $half_id) {
   $this = $this | 0;
   $half_id = $half_id | 0;
   var $retval_0 = 0;
   if ((HEAP32[$this + 44 >> 2] | 0) == 0 | ($half_id & 65535) > 29) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP16[$this + 220 + (($half_id & 65535) << 1) >> 1] | 0;
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($this, $half_id, $spl_id_start) {
   $this = $this | 0;
   $half_id = $half_id | 0;
   $spl_id_start = $spl_id_start | 0;
   var $conv = 0, $retval_0 = 0;
   do {
    if (($spl_id_start | 0) == 0) {
     $retval_0 = 0;
    } else {
     if ((HEAP32[$this + 44 >> 2] | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     $conv = $half_id & 65535;
     if (($half_id & 65535) > 29) {
      $retval_0 = 0;
      break;
     }
     HEAP16[$spl_id_start >> 1] = HEAP16[$this + 160 + ($conv << 1) >> 1] | 0;
     $retval_0 = HEAP16[$this + 220 + ($conv << 1) >> 1] | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrieD2Ev($this) {
   $this = $this | 0;
   var $0 = 0, $1 = 0, $2 = 0, $4 = 0, $root_ = 0, $5 = 0, $6 = 0, $8 = 0, $10 = 0, $12 = 0, $16 = 0, $17 = 0;
   $0 = HEAP32[$this >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0);
   }
   $1 = HEAP32[$this + 36 >> 2] | 0;
   if (($1 | 0) != 0) {
    __ZdaPv($1);
   }
   $2 = HEAP32[$this + 40 >> 2] | 0;
   if (($2 | 0) != 0) {
    __ZdaPv($2);
   }
   $4 = HEAP32[$this + 20 >> 2] | 0;
   if (($4 | 0) != 0) {
    __ZdaPv($4);
   }
   $root_ = $this + 44 | 0;
   $5 = HEAP32[$root_ >> 2] | 0;
   do {
    if (($5 | 0) != 0) {
     __ZN10ime_pinyin12SpellingTrie13free_son_trieEPNS_12SpellingNodeE($this, $5);
     $6 = HEAP32[$root_ >> 2] | 0;
     if (($6 | 0) == 0) {
      break;
     }
     __ZdlPv($6);
    }
   } while (0);
   $8 = HEAP32[$this + 48 >> 2] | 0;
   if (($8 | 0) != 0) {
    __ZdaPv($8);
   }
   $10 = HEAP32[$this + 52 >> 2] | 0;
   if (($10 | 0) != 0) {
    __ZdaPv($10);
   }
   $12 = HEAP32[11856] | 0;
   if (($12 | 0) != 0) {
    __ZN10ime_pinyin12SpellingTrieD2Ev($12);
    __ZdlPv($12);
    HEAP32[11856] = 0;
   }
   $16 = HEAP32[$this + 24 >> 2] | 0;
   if (($16 | 0) != 0) {
    __ZdaPv($16);
   }
   $17 = HEAP32[$this + 280 >> 2] | 0;
   if (($17 | 0) == 0) {
    return;
   }
   __ZdaPv($17);
   return;
  }
  function __ZN10ime_pinyin12SpellingTrie13free_son_trieEPNS_12SpellingNodeE($this, $node) {
   $this = $this | 0;
   $node = $node | 0;
   var $1 = 0, $first_son = 0, $3 = 0, $4 = 0, $pos_08 = 0, $inc = 0, $7 = 0, $_lcssa = 0;
   if (($node | 0) == 0) {
    return;
   }
   $1 = $node + 4 | 0;
   $first_son = $node | 0;
   $3 = HEAP32[$first_son >> 2] | 0;
   if ((HEAPU16[$1 >> 1] | 0) > 2047) {
    $pos_08 = 0;
    $4 = $3;
    while (1) {
     __ZN10ime_pinyin12SpellingTrie13free_son_trieEPNS_12SpellingNodeE($this, $4 + ($pos_08 << 3) | 0);
     $inc = $pos_08 + 1 | 0;
     $7 = HEAP32[$first_son >> 2] | 0;
     if ($inc >>> 0 < ((HEAPU16[$1 >> 1] | 0) >>> 11 & 65535) >>> 0) {
      $pos_08 = $inc;
      $4 = $7;
     } else {
      $_lcssa = $7;
      break;
     }
    }
   } else {
    $_lcssa = $3;
   }
   if (($_lcssa | 0) == 0) {
    return;
   }
   __ZdaPv($_lcssa);
   return;
  }
  function __ZNK10ime_pinyin12SpellingTrie20half_full_compatibleEtt($this, $half_id, $full_id) {
   $this = $this | 0;
   $half_id = $half_id | 0;
   $full_id = $full_id | 0;
   var $call = 0, $retval_0 = 0;
   $call = __ZNK10ime_pinyin12SpellingTrie12full_to_halfEt($this, $full_id) | 0;
   if ($call << 16 >> 16 == $half_id << 16 >> 16) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $retval_0 = (HEAP8[10920 + ($call & 65535) | 0] & -33) << 24 >> 24 == (HEAP8[10920 + ($half_id & 65535) | 0] | 0);
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie11is_szm_charEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   var $0 = 0;
   if (__ZNK10ime_pinyin12SpellingTrie15is_shengmu_charEc(0, $ch) | 0) {
    $0 = 1;
    return $0 | 0;
   }
   $0 = __ZNK10ime_pinyin12SpellingTrie13is_yunmu_charEc(0, $ch) | 0;
   return $0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie14get_cpinstanceEv() {
   return __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie12get_instanceEv() {
   var $1 = 0;
   if ((HEAP32[11856] | 0) == 0) {
    $1 = __Znwj(288) | 0;
    __ZN10ime_pinyin12SpellingTrieC2Ev($1);
    HEAP32[11856] = $1;
   }
   return HEAP32[11856] | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie9constructEPKcjjfh($this, $spelling_arr, $item_size, $item_num, $score_amplifier, $average_score) {
   $this = $this | 0;
   $spelling_arr = $spelling_arr | 0;
   $item_size = $item_size | 0;
   $item_num = $item_num | 0;
   $score_amplifier = +$score_amplifier;
   $average_score = $average_score | 0;
   var $h2f_start_ = 0, $spelling_buf_ = 0, $1 = 0, $mul = 0, $call = 0, $spelling_size_ = 0, $spelling_num_ = 0, $average_score_ = 0, $splstr_queried_ = 0, $2 = 0, $call26 = 0, $splstr16_queried_ = 0, $4 = 0, $7$0 = 0, $call40 = 0, $call49 = 0, $16 = 0, $root_ = 0, $call51 = 0, $18 = 0, $dumb_node_ = 0, $call55 = 0, $22 = 0, $splitter_node_ = 0, $call62 = 0, $retval_0 = 0;
   if (($spelling_arr | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $h2f_start_ = $this + 160 | 0;
   $spelling_buf_ = $this | 0;
   _memset($h2f_start_ | 0, 0, 120);
   $1 = HEAP32[$spelling_buf_ >> 2] | 0;
   do {
    if (($1 | 0) != ($spelling_arr | 0)) {
     if (($1 | 0) != 0) {
      __ZdaPv($1);
     }
     $mul = Math_imul($item_num, $item_size) | 0;
     $call = __Znaj($mul) | 0;
     HEAP32[$spelling_buf_ >> 2] = $call;
     if (($call | 0) == 0) {
      $retval_0 = 0;
      return $retval_0 | 0;
     } else {
      _memcpy($call | 0, $spelling_arr | 0, $mul) | 0;
      break;
     }
    }
   } while (0);
   $spelling_size_ = $this + 4 | 0;
   HEAP32[$spelling_size_ >> 2] = $item_size;
   $spelling_num_ = $this + 8 | 0;
   HEAP32[$spelling_num_ >> 2] = $item_num;
   HEAPF32[$this + 12 >> 2] = $score_amplifier;
   $average_score_ = $this + 16 | 0;
   HEAP8[$average_score_] = $average_score;
   $splstr_queried_ = $this + 36 | 0;
   $2 = HEAP32[$splstr_queried_ >> 2] | 0;
   if (($2 | 0) != 0) {
    __ZdaPv($2);
   }
   $call26 = __Znaj(HEAP32[$spelling_size_ >> 2] | 0) | 0;
   HEAP32[$splstr_queried_ >> 2] = $call26;
   if (($call26 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $splstr16_queried_ = $this + 40 | 0;
   $4 = HEAP32[$splstr16_queried_ >> 2] | 0;
   if (($4 | 0) != 0) {
    __ZdaPv($4);
   }
   $7$0 = _llvm_umul_with_overflow_i32(HEAP32[$spelling_size_ >> 2] | 0, 2) | 0;
   $call40 = __Znaj(tempRet0 ? -1 : $7$0) | 0;
   HEAP32[$splstr16_queried_ >> 2] = $call40;
   if (($call40 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   _qsort(HEAP32[$spelling_buf_ >> 2] | 0, HEAP32[$spelling_num_ >> 2] | 0, HEAP32[$spelling_size_ >> 2] | 0, 44);
   HEAP32[$this + 284 >> 2] = 1;
   $call49 = __Znwj(8) | 0;
   $16 = $call49;
   $root_ = $this + 44 | 0;
   HEAP32[$root_ >> 2] = $call49;
   HEAP32[$16 >> 2] = 0;
   HEAP32[$16 + 4 >> 2] = 0;
   $call51 = __Znwj(8) | 0;
   $18 = $call51;
   $dumb_node_ = $this + 48 | 0;
   HEAP32[$dumb_node_ >> 2] = $call51;
   HEAP32[$18 >> 2] = 0;
   HEAP32[$18 + 4 >> 2] = 0;
   HEAP8[(HEAP32[$dumb_node_ >> 2] | 0) + 7 | 0] = HEAP8[$average_score_] | 0;
   $call55 = __Znwj(8) | 0;
   $22 = $call55;
   $splitter_node_ = $this + 52 | 0;
   HEAP32[$splitter_node_ >> 2] = $call55;
   HEAP32[$22 >> 2] = 0;
   HEAP32[$22 + 4 >> 2] = 0;
   HEAP8[(HEAP32[$splitter_node_ >> 2] | 0) + 7 | 0] = HEAP8[$average_score_] | 0;
   _memset($this + 56 | 0, 0, 104);
   $call62 = __ZN10ime_pinyin12SpellingTrie26construct_spellings_subsetEjjjPNS_12SpellingNodeE($this, 0, HEAP32[$spelling_num_ >> 2] | 0, 0, HEAP32[$root_ >> 2] | 0) | 0;
   HEAP32[HEAP32[$root_ >> 2] >> 2] = $call62;
   HEAP8[(HEAP32[$root_ >> 2] | 0) + 7 | 0] = 0;
   if ((HEAP32[HEAP32[$root_ >> 2] >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP16[$this + 220 >> 1] = 0;
   HEAP16[$h2f_start_ >> 1] = 0;
   if (!(__ZN10ime_pinyin12SpellingTrie9build_f2hEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12SpellingTrie13build_ym_infoEv($this) | 0;
   return $retval_0 | 0;
  }
  function __ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   var $0 = 0, $conv = 0, $1 = 0, $retval_0 = 0;
   do {
    if (($splid | 0) == 0) {
     $retval_0 = 0;
    } else {
     $0 = HEAP16[$splid >> 1] | 0;
     $conv = $0 & 65535;
     if ($0 << 16 >> 16 == 0) {
      $retval_0 = 0;
      break;
     }
     if (($0 & 65535) > 29) {
      $retval_0 = 1;
      break;
     }
     $1 = HEAP8[10920 + $conv | 0] | 0;
     if ((538968080 >>> ($conv >>> 0) & 1 | 0) != 0) {
      $retval_0 = 1;
      break;
     }
     if (__ZNK10ime_pinyin12SpellingTrie14szm_is_enabledEc(0, $1) | 0) {
      $retval_0 = 1;
      break;
     }
     if (!(__ZNK10ime_pinyin12SpellingTrie13is_yunmu_charEc(0, $1) | 0)) {
      $retval_0 = 0;
      break;
     }
     if ((HEAP16[$this + 220 + ($conv << 1) >> 1] | 0) == 0) {
      ___assert_func(3400, 128, 4448, 4088);
      return 0;
     } else {
      HEAP16[$splid >> 1] = HEAP16[$this + 160 + ($conv << 1) >> 1] | 0;
      $retval_0 = 1;
      break;
     }
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc($ch) {
   $ch = $ch | 0;
   if (($ch - 97 & 255) < 26) {
    return 1;
   } else {
    return ($ch - 65 & 255) < 26 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12SpellingTrie9build_f2hEv($this) {
   $this = $this | 0;
   var $f2h_ = 0, $0 = 0, $3$0 = 0, $call = 0, $conv15 = 0, $hid_014 = 0, $arrayidx = 0, $8 = 0, $conv107 = 0, $arrayidx16 = 0, $conv1013 = 0, $fid_012 = 0, $inc24 = 0, $retval_0 = 0;
   $f2h_ = $this + 280 | 0;
   $0 = HEAP32[$f2h_ >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0);
   }
   $3$0 = _llvm_umul_with_overflow_i32(HEAP32[$this + 8 >> 2] | 0, 2) | 0;
   $call = __Znaj(tempRet0 ? -1 : $3$0) | 0;
   HEAP32[$f2h_ >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $hid_014 = 0;
    $conv15 = 0;
   }
   while (1) {
    $arrayidx = $this + 160 + ($conv15 << 1) | 0;
    $8 = HEAP16[$arrayidx >> 1] | 0;
    $conv107 = $8 & 65535;
    $arrayidx16 = $this + 220 + ($conv15 << 1) | 0;
    if (($conv107 | 0) < ((HEAPU16[$arrayidx16 >> 1] | 0) + ($8 & 65535) | 0)) {
     $fid_012 = $8;
     $conv1013 = $conv107;
     do {
      HEAP16[(HEAP32[$f2h_ >> 2] | 0) + ($conv1013 - 30 << 1) >> 1] = $hid_014;
      $fid_012 = $fid_012 + 1 & 65535;
      $conv1013 = $fid_012 & 65535;
     } while (($conv1013 | 0) < ((HEAPU16[$arrayidx16 >> 1] | 0) + (HEAPU16[$arrayidx >> 1] | 0) | 0));
    }
    $inc24 = $hid_014 + 1 & 65535;
    if (($inc24 & 65535) < 30) {
     $hid_014 = $inc24;
     $conv15 = $inc24 & 65535;
    } else {
     $retval_0 = 1;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie10get_ym_strEPKc($this, $spl_str) {
   $this = $this | 0;
   $spl_str = $spl_str | 0;
   var $0 = 0, $add_ptr8 = 0, $spl_str_addr_0 = 0;
   $0 = HEAP8[$spl_str] | 0;
   if (!(__ZNK10ime_pinyin12SpellingTrie15is_shengmu_charEc(0, $0) | 0)) {
    $spl_str_addr_0 = $spl_str;
    return $spl_str_addr_0 | 0;
   }
   if (($0 << 24 >> 24 | 0) == 90 | ($0 << 24 >> 24 | 0) == 67 | ($0 << 24 >> 24 | 0) == 83) {
    $add_ptr8 = $spl_str + 1 | 0;
    return ((HEAP8[$add_ptr8] | 0) == 104 ? $spl_str + 2 | 0 : $add_ptr8) | 0;
   }
   $spl_str_addr_0 = $spl_str + 1 | 0;
   return $spl_str_addr_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   var $splstr_queried_ = 0, $1 = 0, $2 = 0, $3 = 0, $add_ptr = 0, $4 = 0, $5 = 0, $dec_splid = 0, $splid_addr_1_off0 = 0, $12 = 0, sp = 0;
   sp = STACKTOP;
   $splstr_queried_ = $this + 36 | 0;
   HEAP8[HEAP32[$splstr_queried_ >> 2] | 0] = 0;
   if (($splid & 65535) > 29) {
    $1 = HEAP32[$splstr_queried_ >> 2] | 0;
    $2 = HEAP32[$this + 4 >> 2] | 0;
    $3 = HEAP32[$this >> 2] | 0;
    $add_ptr = $3 + (Math_imul($2, $splid - 30 & 65535) | 0) | 0;
    _snprintf($1 | 0, $2 | 0, 896, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $add_ptr, tempInt) | 0) | 0;
    $12 = HEAP32[$splstr_queried_ >> 2] | 0;
    STACKTOP = sp;
    return $12 | 0;
   }
   if (($splid << 16 >> 16 | 0) == 4) {
    $4 = HEAP32[$splstr_queried_ >> 2] | 0;
    $5 = HEAP32[$this + 4 >> 2] | 0;
    _snprintf($4 | 0, $5 | 0, 896, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = 728, tempInt) | 0) | 0;
    $12 = HEAP32[$splstr_queried_ >> 2] | 0;
    STACKTOP = sp;
    return $12 | 0;
   } else if (($splid << 16 >> 16 | 0) == 21) {
    _snprintf(HEAP32[$splstr_queried_ >> 2] | 0, HEAP32[$this + 4 >> 2] | 0, 896, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = 576, tempInt) | 0) | 0;
    $12 = HEAP32[$splstr_queried_ >> 2] | 0;
    STACKTOP = sp;
    return $12 | 0;
   } else if (($splid << 16 >> 16 | 0) == 29) {
    _snprintf(HEAP32[$splstr_queried_ >> 2] | 0, HEAP32[$this + 4 >> 2] | 0, 896, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = 4368, tempInt) | 0) | 0;
    $12 = HEAP32[$splstr_queried_ >> 2] | 0;
    STACKTOP = sp;
    return $12 | 0;
   } else {
    $dec_splid = ((($splid & 65535) > 3) << 31 >> 31) + $splid & 65535;
    if (($dec_splid & 65535) > 19) {
     $splid_addr_1_off0 = $dec_splid + 255 & 255;
    } else {
     $splid_addr_1_off0 = $dec_splid & 255;
    }
    HEAP8[HEAP32[$splstr_queried_ >> 2] | 0] = $splid_addr_1_off0 + 64 & 255;
    HEAP8[(HEAP32[$splstr_queried_ >> 2] | 0) + 1 | 0] = 0;
    $12 = HEAP32[$splstr_queried_ >> 2] | 0;
    STACKTOP = sp;
    return $12 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12SpellingTrie9get_ym_idEPKc($this, $ym_str) {
   $this = $this | 0;
   $ym_str = $ym_str | 0;
   var $ym_buf_ = 0, $1 = 0, $ym_size_ = 0, $pos_0 = 0, $conv = 0, $2 = 0, $add = 0, $retval_0 = 0, label = 0;
   if (($ym_str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $ym_buf_ = $this + 24 | 0;
   if ((HEAP32[$ym_buf_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $1 = HEAP32[$this + 32 >> 2] | 0;
   $ym_size_ = $this + 28 | 0;
   $pos_0 = 0;
   while (1) {
    $conv = $pos_0 & 255;
    if ($conv >>> 0 >= $1 >>> 0) {
     $retval_0 = 0;
     label = 2089;
     break;
    }
    $2 = HEAP32[$ym_buf_ >> 2] | 0;
    $add = $pos_0 + 1 & 255;
    if ((_strcmp($2 + (Math_imul(HEAP32[$ym_size_ >> 2] | 0, $conv) | 0) | 0, $ym_str | 0) | 0) == 0) {
     $retval_0 = $add;
     label = 2087;
     break;
    } else {
     $pos_0 = $add;
    }
   }
   if ((label | 0) == 2089) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2087) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12SpellingTrie13save_spl_trieEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $spelling_buf_ = 0, $spelling_size_ = 0, $spelling_num_ = 0, $call21 = 0, $retval_0 = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_buf_ = $this | 0;
   if ((HEAP32[$spelling_buf_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_size_ = $this + 4 | 0;
   if ((_fwrite($spelling_size_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_num_ = $this + 8 | 0;
   if ((_fwrite($spelling_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($this + 12 | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($this + 16 | 0, 1, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call21 = _fwrite(HEAP32[$spelling_buf_ >> 2] | 0, HEAP32[$spelling_size_ >> 2] | 0, HEAP32[$spelling_num_ >> 2] | 0, $fp | 0) | 0;
   $retval_0 = ($call21 | 0) == (HEAP32[$spelling_num_ >> 2] | 0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie26construct_spellings_subsetEjjjPNS_12SpellingNodeE($this, $item_start, $item_end, $level, $parent) {
   $this = $this | 0;
   $item_start = $item_start | 0;
   $item_end = $item_end | 0;
   $level = $level | 0;
   $parent = $parent | 0;
   var $spelling_size_ = 0, $0 = 0, $spelling_buf_ = 0, $1 = 0, $2 = 0, $add = 0, $3 = 0, $4 = 0, $num_of_son_0216 = 0, $char_for_node_0215 = 0, $i_0214 = 0, $5 = 0, $num_of_son_0_inc = 0, $inc23 = 0, $num_of_son_0_lcssa = 0, $conv25 = 0, $node_num_ = 0, $umul_with_overflow = 0, $call = 0, $7 = 0, $8 = 0, $mul31 = 0, $add_ptr32 = 0, $10 = 0, $add34 = 0, $cmp37 = 0, $cmp61 = 0, $cmp149 = 0, $min_son_score_0207 = 0, $spelling_last_start_0206 = 0, $char_for_node_2205 = 0, $son_pos_0201 = 0, $i40_0197 = 0, $item_start_next_0194 = 0, $spelling_endable_1_off0193 = 0, $12 = 0, $mul48 = 0, $add_ptr49 = 0, $14 = 0, $conv57 = 0, $add_ptr60 = 0, $16 = 0, $arrayidx71 = 0, $20 = 0, $21 = 0, $cmp81 = 0, $23 = 0, $score = 0, $27 = 0, $_min_son_score_0 = 0, $29 = 0, $bf_value140_pn = 0, $32 = 0, $cmp164 = 0, $part_id_0174 = 0, $34 = 0, $idxprom188 = 0, $spelling_endable_3_off0 = 0, $item_start_next_1 = 0, $son_pos_1 = 0, $char_for_node_3 = 0, $spelling_last_start_1 = 0, $min_son_score_2 = 0, $inc217 = 0, $min_son_score_0_lcssa = 0, $spelling_last_start_0_lcssa = 0, $char_for_node_2_lcssa = 0, $son_pos_0_lcssa = 0, $item_start_next_0_lcssa = 0, $spelling_endable_1_off0_lcssa = 0, $add_ptr220 = 0, $cmp222 = 0, $44 = 0, $arrayidx237 = 0, $48 = 0, $49 = 0, $cmp248 = 0, $51 = 0, $score264 = 0, $55 = 0, $_min_son_score_0166 = 0, $57 = 0, $bf_value318_pn = 0, $60 = 0, $cmp346 = 0, $part_id336_0180 = 0, $62 = 0, $idxprom370 = 0, $71 = 0, $retval_0 = 0, label = 0;
   $spelling_size_ = $this + 4 | 0;
   $0 = HEAP32[$spelling_size_ >> 2] | 0;
   if ($item_end >>> 0 <= $item_start >>> 0 | $0 >>> 0 <= $level >>> 0 | ($parent | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_buf_ = $this | 0;
   $1 = HEAP32[$spelling_buf_ >> 2] | 0;
   $2 = HEAP8[$1 + ((Math_imul($0, $item_start) | 0) + $level) | 0] | 0;
   if ($2 << 24 >> 24 <= 64) {
    ___assert_func(3400, 439, 6400, 1496);
    return 0;
   }
   if (!($2 << 24 >> 24 < 91 | $2 << 24 >> 24 == 104)) {
    ___assert_func(3400, 439, 6400, 1496);
    return 0;
   }
   $add = $item_start + 1 | 0;
   if ($add >>> 0 < $item_end >>> 0) {
    $3 = HEAP32[$spelling_buf_ >> 2] | 0;
    $4 = HEAP32[$spelling_size_ >> 2] | 0;
    $i_0214 = $add;
    $char_for_node_0215 = $2;
    $num_of_son_0216 = 0;
    while (1) {
     $5 = HEAP8[$3 + ((Math_imul($4, $i_0214) | 0) + $level) | 0] | 0;
     $num_of_son_0_inc = ($5 << 24 >> 24 != $char_for_node_0215 << 24 >> 24) + $num_of_son_0216 & 65535;
     $inc23 = $i_0214 + 1 | 0;
     if ($inc23 >>> 0 < $item_end >>> 0) {
      $i_0214 = $inc23;
      $char_for_node_0215 = $5;
      $num_of_son_0216 = $num_of_son_0_inc;
     } else {
      break;
     }
    }
    $num_of_son_0_lcssa = $num_of_son_0_inc + 1 & 65535;
   } else {
    $num_of_son_0_lcssa = 1;
   }
   $conv25 = $num_of_son_0_lcssa & 65535;
   $node_num_ = $this + 284 | 0;
   HEAP32[$node_num_ >> 2] = (HEAP32[$node_num_ >> 2] | 0) + $conv25;
   $umul_with_overflow = $conv25 << 3;
   $call = __Znaj($umul_with_overflow) | 0;
   $7 = $call;
   _memset($call | 0, 0, $umul_with_overflow | 0);
   $8 = HEAP32[$spelling_buf_ >> 2] | 0;
   $mul31 = Math_imul(HEAP32[$spelling_size_ >> 2] | 0, $item_start) | 0;
   $add_ptr32 = $8 + $mul31 | 0;
   $10 = HEAP8[$8 + ($mul31 + $level) | 0] | 0;
   $add34 = $level + 1 | 0;
   $cmp37 = (HEAP8[$8 + ($mul31 + $add34) | 0] | 0) == 0;
   L2694 : do {
    if ($add >>> 0 < $item_end >>> 0) {
     $cmp61 = ($level | 0) == 0;
     $cmp149 = ($level | 0) == 1;
     $spelling_endable_1_off0193 = $cmp37;
     $item_start_next_0194 = $item_start;
     $i40_0197 = $add;
     $son_pos_0201 = 0;
     $char_for_node_2205 = $10;
     $spelling_last_start_0206 = $add_ptr32;
     $min_son_score_0207 = -1;
     while (1) {
      $12 = HEAP32[$spelling_buf_ >> 2] | 0;
      $mul48 = Math_imul(HEAP32[$spelling_size_ >> 2] | 0, $i40_0197) | 0;
      $add_ptr49 = $12 + $mul48 | 0;
      $14 = HEAP8[$12 + ($mul48 + $level) | 0] | 0;
      if (!(__ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc($14) | 0)) {
       break;
      }
      $conv57 = $char_for_node_2205 << 24 >> 24;
      if ($14 << 24 >> 24 == $char_for_node_2205 << 24 >> 24) {
       $min_son_score_2 = $min_son_score_0207;
       $spelling_last_start_1 = $spelling_last_start_0206;
       $char_for_node_3 = $char_for_node_2205;
       $son_pos_1 = $son_pos_0201;
       $item_start_next_1 = $item_start_next_0194;
       $spelling_endable_3_off0 = $spelling_endable_1_off0193;
      } else {
       $add_ptr60 = $7 + ($son_pos_0201 << 3) | 0;
       HEAP8[$7 + ($son_pos_0201 << 3) + 6 | 0] = $char_for_node_2205;
       if ($cmp61) {
        HEAP32[$this + 56 + ($conv57 - 65 << 2) >> 2] = $add_ptr60;
       }
       if ($spelling_endable_1_off0193) {
        $16 = $7 + ($son_pos_0201 << 3) + 4 | 0;
        HEAP16[$16 >> 1] = HEAP16[$16 >> 1] & -2048 | $item_start_next_0194 + 30 & 2047;
       }
       $arrayidx71 = $spelling_last_start_0206 + $add34 | 0;
       $20 = HEAP8[$arrayidx71] | 0;
       do {
        if ($20 << 24 >> 24 == 0) {
         if (($i40_0197 - $item_start_next_0194 | 0) >>> 0 > 1) {
          $21 = HEAP8[$arrayidx71] | 0;
          label = 2126;
          break;
         } else {
          HEAP32[$add_ptr60 >> 2] = 0;
          HEAP8[$7 + ($son_pos_0201 << 3) + 7 | 0] = HEAP8[$spelling_last_start_0206 + ((HEAP32[$spelling_size_ >> 2] | 0) - 1) | 0] | 0;
          break;
         }
        } else {
         $21 = $20;
         label = 2126;
        }
       } while (0);
       do {
        if ((label | 0) == 2126) {
         label = 0;
         $cmp81 = $21 << 24 >> 24 == 0;
         HEAP32[$add_ptr60 >> 2] = __ZN10ime_pinyin12SpellingTrie26construct_spellings_subsetEjjjPNS_12SpellingNodeE($this, ($cmp81 & 1) + $item_start_next_0194 | 0, $i40_0197, $add34, $add_ptr60) | 0;
         if (!$cmp81) {
          break;
         }
         $23 = HEAP8[$spelling_last_start_0206 + ((HEAP32[$spelling_size_ >> 2] | 0) - 1) | 0] | 0;
         $score = $7 + ($son_pos_0201 << 3) + 7 | 0;
         if (($23 & 255) >= (HEAPU8[$score] | 0)) {
          break;
         }
         HEAP8[$score] = $23;
        }
       } while (0);
       $27 = HEAP8[$7 + ($son_pos_0201 << 3) + 7 | 0] | 0;
       $_min_son_score_0 = ($27 & 255) < ($min_son_score_0207 & 255) ? $27 : $min_son_score_0207;
       do {
        if ($cmp61) {
         if (!(__ZNK10ime_pinyin12SpellingTrie11is_szm_charEc(0, $char_for_node_2205) | 0)) {
          break;
         }
         $29 = $7 + ($son_pos_0201 << 3) + 4 | 0;
         $bf_value140_pn = (($conv57 + 1984 & 65535) + ($char_for_node_2205 << 24 >> 24 > 67) & 65535) + ($char_for_node_2205 << 24 >> 24 > 83) & 2047;
         HEAP16[$29 >> 1] = HEAP16[$29 >> 1] & -2048 | $bf_value140_pn;
         HEAP16[$this + 220 + (($bf_value140_pn & 65535) << 1) >> 1] = $i40_0197 - $item_start_next_0194 & 65535;
         label = 2138;
        } else {
         if (!($cmp149 & $char_for_node_2205 << 24 >> 24 == 104)) {
          break;
         }
         $32 = HEAP8[$spelling_last_start_0206] | 0;
         if (($32 << 24 >> 24 | 0) == 83) {
          $part_id_0174 = 21;
         } else if (($32 << 24 >> 24 | 0) == 67) {
          $part_id_0174 = 4;
         } else {
          $cmp164 = $32 << 24 >> 24 == 90;
          if ($cmp164) {
           $part_id_0174 = $cmp164 ? 29 : 0;
          } else {
           break;
          }
         }
         $34 = $7 + ($son_pos_0201 << 3) + 4 | 0;
         HEAP16[$34 >> 1] = HEAP16[$34 >> 1] & -2048 | $part_id_0174;
         HEAP16[$this + 220 + (($part_id_0174 & 65535) << 1) >> 1] = $i40_0197 - $item_start_next_0194 & 65535;
         label = 2138;
        }
       } while (0);
       do {
        if ((label | 0) == 2138) {
         label = 0;
         $idxprom188 = HEAP16[$7 + ($son_pos_0201 << 3) + 4 >> 1] & 2047;
         if ((HEAP16[$this + 220 + ($idxprom188 << 1) >> 1] | 0) == 0) {
          HEAP16[$this + 160 + ($idxprom188 << 1) >> 1] = 0;
          break;
         } else {
          HEAP16[$this + 160 + ($idxprom188 << 1) >> 1] = $item_start_next_0194 + 30 & 65535;
          break;
         }
        }
       } while (0);
       $min_son_score_2 = $_min_son_score_0;
       $spelling_last_start_1 = $add_ptr49;
       $char_for_node_3 = $14;
       $son_pos_1 = $son_pos_0201 + 1 | 0;
       $item_start_next_1 = $i40_0197;
       $spelling_endable_3_off0 = (HEAP8[$12 + ($mul48 + $add34) | 0] | 0) == 0;
      }
      $inc217 = $i40_0197 + 1 | 0;
      if ($inc217 >>> 0 < $item_end >>> 0) {
       $spelling_endable_1_off0193 = $spelling_endable_3_off0;
       $item_start_next_0194 = $item_start_next_1;
       $i40_0197 = $inc217;
       $son_pos_0201 = $son_pos_1;
       $char_for_node_2205 = $char_for_node_3;
       $spelling_last_start_0206 = $spelling_last_start_1;
       $min_son_score_0207 = $min_son_score_2;
      } else {
       $spelling_endable_1_off0_lcssa = $spelling_endable_3_off0;
       $item_start_next_0_lcssa = $item_start_next_1;
       $son_pos_0_lcssa = $son_pos_1;
       $char_for_node_2_lcssa = $char_for_node_3;
       $spelling_last_start_0_lcssa = $spelling_last_start_1;
       $min_son_score_0_lcssa = $min_son_score_2;
       break L2694;
      }
     }
     ___assert_func(3400, 474, 6400, 1280);
     return 0;
    } else {
     $spelling_endable_1_off0_lcssa = $cmp37;
     $item_start_next_0_lcssa = $item_start;
     $son_pos_0_lcssa = 0;
     $char_for_node_2_lcssa = $10;
     $spelling_last_start_0_lcssa = $add_ptr32;
     $min_son_score_0_lcssa = -1;
    }
   } while (0);
   $add_ptr220 = $7 + ($son_pos_0_lcssa << 3) | 0;
   HEAP8[$7 + ($son_pos_0_lcssa << 3) + 6 | 0] = $char_for_node_2_lcssa;
   $cmp222 = ($level | 0) == 0;
   if ($cmp222) {
    HEAP32[$this + 56 + (($char_for_node_2_lcssa << 24 >> 24) - 65 << 2) >> 2] = $add_ptr220;
   }
   if ($spelling_endable_1_off0_lcssa) {
    $44 = $7 + ($son_pos_0_lcssa << 3) + 4 | 0;
    HEAP16[$44 >> 1] = HEAP16[$44 >> 1] & -2048 | $item_start_next_0_lcssa + 30 & 2047;
   }
   $arrayidx237 = $spelling_last_start_0_lcssa + $add34 | 0;
   $48 = HEAP8[$arrayidx237] | 0;
   do {
    if ($48 << 24 >> 24 == 0) {
     if (($item_end - $item_start_next_0_lcssa | 0) >>> 0 > 1) {
      $49 = HEAP8[$arrayidx237] | 0;
      label = 2150;
      break;
     } else {
      HEAP32[$add_ptr220 >> 2] = 0;
      HEAP8[$7 + ($son_pos_0_lcssa << 3) + 7 | 0] = HEAP8[$spelling_last_start_0_lcssa + ((HEAP32[$spelling_size_ >> 2] | 0) - 1) | 0] | 0;
      break;
     }
    } else {
     $49 = $48;
     label = 2150;
    }
   } while (0);
   do {
    if ((label | 0) == 2150) {
     $cmp248 = $49 << 24 >> 24 == 0;
     HEAP32[$add_ptr220 >> 2] = __ZN10ime_pinyin12SpellingTrie26construct_spellings_subsetEjjjPNS_12SpellingNodeE($this, ($cmp248 & 1) + $item_start_next_0_lcssa | 0, $item_end, $add34, $add_ptr220) | 0;
     if (!$cmp248) {
      break;
     }
     $51 = HEAP8[$spelling_last_start_0_lcssa + ((HEAP32[$spelling_size_ >> 2] | 0) - 1) | 0] | 0;
     $score264 = $7 + ($son_pos_0_lcssa << 3) + 7 | 0;
     if (($51 & 255) >= (HEAPU8[$score264] | 0)) {
      break;
     }
     HEAP8[$score264] = $51;
    }
   } while (0);
   $55 = HEAP8[$7 + ($son_pos_0_lcssa << 3) + 7 | 0] | 0;
   $_min_son_score_0166 = ($55 & 255) < ($min_son_score_0_lcssa & 255) ? $55 : $min_son_score_0_lcssa;
   if (($son_pos_0_lcssa + 1 | 0) != ($conv25 | 0)) {
    ___assert_func(3400, 598, 6400, 1048);
    return 0;
   }
   do {
    if ($cmp222) {
     if (!(__ZNK10ime_pinyin12SpellingTrie14szm_is_enabledEc(0, $char_for_node_2_lcssa) | 0)) {
      break;
     }
     $57 = $7 + ($son_pos_0_lcssa << 3) + 4 | 0;
     $bf_value318_pn = (($char_for_node_2_lcssa << 24 >> 24 > 67 ? 1985 : 1984) + ($char_for_node_2_lcssa << 24 >> 24) & 65535) + ($char_for_node_2_lcssa << 24 >> 24 > 83) & 2047;
     HEAP16[$57 >> 1] = HEAP16[$57 >> 1] & -2048 | $bf_value318_pn;
     HEAP16[$this + 220 + (($bf_value318_pn & 65535) << 1) >> 1] = $item_end - $item_start_next_0_lcssa & 65535;
     label = 2164;
    } else {
     if (!(($level | 0) == 1 & $char_for_node_2_lcssa << 24 >> 24 == 104)) {
      break;
     }
     $60 = HEAP8[$spelling_last_start_0_lcssa] | 0;
     if (($60 << 24 >> 24 | 0) == 67) {
      $part_id336_0180 = 4;
     } else if (($60 << 24 >> 24 | 0) == 83) {
      $part_id336_0180 = 21;
     } else {
      $cmp346 = $60 << 24 >> 24 == 90;
      if ($cmp346) {
       $part_id336_0180 = $cmp346 ? 29 : 0;
      } else {
       break;
      }
     }
     $62 = $7 + ($son_pos_0_lcssa << 3) + 4 | 0;
     HEAP16[$62 >> 1] = HEAP16[$62 >> 1] & -2048 | $part_id336_0180;
     HEAP16[$this + 220 + (($part_id336_0180 & 65535) << 1) >> 1] = $item_end - $item_start_next_0_lcssa & 65535;
     label = 2164;
    }
   } while (0);
   do {
    if ((label | 0) == 2164) {
     $idxprom370 = HEAP16[$7 + ($son_pos_0_lcssa << 3) + 4 >> 1] & 2047;
     if ((HEAP16[$this + 220 + ($idxprom370 << 1) >> 1] | 0) == 0) {
      HEAP16[$this + 160 + ($idxprom370 << 1) >> 1] = 0;
      break;
     } else {
      HEAP16[$this + 160 + ($idxprom370 << 1) >> 1] = $item_start_next_0_lcssa + 30 & 65535;
      break;
     }
    }
   } while (0);
   $71 = $parent + 4 | 0;
   HEAP16[$71 >> 1] = HEAP16[$71 >> 1] & 2047 | $num_of_son_0_lcssa << 11;
   HEAP8[$parent + 7 | 0] = $_min_son_score_0166;
   $retval_0 = $7;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie13build_ym_infoEv($this) {
   $this = $this | 0;
   var $ym_item_size = 0, $ym_num = 0, $call = 0, $0 = 0, $spelling_num_ = 0, $spelling_buf_ = 0, $spelling_size_ = 0, $conv25 = 0, $pos_024 = 0, $5 = 0, $call4 = 0, $call13 = 0, $ym_buf_ = 0, $9 = 0, $call19 = 0, $mul32 = 0, $spl_ym_ids_ = 0, $19 = 0, $call46 = 0, $conv5720 = 0, $id_019 = 0, $call63 = 0, $call68 = 0, $inc81 = 0, $conv57 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $ym_item_size = sp | 0;
   $ym_num = sp + 8 | 0;
   $call = __Znwj(56) | 0;
   $0 = $call;
   __ZN10ime_pinyin13SpellingTableC2Ev($0);
   if (!(__ZN10ime_pinyin13SpellingTable10init_tableEjjb($0, 5, 128, 0) | 0)) {
    ___assert_func(3400, 372, 6536, 2888);
    return 0;
   }
   $spelling_num_ = $this + 8 | 0;
   L2775 : do {
    if ((HEAP32[$spelling_num_ >> 2] | 0) != 0) {
     $spelling_buf_ = $this | 0;
     $spelling_size_ = $this + 4 | 0;
     $pos_024 = 0;
     $conv25 = 0;
     while (1) {
      $5 = HEAP32[$spelling_buf_ >> 2] | 0;
      $call4 = __ZN10ime_pinyin12SpellingTrie10get_ym_strEPKc(0, $5 + (Math_imul(HEAP32[$spelling_size_ >> 2] | 0, $conv25) | 0) | 0) | 0;
      if ((HEAP8[$call4] | 0) != 0) {
       if (!(__ZN10ime_pinyin13SpellingTable12put_spellingEPKcd($0, $call4, 0.0) | 0)) {
        break;
       }
      }
      $pos_024 = $pos_024 + 1 & 65535;
      $conv25 = $pos_024 & 65535;
      if ($conv25 >>> 0 >= (HEAP32[$spelling_num_ >> 2] | 0) >>> 0) {
       break L2775;
      }
     }
     ___assert_func(3400, 379, 6536, 2888);
     return 0;
    }
   } while (0);
   $call13 = __ZN10ime_pinyin13SpellingTable7arrangeEPjS1_($0, $ym_item_size, $ym_num) | 0;
   $ym_buf_ = $this + 24 | 0;
   $9 = HEAP32[$ym_buf_ >> 2] | 0;
   if (($9 | 0) != 0) {
    __ZdaPv($9);
   }
   $call19 = __Znaj(Math_imul(HEAP32[$ym_num >> 2] | 0, HEAP32[$ym_item_size >> 2] | 0) | 0) | 0;
   HEAP32[$ym_buf_ >> 2] = $call19;
   if (($call19 | 0) == 0) {
    if (($call | 0) == 0) {
     $retval_0 = 0;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
    __ZN10ime_pinyin13SpellingTableD2Ev($0);
    __ZdlPv($call);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $mul32 = Math_imul(HEAP32[$ym_num >> 2] | 0, HEAP32[$ym_item_size >> 2] | 0) | 0;
   _memcpy($call19 | 0, $call13 | 0, $mul32) | 0;
   HEAP32[$this + 28 >> 2] = HEAP32[$ym_item_size >> 2];
   HEAP32[$this + 32 >> 2] = HEAP32[$ym_num >> 2];
   if (($call | 0) != 0) {
    __ZN10ime_pinyin13SpellingTableD2Ev($0);
    __ZdlPv($call);
   }
   $spl_ym_ids_ = $this + 20 | 0;
   $19 = HEAP32[$spl_ym_ids_ >> 2] | 0;
   if (($19 | 0) != 0) {
    __ZdlPv($19);
   }
   $call46 = __Znaj((HEAP32[$spelling_num_ >> 2] | 0) + 30 | 0) | 0;
   HEAP32[$spl_ym_ids_ >> 2] = $call46;
   if (($call46 | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _memset($call46 | 0, 0, (HEAP32[$spelling_num_ >> 2] | 0) + 30 | 0);
   if (((HEAP32[$spelling_num_ >> 2] | 0) + 30 | 0) >>> 0 > 1) {
    $id_019 = 1;
    $conv5720 = 1;
   } else {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   while (1) {
    $call63 = __ZN10ime_pinyin12SpellingTrie10get_ym_strEPKc(0, __ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($this, $id_019) | 0) | 0;
    if ((HEAP8[$call63] | 0) == 0) {
     HEAP8[(HEAP32[$spl_ym_ids_ >> 2] | 0) + $conv5720 | 0] = 0;
    } else {
     $call68 = __ZN10ime_pinyin12SpellingTrie9get_ym_idEPKc($this, $call63) | 0;
     HEAP8[(HEAP32[$spl_ym_ids_ >> 2] | 0) + $conv5720 | 0] = $call68;
     if ($call68 << 24 >> 24 == 0) {
      label = 2200;
      break;
     }
    }
    $inc81 = $id_019 + 1 & 65535;
    $conv57 = $inc81 & 65535;
    if ($conv57 >>> 0 < ((HEAP32[$spelling_num_ >> 2] | 0) + 30 | 0) >>> 0) {
     $id_019 = $inc81;
     $conv5720 = $conv57;
    } else {
     $retval_0 = 1;
     label = 2207;
     break;
    }
   }
   if ((label | 0) == 2207) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2200) {
    ___assert_func(3400, 418, 6536, 1992);
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin4SyncD2Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZN10ime_pinyin12SpellingTrie16get_spelling_numEv($this) {
   $this = $this | 0;
   return HEAP32[$this + 8 >> 2] | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie18get_spelling_str16Et($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   var $splstr16_queried_ = 0, $spelling_size_ = 0, $1 = 0, $conv5 = 0, $spelling_buf_ = 0, $2 = 0, $pos_014 = 0, $add = 0, $dec_splid = 0, $18 = 0;
   $splstr16_queried_ = $this + 40 | 0;
   HEAP16[HEAP32[$splstr16_queried_ >> 2] >> 1] = 0;
   if (($splid & 65535) > 29) {
    $spelling_size_ = $this + 4 | 0;
    $1 = HEAP32[$spelling_size_ >> 2] | 0;
    if (($1 | 0) == 0) {
     $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
     return $18 | 0;
    }
    $conv5 = $splid - 30 & 65535;
    $spelling_buf_ = $this | 0;
    $pos_014 = 0;
    $2 = $1;
    do {
     $add = (Math_imul($2, $conv5) | 0) + $pos_014 | 0;
     HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + ($pos_014 << 1) >> 1] = HEAP8[(HEAP32[$spelling_buf_ >> 2] | 0) + $add | 0] | 0;
     $pos_014 = $pos_014 + 1 | 0;
     $2 = HEAP32[$spelling_size_ >> 2] | 0;
    } while ($pos_014 >>> 0 < $2 >>> 0);
    $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
    return $18 | 0;
   }
   if (($splid << 16 >> 16 | 0) == 21) {
    HEAP16[HEAP32[$splstr16_queried_ >> 2] >> 1] = 83;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 2 >> 1] = 104;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 4 >> 1] = 0;
    $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
    return $18 | 0;
   } else if (($splid << 16 >> 16 | 0) == 29) {
    HEAP16[HEAP32[$splstr16_queried_ >> 2] >> 1] = 90;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 2 >> 1] = 104;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 4 >> 1] = 0;
    $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
    return $18 | 0;
   } else if (($splid << 16 >> 16 | 0) == 4) {
    HEAP16[HEAP32[$splstr16_queried_ >> 2] >> 1] = 67;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 2 >> 1] = 104;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 4 >> 1] = 0;
    $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
    return $18 | 0;
   } else {
    $dec_splid = ((($splid & 65535) > 3) << 31 >> 31) + $splid & 65535;
    HEAP16[HEAP32[$splstr16_queried_ >> 2] >> 1] = ($dec_splid + 64 & 65535) + ((($dec_splid & 65535) > 19) << 31 >> 31) & 65535;
    HEAP16[(HEAP32[$splstr16_queried_ >> 2] | 0) + 2 >> 1] = 0;
    $18 = HEAP32[$splstr16_queried_ >> 2] | 0;
    return $18 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin12SpellingTrie18get_spelling_str16EtPtj($this, $splid, $splstr16, $splstr16_len) {
   $this = $this | 0;
   $splid = $splid | 0;
   $splstr16 = $splstr16 | 0;
   $splstr16_len = $splstr16_len | 0;
   var $conv8 = 0, $spelling_size_ = 0, $spelling_buf_ = 0, $pos_0 = 0, $add = 0, $2 = 0, $dec_splid = 0, $retval_0 = 0, label = 0;
   if (($splstr16 | 0) == 0 | $splstr16_len >>> 0 < 7) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (($splid & 65535) > 29) {
    $conv8 = $splid - 30 & 65535;
    $spelling_size_ = $this + 4 | 0;
    $spelling_buf_ = $this | 0;
    $pos_0 = 0;
    while (1) {
     if ($pos_0 >>> 0 >= 7) {
      $retval_0 = 0;
      label = 2239;
      break;
     }
     $add = (Math_imul(HEAP32[$spelling_size_ >> 2] | 0, $conv8) | 0) + $pos_0 | 0;
     $2 = HEAP8[(HEAP32[$spelling_buf_ >> 2] | 0) + $add | 0] | 0;
     HEAP16[$splstr16 + ($pos_0 << 1) >> 1] = $2 << 24 >> 24;
     if ($2 << 24 >> 24 == 0) {
      $retval_0 = $pos_0;
      label = 2245;
      break;
     } else {
      $pos_0 = $pos_0 + 1 | 0;
     }
    }
    if ((label | 0) == 2245) {
     return $retval_0 | 0;
    } else if ((label | 0) == 2239) {
     return $retval_0 | 0;
    }
   }
   if (($splid << 16 >> 16 | 0) == 29) {
    HEAP16[$splstr16 >> 1] = 90;
    HEAP16[$splstr16 + 2 >> 1] = 104;
    HEAP16[$splstr16 + 4 >> 1] = 0;
    $retval_0 = 2;
    return $retval_0 | 0;
   } else if (($splid << 16 >> 16 | 0) == 21) {
    HEAP16[$splstr16 >> 1] = 83;
    HEAP16[$splstr16 + 2 >> 1] = 104;
    HEAP16[$splstr16 + 4 >> 1] = 0;
    $retval_0 = 2;
    return $retval_0 | 0;
   } else if (($splid << 16 >> 16 | 0) == 4) {
    HEAP16[$splstr16 >> 1] = 67;
    HEAP16[$splstr16 + 2 >> 1] = 104;
    HEAP16[$splstr16 + 4 >> 1] = 0;
    $retval_0 = 2;
    return $retval_0 | 0;
   } else {
    $dec_splid = ((($splid & 65535) > 3) << 31 >> 31) + $splid & 65535;
    HEAP16[$splstr16 >> 1] = ($dec_splid + 64 & 65535) + ((($dec_splid & 65535) > 19) << 31 >> 31) & 65535;
    HEAP16[$splstr16 + 2 >> 1] = 0;
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin4SyncC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 0;
   HEAP32[$this + 4 >> 2] = 0;
   HEAP32[$this + 8 >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin4Sync18get_last_got_countEv($this) {
   $this = $this | 0;
   return HEAP32[$this + 8 >> 2] | 0;
  }
  function _utf16_strtok($utf16_str, $token_size, $utf16_str_next) {
   $utf16_str = $utf16_str | 0;
   $token_size = $token_size | 0;
   $utf16_str_next = $utf16_str_next | 0;
   var $pos_0 = 0, $arrayidx = 0, $0 = 0, $pos_1 = 0, $arrayidx_sum = 0, $arrayidx13 = 0, $1 = 0, $retval_0 = 0, label = 0;
   if (($utf16_str | 0) == 0 | ($token_size | 0) == 0 | ($utf16_str_next | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $pos_0 = 0;
   }
   while (1) {
    $arrayidx = $utf16_str + ($pos_0 << 1) | 0;
    $0 = HEAP16[$arrayidx >> 1] | 0;
    if (!(($0 << 16 >> 16 | 0) == 32 | ($0 << 16 >> 16 | 0) == 10 | ($0 << 16 >> 16 | 0) == 9)) {
     $pos_1 = 0;
     break;
    }
    $pos_0 = $pos_0 + 1 | 0;
   }
   while (1) {
    $arrayidx_sum = $pos_1 + $pos_0 | 0;
    $arrayidx13 = $utf16_str + ($arrayidx_sum << 1) | 0;
    $1 = HEAP16[$arrayidx13 >> 1] | 0;
    if (($1 << 16 >> 16 | 0) == 9 | ($1 << 16 >> 16 | 0) == 10 | ($1 << 16 >> 16 | 0) == 32) {
     label = 2254;
     break;
    } else if (($1 << 16 >> 16 | 0) == 0) {
     label = 2253;
     break;
    }
    $pos_1 = $pos_1 + 1 | 0;
   }
   do {
    if ((label | 0) == 2254) {
     HEAP32[$utf16_str_next >> 2] = $utf16_str + ($arrayidx_sum + 1 << 1);
    } else if ((label | 0) == 2253) {
     HEAP32[$utf16_str_next >> 2] = 0;
     if (($pos_1 | 0) == 0) {
      $retval_0 = 0;
     } else {
      break;
     }
     return $retval_0 | 0;
    }
   } while (0);
   HEAP16[$arrayidx13 >> 1] = 0;
   HEAP32[$token_size >> 2] = $pos_1;
   $retval_0 = $arrayidx;
   return $retval_0 | 0;
  }
  function _utf16_atoi($utf16_str) {
   $utf16_str = $utf16_str | 0;
   var $cmp1 = 0, $_ = 0, $_10 = 0, $1 = 0, $3 = 0, $pos_014 = 0, $value_013 = 0, $add = 0, $inc12 = 0, $4 = 0, $value_0_lcssa = 0, $retval_0 = 0;
   if (($utf16_str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $cmp1 = (HEAP16[$utf16_str >> 1] | 0) == 45;
   $_ = $cmp1 ? -1 : 1;
   $_10 = $cmp1 & 1;
   $1 = HEAP16[$utf16_str + ($_10 << 1) >> 1] | 0;
   if (($1 - 48 & 65535) < 10) {
    $value_013 = 0;
    $pos_014 = $_10;
    $3 = $1;
    while (1) {
     $add = ($value_013 * 10 | 0) - 48 + ($3 & 65535) | 0;
     $inc12 = $pos_014 + 1 | 0;
     $4 = HEAP16[$utf16_str + ($inc12 << 1) >> 1] | 0;
     if (($4 - 48 & 65535) < 10) {
      $value_013 = $add;
      $pos_014 = $inc12;
      $3 = $4;
     } else {
      $value_0_lcssa = $add;
      break;
     }
    }
   } else {
    $value_0_lcssa = 0;
   }
   $retval_0 = Math_imul($value_0_lcssa, $_) | 0;
   return $retval_0 | 0;
  }
  function _utf16_strlen($utf16_str) {
   $utf16_str = $utf16_str | 0;
   var $size_0 = 0, $retval_0 = 0;
   if (($utf16_str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $size_0 = 0;
   }
   while (1) {
    if ((HEAP16[$utf16_str + ($size_0 << 1) >> 1] | 0) == 0) {
     $retval_0 = $size_0;
     break;
    } else {
     $size_0 = $size_0 + 1 | 0;
    }
   }
   return $retval_0 | 0;
  }
  function _utf16_strcpy_tochar($dst, $src) {
   $dst = $dst | 0;
   $src = $src | 0;
   var $0 = 0, $cp_010 = 0, $src_addr_09 = 0, $incdec_ptr = 0, $incdec_ptr4 = 0, $1 = 0, $retval_0 = 0;
   if (($src | 0) == 0 | ($dst | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $0 = HEAP16[$src >> 1] | 0;
   HEAP8[$dst] = $0 & 255;
   if ($0 << 16 >> 16 == 0) {
    $retval_0 = $dst;
    return $retval_0 | 0;
   } else {
    $src_addr_09 = $src;
    $cp_010 = $dst;
   }
   while (1) {
    $incdec_ptr = $cp_010 + 1 | 0;
    $incdec_ptr4 = $src_addr_09 + 2 | 0;
    $1 = HEAP16[$incdec_ptr4 >> 1] | 0;
    HEAP8[$incdec_ptr] = $1 & 255;
    if ($1 << 16 >> 16 == 0) {
     $retval_0 = $dst;
     break;
    } else {
     $src_addr_09 = $incdec_ptr4;
     $cp_010 = $incdec_ptr;
    }
   }
   return $retval_0 | 0;
  }
  function _utf16_strcmp($str1, $str2) {
   $str1 = $str1 | 0;
   $str2 = $str2 | 0;
   var $pos_0 = 0, $0 = 0, $1 = 0;
   $pos_0 = 0;
   while (1) {
    $0 = HEAP16[$str1 + ($pos_0 << 1) >> 1] | 0;
    $1 = HEAP16[$str2 + ($pos_0 << 1) >> 1] | 0;
    if ($0 << 16 >> 16 == $1 << 16 >> 16 & $0 << 16 >> 16 != 0) {
     $pos_0 = $pos_0 + 1 | 0;
    } else {
     break;
    }
   }
   return ($0 & 65535) - ($1 & 65535) | 0;
  }
  function _utf16_strncmp($str1, $str2, $size) {
   $str1 = $str1 | 0;
   $str2 = $str2 | 0;
   $size = $size | 0;
   var $pos_0 = 0, $0 = 0, $retval_0 = 0;
   $pos_0 = 0;
   while (1) {
    if ($pos_0 >>> 0 >= $size >>> 0) {
     break;
    }
    $0 = HEAP16[$str1 + ($pos_0 << 1) >> 1] | 0;
    if ($0 << 16 >> 16 == (HEAP16[$str2 + ($pos_0 << 1) >> 1] | 0) & $0 << 16 >> 16 != 0) {
     $pos_0 = $pos_0 + 1 | 0;
    } else {
     break;
    }
   }
   if (($pos_0 | 0) == ($size | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = (HEAPU16[$str1 + ($pos_0 << 1) >> 1] | 0) - (HEAPU16[$str2 + ($pos_0 << 1) >> 1] | 0) | 0;
   return $retval_0 | 0;
  }
  function _utf16_strcpy($dst, $src) {
   $dst = $dst | 0;
   $src = $src | 0;
   var $0 = 0, $cp_09 = 0, $src_addr_08 = 0, $incdec_ptr = 0, $incdec_ptr3 = 0, $1 = 0, $retval_0 = 0;
   if (($src | 0) == 0 | ($dst | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $0 = HEAP16[$src >> 1] | 0;
   HEAP16[$dst >> 1] = $0;
   if ($0 << 16 >> 16 == 0) {
    $retval_0 = $dst;
    return $retval_0 | 0;
   } else {
    $src_addr_08 = $src;
    $cp_09 = $dst;
   }
   while (1) {
    $incdec_ptr = $cp_09 + 2 | 0;
    $incdec_ptr3 = $src_addr_08 + 2 | 0;
    $1 = HEAP16[$incdec_ptr3 >> 1] | 0;
    HEAP16[$incdec_ptr >> 1] = $1;
    if ($1 << 16 >> 16 == 0) {
     $retval_0 = $dst;
     break;
    } else {
     $src_addr_08 = $incdec_ptr3;
     $cp_09 = $incdec_ptr;
    }
   }
   return $retval_0 | 0;
  }
  function _utf16_strncpy($dst, $src, $size) {
   $dst = $dst | 0;
   $src = $src | 0;
   $size = $size | 0;
   var $src_addr_0 = 0, $size_addr_0 = 0, $cp_0 = 0, $0 = 0, $retval_0 = 0;
   L2923 : do {
    if (($src | 0) == 0 | ($dst | 0) == 0 | ($size | 0) == 0) {
     $retval_0 = 0;
    } else {
     if (($src | 0) == ($dst | 0)) {
      $retval_0 = $dst;
      break;
     }
     if ($dst >>> 0 < $src >>> 0) {
      $cp_0 = $dst;
      $size_addr_0 = $size;
      $src_addr_0 = $src;
     } else {
      if ($dst >>> 0 <= $src >>> 0) {
       $retval_0 = $dst;
       break;
      }
      if (($src + ($size << 1) | 0) >>> 0 > $dst >>> 0) {
       $retval_0 = $dst;
       break;
      } else {
       $cp_0 = $dst;
       $size_addr_0 = $size;
       $src_addr_0 = $src;
      }
     }
     while (1) {
      if (($size_addr_0 | 0) == 0) {
       $retval_0 = $dst;
       break L2923;
      }
      $0 = HEAP16[$src_addr_0 >> 1] | 0;
      HEAP16[$cp_0 >> 1] = $0;
      if ($0 << 16 >> 16 == 0) {
       $retval_0 = $dst;
       break;
      } else {
       $cp_0 = $cp_0 + 2 | 0;
       $size_addr_0 = $size_addr_0 - 1 | 0;
       $src_addr_0 = $src_addr_0 + 2 | 0;
      }
     }
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie13load_spl_trieEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $spelling_size_ = 0, $spelling_num_ = 0, $score_amplifier_ = 0, $average_score_ = 0, $spelling_buf_ = 0, $3 = 0, $call23 = 0, $call33 = 0, $8 = 0, $retval_0 = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_size_ = $this + 4 | 0;
   if ((_fread($spelling_size_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_num_ = $this + 8 | 0;
   if ((_fread($spelling_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $score_amplifier_ = $this + 12 | 0;
   if ((_fread($score_amplifier_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $average_score_ = $this + 16 | 0;
   if ((_fread($average_score_ | 0, 1, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_buf_ = $this | 0;
   $3 = HEAP32[$spelling_buf_ >> 2] | 0;
   if (($3 | 0) != 0) {
    __ZdaPv($3);
   }
   $call23 = __Znaj(Math_imul(HEAP32[$spelling_num_ >> 2] | 0, HEAP32[$spelling_size_ >> 2] | 0) | 0) | 0;
   HEAP32[$spelling_buf_ >> 2] = $call23;
   if (($call23 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call33 = _fread($call23 | 0, HEAP32[$spelling_size_ >> 2] | 0, HEAP32[$spelling_num_ >> 2] | 0, $fp | 0) | 0;
   $8 = HEAP32[$spelling_num_ >> 2] | 0;
   if (($call33 | 0) != ($8 | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin12SpellingTrie9constructEPKcjjfh($this, HEAP32[$spelling_buf_ >> 2] | 0, HEAP32[$spelling_size_ >> 2] | 0, $8, +HEAPF32[$score_amplifier_ >> 2], HEAP8[$average_score_] | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin4Sync5beginEPKc($this, $filename) {
   $this = $this | 0;
   $filename = $filename | 0;
   var $userdict_ = 0, $call = 0, $dictfile_ = 0, $call9 = 0, $1 = 0, $call19 = 0, $7 = 0, $retval_0 = 0;
   $userdict_ = $this | 0;
   if ((HEAP32[$userdict_ >> 2] | 0) != 0) {
    __ZN10ime_pinyin4Sync6finishEv($this);
   }
   if (($filename | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = _strdup($filename | 0) | 0;
   $dictfile_ = $this + 4 | 0;
   HEAP32[$dictfile_ >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call9 = __Znwj(1132) | 0;
   $1 = $call9;
   __ZN10ime_pinyin8UserDictC2Ev($1);
   HEAP32[$userdict_ >> 2] = $1;
   if (($call9 | 0) == 0) {
    _free(HEAP32[$dictfile_ >> 2] | 0);
    HEAP32[$dictfile_ >> 2] = 0;
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call19 = FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$call9 >> 2] | 0) + 8 >> 2] & 31]($1, HEAP32[$dictfile_ >> 2] | 0, 500001, 6e5) | 0;
   $7 = HEAP32[$userdict_ >> 2] | 0;
   if ($call19) {
    __ZN10ime_pinyin8UserDict9set_limitEjjj($7, 5e3, 2e5, 20);
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   if (($7 | 0) != 0) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$7 >> 2] | 0) + 4 >> 2] & 127]($7);
   }
   HEAP32[$userdict_ >> 2] = 0;
   _free(HEAP32[$dictfile_ >> 2] | 0);
   HEAP32[$dictfile_ >> 2] = 0;
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin4Sync6finishEv($this) {
   $this = $this | 0;
   var $userdict_ = 0, $0 = 0, $3 = 0, $dictfile_ = 0;
   $userdict_ = $this | 0;
   $0 = HEAP32[$userdict_ >> 2] | 0;
   if (($0 | 0) == 0) {
    return;
   }
   FUNCTION_TABLE_ii[HEAP32[(HEAP32[$0 >> 2] | 0) + 12 >> 2] & 31]($0) | 0;
   $3 = HEAP32[$userdict_ >> 2] | 0;
   if (($3 | 0) != 0) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$3 >> 2] | 0) + 4 >> 2] & 127]($3);
   }
   HEAP32[$userdict_ >> 2] = 0;
   $dictfile_ = $this + 4 | 0;
   _free(HEAP32[$dictfile_ >> 2] | 0);
   HEAP32[$dictfile_ >> 2] = 0;
   HEAP32[$this + 8 >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin4Sync10put_lemmasEPti($this, $lemmas, $len) {
   $this = $this | 0;
   $lemmas = $lemmas | 0;
   $len = $len | 0;
   return __ZN10ime_pinyin8UserDict38put_lemmas_no_sync_from_utf16le_stringEPti(HEAP32[$this >> 2] | 0, $lemmas, $len) | 0;
  }
  function __ZN10ime_pinyin4Sync10get_lemmasEPti($this, $str, $size) {
   $this = $this | 0;
   $str = $str | 0;
   $size = $size | 0;
   return __ZN10ime_pinyin8UserDict48get_sync_lemmas_in_utf16le_string_from_beginningEPtiPi(HEAP32[$this >> 2] | 0, $str, $size, $this + 8 | 0) | 0;
  }
  function __ZN10ime_pinyin4Sync15get_total_countEv($this) {
   $this = $this | 0;
   return __ZN10ime_pinyin8UserDict14get_sync_countEv(HEAP32[$this >> 2] | 0) | 0;
  }
  function __ZN10ime_pinyin4Sync14clear_last_gotEv($this) {
   $this = $this | 0;
   var $last_count_ = 0, $0 = 0;
   $last_count_ = $this + 8 | 0;
   $0 = HEAP32[$last_count_ >> 2] | 0;
   if (($0 | 0) < 0) {
    return;
   }
   __ZN10ime_pinyin8UserDict17clear_sync_lemmasEjj(HEAP32[$this >> 2] | 0, 0, $0);
   HEAP32[$last_count_ >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin4Sync12get_capacityEv($this) {
   $this = $this | 0;
   var $stat = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 64 | 0;
   $stat = sp | 0;
   __ZN10ime_pinyin8UserDict5stateEPNS0_12UserDictStatE(HEAP32[$this >> 2] | 0, $stat) | 0;
   STACKTOP = sp;
   return (HEAP32[$stat + 52 >> 2] | 0) - (HEAP32[$stat + 28 >> 2] | 0) | 0;
  }
  function _utf16_atof($utf16_str) {
   $utf16_str = $utf16_str | 0;
   var $arraydecay = 0, $retval_0 = 0.0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 256 | 0;
   if ((_utf16_strlen($utf16_str) | 0) >>> 0 > 255) {
    $retval_0 = 0.0;
    STACKTOP = sp;
    return +$retval_0;
   }
   $arraydecay = sp | 0;
   _utf16_strcpy_tochar($arraydecay, $utf16_str) | 0;
   $retval_0 = +_atof($arraydecay);
   STACKTOP = sp;
   return +$retval_0;
  }
  function __ZN10ime_pinyin8DictListC2Ev($this) {
   $this = $this | 0;
   HEAP8[$this | 0] = 0;
   _memset($this + 8 | 0, 0, 16);
   HEAP32[$this + 4 >> 2] = __ZN10ime_pinyin12SpellingTrie14get_cpinstanceEv() | 0;
   HEAP32[$this + 96 >> 2] = 14;
   HEAP32[$this + 100 >> 2] = 18;
   HEAP32[$this + 104 >> 2] = 10;
   HEAP32[$this + 108 >> 2] = 12;
   HEAP32[$this + 112 >> 2] = 8;
   HEAP32[$this + 116 >> 2] = 32;
   HEAP32[$this + 120 >> 2] = 46;
   HEAP32[$this + 124 >> 2] = 38;
   return;
  }
  function __ZN10ime_pinyin8DictListD2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin8DictList13free_resourceEv($this);
   return;
  }
  function __ZN10ime_pinyin8DictList13free_resourceEv($this) {
   $this = $this | 0;
   var $buf_ = 0, $0 = 0, $scis_hz_ = 0, $2 = 0, $scis_splid_ = 0, $4 = 0;
   $buf_ = $this + 20 | 0;
   $0 = HEAP32[$buf_ >> 2] | 0;
   if (($0 | 0) != 0) {
    _free($0);
   }
   HEAP32[$buf_ >> 2] = 0;
   $scis_hz_ = $this + 12 | 0;
   $2 = HEAP32[$scis_hz_ >> 2] | 0;
   if (($2 | 0) != 0) {
    _free($2);
   }
   HEAP32[$scis_hz_ >> 2] = 0;
   $scis_splid_ = $this + 16 | 0;
   $4 = HEAP32[$scis_splid_ >> 2] | 0;
   if (($4 | 0) == 0) {
    HEAP32[$scis_splid_ >> 2] = 0;
    return;
   }
   _free($4 | 0);
   HEAP32[$scis_splid_ >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin8DictList14alloc_resourceEjj($this, $buf_size, $scis_num) {
   $this = $this | 0;
   $buf_size = $buf_size | 0;
   $scis_num = $scis_num | 0;
   var $call = 0, $scis_num_ = 0, $call5 = 0, $call12 = 0, $retval_0 = 0;
   $call = _malloc($buf_size << 1) | 0;
   HEAP32[$this + 20 >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $scis_num_ = $this + 8 | 0;
   HEAP32[$scis_num_ >> 2] = $scis_num;
   $call5 = _malloc($scis_num << 1) | 0;
   HEAP32[$this + 12 >> 2] = $call5;
   if (($call5 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call12 = _malloc(HEAP32[$scis_num_ >> 2] << 1) | 0;
   HEAP32[$this + 16 >> 2] = $call12;
   $retval_0 = ($call12 | 0) != 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictList9init_listEPKNS_14SingleCharItemEjPKNS_10LemmaEntryEj($this, $scis, $scis_num, $lemma_arr, $lemma_num) {
   $this = $this | 0;
   $scis = $scis | 0;
   $scis_num = $scis_num | 0;
   $lemma_arr = $lemma_arr | 0;
   $lemma_num = $lemma_num | 0;
   var $initialized_ = 0, $0 = 0, $call = 0, $retval_0 = 0;
   if (($scis | 0) == 0 | ($scis_num | 0) == 0 | ($lemma_arr | 0) == 0 | ($lemma_num | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $initialized_ = $this | 0;
   HEAP8[$initialized_] = 0;
   $0 = HEAP32[$this + 20 >> 2] | 0;
   if (($0 | 0) != 0) {
    _free($0);
   }
   $call = __ZN10ime_pinyin8DictList14calculate_sizeEPKNS_10LemmaEntryEj($this, $lemma_arr, $lemma_num) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8DictList14alloc_resourceEjj($this, $call, $scis_num) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8DictList9fill_scisEPKNS_14SingleCharItemEj($this, $scis, $scis_num);
   __ZN10ime_pinyin8DictList9fill_listEPKNS_10LemmaEntryEj($this, $lemma_arr, $lemma_num);
   HEAP8[$initialized_] = 1;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictList13get_lemma_strEjPtt($this, $id_lemma, $str_buf, $str_max) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $str_buf = $str_buf | 0;
   $str_max = $str_max | 0;
   var $sub = 0, $3 = 0, $_lcssa = 0, $add_lcssa29 = 0, $i_024_lcssa28 = 0, $conv625_lcssa27 = 0, $5 = 0, $6 = 0, $add_ptr_sum = 0, $conv3221 = 0, $len_020 = 0, $inc = 0, $retval_0 = 0, $8 = 0, $10 = 0, $12 = 0, $14 = 0, $16 = 0, $18 = 0, $20 = 0, label = 0;
   if ((HEAP8[$this | 0] & 1) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 92 >> 2] | 0) >>> 0 <= $id_lemma >>> 0 | ($str_buf | 0) == 0 | ($str_max & 65535) < 2) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $sub = ($str_max & 65535) - 1 | 0;
   if (($sub | 0) < 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $3 = HEAP32[$this + 60 >> 2] | 0;
   if ($3 >>> 0 > $id_lemma >>> 0) {
    label = 2401;
   } else {
    if ((HEAP32[$this + 64 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
     $conv625_lcssa27 = 0;
     $i_024_lcssa28 = 0;
     $add_lcssa29 = 1;
     $_lcssa = $3;
    } else {
     label = 2401;
    }
   }
   do {
    if ((label | 0) == 2401) {
     if (($sub | 0) < 2) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $8 = HEAP32[$this + 64 >> 2] | 0;
     if ($8 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 68 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 1;
       $i_024_lcssa28 = 1;
       $add_lcssa29 = 2;
       $_lcssa = $8;
       break;
      }
     }
     if (($sub | 0) < 3) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $10 = HEAP32[$this + 68 >> 2] | 0;
     if ($10 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 72 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 2;
       $i_024_lcssa28 = 2;
       $add_lcssa29 = 3;
       $_lcssa = $10;
       break;
      }
     }
     if (($sub | 0) < 4) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $12 = HEAP32[$this + 72 >> 2] | 0;
     if ($12 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 76 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 3;
       $i_024_lcssa28 = 3;
       $add_lcssa29 = 4;
       $_lcssa = $12;
       break;
      }
     }
     if (($sub | 0) < 5) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $14 = HEAP32[$this + 76 >> 2] | 0;
     if ($14 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 80 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 4;
       $i_024_lcssa28 = 4;
       $add_lcssa29 = 5;
       $_lcssa = $14;
       break;
      }
     }
     if (($sub | 0) < 6) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $16 = HEAP32[$this + 80 >> 2] | 0;
     if ($16 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 84 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 5;
       $i_024_lcssa28 = 5;
       $add_lcssa29 = 6;
       $_lcssa = $16;
       break;
      }
     }
     if (($sub | 0) < 7) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $18 = HEAP32[$this + 84 >> 2] | 0;
     if ($18 >>> 0 <= $id_lemma >>> 0) {
      if ((HEAP32[$this + 88 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
       $conv625_lcssa27 = 6;
       $i_024_lcssa28 = 6;
       $add_lcssa29 = 7;
       $_lcssa = $18;
       break;
      }
     }
     if (($sub | 0) < 8) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     $20 = HEAP32[$this + 88 >> 2] | 0;
     if ($20 >>> 0 > $id_lemma >>> 0) {
      $retval_0 = 0;
      return $retval_0 | 0;
     }
     if ((HEAP32[$this + 92 >> 2] | 0) >>> 0 > $id_lemma >>> 0) {
      $conv625_lcssa27 = 7;
      $i_024_lcssa28 = 7;
      $add_lcssa29 = 8;
      $_lcssa = $20;
      break;
     } else {
      $retval_0 = 0;
     }
     return $retval_0 | 0;
    }
   } while (0);
   $5 = HEAP32[$this + 20 >> 2] | 0;
   $6 = HEAP32[$this + 24 + ($conv625_lcssa27 << 2) >> 2] | 0;
   $add_ptr_sum = $6 + (Math_imul($id_lemma - $_lcssa | 0, $add_lcssa29) | 0) | 0;
   $len_020 = 0;
   $conv3221 = 0;
   while (1) {
    HEAP16[$str_buf + ($conv3221 << 1) >> 1] = HEAP16[$5 + ($add_ptr_sum + $conv3221 << 1) >> 1] | 0;
    $inc = $len_020 + 1 & 65535;
    if (($inc & 65535) > ($i_024_lcssa28 & 65535)) {
     break;
    } else {
     $len_020 = $inc;
     $conv3221 = $inc & 65535;
    }
   }
   HEAP16[$str_buf + ($add_lcssa29 << 1) >> 1] = 0;
   $retval_0 = $add_lcssa29 & 65535;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictList21find_pos2_startedbyhzEt($this, $hz_char) {
   $this = $this | 0;
   $hz_char = $hz_char | 0;
   var $hz_char_addr = 0, $buf_ = 0, $arrayidx = 0, $2 = 0, $call = 0, $add_ptr9 = 0, $found_2w_0 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $hz_char_addr = sp | 0;
   HEAP16[$hz_char_addr >> 1] = $hz_char;
   $buf_ = $this + 20 | 0;
   $arrayidx = $this + 28 | 0;
   $2 = HEAP32[$arrayidx >> 2] | 0;
   $call = __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($hz_char_addr, (HEAP32[$buf_ >> 2] | 0) + ($2 << 1) | 0, ((HEAP32[$this + 32 >> 2] | 0) - $2 | 0) >>> 1, 4, 14) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $add_ptr9 = (HEAP32[$buf_ >> 2] | 0) + (HEAP32[$arrayidx >> 2] << 1) | 0;
   $found_2w_0 = $call;
   while (1) {
    if ($found_2w_0 >>> 0 <= $add_ptr9 >>> 0) {
     $retval_0 = $found_2w_0;
     label = 2442;
     break;
    }
    if ((HEAP16[$found_2w_0 >> 1] | 0) == (HEAP16[$found_2w_0 - 2 >> 1] | 0)) {
     $found_2w_0 = $found_2w_0 - 4 | 0;
    } else {
     $retval_0 = $found_2w_0;
     label = 2441;
     break;
    }
   }
   if ((label | 0) == 2442) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2441) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictList21find_pos_startedbyhzsEPKtjPFiPKvS4_E($this, $last_hzs, $word_len, $cmp_func) {
   $this = $this | 0;
   $last_hzs = $last_hzs | 0;
   $word_len = $word_len | 0;
   $cmp_func = $cmp_func | 0;
   var $buf_ = 0, $arrayidx = 0, $2 = 0, $call = 0, $idx_neg = 0, $found_w_0 = 0, $add_ptr14 = 0, $retval_0 = 0, label = 0;
   $buf_ = $this + 20 | 0;
   $arrayidx = $this + 24 + ($word_len - 1 << 2) | 0;
   $2 = HEAP32[$arrayidx >> 2] | 0;
   $call = __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($last_hzs, (HEAP32[$buf_ >> 2] | 0) + ($2 << 1) | 0, (((HEAP32[$this + 24 + ($word_len << 2) >> 2] | 0) - $2 | 0) >>> 0) / ($word_len >>> 0) | 0, $word_len << 1, $cmp_func) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $idx_neg = -$word_len | 0;
   $found_w_0 = $call;
   while (1) {
    if ($found_w_0 >>> 0 <= ((HEAP32[$buf_ >> 2] | 0) + (HEAP32[$arrayidx >> 2] << 1) | 0) >>> 0) {
     $retval_0 = $found_w_0;
     label = 2450;
     break;
    }
    $add_ptr14 = $found_w_0 + ($idx_neg << 1) | 0;
    if ((FUNCTION_TABLE_iii[$cmp_func & 63]($found_w_0, $add_ptr14) | 0) == 0) {
     $found_w_0 = $add_ptr14;
    } else {
     $retval_0 = $found_w_0;
     label = 2449;
     break;
    }
   }
   if ((label | 0) == 2450) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2449) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictList14calculate_sizeEPKNS_10LemmaEntryEj($this, $lemma_arr, $lemma_num) {
   $this = $this | 0;
   $lemma_arr = $lemma_arr | 0;
   $lemma_num = $lemma_num | 0;
   var $idx_by_hz = 0, $arrayidx9 = 0, $arrayidx10 = 0, $list_size_0_lcssa63 = 0, $id_num_0_lcssa62 = 0, $last_hz_len_0_lcssa61 = 0, $arrayidx56 = 0, $arrayidx58 = 0, $last_hz_len_052 = 0, $i_051 = 0, $id_num_050 = 0, $list_size_049 = 0, $0 = 0, $conv = 0, $inc = 0, $sub = 0, $len_038 = 0, $sub26 = 0, $inc40 = 0, $list_size_1 = 0, $id_num_1 = 0, $last_hz_len_1 = 0, $inc47 = 0, $i49_036 = 0, $inc66 = 0, $arrayidx69 = 0, $4 = 0, label = 0;
   do {
    if (($lemma_num | 0) == 0) {
     $last_hz_len_0_lcssa61 = 0;
     $id_num_0_lcssa62 = 0;
     $list_size_0_lcssa63 = 0;
    } else {
     $idx_by_hz = $lemma_arr + 4 | 0;
     $arrayidx9 = $this + 24 | 0;
     $arrayidx10 = $this + 60 | 0;
     $list_size_049 = 0;
     $id_num_050 = 0;
     $i_051 = 0;
     $last_hz_len_052 = 0;
     L3124 : while (1) {
      $0 = HEAP8[$lemma_arr + ($i_051 * 124 | 0) + 116 | 0] | 0;
      $conv = $0 & 255;
      do {
       if (($i_051 | 0) == 0) {
        if ($0 << 24 >> 24 == 0) {
         label = 2458;
         break L3124;
        }
        if ((HEAP32[$idx_by_hz >> 2] | 0) != 1) {
         label = 2460;
         break L3124;
        }
        $inc = $id_num_050 + 1 | 0;
        HEAP32[$arrayidx9 >> 2] = 0;
        HEAP32[$arrayidx10 >> 2] = $inc;
        $last_hz_len_1 = 1;
        $id_num_1 = $inc;
        $list_size_1 = $list_size_049 + 1 | 0;
       } else {
        if ($conv >>> 0 < $last_hz_len_052 >>> 0) {
         label = 2463;
         break L3124;
        }
        if (($conv | 0) == ($last_hz_len_052 | 0)) {
         $last_hz_len_1 = $last_hz_len_052;
         $id_num_1 = $id_num_050 + 1 | 0;
         $list_size_1 = $conv + $list_size_049 | 0;
         break;
        }
        $sub = $conv - 1 | 0;
        if ($last_hz_len_052 >>> 0 < $sub >>> 0) {
         $len_038 = $last_hz_len_052;
         do {
          $sub26 = $len_038 - 1 | 0;
          HEAP32[$this + 24 + ($len_038 << 2) >> 2] = HEAP32[$this + 24 + ($sub26 << 2) >> 2];
          HEAP32[$this + 60 + ($len_038 << 2) >> 2] = HEAP32[$this + 60 + ($sub26 << 2) >> 2];
          $len_038 = $len_038 + 1 | 0;
         } while ($len_038 >>> 0 < $sub >>> 0);
        }
        HEAP32[$this + 24 + ($sub << 2) >> 2] = $list_size_049;
        $inc40 = $id_num_050 + 1 | 0;
        HEAP32[$this + 60 + ($sub << 2) >> 2] = $inc40;
        $last_hz_len_1 = $conv;
        $id_num_1 = $inc40;
        $list_size_1 = $conv + $list_size_049 | 0;
       }
      } while (0);
      $inc47 = $i_051 + 1 | 0;
      if ($inc47 >>> 0 < $lemma_num >>> 0) {
       $list_size_049 = $list_size_1;
       $id_num_050 = $id_num_1;
       $i_051 = $inc47;
       $last_hz_len_052 = $last_hz_len_1;
      } else {
       label = 2454;
       break;
      }
     }
     if ((label | 0) == 2458) {
      ___assert_func(2896, 122, 5992, 4008);
      return 0;
     } else if ((label | 0) == 2454) {
      if ($last_hz_len_1 >>> 0 < 9) {
       $last_hz_len_0_lcssa61 = $last_hz_len_1;
       $id_num_0_lcssa62 = $id_num_1;
       $list_size_0_lcssa63 = $list_size_1;
       break;
      }
      $arrayidx69 = $this + 56 | 0;
      $4 = HEAP32[$arrayidx69 >> 2] | 0;
      return $4 | 0;
     } else if ((label | 0) == 2460) {
      ___assert_func(2896, 123, 5992, 2800);
      return 0;
     } else if ((label | 0) == 2463) {
      ___assert_func(2896, 134, 5992, 1904);
      return 0;
     }
    }
   } while (0);
   $arrayidx56 = $this + 24 | 0;
   $arrayidx58 = $this + 60 | 0;
   $i49_036 = $last_hz_len_0_lcssa61;
   while (1) {
    if (($i49_036 | 0) == 0) {
     HEAP32[$arrayidx56 >> 2] = 0;
     HEAP32[$arrayidx58 >> 2] = 1;
     $i49_036 = $i49_036 + 1 | 0;
     continue;
    } else {
     HEAP32[$this + 24 + ($i49_036 << 2) >> 2] = $list_size_0_lcssa63;
     HEAP32[$this + 60 + ($i49_036 << 2) >> 2] = $id_num_0_lcssa62;
     $inc66 = $i49_036 + 1 | 0;
     if ($inc66 >>> 0 < 9) {
      $i49_036 = $inc66;
      continue;
     } else {
      break;
     }
    }
   }
   $arrayidx69 = $this + 56 | 0;
   $4 = HEAP32[$arrayidx69 >> 2] | 0;
   return $4 | 0;
  }
  function __ZN10ime_pinyin8DictList9fill_scisEPKNS_14SingleCharItemEj($this, $scis, $scis_num) {
   $this = $this | 0;
   $scis = $scis | 0;
   $scis_num = $scis_num | 0;
   var $scis_num_ = 0, $scis_hz_ = 0, $scis_splid_ = 0, $pos_08 = 0;
   $scis_num_ = $this + 8 | 0;
   if ((HEAP32[$scis_num_ >> 2] | 0) != ($scis_num | 0)) {
    ___assert_func(2896, 170, 5504, 1472);
   }
   if ((HEAP32[$scis_num_ >> 2] | 0) == 0) {
    return;
   }
   $scis_hz_ = $this + 12 | 0;
   $scis_splid_ = $this + 16 | 0;
   $pos_08 = 0;
   do {
    HEAP16[(HEAP32[$scis_hz_ >> 2] | 0) + ($pos_08 << 1) >> 1] = HEAP16[$scis + ($pos_08 << 3) + 4 >> 1] | 0;
    HEAP16[(HEAP32[$scis_splid_ >> 2] | 0) + ($pos_08 << 1) >> 1] = HEAP16[$scis + ($pos_08 << 3) + 6 >> 1] | 0;
    $pos_08 = $pos_08 + 1 | 0;
   } while ($pos_08 >>> 0 < (HEAP32[$scis_num_ >> 2] | 0) >>> 0);
   return;
  }
  function __ZN10ime_pinyin8DictList9fill_listEPKNS_10LemmaEntryEj($this, $lemma_arr, $lemma_num) {
   $this = $this | 0;
   $lemma_arr = $lemma_arr | 0;
   $lemma_num = $lemma_num | 0;
   var $buf_ = 0, $hz_str_len = 0, $conv5 = 0, $i_016 = 0, $current_pos_014 = 0, $hz_str_len11 = 0, $inc17 = 0, $add = 0, $id_num_0_lcssa = 0, $current_pos_0_lcssa = 0;
   $buf_ = $this + 20 | 0;
   $hz_str_len = $lemma_arr + 116 | 0;
   _utf16_strncpy(HEAP32[$buf_ >> 2] | 0, $lemma_arr + 8 | 0, HEAPU8[$hz_str_len] | 0) | 0;
   $conv5 = HEAPU8[$hz_str_len] | 0;
   if ($lemma_num >>> 0 > 1) {
    $current_pos_014 = $conv5;
    $i_016 = 1;
    while (1) {
     $hz_str_len11 = $lemma_arr + ($i_016 * 124 | 0) + 116 | 0;
     _utf16_strncpy((HEAP32[$buf_ >> 2] | 0) + ($current_pos_014 << 1) | 0, $lemma_arr + ($i_016 * 124 | 0) + 8 | 0, HEAPU8[$hz_str_len11] | 0) | 0;
     $inc17 = $i_016 + 1 | 0;
     $add = (HEAPU8[$hz_str_len11] | 0) + $current_pos_014 | 0;
     if ($inc17 >>> 0 < $lemma_num >>> 0) {
      $current_pos_014 = $add;
      $i_016 = $inc17;
     } else {
      $current_pos_0_lcssa = $add;
      $id_num_0_lcssa = $lemma_num;
      break;
     }
    }
   } else {
    $current_pos_0_lcssa = $conv5;
    $id_num_0_lcssa = 1;
   }
   if (($current_pos_0_lcssa | 0) != (HEAP32[$this + 56 >> 2] | 0)) {
    ___assert_func(2896, 196, 5592, 1232);
   }
   if (($id_num_0_lcssa | 0) == (HEAP32[$this + 92 >> 2] | 0)) {
    return;
   } else {
    ___assert_func(2896, 197, 5592, 1008);
   }
  }
  function __ZN10ime_pinyin8DictList7predictEPKttPNS_12NPredictItemEjj($this, $last_hzs, $hzs_len, $npre_items, $npre_max, $b4_used) {
   $this = $this | 0;
   $last_hzs = $last_hzs | 0;
   $hzs_len = $hzs_len | 0;
   $npre_items = $npre_items | 0;
   $npre_max = $npre_max | 0;
   $b4_used = $b4_used | 0;
   var $conv = 0, $0 = 0, $call = 0, $sub7 = 0, $buf_ = 0, $1 = 0, $conv557 = 0, $item_num_056 = 0, $pre_len_055 = 0, $conv12 = 0, $call13 = 0, $arrayidx15 = 0, $sub29 = 0, $arrayidx31 = 0, $arrayidx36 = 0, $w_buf_052 = 0, $item_num_151 = 0, $add_ptr21 = 0, $inc = 0, $add_ptr42 = 0, $item_num_2 = 0, $inc43 = 0, $conv5 = 0, $i_048 = 0, $new_num_047 = 0, $arraydecay55 = 0, $e_pos_0 = 0, $11 = 0, $12 = 0, $new_num_1 = 0, $inc70 = 0, $new_num_0_lcssa = 0, label = 0;
   $conv = $hzs_len & 65535;
   if (($hzs_len & 65535) > 7 | $hzs_len << 16 >> 16 == 0) {
    ___assert_func(2896, 236, 5672, 848);
    return 0;
   }
   $0 = HEAP32[$this + 96 + ($conv - 1 << 2) >> 2] | 0;
   $call = __ZN10ime_pinyin5NGram12get_instanceEv() | 0;
   $sub7 = 8 - $conv | 0;
   if ($hzs_len << 16 >> 16 == 8) {
    $new_num_0_lcssa = 0;
    return $new_num_0_lcssa | 0;
   }
   $buf_ = $this + 20 | 0;
   $1 = $last_hzs;
   $pre_len_055 = 1;
   $item_num_056 = 0;
   $conv557 = 1;
   while (1) {
    $conv12 = $pre_len_055 + $hzs_len & 65535;
    $call13 = __ZN10ime_pinyin8DictList21find_pos_startedbyhzsEPKtjPFiPKvS4_E($this, $last_hzs, $conv12, $0) | 0;
    L3183 : do {
     if (($call13 | 0) == 0) {
      $item_num_2 = $item_num_056;
     } else {
      $arrayidx15 = $this + 24 + ($conv12 << 2) | 0;
      if ($call13 >>> 0 >= ((HEAP32[$buf_ >> 2] | 0) + (HEAP32[$arrayidx15 >> 2] << 1) | 0) >>> 0) {
       $item_num_2 = $item_num_056;
       break;
      }
      $sub29 = $conv12 - 1 | 0;
      $arrayidx31 = $this + 24 + ($sub29 << 2) | 0;
      $arrayidx36 = $this + 60 + ($sub29 << 2) | 0;
      $item_num_151 = $item_num_056;
      $w_buf_052 = $call13;
      while (1) {
       if (!((FUNCTION_TABLE_iii[$0 & 63]($w_buf_052, $1) | 0) == 0 & $item_num_151 >>> 0 < $npre_max >>> 0)) {
        $item_num_2 = $item_num_151;
        break L3183;
       }
       $add_ptr21 = $npre_items + ($item_num_151 * 20 | 0) | 0;
       _memset($add_ptr21 | 0, 0, 20);
       _utf16_strncpy($npre_items + ($item_num_151 * 20 | 0) + 4 | 0, $w_buf_052 + ($conv << 1) | 0, $conv557) | 0;
       HEAPF32[$add_ptr21 >> 2] = +__ZN10ime_pinyin5NGram11get_uni_psbEj($call, (HEAP32[$arrayidx36 >> 2] | 0) + (((($w_buf_052 - (HEAP32[$buf_ >> 2] | 0) >> 1) - (HEAP32[$arrayidx31 >> 2] | 0) | 0) >>> 0) / ($conv12 >>> 0) | 0) | 0);
       HEAP16[$npre_items + ($item_num_151 * 20 | 0) + 18 >> 1] = $hzs_len;
       $inc = $item_num_151 + 1 | 0;
       $add_ptr42 = $w_buf_052 + ($conv12 << 1) | 0;
       if ($add_ptr42 >>> 0 < ((HEAP32[$buf_ >> 2] | 0) + (HEAP32[$arrayidx15 >> 2] << 1) | 0) >>> 0) {
        $item_num_151 = $inc;
        $w_buf_052 = $add_ptr42;
       } else {
        $item_num_2 = $inc;
        break;
       }
      }
     }
    } while (0);
    $inc43 = $pre_len_055 + 1 & 65535;
    $conv5 = $inc43 & 65535;
    if ($conv5 >>> 0 > $sub7 >>> 0) {
     break;
    } else {
     $pre_len_055 = $inc43;
     $item_num_056 = $item_num_2;
     $conv557 = $conv5;
    }
   }
   if (($item_num_2 | 0) == 0) {
    $new_num_0_lcssa = 0;
    return $new_num_0_lcssa | 0;
   } else {
    $new_num_047 = 0;
    $i_048 = 0;
   }
   while (1) {
    $arraydecay55 = $npre_items + ($i_048 * 20 | 0) + 4 | 0;
    $e_pos_0 = 1;
    while (1) {
     if ($e_pos_0 >>> 0 > $b4_used >>> 0) {
      label = 2505;
      break;
     }
     if ((_utf16_strncmp($npre_items + ((-$e_pos_0 | 0) * 20 | 0) + 4 | 0, $arraydecay55, 7) | 0) == 0) {
      $new_num_1 = $new_num_047;
      break;
     } else {
      $e_pos_0 = $e_pos_0 + 1 | 0;
     }
    }
    if ((label | 0) == 2505) {
     label = 0;
     $11 = $npre_items + ($new_num_047 * 20 | 0) | 0;
     $12 = $npre_items + ($i_048 * 20 | 0) | 0;
     HEAP32[$11 >> 2] = HEAP32[$12 >> 2];
     HEAP32[$11 + 4 >> 2] = HEAP32[$12 + 4 >> 2];
     HEAP32[$11 + 8 >> 2] = HEAP32[$12 + 8 >> 2];
     HEAP32[$11 + 12 >> 2] = HEAP32[$12 + 12 >> 2];
     HEAP32[$11 + 16 >> 2] = HEAP32[$12 + 16 >> 2];
     $new_num_1 = $new_num_047 + 1 | 0;
    }
    $inc70 = $i_048 + 1 | 0;
    if ($inc70 >>> 0 < $item_num_2 >>> 0) {
     $new_num_047 = $new_num_1;
     $i_048 = $inc70;
    } else {
     $new_num_0_lcssa = $new_num_1;
     break;
    }
   }
   return $new_num_0_lcssa | 0;
  }
  function __ZN10ime_pinyin8DictList20get_splids_for_hanziEttPtt($this, $hanzi, $half_splid, $splids, $max_splids) {
   $this = $this | 0;
   $hanzi = $hanzi | 0;
   $half_splid = $half_splid | 0;
   $splids = $splids | 0;
   $max_splids = $max_splids | 0;
   var $hanzi_addr = 0, $scis_hz_ = 0, $scis_num_ = 0, $call = 0, $4 = 0, $7 = 0, $8 = 0, $hz_found_0 = 0, $add_ptr = 0, $10 = 0, $12 = 0, $cmp23 = 0, $scis_splid_ = 0, $13 = 0, $hz_f_033 = 0, $strict_0_off032 = 0, $strict_0_off0_lcssa = 0, $15 = 0, $cmp48 = 0, $conv68 = 0, $scis_splid_74 = 0, $scis_splid_52 = 0, $spl_trie_ = 0, $scis_splid_62 = 0, $strict_1_off0 = 0, $incdec_ptr27 = 0, $20 = 0, $22 = 0, $hz_found_129 = 0, $found_num_028 = 0, $sub_ptr_div4523 = 0, $conv67 = 0, $found_num_1 = 0, $incdec_ptr80 = 0, $37 = 0, $found_num_0_lcssa = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $hanzi_addr = sp | 0;
   HEAP16[$hanzi_addr >> 1] = $hanzi;
   $scis_hz_ = $this + 12 | 0;
   $scis_num_ = $this + 8 | 0;
   $call = __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($hanzi_addr, HEAP32[$scis_hz_ >> 2] | 0, HEAP32[$scis_num_ >> 2] | 0, 2, 14) | 0;
   $4 = $call;
   if (($call | 0) == 0) {
    ___assert_func(2896, 314, 5768, 688);
    return 0;
   }
   if ((HEAP16[$hanzi_addr >> 1] | 0) != (HEAP16[$4 >> 1] | 0)) {
    ___assert_func(2896, 314, 5768, 688);
    return 0;
   }
   $7 = HEAP32[$scis_hz_ >> 2] | 0;
   $8 = HEAP16[$hanzi_addr >> 1] | 0;
   $hz_found_0 = $4;
   while (1) {
    if ($hz_found_0 >>> 0 <= $7 >>> 0) {
     break;
    }
    $add_ptr = $hz_found_0 - 2 | 0;
    if ($8 << 16 >> 16 == (HEAP16[$add_ptr >> 1] | 0)) {
     $hz_found_0 = $add_ptr;
    } else {
     break;
    }
   }
   $10 = HEAP32[$scis_hz_ >> 2] | 0;
   L3213 : do {
    if ($hz_found_0 >>> 0 < ($10 + (HEAP32[$scis_num_ >> 2] << 1) | 0) >>> 0) {
     $12 = HEAP16[$hanzi_addr >> 1] | 0;
     $cmp23 = $half_splid << 16 >> 16 == 0;
     $scis_splid_ = $this + 16 | 0;
     $strict_0_off032 = 0;
     $hz_f_033 = $hz_found_0;
     $13 = $10;
     while (1) {
      if ($12 << 16 >> 16 != (HEAP16[$hz_f_033 >> 1] | 0)) {
       $strict_0_off0_lcssa = $strict_0_off032;
       break L3213;
      }
      if ($cmp23) {
       label = 2524;
      } else {
       if ((HEAP16[(HEAP32[$scis_splid_ >> 2] | 0) + ((($hz_f_033 - $13 | 0) >>> 1 & 65535) << 1) >> 1] & 31) == $half_splid << 16 >> 16) {
        label = 2524;
       } else {
        $strict_1_off0 = $strict_0_off032;
       }
      }
      if ((label | 0) == 2524) {
       label = 0;
       $strict_1_off0 = 1;
      }
      $incdec_ptr27 = $hz_f_033 + 2 | 0;
      $20 = HEAP32[$scis_hz_ >> 2] | 0;
      if ($incdec_ptr27 >>> 0 < ($20 + (HEAP32[$scis_num_ >> 2] << 1) | 0) >>> 0) {
       $strict_0_off032 = $strict_1_off0;
       $hz_f_033 = $incdec_ptr27;
       $13 = $20;
      } else {
       $strict_0_off0_lcssa = $strict_1_off0;
       break;
      }
     }
    } else {
     $strict_0_off0_lcssa = 0;
    }
   } while (0);
   $15 = HEAP32[$scis_hz_ >> 2] | 0;
   if ($hz_found_0 >>> 0 >= ($15 + (HEAP32[$scis_num_ >> 2] << 1) | 0) >>> 0) {
    $found_num_0_lcssa = 0;
    STACKTOP = sp;
    return $found_num_0_lcssa | 0;
   }
   $cmp48 = $half_splid << 16 >> 16 == 0;
   $conv68 = $max_splids & 65535;
   $scis_splid_74 = $this + 16 | 0;
   $scis_splid_52 = $this + 16 | 0;
   $spl_trie_ = $this + 4 | 0;
   $scis_splid_62 = $this + 16 | 0;
   $found_num_028 = 0;
   $hz_found_129 = $hz_found_0;
   $22 = $15;
   while (1) {
    if ((HEAP16[$hanzi_addr >> 1] | 0) != (HEAP16[$hz_found_129 >> 1] | 0)) {
     $found_num_0_lcssa = $found_num_028;
     label = 2540;
     break;
    }
    $sub_ptr_div4523 = ($hz_found_129 - $22 | 0) >>> 1;
    do {
     if ($cmp48) {
      label = 2531;
     } else {
      if ($strict_0_off0_lcssa) {
       if ((HEAP16[(HEAP32[$scis_splid_52 >> 2] | 0) + (($sub_ptr_div4523 & 65535) << 1) >> 1] & 31) == $half_splid << 16 >> 16) {
        label = 2531;
        break;
       } else {
        $found_num_1 = $found_num_028;
        break;
       }
      } else {
       if (__ZNK10ime_pinyin12SpellingTrie20half_full_compatibleEtt(HEAP32[$spl_trie_ >> 2] | 0, $half_splid, (HEAPU16[(HEAP32[$scis_splid_62 >> 2] | 0) + (($sub_ptr_div4523 & 65535) << 1) >> 1] | 0) >>> 5) | 0) {
        label = 2531;
        break;
       } else {
        $found_num_1 = $found_num_028;
        break;
       }
      }
     }
    } while (0);
    if ((label | 0) == 2531) {
     label = 0;
     $conv67 = $found_num_028 & 65535;
     if (($conv67 + 1 | 0) >>> 0 >= $conv68 >>> 0) {
      label = 2532;
      break;
     }
     HEAP16[$splids + ($conv67 << 1) >> 1] = (HEAPU16[(HEAP32[$scis_splid_74 >> 2] | 0) + (($sub_ptr_div4523 & 65535) << 1) >> 1] | 0) >>> 5;
     $found_num_1 = $found_num_028 + 1 & 65535;
    }
    $incdec_ptr80 = $hz_found_129 + 2 | 0;
    $37 = HEAP32[$scis_hz_ >> 2] | 0;
    if ($incdec_ptr80 >>> 0 < ($37 + (HEAP32[$scis_num_ >> 2] << 1) | 0) >>> 0) {
     $found_num_028 = $found_num_1;
     $hz_found_129 = $incdec_ptr80;
     $22 = $37;
    } else {
     $found_num_0_lcssa = $found_num_1;
     label = 2538;
     break;
    }
   }
   if ((label | 0) == 2538) {
    STACKTOP = sp;
    return $found_num_0_lcssa | 0;
   } else if ((label | 0) == 2540) {
    STACKTOP = sp;
    return $found_num_0_lcssa | 0;
   } else if ((label | 0) == 2532) {
    ___assert_func(2896, 338, 5768, 544);
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8DictList12get_lemma_idEPKtt($this, $str, $str_len) {
   $this = $this | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   var $conv = 0, $sub = 0, $call = 0, $1 = 0, $sub_ptr_div = 0, $2 = 0, $retval_0 = 0;
   if (($str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $conv = $str_len & 65535;
   if (($str_len & 65535) > 8) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $sub = $conv - 1 | 0;
   $call = __ZN10ime_pinyin8DictList21find_pos_startedbyhzsEPKtjPFiPKvS4_E($this, $str, $conv, HEAP32[$this + 96 + ($sub << 2) >> 2] | 0) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $1 = HEAP32[$this + 20 >> 2] | 0;
   if ($call >>> 0 <= $1 >>> 0) {
    ___assert_func(2896, 356, 6080, 4352);
    return 0;
   }
   $sub_ptr_div = $call - $1 >> 1;
   $2 = HEAP32[$this + 24 + ($sub << 2) >> 2] | 0;
   if ($sub_ptr_div >>> 0 < $2 >>> 0) {
    ___assert_func(2896, 357, 6080, 4168);
    return 0;
   }
   $retval_0 = ((($sub_ptr_div - $2 | 0) >>> 0) / ($conv >>> 0) | 0) + (HEAP32[$this + 60 + ($sub << 2) >> 2] | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictList17convert_to_hanzisEPtt($this, $str, $str_len) {
   $this = $this | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   var $scis_hz_ = 0, $str_pos_07 = 0, $arrayidx = 0;
   if (($str | 0) == 0) {
    ___assert_func(2896, 364, 5928, 3992);
   }
   if ($str_len << 16 >> 16 == 0) {
    return;
   }
   $scis_hz_ = $this + 12 | 0;
   $str_pos_07 = 0;
   do {
    $arrayidx = $str + (($str_pos_07 & 65535) << 1) | 0;
    HEAP16[$arrayidx >> 1] = HEAP16[(HEAP32[$scis_hz_ >> 2] | 0) + ((HEAPU16[$arrayidx >> 1] | 0) << 1) >> 1] | 0;
    $str_pos_07 = $str_pos_07 + 1 & 65535;
   } while (($str_pos_07 & 65535) < ($str_len & 65535));
   return;
  }
  function __ZN10ime_pinyin8DictList19convert_to_scis_idsEPtt($this, $str, $str_len) {
   $this = $this | 0;
   $str = $str | 0;
   $str_len = $str_len | 0;
   var $str_pos_05 = 0;
   if (($str | 0) == 0) {
    ___assert_func(2896, 372, 5856, 3992);
   }
   if ($str_len << 16 >> 16 == 0) {
    return;
   } else {
    $str_pos_05 = 0;
   }
   do {
    HEAP16[$str + (($str_pos_05 & 65535) << 1) >> 1] = 256;
    $str_pos_05 = $str_pos_05 + 1 & 65535;
   } while (($str_pos_05 & 65535) < ($str_len & 65535));
   return;
  }
  function __ZN10ime_pinyin8LpiCache9is_cachedEt($this, $splid) {
   $this = $this | 0;
   $splid = $splid | 0;
   var $retval_0 = 0;
   if (($splid & 65535) > 29) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = (HEAP16[(HEAP32[$this + 4 >> 2] | 0) + (($splid & 65535) << 1) >> 1] | 0) != 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8LpiCache9put_cacheEtPNS_10LmaPsbItemEj($this, $splid, $lpi_items, $lpi_num) {
   $this = $this | 0;
   $splid = $splid | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_num = $lpi_num | 0;
   var $conv2_ = 0, $0 = 0, $conv3 = 0, $mul = 0, $conv411 = 0, $pos_010 = 0, $3 = 0, $4 = 0, $5$1 = 0, $inc = 0;
   $conv2_ = $lpi_num >>> 0 < 15 ? $lpi_num & 65535 : 15;
   $0 = HEAP32[$this >> 2] | 0;
   $conv3 = $splid & 65535;
   $mul = $conv3 * 15 | 0;
   if ($conv2_ << 16 >> 16 != 0) {
    $pos_010 = 0;
    $conv411 = 0;
    while (1) {
     $3 = $lpi_items + ($conv411 << 3) | 0;
     $4 = $0 + ($conv411 + $mul << 3) | 0;
     $5$1 = HEAP32[$3 + 4 >> 2] | 0;
     HEAP32[$4 >> 2] = HEAP32[$3 >> 2];
     HEAP32[$4 + 4 >> 2] = $5$1;
     $inc = $pos_010 + 1 & 65535;
     if (($inc & 65535) < ($conv2_ & 65535)) {
      $pos_010 = $inc;
      $conv411 = $inc & 65535;
     } else {
      break;
     }
    }
   }
   HEAP16[(HEAP32[$this + 4 >> 2] | 0) + ($conv3 << 1) >> 1] = $conv2_;
   return $conv2_ & 65535 | 0;
  }
  function __ZN10ime_pinyin8LpiCache9get_cacheEtPNS_10LmaPsbItemEj($this, $splid, $lpi_items, $lpi_max) {
   $this = $this | 0;
   $splid = $splid | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   var $idxprom = 0, $conv = 0, $conv_lpi_max = 0, $2 = 0, $mul = 0, $conv710 = 0, $pos_09 = 0, $5 = 0, $6 = 0, $7$1 = 0;
   $idxprom = $splid & 65535;
   $conv = HEAPU16[(HEAP32[$this + 4 >> 2] | 0) + ($idxprom << 1) >> 1] | 0;
   $conv_lpi_max = $conv >>> 0 < $lpi_max >>> 0 ? $conv : $lpi_max;
   $2 = HEAP32[$this >> 2] | 0;
   $mul = $idxprom * 15 | 0;
   if (($conv_lpi_max | 0) == 0) {
    return $conv_lpi_max | 0;
   } else {
    $pos_09 = 0;
    $conv710 = 0;
   }
   do {
    $5 = $2 + ($conv710 + $mul << 3) | 0;
    $6 = $lpi_items + ($conv710 << 3) | 0;
    $7$1 = HEAP32[$5 + 4 >> 2] | 0;
    HEAP32[$6 >> 2] = HEAP32[$5 >> 2];
    HEAP32[$6 + 4 >> 2] = $7$1;
    $pos_09 = $pos_09 + 1 & 65535;
    $conv710 = $pos_09 & 65535;
   } while ($conv710 >>> 0 < $conv_lpi_max >>> 0);
   return $conv_lpi_max | 0;
  }
  function __ZN10ime_pinyin13SpellingTableC2Ev($this) {
   $this = $this | 0;
   HEAP8[$this | 0] = 0;
   HEAP32[$this + 8 >> 2] = 0;
   HEAP32[$this + 12 >> 2] = 0;
   HEAP32[$this + 32 >> 2] = 0;
   HEAPF64[$this + 24 >> 3] = 0.0;
   HEAP8[$this + 49 | 0] = 1;
   return;
  }
  function __ZN10ime_pinyin13SpellingTable12get_hash_posEPKc($this, $spelling_str) {
   $this = $this | 0;
   $spelling_str = $spelling_str | 0;
   var $spelling_size_ = 0, $pos_09 = 0, $hash_pos_08 = 0, $1 = 0, $add = 0, $inc = 0, $hash_pos_0_lcssa = 0;
   $spelling_size_ = $this + 16 | 0;
   L3297 : do {
    if ((HEAP32[$spelling_size_ >> 2] | 0) == 0) {
     $hash_pos_0_lcssa = 0;
    } else {
     $hash_pos_08 = 0;
     $pos_09 = 0;
     while (1) {
      $1 = HEAP8[$spelling_str + $pos_09 | 0] | 0;
      if ($1 << 24 >> 24 == 0) {
       $hash_pos_0_lcssa = $hash_pos_08;
       break L3297;
      }
      $add = ($1 << 24 >> 24) + $hash_pos_08 | 0;
      $inc = $pos_09 + 1 | 0;
      if ($inc >>> 0 < (HEAP32[$spelling_size_ >> 2] | 0) >>> 0) {
       $hash_pos_08 = $add;
       $pos_09 = $inc;
      } else {
       $hash_pos_0_lcssa = $add;
       break;
      }
     }
    }
   } while (0);
   return ($hash_pos_0_lcssa >>> 0) % ((HEAP32[$this + 4 >> 2] | 0) >>> 0) | 0 | 0;
  }
  function __ZN10ime_pinyin13SpellingTable13hash_pos_nextEj($this, $hash_pos) {
   $this = $this | 0;
   $hash_pos = $hash_pos | 0;
   return (($hash_pos + 123 | 0) >>> 0) % ((HEAP32[$this + 4 >> 2] | 0) >>> 0) | 0 | 0;
  }
  function __ZN10ime_pinyin13SpellingTable19get_score_amplifierEv($this) {
   $this = $this | 0;
   return +(+HEAPF64[$this + 40 >> 3]);
  }
  function __ZN10ime_pinyin13SpellingTable17get_average_scoreEv($this) {
   $this = $this | 0;
   return HEAP8[$this + 48 | 0] | 0;
  }
  function __ZN10ime_pinyin8DictList9save_listEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $buf_ = 0, $arrayidx = 0, $scis_hz_ = 0, $scis_splid_ = 0, $scis_num_ = 0, $call29 = 0, $13 = 0, $call36 = 0, $call44 = 0, $retval_0 = 0;
   if ((HEAP8[$this | 0] & 1) == 0 | ($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $buf_ = $this + 20 | 0;
   if ((HEAP32[$buf_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $arrayidx = $this + 56 | 0;
   if ((HEAP32[$arrayidx >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $scis_hz_ = $this + 12 | 0;
   if ((HEAP32[$scis_hz_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $scis_splid_ = $this + 16 | 0;
   if ((HEAP32[$scis_splid_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $scis_num_ = $this + 8 | 0;
   if ((HEAP32[$scis_num_ >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($scis_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($this + 24 | 0, 4, 9, $fp | 0) | 0) != 9) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fwrite($this + 60 | 0, 4, 9, $fp | 0) | 0) != 9) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call29 = _fwrite(HEAP32[$scis_hz_ >> 2] | 0, 2, HEAP32[$scis_num_ >> 2] | 0, $fp | 0) | 0;
   $13 = HEAP32[$scis_num_ >> 2] | 0;
   if (($call29 | 0) != ($13 | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call36 = _fwrite(HEAP32[$scis_splid_ >> 2] | 0, 2, $13 | 0, $fp | 0) | 0;
   if (($call36 | 0) != (HEAP32[$scis_num_ >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call44 = _fwrite(HEAP32[$buf_ >> 2] | 0, 2, HEAP32[$arrayidx >> 2] | 0, $fp | 0) | 0;
   $retval_0 = ($call44 | 0) == (HEAP32[$arrayidx >> 2] | 0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8DictList9load_listEP7__sFILE($this, $fp) {
   $this = $this | 0;
   $fp = $fp | 0;
   var $initialized_ = 0, $scis_num_ = 0, $arrayidx = 0, $call20 = 0, $8 = 0, $call26 = 0, $call33 = 0, $retval_0 = 0;
   if (($fp | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $initialized_ = $this | 0;
   HEAP8[$initialized_] = 0;
   $scis_num_ = $this + 8 | 0;
   if ((_fread($scis_num_ | 0, 4, 1, $fp | 0) | 0) != 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fread($this + 24 | 0, 4, 9, $fp | 0) | 0) != 9) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((_fread($this + 60 | 0, 4, 9, $fp | 0) | 0) != 9) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8DictList13free_resourceEv($this);
   $arrayidx = $this + 56 | 0;
   if (!(__ZN10ime_pinyin8DictList14alloc_resourceEjj($this, HEAP32[$arrayidx >> 2] | 0, HEAP32[$scis_num_ >> 2] | 0) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call20 = _fread(HEAP32[$this + 12 >> 2] | 0, 2, HEAP32[$scis_num_ >> 2] | 0, $fp | 0) | 0;
   $8 = HEAP32[$scis_num_ >> 2] | 0;
   if (($call20 | 0) != ($8 | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call26 = _fread(HEAP32[$this + 16 >> 2] | 0, 2, $8 | 0, $fp | 0) | 0;
   if (($call26 | 0) != (HEAP32[$scis_num_ >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call33 = _fread(HEAP32[$this + 20 >> 2] | 0, 2, HEAP32[$arrayidx >> 2] | 0, $fp | 0) | 0;
   if (($call33 | 0) != (HEAP32[$arrayidx >> 2] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP8[$initialized_] = 1;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8LpiCacheD2Ev($this) {
   $this = $this | 0;
   var $0 = 0, $2 = 0;
   $0 = HEAP32[$this >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0 | 0);
   }
   $2 = HEAP32[$this + 4 >> 2] | 0;
   if (($2 | 0) == 0) {
    return;
   }
   __ZdaPv($2);
   return;
  }
  function __ZN10ime_pinyin7myqsortEPvjjPFiPKvS2_E($p, $n, $es, $cmp) {
   $p = $p | 0;
   $n = $n | 0;
   $es = $es | 0;
   $cmp = $cmp | 0;
   _qsort($p | 0, $n | 0, $es | 0, $cmp | 0);
   return;
  }
  function __ZN10ime_pinyin9mybsearchEPKvS1_jjPFiS1_S1_E($k, $b, $n, $es, $cmp) {
   $k = $k | 0;
   $b = $b | 0;
   $n = $n | 0;
   $es = $es | 0;
   $cmp = $cmp | 0;
   return _bsearch($k | 0, $b | 0, $n | 0, $es | 0, $cmp | 0) | 0;
  }
  function __ZN10ime_pinyin18compare_raw_spl_ebEPKvS1_($p1, $p2) {
   $p1 = $p1 | 0;
   $p2 = $p2 | 0;
   var $retval_0 = 0;
   do {
    if ((HEAP8[$p1] | 0) == 0) {
     $retval_0 = 1;
    } else {
     if ((HEAP8[$p2] | 0) == 0) {
      $retval_0 = -1;
      break;
     }
     $retval_0 = _strcmp($p1 | 0, $p2 | 0) | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12get_odd_nextEj($value) {
   $value = $value | 0;
   var $v_next_0 = 0, $add = 0, $v_dv_0 = 0;
   $v_next_0 = $value;
   L3382 : while (1) {
    $add = ~~+Math_sqrt(+(+($v_next_0 >>> 0 >>> 0))) + 1 | 0;
    $v_dv_0 = 2;
    while (1) {
     if ($v_dv_0 >>> 0 >= $add >>> 0) {
      break L3382;
     }
     if ((($v_next_0 >>> 0) % ($v_dv_0 >>> 0) | 0 | 0) == 0) {
      break;
     } else {
      $v_dv_0 = $v_dv_0 + 1 | 0;
     }
    }
    $v_next_0 = $v_next_0 + 1 | 0;
   }
   return $v_next_0 | 0;
  }
  function __ZN10ime_pinyin13SpellingTableD2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin13SpellingTable13free_resourceEv($this);
   return;
  }
  function __ZN10ime_pinyin13SpellingTable13free_resourceEv($this) {
   $this = $this | 0;
   var $raw_spellings_ = 0, $0 = 0, $spelling_buf_ = 0, $2 = 0;
   $raw_spellings_ = $this + 8 | 0;
   $0 = HEAP32[$raw_spellings_ >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0 | 0);
   }
   HEAP32[$raw_spellings_ >> 2] = 0;
   $spelling_buf_ = $this + 12 | 0;
   $2 = HEAP32[$spelling_buf_ >> 2] | 0;
   if (($2 | 0) == 0) {
    HEAP32[$spelling_buf_ >> 2] = 0;
    return;
   }
   __ZdaPv($2);
   HEAP32[$spelling_buf_ >> 2] = 0;
   return;
  }
  function __ZN10ime_pinyin13SpellingTable10init_tableEjjb($this, $pure_spl_size, $spl_max_num, $need_score) {
   $this = $this | 0;
   $pure_spl_size = $pure_spl_size | 0;
   $spl_max_num = $spl_max_num | 0;
   $need_score = $need_score | 0;
   var $spelling_size_ = 0, $spelling_max_num_ = 0, $1$0 = 0, $raw_spellings_ = 0, $call13 = 0, $spelling_buf_ = 0, $8 = 0, $11 = 0, $retval_0 = 0;
   if (($pure_spl_size | 0) == 0 | ($spl_max_num | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP8[$this | 0] = $need_score & 1;
   __ZN10ime_pinyin13SpellingTable13free_resourceEv($this);
   $spelling_size_ = $this + 16 | 0;
   HEAP32[$spelling_size_ >> 2] = ($need_score ? 2 : 1) + $pure_spl_size;
   $spelling_max_num_ = $this + 4 | 0;
   HEAP32[$spelling_max_num_ >> 2] = __ZN10ime_pinyin12get_odd_nextEj($spl_max_num) | 0;
   HEAP32[$this + 32 >> 2] = 0;
   $1$0 = _llvm_umul_with_overflow_i32(HEAP32[$spelling_max_num_ >> 2] | 0, 16) | 0;
   $raw_spellings_ = $this + 8 | 0;
   HEAP32[$raw_spellings_ >> 2] = __Znaj(tempRet0 ? -1 : $1$0) | 0;
   $call13 = __Znaj(Math_imul(HEAP32[$spelling_size_ >> 2] | 0, HEAP32[$spelling_max_num_ >> 2] | 0) | 0) | 0;
   $spelling_buf_ = $this + 12 | 0;
   HEAP32[$spelling_buf_ >> 2] = $call13;
   $8 = HEAP32[$raw_spellings_ >> 2] | 0;
   if (($8 | 0) == 0 | ($call13 | 0) == 0) {
    __ZN10ime_pinyin13SpellingTable13free_resourceEv($this);
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    _memset($8 | 0, 0, HEAP32[$spelling_max_num_ >> 2] << 4 | 0);
    $11 = HEAP32[$spelling_buf_ >> 2] | 0;
    _memset($11 | 0, 0, Math_imul(HEAP32[$spelling_size_ >> 2] | 0, HEAP32[$spelling_max_num_ >> 2] | 0) | 0);
    HEAP8[$this + 49 | 0] = 0;
    HEAPF64[$this + 24 >> 3] = 0.0;
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin13SpellingTable12put_spellingEPKcd($this, $spelling_str, $freq) {
   $this = $this | 0;
   $spelling_str = $spelling_str | 0;
   $freq = +$freq;
   var $pos_0 = 0, $total_freq_ = 0, $call6 = 0, $spelling_size_ = 0, $raw_spellings_ = 0, $5 = 0, $7 = 0, $sub28 = 0, $freq20 = 0, $hash_pos_0 = 0, $arraydecay26 = 0, $freq34 = 0, $freq45 = 0, $arraydecay50 = 0, $sub52 = 0, $spelling_num_ = 0, $call62 = 0, $retval_0 = 0, label = 0;
   if ((HEAP8[$this + 49 | 0] & 1) != 0 | ($spelling_str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $pos_0 = 0;
   }
   while (1) {
    if ($pos_0 >>> 0 >= 3) {
     break;
    }
    if ((_strcmp($spelling_str | 0, 10896 + ($pos_0 * 7 | 0) | 0) | 0) == 0) {
     $retval_0 = 0;
     label = 2683;
     break;
    } else {
     $pos_0 = $pos_0 + 1 | 0;
    }
   }
   if ((label | 0) == 2683) {
    return $retval_0 | 0;
   }
   $total_freq_ = $this + 24 | 0;
   HEAPF64[$total_freq_ >> 3] = +HEAPF64[$total_freq_ >> 3] + $freq;
   $call6 = __ZN10ime_pinyin13SpellingTable12get_hash_posEPKc($this, $spelling_str) | 0;
   $spelling_size_ = $this + 16 | 0;
   $raw_spellings_ = $this + 8 | 0;
   HEAP8[(HEAP32[$spelling_size_ >> 2] | 0) - 1 + ((HEAP32[$raw_spellings_ >> 2] | 0) + ($call6 << 4)) | 0] = 0;
   $5 = HEAP32[$raw_spellings_ >> 2] | 0;
   if ((_strncmp($5 + ($call6 << 4) | 0, $spelling_str | 0, (HEAP32[$spelling_size_ >> 2] | 0) - 1 | 0) | 0) == 0) {
    $freq20 = $5 + ($call6 << 4) + 8 | 0;
    HEAPF64[$freq20 >> 3] = +HEAPF64[$freq20 >> 3] + $freq;
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $7 = HEAP32[$raw_spellings_ >> 2] | 0;
   $sub28 = (HEAP32[$spelling_size_ >> 2] | 0) - 1 | 0;
   $hash_pos_0 = $call6;
   while (1) {
    $arraydecay26 = $7 + ($hash_pos_0 << 4) | 0;
    if ((_strncmp($arraydecay26 | 0, $spelling_str | 0, $sub28 | 0) | 0) == 0) {
     label = 2676;
     break;
    }
    if ((HEAP8[$arraydecay26] | 0) == 0) {
     label = 2678;
     break;
    }
    $call62 = __ZN10ime_pinyin13SpellingTable13hash_pos_nextEj($this, $hash_pos_0) | 0;
    if (($call6 | 0) == ($call62 | 0)) {
     $retval_0 = 0;
     label = 2685;
     break;
    } else {
     $hash_pos_0 = $call62;
    }
   }
   if ((label | 0) == 2678) {
    $freq45 = $7 + ($hash_pos_0 << 4) + 8 | 0;
    HEAPF64[$freq45 >> 3] = +HEAPF64[$freq45 >> 3] + $freq;
    $arraydecay50 = (HEAP32[$raw_spellings_ >> 2] | 0) + ($hash_pos_0 << 4) | 0;
    $sub52 = (HEAP32[$spelling_size_ >> 2] | 0) - 1 | 0;
    _strncpy($arraydecay50 | 0, $spelling_str | 0, $sub52 | 0) | 0;
    HEAP8[(HEAP32[$spelling_size_ >> 2] | 0) - 1 + ((HEAP32[$raw_spellings_ >> 2] | 0) + ($hash_pos_0 << 4)) | 0] = 0;
    $spelling_num_ = $this + 32 | 0;
    HEAP32[$spelling_num_ >> 2] = (HEAP32[$spelling_num_ >> 2] | 0) + 1;
    $retval_0 = 1;
    return $retval_0 | 0;
   } else if ((label | 0) == 2685) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2676) {
    $freq34 = $7 + ($hash_pos_0 << 4) + 8 | 0;
    HEAPF64[$freq34 >> 3] = +HEAPF64[$freq34 >> 3] + $freq;
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin13SpellingTable7containEPKc($this, $spelling_str) {
   $this = $this | 0;
   $spelling_str = $spelling_str | 0;
   var $call = 0, $raw_spellings_ = 0, $arrayidx4 = 0, $spelling_size_ = 0, $hash_pos_0 = 0, $call15 = 0, $arrayidx22 = 0, $retval_0 = 0, label = 0;
   if (($spelling_str | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP32[$this + 12 >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if ((HEAP8[$this + 49 | 0] & 1) != 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin13SpellingTable12get_hash_posEPKc($this, $spelling_str) | 0;
   $raw_spellings_ = $this + 8 | 0;
   $arrayidx4 = (HEAP32[$raw_spellings_ >> 2] | 0) + ($call << 4) | 0;
   if ((HEAP8[$arrayidx4] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_size_ = $this + 16 | 0;
   if ((_strncmp($arrayidx4 | 0, $spelling_str | 0, (HEAP32[$spelling_size_ >> 2] | 0) - 1 | 0) | 0) == 0) {
    $retval_0 = 1;
    return $retval_0 | 0;
   } else {
    $hash_pos_0 = $call;
   }
   while (1) {
    $call15 = __ZN10ime_pinyin13SpellingTable13hash_pos_nextEj($this, $hash_pos_0) | 0;
    if (($call | 0) == ($call15 | 0)) {
     $retval_0 = 0;
     label = 2701;
     break;
    }
    $arrayidx22 = (HEAP32[$raw_spellings_ >> 2] | 0) + ($call15 << 4) | 0;
    if ((HEAP8[$arrayidx22] | 0) == 0) {
     $retval_0 = 0;
     label = 2698;
     break;
    }
    if ((_strncmp($arrayidx22 | 0, $spelling_str | 0, (HEAP32[$spelling_size_ >> 2] | 0) - 1 | 0) | 0) == 0) {
     $retval_0 = 1;
     label = 2702;
     break;
    } else {
     $hash_pos_0 = $call15;
    }
   }
   if ((label | 0) == 2698) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2701) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2702) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin14SpellingParserC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = __ZN10ime_pinyin12SpellingTrie14get_cpinstanceEv() | 0;
   return;
  }
  function __ZN10ime_pinyin14SpellingParser17is_valid_to_parseEc($this, $ch) {
   $this = $this | 0;
   $ch = $ch | 0;
   return __ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc($ch) | 0;
  }
  function __ZN10ime_pinyin8LpiCacheC2Ev($this) {
   $this = $this | 0;
   var $lpi_cache_ = 0, $call2 = 0, $lpi_cache_len_ = 0, $id_03 = 0;
   $lpi_cache_ = $this | 0;
   HEAP32[$lpi_cache_ >> 2] = __Znaj(3600) | 0;
   $call2 = __Znaj(60) | 0;
   $lpi_cache_len_ = $this + 4 | 0;
   HEAP32[$lpi_cache_len_ >> 2] = $call2;
   if ((HEAP32[$lpi_cache_ >> 2] | 0) == 0) {
    ___assert_func(2496, 27, 4560, 3920);
   }
   if (($call2 | 0) == 0) {
    ___assert_func(2496, 28, 4560, 2776);
   } else {
    $id_03 = 0;
   }
   do {
    HEAP16[(HEAP32[$lpi_cache_len_ >> 2] | 0) + (($id_03 & 65535) << 1) >> 1] = 0;
    $id_03 = $id_03 + 1 & 65535;
   } while (($id_03 & 65535) < 30);
   return;
  }
  function __ZN10ime_pinyin8LpiCache12get_instanceEv() {
   var $call = 0, $1 = 0, $3 = 0;
   if ((HEAP32[11852] | 0) != 0) {
    $3 = HEAP32[11852] | 0;
    return $3 | 0;
   }
   $call = __Znwj(8) | 0;
   $1 = $call;
   __ZN10ime_pinyin8LpiCacheC2Ev($1);
   HEAP32[11852] = $1;
   if (($call | 0) == 0) {
    ___assert_func(2496, 44, 4600, 1864);
    return 0;
   } else {
    $3 = HEAP32[11852] | 0;
    return $3 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin13SpellingTable7arrangeEPjS1_($this, $item_size, $spl_num) {
   $this = $this | 0;
   $item_size = $item_size | 0;
   $spl_num = $spl_num | 0;
   var $raw_spellings_ = 0, $0 = 0, $spelling_buf_ = 0, $spelling_num_ = 0, $spelling_size_ = 0, $pos_040 = 0, $5 = 0, $6 = 0, $add_ptr = 0, $need_score_ = 0, $total_freq_ = 0, $pos13_036 = 0, $min_score_035 = 0.0, $freq = 0, $17 = 0, $19 = 0.0, $min_score_1 = 0.0, $inc49 = 0, $min_score_0_lcssa = 0.0, $score_amplifier_ = 0, $spelling_size_70 = 0, $pos54_031 = 0, $average_score_030 = 0.0, $call62 = 0.0, $mul64 = 0.0, $add = 0.0, $25 = 0, $26 = 0, $inc76 = 0, $28 = 0, $_lcssa = 0, $average_score_0_lcssa = 0.0, $div80 = 0.0, $retval_0 = 0;
   $raw_spellings_ = $this + 8 | 0;
   $0 = HEAP32[$raw_spellings_ >> 2] | 0;
   if (($0 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $spelling_buf_ = $this + 12 | 0;
   if ((HEAP32[$spelling_buf_ >> 2] | 0) == 0 | ($item_size | 0) == 0 | ($spl_num | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   _qsort($0 | 0, HEAP32[$this + 4 >> 2] | 0, 16, 40);
   $spelling_num_ = $this + 32 | 0;
   if ((HEAP32[$spelling_num_ >> 2] | 0) != 0) {
    $spelling_size_ = $this + 16 | 0;
    $pos_040 = 0;
    do {
     $5 = HEAP32[$spelling_buf_ >> 2] | 0;
     $6 = HEAP32[$spelling_size_ >> 2] | 0;
     $add_ptr = $5 + (Math_imul($6, $pos_040) | 0) | 0;
     _strncpy($add_ptr | 0, (HEAP32[$raw_spellings_ >> 2] | 0) + ($pos_040 << 4) | 0, $6 | 0) | 0;
     $pos_040 = $pos_040 + 1 | 0;
    } while ($pos_040 >>> 0 < (HEAP32[$spelling_num_ >> 2] | 0) >>> 0);
   }
   $need_score_ = $this | 0;
   do {
    if ((HEAP8[$need_score_] & 1) != 0) {
     if ((HEAP32[$spelling_num_ >> 2] | 0) == 0) {
      $min_score_0_lcssa = 0.0;
     } else {
      $total_freq_ = $this + 24 | 0;
      $min_score_035 = 0.0;
      $pos13_036 = 0;
      while (1) {
       $freq = (HEAP32[$raw_spellings_ >> 2] | 0) + ($pos13_036 << 4) + 8 | 0;
       HEAPF64[$freq >> 3] = +HEAPF64[$freq >> 3] / +HEAPF64[$total_freq_ >> 3];
       do {
        if ((HEAP8[$need_score_] & 1) == 0) {
         $min_score_1 = $min_score_035;
        } else {
         $17 = HEAP32[$raw_spellings_ >> 2] | 0;
         if (($pos13_036 | 0) == 0) {
          $min_score_1 = +HEAPF64[$17 + 8 >> 3];
          break;
         }
         $19 = +HEAPF64[$17 + ($pos13_036 << 4) + 8 >> 3];
         if ($19 >= $min_score_035) {
          $min_score_1 = $min_score_035;
          break;
         }
         $min_score_1 = $19;
        }
       } while (0);
       $inc49 = $pos13_036 + 1 | 0;
       if ($inc49 >>> 0 < (HEAP32[$spelling_num_ >> 2] | 0) >>> 0) {
        $min_score_035 = $min_score_1;
        $pos13_036 = $inc49;
       } else {
        $min_score_0_lcssa = $min_score_1;
        break;
       }
      }
     }
     $score_amplifier_ = $this + 40 | 0;
     HEAPF64[$score_amplifier_ >> 3] = 255.0 / +Math_log(+$min_score_0_lcssa);
     L3498 : do {
      if ((HEAP32[$spelling_num_ >> 2] | 0) == 0) {
       $average_score_0_lcssa = 0.0;
       $_lcssa = 0;
      } else {
       $spelling_size_70 = $this + 16 | 0;
       $average_score_030 = 0.0;
       $pos54_031 = 0;
       while (1) {
        $call62 = +Math_log(+(+HEAPF64[(HEAP32[$raw_spellings_ >> 2] | 0) + ($pos54_031 << 4) + 8 >> 3]));
        $mul64 = $call62 * +HEAPF64[$score_amplifier_ >> 3];
        if ($mul64 < 0.0) {
         break;
        }
        $add = $average_score_030 + $mul64;
        $25 = HEAP32[$spelling_buf_ >> 2] | 0;
        $26 = HEAP32[$spelling_size_70 >> 2] | 0;
        HEAP8[$25 + ($26 - 1 + (Math_imul($26, $pos54_031) | 0)) | 0] = $mul64 > 255.0 ? -1 : ~~$mul64;
        $inc76 = $pos54_031 + 1 | 0;
        $28 = HEAP32[$spelling_num_ >> 2] | 0;
        if ($inc76 >>> 0 < $28 >>> 0) {
         $average_score_030 = $add;
         $pos54_031 = $inc76;
        } else {
         $average_score_0_lcssa = $add;
         $_lcssa = $28;
         break L3498;
        }
       }
       ___assert_func(2376, 272, 6328, 3848);
       return 0;
      }
     } while (0);
     $div80 = $average_score_0_lcssa / +($_lcssa >>> 0 >>> 0);
     if ($div80 > 255.0) {
      ___assert_func(2376, 290, 6328, 2752);
      return 0;
     } else {
      HEAP8[$this + 48 | 0] = ~~$div80;
      break;
     }
    }
   } while (0);
   HEAP32[$item_size >> 2] = HEAP32[$this + 16 >> 2];
   HEAP32[$spl_num >> 2] = HEAP32[$spelling_num_ >> 2];
   HEAP8[$this + 49 | 0] = 1;
   $retval_0 = HEAP32[$spelling_buf_ >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin12SpellingTrie16is_same_spl_charEcc($ch1, $ch2) {
   $ch1 = $ch1 | 0;
   $ch2 = $ch2 | 0;
   var $conv = 0, $conv1 = 0, $0 = 0;
   $conv = $ch1 << 24 >> 24;
   $conv1 = $ch2 << 24 >> 24;
   if ($ch1 << 24 >> 24 == $ch2 << 24 >> 24) {
    $0 = 1;
    return $0 | 0;
   }
   if (($conv - $conv1 | 0) == 32) {
    $0 = 1;
    return $0 | 0;
   }
   $0 = ($conv1 - $conv | 0) == 32;
   return $0 | 0;
  }
  function __ZN10ime_pinyin14SpellingParser14splstr_to_idxsEPKctPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $spl_idx = $spl_idx | 0;
   $start_pos = $start_pos | 0;
   $max_size = $max_size | 0;
   $last_is_pre = $last_is_pre | 0;
   var $id_this = 0, $id_this75 = 0, $id_this99 = 0, $spl_trie_ = 0, $2 = 0, $cmp8 = 0, $idx_num_0_ph = 0, $last_is_splitter_0_off0_ph = 0, $str_pos_0_ph = 0, $node_this_0_ph = 0, $arrayidx41 = 0, $last_is_splitter_0_off0_ph60_ph = 0, $str_pos_0_ph61_ph = 0, $node_this_0_ph62_ph = 0, $4 = 0, $str_pos_0_ph6183 = 0, $last_is_splitter_0_off0_ph6082 = 0, $str_pos_071 = 0, $5 = 0, $inc = 0, $inc23 = 0, $inc37 = 0, $conv48 = 0, $13 = 0, $conv65 = 0, $i_0 = 0, $found_son_0 = 0, $inc83 = 0, $idx_num_0_ph_be = 0, $last_is_splitter_0_off0_ph_be = 0, $str_pos_0_ph_be = 0, $last_is_splitter_0_off0_ph6076 = 0, $str_pos_0_lcssa = 0, $inc107 = 0, $idx_num_1 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 24 | 0;
   $id_this = sp | 0;
   $id_this75 = sp + 8 | 0;
   $id_this99 = sp + 16 | 0;
   if (($splstr | 0) == 0 | $max_size << 16 >> 16 == 0 | $str_len << 16 >> 16 == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc(HEAP8[$splstr] | 0) | 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP8[$last_is_pre] = 0;
   $spl_trie_ = $this | 0;
   $2 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 44 >> 2] | 0;
   $cmp8 = ($start_pos | 0) != 0;
   if ($cmp8) {
    HEAP16[$start_pos >> 1] = 0;
    $node_this_0_ph = $2;
    $str_pos_0_ph = 0;
    $last_is_splitter_0_off0_ph = 0;
    $idx_num_0_ph = 0;
   } else {
    $node_this_0_ph = $2;
    $str_pos_0_ph = 0;
    $last_is_splitter_0_off0_ph = 0;
    $idx_num_0_ph = 0;
   }
   L3527 : while (1) {
    $arrayidx41 = $start_pos + (($idx_num_0_ph & 65535) << 1) | 0;
    $node_this_0_ph62_ph = $node_this_0_ph;
    $str_pos_0_ph61_ph = $str_pos_0_ph;
    $last_is_splitter_0_off0_ph60_ph = $last_is_splitter_0_off0_ph;
    L3529 : while (1) {
     if (($str_pos_0_ph61_ph & 65535) >= ($str_len & 65535)) {
      $str_pos_0_lcssa = $str_pos_0_ph61_ph;
      $last_is_splitter_0_off0_ph6076 = $last_is_splitter_0_off0_ph60_ph;
      label = 2785;
      break L3527;
     }
     $4 = $node_this_0_ph62_ph + 4 | 0;
     $last_is_splitter_0_off0_ph6082 = $last_is_splitter_0_off0_ph60_ph;
     $str_pos_0_ph6183 = $str_pos_0_ph61_ph;
     L3532 : while (1) {
      $str_pos_071 = $str_pos_0_ph6183;
      while (1) {
       $5 = HEAP8[$splstr + ($str_pos_071 & 65535) | 0] | 0;
       if (__ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc($5) | 0) {
        break L3532;
       }
       HEAP16[$id_this >> 1] = HEAP16[$4 >> 1] & 2047;
       if (__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this) | 0) {
        label = 2765;
        break L3529;
       }
       if (!$last_is_splitter_0_off0_ph6082) {
        $retval_0 = $idx_num_0_ph;
        label = 2796;
        break L3527;
       }
       $inc37 = $str_pos_071 + 1 & 65535;
       if (!$cmp8) {
        break;
       }
       HEAP16[$arrayidx41 >> 1] = $inc37;
       if (($inc37 & 65535) < ($str_len & 65535)) {
        $str_pos_071 = $inc37;
       } else {
        $str_pos_0_lcssa = $inc37;
        $last_is_splitter_0_off0_ph6076 = $last_is_splitter_0_off0_ph6082;
        label = 2785;
        break L3527;
       }
      }
      if (($inc37 & 65535) < ($str_len & 65535)) {
       $last_is_splitter_0_off0_ph6082 = 1;
       $str_pos_0_ph6183 = $inc37;
      } else {
       $str_pos_0_lcssa = $inc37;
       $last_is_splitter_0_off0_ph6076 = 1;
       label = 2785;
       break L3527;
      }
     }
     do {
      if ($str_pos_071 << 16 >> 16 == 0) {
       $conv48 = $5 << 24 >> 24;
       if ($5 << 24 >> 24 > 96) {
        $found_son_0 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 56 + ($conv48 - 97 << 2) >> 2] | 0;
        break;
       } else {
        $found_son_0 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 56 + ($conv48 - 65 << 2) >> 2] | 0;
        break;
       }
      } else {
       $13 = HEAP32[$node_this_0_ph62_ph >> 2] | 0;
       $conv65 = (HEAPU16[$node_this_0_ph62_ph + 4 >> 1] | 0) >>> 11 & 65535;
       $i_0 = 0;
       while (1) {
        if (($i_0 | 0) >= ($conv65 | 0)) {
         label = 2780;
         break L3529;
        }
        if (__ZN10ime_pinyin12SpellingTrie16is_same_spl_charEcc(HEAP8[$13 + ($i_0 << 3) + 6 | 0] | 0, $5) | 0) {
         break;
        } else {
         $i_0 = $i_0 + 1 | 0;
        }
       }
       $found_son_0 = $13 + ($i_0 << 3) | 0;
      }
     } while (0);
     if (($found_son_0 | 0) == 0) {
      label = 2780;
      break;
     } else {
      $node_this_0_ph62_ph = $found_son_0;
      $str_pos_0_ph61_ph = $str_pos_071 + 1 & 65535;
      $last_is_splitter_0_off0_ph60_ph = 0;
     }
    }
    if ((label | 0) == 2780) {
     label = 0;
     HEAP16[$id_this75 >> 1] = HEAP16[$node_this_0_ph62_ph + 4 >> 1] & 2047;
     if (!(__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this75) | 0)) {
      $retval_0 = $idx_num_0_ph;
      label = 2793;
      break;
     }
     HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this75 >> 1] | 0;
     $inc83 = $idx_num_0_ph + 1 & 65535;
     if ($cmp8) {
      HEAP16[$start_pos + (($inc83 & 65535) << 1) >> 1] = $str_pos_071;
     }
     if (($inc83 & 65535) < ($max_size & 65535)) {
      $str_pos_0_ph_be = $str_pos_071;
      $last_is_splitter_0_off0_ph_be = 0;
      $idx_num_0_ph_be = $inc83;
     } else {
      $retval_0 = $inc83;
      label = 2791;
      break;
     }
    } else if ((label | 0) == 2765) {
     label = 0;
     HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this >> 1] | 0;
     $inc = $idx_num_0_ph + 1 & 65535;
     $inc23 = $str_pos_071 + 1 & 65535;
     if ($cmp8) {
      HEAP16[$start_pos + (($inc & 65535) << 1) >> 1] = $inc23;
     }
     if (($inc & 65535) < ($max_size & 65535)) {
      $str_pos_0_ph_be = $inc23;
      $last_is_splitter_0_off0_ph_be = 1;
      $idx_num_0_ph_be = $inc;
     } else {
      $retval_0 = $inc;
      label = 2795;
      break;
     }
    }
    $node_this_0_ph = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 44 >> 2] | 0;
    $str_pos_0_ph = $str_pos_0_ph_be;
    $last_is_splitter_0_off0_ph = $last_is_splitter_0_off0_ph_be;
    $idx_num_0_ph = $idx_num_0_ph_be;
   }
   if ((label | 0) == 2785) {
    HEAP16[$id_this99 >> 1] = HEAP16[$node_this_0_ph62_ph + 4 >> 1] & 2047;
    do {
     if (__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this99) | 0) {
      HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this99 >> 1] | 0;
      $inc107 = $idx_num_0_ph + 1 & 65535;
      if (!$cmp8) {
       $idx_num_1 = $inc107;
       break;
      }
      HEAP16[$start_pos + (($inc107 & 65535) << 1) >> 1] = $str_pos_0_lcssa;
      $idx_num_1 = $inc107;
     } else {
      $idx_num_1 = $idx_num_0_ph;
     }
    } while (0);
    HEAP8[$last_is_pre] = $last_is_splitter_0_off0_ph6076 & 1 ^ 1;
    $retval_0 = $idx_num_1;
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2791) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2793) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2795) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2796) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin14SpellingParser16splstr_to_idxs_fEPKctPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $spl_idx = $spl_idx | 0;
   $start_pos = $start_pos | 0;
   $max_size = $max_size | 0;
   $last_is_pre = $last_is_pre | 0;
   var $call = 0, $spl_trie_ = 0, $sub = 0, $conv14 = 0, $pos_013 = 0, $arrayidx = 0, $2 = 0, $3 = 0, $inc = 0;
   $call = __ZN10ime_pinyin14SpellingParser14splstr_to_idxsEPKctPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) | 0;
   if ($call << 16 >> 16 == 0) {
    return $call | 0;
   }
   $spl_trie_ = $this | 0;
   $sub = ($call & 65535) - 1 | 0;
   $pos_013 = 0;
   $conv14 = 0;
   while (1) {
    $arrayidx = $spl_idx + ($conv14 << 1) | 0;
    do {
     if (__ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arrayidx >> 1] | 0) | 0) {
      $2 = HEAP32[$spl_trie_ >> 2] | 0;
      $3 = HEAP16[$arrayidx >> 1] | 0;
      __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($2, $3, $arrayidx) | 0;
      if (($conv14 | 0) != ($sub | 0)) {
       break;
      }
      HEAP8[$last_is_pre] = 0;
     }
    } while (0);
    $inc = $pos_013 + 1 & 65535;
    if (($inc & 65535) < ($call & 65535)) {
     $pos_013 = $inc;
     $conv14 = $inc & 65535;
    } else {
     break;
    }
   }
   return $call | 0;
  }
  function __ZN10ime_pinyin14SpellingParser16splstr16_to_idxsEPKttPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $spl_idx = $spl_idx | 0;
   $start_pos = $start_pos | 0;
   $max_size = $max_size | 0;
   $last_is_pre = $last_is_pre | 0;
   var $id_this = 0, $id_this78 = 0, $id_this102 = 0, $spl_trie_ = 0, $2 = 0, $cmp9 = 0, $idx_num_0_ph = 0, $last_is_splitter_0_off0_ph = 0, $str_pos_0_ph = 0, $node_this_0_ph = 0, $arrayidx43 = 0, $last_is_splitter_0_off0_ph60_ph = 0, $str_pos_0_ph61_ph = 0, $node_this_0_ph62_ph = 0, $4 = 0, $str_pos_0_ph6186 = 0, $last_is_splitter_0_off0_ph6085 = 0, $str_pos_074 = 0, $5 = 0, $conv17 = 0, $inc = 0, $inc25 = 0, $inc39 = 0, $conv50 = 0, $13 = 0, $conv67 = 0, $i_0 = 0, $found_son_0 = 0, $inc86 = 0, $idx_num_0_ph_be = 0, $last_is_splitter_0_off0_ph_be = 0, $str_pos_0_ph_be = 0, $last_is_splitter_0_off0_ph6079 = 0, $str_pos_0_lcssa = 0, $inc110 = 0, $idx_num_1 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 24 | 0;
   $id_this = sp | 0;
   $id_this78 = sp + 8 | 0;
   $id_this102 = sp + 16 | 0;
   if (($splstr | 0) == 0 | $max_size << 16 >> 16 == 0 | $str_len << 16 >> 16 == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc(HEAP16[$splstr >> 1] & 255) | 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP8[$last_is_pre] = 0;
   $spl_trie_ = $this | 0;
   $2 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 44 >> 2] | 0;
   $cmp9 = ($start_pos | 0) != 0;
   if ($cmp9) {
    HEAP16[$start_pos >> 1] = 0;
    $node_this_0_ph = $2;
    $str_pos_0_ph = 0;
    $last_is_splitter_0_off0_ph = 0;
    $idx_num_0_ph = 0;
   } else {
    $node_this_0_ph = $2;
    $str_pos_0_ph = 0;
    $last_is_splitter_0_off0_ph = 0;
    $idx_num_0_ph = 0;
   }
   L3595 : while (1) {
    $arrayidx43 = $start_pos + (($idx_num_0_ph & 65535) << 1) | 0;
    $node_this_0_ph62_ph = $node_this_0_ph;
    $str_pos_0_ph61_ph = $str_pos_0_ph;
    $last_is_splitter_0_off0_ph60_ph = $last_is_splitter_0_off0_ph;
    L3597 : while (1) {
     if (($str_pos_0_ph61_ph & 65535) >= ($str_len & 65535)) {
      $str_pos_0_lcssa = $str_pos_0_ph61_ph;
      $last_is_splitter_0_off0_ph6079 = $last_is_splitter_0_off0_ph60_ph;
      label = 2837;
      break L3595;
     }
     $4 = $node_this_0_ph62_ph + 4 | 0;
     $last_is_splitter_0_off0_ph6085 = $last_is_splitter_0_off0_ph60_ph;
     $str_pos_0_ph6186 = $str_pos_0_ph61_ph;
     L3600 : while (1) {
      $str_pos_074 = $str_pos_0_ph6186;
      while (1) {
       $5 = HEAP16[$splstr + (($str_pos_074 & 65535) << 1) >> 1] | 0;
       $conv17 = $5 & 255;
       if (__ZN10ime_pinyin12SpellingTrie17is_valid_spl_charEc($conv17) | 0) {
        break L3600;
       }
       HEAP16[$id_this >> 1] = HEAP16[$4 >> 1] & 2047;
       if (__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this) | 0) {
        label = 2817;
        break L3597;
       }
       if (!$last_is_splitter_0_off0_ph6085) {
        $retval_0 = $idx_num_0_ph;
        label = 2846;
        break L3595;
       }
       $inc39 = $str_pos_074 + 1 & 65535;
       if (!$cmp9) {
        break;
       }
       HEAP16[$arrayidx43 >> 1] = $inc39;
       if (($inc39 & 65535) < ($str_len & 65535)) {
        $str_pos_074 = $inc39;
       } else {
        $str_pos_0_lcssa = $inc39;
        $last_is_splitter_0_off0_ph6079 = $last_is_splitter_0_off0_ph6085;
        label = 2837;
        break L3595;
       }
      }
      if (($inc39 & 65535) < ($str_len & 65535)) {
       $last_is_splitter_0_off0_ph6085 = 1;
       $str_pos_0_ph6186 = $inc39;
      } else {
       $str_pos_0_lcssa = $inc39;
       $last_is_splitter_0_off0_ph6079 = 1;
       label = 2837;
       break L3595;
      }
     }
     do {
      if ($str_pos_074 << 16 >> 16 == 0) {
       $conv50 = $5 & 65535;
       if (($5 & 65535) > 96) {
        $found_son_0 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 56 + ($conv50 - 97 << 2) >> 2] | 0;
        break;
       } else {
        $found_son_0 = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 56 + ($conv50 - 65 << 2) >> 2] | 0;
        break;
       }
      } else {
       $13 = HEAP32[$node_this_0_ph62_ph >> 2] | 0;
       $conv67 = (HEAPU16[$node_this_0_ph62_ph + 4 >> 1] | 0) >>> 11 & 65535;
       $i_0 = 0;
       while (1) {
        if (($i_0 | 0) >= ($conv67 | 0)) {
         label = 2832;
         break L3597;
        }
        if (__ZN10ime_pinyin12SpellingTrie16is_same_spl_charEcc(HEAP8[$13 + ($i_0 << 3) + 6 | 0] | 0, $conv17) | 0) {
         break;
        } else {
         $i_0 = $i_0 + 1 | 0;
        }
       }
       $found_son_0 = $13 + ($i_0 << 3) | 0;
      }
     } while (0);
     if (($found_son_0 | 0) == 0) {
      label = 2832;
      break;
     } else {
      $node_this_0_ph62_ph = $found_son_0;
      $str_pos_0_ph61_ph = $str_pos_074 + 1 & 65535;
      $last_is_splitter_0_off0_ph60_ph = 0;
     }
    }
    if ((label | 0) == 2832) {
     label = 0;
     HEAP16[$id_this78 >> 1] = HEAP16[$node_this_0_ph62_ph + 4 >> 1] & 2047;
     if (!(__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this78) | 0)) {
      $retval_0 = $idx_num_0_ph;
      label = 2844;
      break;
     }
     HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this78 >> 1] | 0;
     $inc86 = $idx_num_0_ph + 1 & 65535;
     if ($cmp9) {
      HEAP16[$start_pos + (($inc86 & 65535) << 1) >> 1] = $str_pos_074;
     }
     if (($inc86 & 65535) < ($max_size & 65535)) {
      $str_pos_0_ph_be = $str_pos_074;
      $last_is_splitter_0_off0_ph_be = 0;
      $idx_num_0_ph_be = $inc86;
     } else {
      $retval_0 = $inc86;
      label = 2843;
      break;
     }
    } else if ((label | 0) == 2817) {
     label = 0;
     HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this >> 1] | 0;
     $inc = $idx_num_0_ph + 1 & 65535;
     $inc25 = $str_pos_074 + 1 & 65535;
     if ($cmp9) {
      HEAP16[$start_pos + (($inc & 65535) << 1) >> 1] = $inc25;
     }
     if (($inc & 65535) < ($max_size & 65535)) {
      $str_pos_0_ph_be = $inc25;
      $last_is_splitter_0_off0_ph_be = 1;
      $idx_num_0_ph_be = $inc;
     } else {
      $retval_0 = $inc;
      label = 2845;
      break;
     }
    }
    $node_this_0_ph = HEAP32[(HEAP32[$spl_trie_ >> 2] | 0) + 44 >> 2] | 0;
    $str_pos_0_ph = $str_pos_0_ph_be;
    $last_is_splitter_0_off0_ph = $last_is_splitter_0_off0_ph_be;
    $idx_num_0_ph = $idx_num_0_ph_be;
   }
   if ((label | 0) == 2837) {
    HEAP16[$id_this102 >> 1] = HEAP16[$node_this_0_ph62_ph + 4 >> 1] & 2047;
    do {
     if (__ZNK10ime_pinyin12SpellingTrie18if_valid_id_updateEPt(HEAP32[$spl_trie_ >> 2] | 0, $id_this102) | 0) {
      HEAP16[$spl_idx + (($idx_num_0_ph & 65535) << 1) >> 1] = HEAP16[$id_this102 >> 1] | 0;
      $inc110 = $idx_num_0_ph + 1 & 65535;
      if (!$cmp9) {
       $idx_num_1 = $inc110;
       break;
      }
      HEAP16[$start_pos + (($inc110 & 65535) << 1) >> 1] = $str_pos_0_lcssa;
      $idx_num_1 = $inc110;
     } else {
      $idx_num_1 = $idx_num_0_ph;
     }
    } while (0);
    HEAP8[$last_is_pre] = $last_is_splitter_0_off0_ph6079 & 1 ^ 1;
    $retval_0 = $idx_num_1;
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2843) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2844) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2845) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 2846) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin14SpellingParser18splstr16_to_idxs_fEPKttPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $spl_idx = $spl_idx | 0;
   $start_pos = $start_pos | 0;
   $max_size = $max_size | 0;
   $last_is_pre = $last_is_pre | 0;
   var $call = 0, $spl_trie_ = 0, $sub = 0, $conv14 = 0, $pos_013 = 0, $arrayidx = 0, $2 = 0, $3 = 0, $inc = 0;
   $call = __ZN10ime_pinyin14SpellingParser16splstr16_to_idxsEPKttPtS3_tRb($this, $splstr, $str_len, $spl_idx, $start_pos, $max_size, $last_is_pre) | 0;
   if ($call << 16 >> 16 == 0) {
    return $call | 0;
   }
   $spl_trie_ = $this | 0;
   $sub = ($call & 65535) - 1 | 0;
   $pos_013 = 0;
   $conv14 = 0;
   while (1) {
    $arrayidx = $spl_idx + ($conv14 << 1) | 0;
    do {
     if (__ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arrayidx >> 1] | 0) | 0) {
      $2 = HEAP32[$spl_trie_ >> 2] | 0;
      $3 = HEAP16[$arrayidx >> 1] | 0;
      __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($2, $3, $arrayidx) | 0;
      if (($conv14 | 0) != ($sub | 0)) {
       break;
      }
      HEAP8[$last_is_pre] = 0;
     }
    } while (0);
    $inc = $pos_013 + 1 & 65535;
    if (($inc & 65535) < ($call & 65535)) {
     $pos_013 = $inc;
     $conv14 = $inc & 65535;
    } else {
     break;
    }
   }
   return $call | 0;
  }
  function __ZN10ime_pinyin14SpellingParser16get_splid_by_strEPKctPb($this, $splstr, $str_len, $is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $is_pre = $is_pre | 0;
   var $start_pos = 0, $arraydecay = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $start_pos = sp + 8 | 0;
   if (($is_pre | 0) == 0) {
    STACKTOP = sp;
    return 0;
   }
   $arraydecay = sp | 0;
   if ((__ZN10ime_pinyin14SpellingParser14splstr_to_idxsEPKctPtS3_tRb($this, $splstr, $str_len, $arraydecay, $start_pos | 0, 2, $is_pre) | 0) << 16 >> 16 == 1) {
    STACKTOP = sp;
    return ((HEAP16[$start_pos + 2 >> 1] | 0) == $str_len << 16 >> 16 ? HEAP16[$arraydecay >> 1] | 0 : 0) | 0;
   } else {
    STACKTOP = sp;
    return 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin14SpellingParser18get_splid_by_str_fEPKctPb($this, $splstr, $str_len, $is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $is_pre = $is_pre | 0;
   var $start_pos = 0, $arraydecay = 0, $spl_trie_ = 0, $3 = 0, $4 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $start_pos = sp + 8 | 0;
   if (($is_pre | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $arraydecay = sp | 0;
   if ((__ZN10ime_pinyin14SpellingParser14splstr_to_idxsEPKctPtS3_tRb($this, $splstr, $str_len, $arraydecay, $start_pos | 0, 2, $is_pre) | 0) << 16 >> 16 != 1) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ((HEAP16[$start_pos + 2 >> 1] | 0) != $str_len << 16 >> 16) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $spl_trie_ = $this | 0;
   if (__ZNK10ime_pinyin12SpellingTrie16is_half_id_yunmuEt(HEAP32[$spl_trie_ >> 2] | 0, HEAP16[$arraydecay >> 1] | 0) | 0) {
    $3 = HEAP32[$spl_trie_ >> 2] | 0;
    $4 = HEAP16[$arraydecay >> 1] | 0;
    __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($3, $4, $arraydecay) | 0;
    HEAP8[$is_pre] = 0;
   }
   $retval_0 = HEAP16[$arraydecay >> 1] | 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin14SpellingParser19get_splids_parallelEPKctPttRtRb($this, $splstr, $str_len, $splidx, $max_size, $full_id_num, $is_pre) {
   $this = $this | 0;
   $splstr = $splstr | 0;
   $str_len = $str_len | 0;
   $splidx = $splidx | 0;
   $max_size = $max_size | 0;
   $full_id_num = $full_id_num | 0;
   $is_pre = $is_pre | 0;
   var $1 = 0, $retval_0 = 0;
   do {
    if ($max_size << 16 >> 16 == 0) {
     $retval_0 = 0;
    } else {
     if (!(__ZN10ime_pinyin14SpellingParser17is_valid_to_parseEc(0, HEAP8[$splstr] | 0) | 0)) {
      $retval_0 = 0;
      break;
     }
     HEAP16[$splidx >> 1] = __ZN10ime_pinyin14SpellingParser16get_splid_by_strEPKctPb($this, $splstr, $str_len, $is_pre) | 0;
     HEAP16[$full_id_num >> 1] = 0;
     $1 = HEAP16[$splidx >> 1] | 0;
     if ($1 << 16 >> 16 == 0) {
      $retval_0 = 0;
      break;
     }
     if (($1 & 65535) <= 29) {
      $retval_0 = 1;
      break;
     }
     HEAP16[$full_id_num >> 1] = 1;
     $retval_0 = 1;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDictC2Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin12AtomDictBaseC2Ev($this | 0);
   HEAP32[$this >> 2] = 8176;
   _memset($this + 8 | 0, 0, 100);
   __ZN10ime_pinyin8UserDict10cache_initEv($this);
   return;
  }
  function __ZN10ime_pinyin8UserDict10cache_initEv($this) {
   $this = $this | 0;
   __ZN10ime_pinyin8UserDict11reset_cacheEv($this);
   __ZN10ime_pinyin8UserDict16reset_miss_cacheEv($this);
   return;
  }
  function __ZN10ime_pinyin8UserDictD0Ev($this) {
   $this = $this | 0;
   __ZN10ime_pinyin8UserDictD2Ev($this);
   __ZdlPv($this);
   return;
  }
  function __ZN10ime_pinyin8UserDictD2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8176;
   FUNCTION_TABLE_ii[HEAP32[(HEAP32[$this >> 2] | 0) + 12 >> 2] & 31]($this) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict9load_dictEPKcjj($this, $file_name, $start_id, $end_id) {
   $this = $this | 0;
   $file_name = $file_name | 0;
   $start_id = $start_id | 0;
   $end_id = $end_id | 0;
   var $call = 0, $dict_file_ = 0, $start_id_ = 0, $load_time_ = 0, $retval_0 = 0, label = 0;
   $call = _strdup($file_name | 0) | 0;
   $dict_file_ = $this + 64 | 0;
   HEAP32[$dict_file_ >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $start_id_ = $this + 16 | 0;
   HEAP32[$start_id_ >> 2] = $start_id;
   if (__ZN10ime_pinyin8UserDict8validateEPKc($this, $file_name) | 0) {
    label = 2890;
   } else {
    if (__ZN10ime_pinyin8UserDict5resetEPKc(0, $file_name) | 0) {
     label = 2890;
    }
   }
   do {
    if ((label | 0) == 2890) {
     if (!(__ZN10ime_pinyin8UserDict4loadEPKcj($this, $file_name, $start_id) | 0)) {
      break;
     }
     HEAP32[$this + 104 >> 2] = 1;
     $load_time_ = $this + 8 | 0;
     _gettimeofday($load_time_ | 0, 0) | 0;
     $retval_0 = 1;
     return $retval_0 | 0;
    }
   } while (0);
   _free(HEAP32[$dict_file_ >> 2] | 0);
   HEAP32[$start_id_ >> 2] = 0;
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict8validateEPKc($this, $file) {
   $this = $this | 0;
   $file = $file | 0;
   var $version = 0, $dict_info = 0, $call = 0, $call6 = 0, $cmp14 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 48 | 0;
   $version = sp | 0;
   $dict_info = sp + 8 | 0;
   $call = _fopen($file | 0, 3840) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   do {
    if ((_fseek($call | 0, 0, 2) | 0) == 0) {
     $call6 = _ftell($call | 0) | 0;
     if ($call6 >>> 0 < 40) {
      break;
     }
     if ((_fseek($call | 0, 0, 0) | 0) != 0) {
      break;
     }
     $cmp14 = (_fread($version | 0, 1, 4, $call | 0) | 0) >>> 0 > 3;
     if (!($cmp14 & (HEAP32[$version >> 2] | 0) == 18015e4)) {
      break;
     }
     if ((_fseek($call | 0, -36 | 0, 2) | 0) != 0) {
      break;
     }
     if ((_fread($dict_info | 0, 1, 36, $call | 0) | 0) != 36) {
      break;
     }
     if (($call6 | 0) != (__ZN10ime_pinyin8UserDict18get_dict_file_sizeEPNS0_12UserDictInfoE(0, $dict_info) | 0)) {
      break;
     }
     _fclose($call | 0) | 0;
     $retval_0 = 1;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } while (0);
   _fclose($call | 0) | 0;
   $retval_0 = 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict5resetEPKc($this, $file) {
   $this = $this | 0;
   $file = $file | 0;
   var $version = 0, $call = 0, $call2 = 0, $1 = 0, $cmp = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 48 | 0;
   $version = sp | 0;
   $call = _fopen($file | 0, 2200) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP32[$version >> 2] = 18015e4;
   $call2 = _fwrite($version | 0, 1, 4, $call | 0) | 0;
   $1 = sp + 8 | 0;
   _memset($1 | 0, 0, 36);
   $cmp = ((_fwrite($1 | 0, 1, 36, $call | 0) | 0) + $call2 | 0) == 40;
   _fclose($call | 0) | 0;
   if ($cmp) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _unlink($file | 0) | 0;
   $retval_0 = 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict16reset_milestonesEtt($this, $from_step, $from_handle) {
   $this = $this | 0;
   $from_step = $from_step | 0;
   $from_handle = $from_handle | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict16number_of_lemmasEv($this) {
   $this = $this | 0;
   return HEAP32[$this + 80 >> 2] | 0;
  }
  function __ZN10ime_pinyin8UserDict14is_valid_stateEv($this) {
   $this = $this | 0;
   return (HEAP32[$this + 104 >> 2] | 0) != 0 | 0;
  }
  function __ZN10ime_pinyin8UserDict18is_prefix_spell_idEPKttPKNS0_18UserDictSearchableE($this, $fullids, $fulllen, $searchable) {
   $this = $this | 0;
   $fullids = $fullids | 0;
   $fulllen = $fulllen | 0;
   $searchable = $searchable | 0;
   var $splids_len = 0, $conv4 = 0, $i_0 = 0, $2 = 0, $3 = 0, $retval_0 = 0, label = 0;
   $splids_len = $searchable | 0;
   if ((HEAPU16[$splids_len >> 1] | 0) > ($fulllen & 65535)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $conv4 = HEAPU16[$splids_len >> 1] | 0;
   $i_0 = 0;
   while (1) {
    if ($i_0 >>> 0 >= $conv4 >>> 0) {
     $retval_0 = 1;
     label = 2928;
     break;
    }
    $2 = HEAP16[$searchable + 2 + ($i_0 << 1) >> 1] | 0;
    $3 = HEAP16[$fullids + ($i_0 << 1) >> 1] | 0;
    if (($3 & 65535) < ($2 & 65535)) {
     $retval_0 = 0;
     label = 2929;
     break;
    }
    if (($3 & 65535 | 0) < ((HEAPU16[$searchable + 18 + ($i_0 << 1) >> 1] | 0) + ($2 & 65535) | 0)) {
     $i_0 = $i_0 + 1 | 0;
    } else {
     $retval_0 = 0;
     label = 2927;
     break;
    }
   }
   if ((label | 0) == 2928) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2927) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2929) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict14equal_spell_idEPKttPKNS0_18UserDictSearchableE($this, $fullids, $fulllen, $searchable) {
   $this = $this | 0;
   $fullids = $fullids | 0;
   $fulllen = $fulllen | 0;
   $searchable = $searchable | 0;
   var $conv = 0, $i_0 = 0, $1 = 0, $2 = 0, $retval_0 = 0, label = 0;
   $conv = $fulllen & 65535;
   if ((HEAP16[$searchable >> 1] | 0) == $fulllen << 16 >> 16) {
    $i_0 = 0;
   } else {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   while (1) {
    if ($i_0 >>> 0 >= $conv >>> 0) {
     $retval_0 = 1;
     label = 2936;
     break;
    }
    $1 = HEAP16[$searchable + 2 + ($i_0 << 1) >> 1] | 0;
    $2 = HEAP16[$fullids + ($i_0 << 1) >> 1] | 0;
    if (($2 & 65535) < ($1 & 65535)) {
     $retval_0 = 0;
     label = 2939;
     break;
    }
    if (($2 & 65535 | 0) < ((HEAPU16[$searchable + 18 + ($i_0 << 1) >> 1] | 0) + ($1 & 65535) | 0)) {
     $i_0 = $i_0 + 1 | 0;
    } else {
     $retval_0 = 0;
     label = 2938;
     break;
    }
   }
   if ((label | 0) == 2938) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2936) {
    return $retval_0 | 0;
   } else if ((label | 0) == 2939) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   return HEAP8[(HEAP32[$this + 24 >> 2] | 0) + (($offset & 2147483647) + 1) | 0] | 0;
  }
  function __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   return (HEAP32[$this + 24 >> 2] | 0) + (($offset & 2147483647) + 2) | 0;
  }
  function __ZN10ime_pinyin8UserDict4loadEPKcj($this, $file, $start_id) {
   $this = $this | 0;
   $file = $file | 0;
   $start_id = $start_id | 0;
   var $dict_info = 0, $call = 0, $0 = 0, $lemma_size = 0, $call9 = 0, $lemma_count = 0, $call14 = 0, $3 = 0, $call21 = 0, $5 = 0, $sync_count = 0, $call27 = 0, $7 = 0, $call34 = 0, $9 = 0, $call41 = 0, $11 = 0, $call48 = 0, $13 = 0, $15 = 0, $readed_0148 = 0, $add64 = 0, $readed_0_lcssa = 0, $shl70 = 0, $readed_1146 = 0, $shl91 = 0, $readed_2143 = 0, $readed_3140 = 0, $shl131 = 0, $21 = 0, $23 = 0, $readed_4137 = 0, $i_0135 = 0, $25 = 0, $syncs_0 = 0, $scores_0 = 0, $ids_0 = 0, $offsets_by_id_0 = 0, $predicts_0112 = 0, $offsets_by_id_0111 = 0, $ids_0110 = 0, $scores_0109 = 0, $syncs_0108 = 0, $predicts_0103 = 0, $offsets_by_id_0102 = 0, $ids_0101 = 0, $scores_0100 = 0, $syncs_099 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 40 | 0;
   $dict_info = sp | 0;
   $call = _fopen($file | 0, 3840) | 0;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   do {
    if ((_fseek($call | 0, -36 | 0, 2) | 0) == 0) {
     $0 = $dict_info;
     if ((_fread($0 | 0, 1, 36, $call | 0) | 0) != 36) {
      break;
     }
     $lemma_size = $dict_info + 16 | 0;
     $call9 = _malloc((HEAP32[$lemma_size >> 2] | 0) + 1088 | 0) | 0;
     if (($call9 | 0) == 0) {
      break;
     }
     $lemma_count = $dict_info + 12 | 0;
     $call14 = _malloc((HEAP32[$lemma_count >> 2] << 2) + 128 | 0) | 0;
     $3 = $call14;
     if (($call14 | 0) == 0) {
      $syncs_0108 = 0;
      $scores_0109 = 0;
      $ids_0110 = 0;
      $offsets_by_id_0111 = 0;
      $predicts_0112 = 0;
      label = 2980;
     } else {
      $call21 = _malloc((HEAP32[$lemma_count >> 2] << 2) + 128 | 0) | 0;
      $5 = $call21;
      L3760 : do {
       if (($call21 | 0) == 0) {
        $offsets_by_id_0 = 0;
        $ids_0 = 0;
        $scores_0 = 0;
        $syncs_0 = 0;
       } else {
        $sync_count = $dict_info + 28 | 0;
        $call27 = _malloc((HEAP32[$sync_count >> 2] << 2) + 128 | 0) | 0;
        $7 = $call27;
        if (($call27 | 0) == 0) {
         $offsets_by_id_0 = 0;
         $ids_0 = 0;
         $scores_0 = 0;
         $syncs_0 = $7;
         break;
        }
        $call34 = _malloc((HEAP32[$lemma_count >> 2] << 2) + 128 | 0) | 0;
        $9 = $call34;
        if (($call34 | 0) == 0) {
         $offsets_by_id_0 = 0;
         $ids_0 = 0;
         $scores_0 = $9;
         $syncs_0 = $7;
         break;
        }
        $call41 = _malloc((HEAP32[$lemma_count >> 2] << 2) + 128 | 0) | 0;
        $11 = $call41;
        if (($call41 | 0) == 0) {
         $offsets_by_id_0 = 0;
         $ids_0 = $11;
         $scores_0 = $9;
         $syncs_0 = $7;
         break;
        }
        $call48 = _malloc((HEAP32[$lemma_count >> 2] << 2) + 128 | 0) | 0;
        $13 = $call48;
        if (($call48 | 0) == 0) {
         $offsets_by_id_0 = $13;
         $ids_0 = $11;
         $scores_0 = $9;
         $syncs_0 = $7;
         break;
        }
        if ((_fseek($call | 0, 4, 0) | 0) != 0) {
         $offsets_by_id_0 = $13;
         $ids_0 = $11;
         $scores_0 = $9;
         $syncs_0 = $7;
         break;
        }
        L3767 : do {
         if ((HEAP32[$lemma_size >> 2] | 0) == 0) {
          $readed_0_lcssa = 0;
         } else {
          $15 = HEAP32[$lemma_size >> 2] | 0;
          $readed_0148 = 0;
          while (1) {
           if ((_ferror($call | 0) | 0) != 0) {
            $readed_0_lcssa = $readed_0148;
            break L3767;
           }
           if ((_feof($call | 0) | 0) != 0) {
            $readed_0_lcssa = $readed_0148;
            break L3767;
           }
           $add64 = (_fread($call9 + $readed_0148 | 0, 1, $15 - $readed_0148 | 0, $call | 0) | 0) + $readed_0148 | 0;
           if ($add64 >>> 0 < $15 >>> 0) {
            $readed_0148 = $add64;
           } else {
            $readed_0_lcssa = $add64;
            break;
           }
          }
         }
        } while (0);
        if ($readed_0_lcssa >>> 0 < (HEAP32[$lemma_size >> 2] | 0) >>> 0) {
         $offsets_by_id_0 = $13;
         $ids_0 = $11;
         $scores_0 = $9;
         $syncs_0 = $7;
         break;
        }
        $shl70 = HEAP32[$lemma_count >> 2] << 2;
        if (($shl70 | 0) != 0) {
         $readed_1146 = 0;
         do {
          if ((_ferror($call | 0) | 0) != 0) {
           $offsets_by_id_0 = $13;
           $ids_0 = $11;
           $scores_0 = $9;
           $syncs_0 = $7;
           break L3760;
          }
          if ((_feof($call | 0) | 0) != 0) {
           $offsets_by_id_0 = $13;
           $ids_0 = $11;
           $scores_0 = $9;
           $syncs_0 = $7;
           break L3760;
          }
          $readed_1146 = (_fread($call14 + $readed_1146 | 0, 1, $shl70 - $readed_1146 | 0, $call | 0) | 0) + $readed_1146 | 0;
         } while ($readed_1146 >>> 0 < $shl70 >>> 0);
        }
        $shl91 = HEAP32[$lemma_count >> 2] << 2;
        do {
         if (($shl91 | 0) != 0) {
          $readed_2143 = 0;
          do {
           if ((_ferror($call | 0) | 0) != 0) {
            $offsets_by_id_0 = $13;
            $ids_0 = $11;
            $scores_0 = $9;
            $syncs_0 = $7;
            break L3760;
           }
           if ((_feof($call | 0) | 0) != 0) {
            $offsets_by_id_0 = $13;
            $ids_0 = $11;
            $scores_0 = $9;
            $syncs_0 = $7;
            break L3760;
           }
           $readed_2143 = (_fread($call21 + $readed_2143 | 0, 1, $shl91 - $readed_2143 | 0, $call | 0) | 0) + $readed_2143 | 0;
          } while ($readed_2143 >>> 0 < $shl91 >>> 0);
          if (($shl91 | 0) == 0) {
           break;
          } else {
           $readed_3140 = 0;
          }
          do {
           if ((_ferror($call | 0) | 0) != 0) {
            $offsets_by_id_0 = $13;
            $ids_0 = $11;
            $scores_0 = $9;
            $syncs_0 = $7;
            break L3760;
           }
           if ((_feof($call | 0) | 0) != 0) {
            $offsets_by_id_0 = $13;
            $ids_0 = $11;
            $scores_0 = $9;
            $syncs_0 = $7;
            break L3760;
           }
           $readed_3140 = (_fread($call34 + $readed_3140 | 0, 1, $shl91 - $readed_3140 | 0, $call | 0) | 0) + $readed_3140 | 0;
          } while ($readed_3140 >>> 0 < $shl91 >>> 0);
         }
        } while (0);
        $shl131 = HEAP32[$sync_count >> 2] << 2;
        if (($shl131 | 0) != 0) {
         $readed_4137 = 0;
         do {
          if ((_ferror($call | 0) | 0) != 0) {
           $offsets_by_id_0 = $13;
           $ids_0 = $11;
           $scores_0 = $9;
           $syncs_0 = $7;
           break L3760;
          }
          if ((_feof($call | 0) | 0) != 0) {
           $offsets_by_id_0 = $13;
           $ids_0 = $11;
           $scores_0 = $9;
           $syncs_0 = $7;
           break L3760;
          }
          $readed_4137 = (_fread($call27 + $readed_4137 | 0, 1, $shl131 - $readed_4137 | 0, $call | 0) | 0) + $readed_4137 | 0;
         } while ($readed_4137 >>> 0 < $shl131 >>> 0);
        }
        if ((HEAP32[$lemma_count >> 2] | 0) != 0) {
         $21 = HEAP32[$lemma_count >> 2] | 0;
         $23 = $21 >>> 0 > 1 ? $21 << 2 : 4;
         _memcpy($call48 | 0, $call14 | 0, $23) | 0;
         $i_0135 = 0;
         do {
          HEAP32[$11 + ($i_0135 << 2) >> 2] = $i_0135 + $start_id;
          $i_0135 = $i_0135 + 1 | 0;
         } while ($i_0135 >>> 0 < $21 >>> 0);
        }
        HEAP32[$this + 24 >> 2] = $call9;
        HEAP32[$this + 28 >> 2] = $3;
        HEAP32[$this + 44 >> 2] = $7;
        HEAP32[$this + 48 >> 2] = (HEAP32[$sync_count >> 2] | 0) + 32;
        HEAP32[$this + 52 >> 2] = $13;
        HEAP32[$this + 32 >> 2] = $9;
        HEAP32[$this + 36 >> 2] = $11;
        HEAP32[$this + 40 >> 2] = $5;
        HEAP32[$this + 56 >> 2] = 32;
        HEAP32[$this + 60 >> 2] = 1088;
        $25 = $this + 68 | 0;
        _memcpy($25 | 0, $0 | 0, 36) | 0;
        HEAP32[$this + 104 >> 2] = 1;
        _fclose($call | 0) | 0;
        $retval_0 = 1;
        STACKTOP = sp;
        return $retval_0 | 0;
       }
      } while (0);
      if (($call9 | 0) == 0) {
       $syncs_099 = $syncs_0;
       $scores_0100 = $scores_0;
       $ids_0101 = $ids_0;
       $offsets_by_id_0102 = $offsets_by_id_0;
       $predicts_0103 = $5;
      } else {
       $syncs_0108 = $syncs_0;
       $scores_0109 = $scores_0;
       $ids_0110 = $ids_0;
       $offsets_by_id_0111 = $offsets_by_id_0;
       $predicts_0112 = $5;
       label = 2980;
      }
     }
     if ((label | 0) == 2980) {
      _free($call9);
      $syncs_099 = $syncs_0108;
      $scores_0100 = $scores_0109;
      $ids_0101 = $ids_0110;
      $offsets_by_id_0102 = $offsets_by_id_0111;
      $predicts_0103 = $predicts_0112;
     }
     if (($call14 | 0) != 0) {
      _free($call14);
     }
     if (($syncs_099 | 0) != 0) {
      _free($syncs_099);
     }
     if (($scores_0100 | 0) != 0) {
      _free($scores_0100);
     }
     if (($ids_0101 | 0) != 0) {
      _free($ids_0101);
     }
     if (($offsets_by_id_0102 | 0) != 0) {
      _free($offsets_by_id_0102);
     }
     if (($predicts_0103 | 0) == 0) {
      break;
     }
     _free($predicts_0103);
    }
   } while (0);
   _fclose($call | 0) | 0;
   $retval_0 = 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict10close_dictEv($this) {
   $this = $this | 0;
   var $0 = 0, $1 = 0, $2 = 0, label = 0;
   $0 = HEAP32[$this + 104 >> 2] | 0;
   if (($0 | 0) == 0) {
    return 1;
   } else if (($0 | 0) != 1) {
    label = 2999;
   }
   do {
    if ((label | 0) == 2999) {
     $1 = HEAP32[$this + 8 >> 2] | 0;
     $2 = HEAP32[11850] | 0;
     if (($1 | 0) <= ($2 | 0)) {
      if (($1 | 0) != ($2 | 0)) {
       break;
      }
      if ((HEAP32[$this + 12 >> 2] | 0) <= (HEAP32[11851] | 0)) {
       break;
      }
     }
     __ZN10ime_pinyin8UserDict10write_backEv($this);
     _gettimeofday(47400, 0) | 0;
    }
   } while (0);
   _free(HEAP32[$this + 64 >> 2] | 0);
   _free(HEAP32[$this + 24 >> 2] | 0);
   _free(HEAP32[$this + 28 >> 2] | 0);
   _free(HEAP32[$this + 52 >> 2] | 0);
   _free(HEAP32[$this + 32 >> 2] | 0);
   _free(HEAP32[$this + 36 >> 2] | 0);
   _free(HEAP32[$this + 40 >> 2] | 0);
   _memset($this + 20 | 0, 0, 88);
   return 1;
  }
  function __ZN10ime_pinyin8UserDict10write_backEv($this) {
   $this = $this | 0;
   var $state_ = 0, $call = 0, $2 = 0, sp = 0;
   sp = STACKTOP;
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) >>> 0 < 2) {
    STACKTOP = sp;
    return;
   }
   $call = _open(HEAP32[$this + 64 >> 2] | 0, 1, (tempInt = STACKTOP, STACKTOP = STACKTOP + 1 | 0, STACKTOP = STACKTOP + 7 >> 3 << 3, HEAP32[tempInt >> 2] = 0, tempInt) | 0) | 0;
   if (($call | 0) == -1) {
    STACKTOP = sp;
    return;
   }
   $2 = HEAP32[$state_ >> 2] | 0;
   if (($2 | 0) == 4) {
    __ZN10ime_pinyin8UserDict17write_back_offsetEi($this, $call);
   } else if (($2 | 0) == 2) {
    __ZN10ime_pinyin8UserDict15write_back_syncEi($this, $call);
   } else if (($2 | 0) == 3) {
    __ZN10ime_pinyin8UserDict16write_back_scoreEi($this, $call);
   } else if (($2 | 0) == 6) {
    __ZN10ime_pinyin8UserDict14write_back_allEi($this, $call);
   } else if (($2 | 0) == 5) {
    __ZN10ime_pinyin8UserDict16write_back_lemmaEi($this, $call);
   }
   _ftruncate($call | 0, _lseek($call | 0, 0, 1) | 0) | 0;
   _close($call | 0) | 0;
   HEAP32[$state_ >> 2] = 1;
   STACKTOP = sp;
   return;
  }
  function __ZN10ime_pinyin8UserDict11extend_dictEtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj($this, $from_handle, $dep, $lpi_items, $lpi_max, $lpi_num) {
   $this = $this | 0;
   $from_handle = $from_handle | 0;
   $dep = $dep | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $lpi_num = $lpi_num | 0;
   var $need_extend = 0, $call4 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $need_extend = sp | 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP8[$need_extend] = 0;
   $call4 = __ZN10ime_pinyin8UserDict9_get_lpisEPKttPNS_10LmaPsbItemEjPb($this, $dep | 0, (HEAP16[$dep + 80 >> 1] | 0) + 1 & 65535, $lpi_items, $lpi_max, $need_extend) | 0;
   HEAP32[$lpi_num >> 2] = $call4;
   if (($call4 | 0) != 0) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP8[$need_extend] & 1;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict9_get_lpisEPKttPNS_10LmaPsbItemEjPb($this, $splid_str, $splid_str_len, $lpi_items, $lpi_max, $need_extend) {
   $this = $this | 0;
   $splid_str = $splid_str | 0;
   $splid_str_len = $splid_str_len | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   $need_extend = $need_extend | 0;
   var $searchable = 0, $start = 0, $count = 0, $tmp_extend_need_extend = 0, $0 = 0, $1 = 0, $6 = 0, $call15 = 0, $7 = 0, $call19 = 0, $middle_0 = 0, $max_off_0 = 0, $offsets_ = 0, $scores_ = 0, $ids_ = 0, $middle_1 = 0, $10 = 0, $call37 = 0, $call38 = 0, $fuzzy_break_1_off0 = 0, $conv50 = 0, $prefix_break_1_off0 = 0, $17 = 0, $lpi_current_1 = 0, $middle_1_ph = 0, $lpi_current_0_ph = 0, $fuzzy_break_0_off0_ph = 0, $prefix_break_0_off0_ph = 0, $cmp31 = 0, $23 = 0, $sub = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 72 | 0;
   $searchable = sp + 8 | 0;
   $start = sp + 56 | 0;
   $count = sp + 64 | 0;
   $tmp_extend_need_extend = ($need_extend | 0) == 0 ? sp | 0 : $need_extend;
   HEAP8[$tmp_extend_need_extend] = 0;
   if (($lpi_max | 0) == 0 | (__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0) ^ 1) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $0 = HEAP32[$this + 8 >> 2] | 0;
   $1 = HEAP32[11850] | 0;
   do {
    if (($0 | 0) < ($1 | 0)) {
     label = 3031;
    } else {
     if (($0 | 0) != ($1 | 0)) {
      break;
     }
     if ((HEAP32[$this + 12 >> 2] | 0) < (HEAP32[11851] | 0)) {
      label = 3031;
     }
    }
   } while (0);
   if ((label | 0) == 3031) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$this >> 2] | 0) + 76 >> 2] & 127]($this);
   }
   __ZN10ime_pinyin8UserDict14prepare_locateEPNS0_18UserDictSearchableEPKtt(0, $searchable, $splid_str, $splid_str_len);
   $6 = HEAP32[$this + 80 >> 2] | 0;
   $call15 = __ZN10ime_pinyin8UserDict9cache_hitEPNS0_18UserDictSearchableEPjS3_($this, $searchable, $start, $count) | 0;
   if ($call15) {
    $7 = HEAP32[$start >> 2] | 0;
    $max_off_0 = (HEAP32[$count >> 2] | 0) + $7 | 0;
    $middle_0 = $7;
   } else {
    $call19 = __ZN10ime_pinyin8UserDict23locate_first_in_offsetsEPKNS0_18UserDictSearchableE($this, $searchable) | 0;
    HEAP32[$start >> 2] = $call19;
    $max_off_0 = $6;
    $middle_0 = $call19;
   }
   if (($middle_0 | 0) == -1) {
    if ($call15) {
     $retval_0 = 0;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
    __ZN10ime_pinyin8UserDict10cache_pushENS0_17UserDictCacheTypeEPNS0_18UserDictSearchableEjj($this, 1, $searchable, 0, 0);
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $offsets_ = $this + 28 | 0;
   $scores_ = $this + 32 | 0;
   $ids_ = $this + 36 | 0;
   $prefix_break_0_off0_ph = 0;
   $fuzzy_break_0_off0_ph = 0;
   $lpi_current_0_ph = 0;
   $middle_1_ph = $middle_0;
   L3881 : while (1) {
    $cmp31 = $lpi_current_0_ph >>> 0 < $lpi_max >>> 0;
    $middle_1 = $middle_1_ph;
    while (1) {
     if (!($cmp31 & (($middle_1 >>> 0 >= $max_off_0 >>> 0 | $fuzzy_break_0_off0_ph | $prefix_break_0_off0_ph) ^ 1))) {
      break L3881;
     }
     $10 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($middle_1 << 2) >> 2] | 0;
     if (($10 | 0) < 0) {
      $middle_1 = $middle_1 + 1 | 0;
     } else {
      break;
     }
    }
    $call37 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $10) | 0;
    $call38 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $10) | 0;
    if ($call15) {
     $fuzzy_break_1_off0 = $fuzzy_break_0_off0_ph;
    } else {
     $fuzzy_break_1_off0 = $fuzzy_break_0_off0_ph | (__ZN10ime_pinyin8UserDict22fuzzy_compare_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call38, $call37 & 255, $searchable) | 0) != 0;
    }
    do {
     if ($prefix_break_0_off0_ph) {
      $prefix_break_1_off0 = 1;
     } else {
      $conv50 = $call37 & 255;
      if ((__ZN10ime_pinyin8UserDict24is_fuzzy_prefix_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call38, $conv50, $searchable) | 0) == 0) {
       $prefix_break_1_off0 = 1;
       break;
      }
      if ((HEAP8[$tmp_extend_need_extend] & 1) != 0) {
       $prefix_break_1_off0 = $prefix_break_0_off0_ph;
       break;
      }
      if (!(__ZN10ime_pinyin8UserDict18is_prefix_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call38, $conv50, $searchable) | 0)) {
       $prefix_break_1_off0 = $prefix_break_0_off0_ph;
       break;
      }
      HEAP8[$tmp_extend_need_extend] = 1;
      $prefix_break_1_off0 = $prefix_break_0_off0_ph;
     }
    } while (0);
    if (__ZN10ime_pinyin8UserDict14equal_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call38, $call37 & 255, $searchable) | 0) {
     HEAP16[$lpi_items + ($lpi_current_0_ph << 3) + 4 >> 1] = __ZN10ime_pinyin8UserDict15translate_scoreEi($this, HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($middle_1 << 2) >> 2] | 0) | 0;
     $17 = $lpi_items + ($lpi_current_0_ph << 3) | 0;
     HEAP32[$17 >> 2] = HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($middle_1 << 2) >> 2] & 16777215 | ($call37 & 255) << 24 & 251658240 | HEAP32[$17 >> 2] & -268435456;
     $lpi_current_1 = $lpi_current_0_ph + 1 | 0;
    } else {
     $lpi_current_1 = $lpi_current_0_ph;
    }
    $prefix_break_0_off0_ph = $prefix_break_1_off0;
    $fuzzy_break_0_off0_ph = $fuzzy_break_1_off0;
    $lpi_current_0_ph = $lpi_current_1;
    $middle_1_ph = $middle_1 + 1 | 0;
   }
   if ($call15) {
    $retval_0 = $lpi_current_0_ph;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $23 = HEAP32[$start >> 2] | 0;
   $sub = $middle_1 - $23 | 0;
   HEAP32[$count >> 2] = $sub;
   __ZN10ime_pinyin8UserDict10cache_pushENS0_17UserDictCacheTypeEPNS0_18UserDictSearchableEjj($this, 0, $searchable, $23, $sub);
   $retval_0 = $lpi_current_0_ph;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict24is_fuzzy_prefix_spell_idEPKttPKNS0_18UserDictSearchableE($this, $id1, $len1, $searchable) {
   $this = $this | 0;
   $id1 = $id1 | 0;
   $len1 = $len1 | 0;
   $searchable = $searchable | 0;
   var $splids_len = 0, $call = 0, $i_0 = 0, $3 = 0, $conv9 = 0, $retval_0 = 0, label = 0;
   $splids_len = $searchable | 0;
   if ((HEAPU16[$splids_len >> 1] | 0) > ($len1 & 65535)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $i_0 = 0;
   while (1) {
    if ($i_0 >>> 0 >= (HEAPU16[$splids_len >> 1] | 0) >>> 0) {
     $retval_0 = 1;
     label = 3067;
     break;
    }
    $3 = HEAP8[__ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($call, HEAP16[$id1 + ($i_0 << 1) >> 1] | 0) | 0] | 0;
    $conv9 = $i_0 << 3 & 24;
    if (($3 << 24 >> 24 | 0) == ((HEAP32[$searchable + 36 + ($i_0 >>> 2 << 2) >> 2] & 255 << $conv9) >>> ($conv9 >>> 0) << 24 >> 24 | 0)) {
     $i_0 = $i_0 + 1 | 0;
    } else {
     $retval_0 = 0;
     label = 3065;
     break;
    }
   }
   if ((label | 0) == 3065) {
    return $retval_0 | 0;
   } else if ((label | 0) == 3067) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict22fuzzy_compare_spell_idEPKttPKNS0_18UserDictSearchableE($this, $id1, $len1, $searchable) {
   $this = $this | 0;
   $id1 = $id1 | 0;
   $len1 = $len1 | 0;
   $searchable = $searchable | 0;
   var $conv = 0, $0 = 0, $call = 0, $i_0 = 0, $2 = 0, $conv14 = 0, $conv17 = 0, $conv18 = 0, $retval_0 = 0, label = 0;
   $conv = $len1 & 65535;
   $0 = HEAP16[$searchable >> 1] | 0;
   if (($0 & 65535) > ($len1 & 65535)) {
    $retval_0 = -1;
    return $retval_0 | 0;
   }
   if (($0 & 65535) < ($len1 & 65535)) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   $call = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $i_0 = 0;
   while (1) {
    if ($i_0 >>> 0 >= $conv >>> 0) {
     $retval_0 = 0;
     label = 3076;
     break;
    }
    $2 = HEAP8[__ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($call, HEAP16[$id1 + ($i_0 << 1) >> 1] | 0) | 0] | 0;
    $conv14 = $i_0 << 3 & 24;
    $conv17 = $2 << 24 >> 24;
    $conv18 = (HEAP32[$searchable + 36 + ($i_0 >>> 2 << 2) >> 2] & 255 << $conv14) >>> ($conv14 >>> 0) << 24 >> 24;
    if (($conv17 | 0) == ($conv18 | 0)) {
     $i_0 = $i_0 + 1 | 0;
    } else {
     break;
    }
   }
   if ((label | 0) == 3076) {
    return $retval_0 | 0;
   }
   $retval_0 = ($conv17 | 0) > ($conv18 | 0) ? 1 : -1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict23locate_first_in_offsetsEPKNS0_18UserDictSearchableE($this, $searchable) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   var $offsets_ = 0, $first_prefix_0_ph = 0, $end_0_ph_in = 0, $begin_0_ph = 0, $end_0_ph = 0, $first_prefix_0 = 0, $begin_0 = 0, $shr = 0, $2 = 0, $call = 0, $call2 = 0, $conv = 0, $call4 = 0, $first_prefix_0_shr = 0;
   $offsets_ = $this + 28 | 0;
   $begin_0_ph = 0;
   $end_0_ph_in = HEAP32[$this + 80 >> 2] | 0;
   $first_prefix_0_ph = -1;
   L3929 : while (1) {
    $end_0_ph = $end_0_ph_in - 1 | 0;
    $begin_0 = $begin_0_ph;
    $first_prefix_0 = $first_prefix_0_ph;
    while (1) {
     if (($begin_0 | 0) > ($end_0_ph | 0)) {
      break L3929;
     }
     $shr = $begin_0 + $end_0_ph >> 1;
     $2 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($shr << 2) >> 2] | 0;
     $call = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
     $call2 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0;
     $conv = $call & 255;
     $call4 = __ZN10ime_pinyin8UserDict22fuzzy_compare_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call2, $conv, $searchable) | 0;
     $first_prefix_0_shr = (__ZN10ime_pinyin8UserDict24is_fuzzy_prefix_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call2, $conv, $searchable) | 0) == 0 ? $first_prefix_0 : $shr;
     if (($call4 | 0) < 0) {
      $begin_0 = $shr + 1 | 0;
      $first_prefix_0 = $first_prefix_0_shr;
     } else {
      $begin_0_ph = $begin_0;
      $end_0_ph_in = $shr;
      $first_prefix_0_ph = $first_prefix_0_shr;
      continue L3929;
     }
    }
   }
   return $first_prefix_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict14prepare_locateEPNS0_18UserDictSearchableEPKtt($this, $searchable, $splid_str, $splid_str_len) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   $splid_str = $splid_str | 0;
   $splid_str_len = $splid_str_len | 0;
   var $0 = 0, $call = 0, $conv = 0, $i_025 = 0, $arrayidx = 0, $shl = 0, $arrayidx16 = 0;
   HEAP16[$searchable >> 1] = $splid_str_len;
   $0 = $searchable + 36 | 0;
   HEAP32[$0 >> 2] = 0;
   HEAP32[$0 + 4 >> 2] = 0;
   $call = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   $conv = $splid_str_len & 65535;
   if ($splid_str_len << 16 >> 16 == 0) {
    return;
   } else {
    $i_025 = 0;
   }
   do {
    $arrayidx = $splid_str + ($i_025 << 1) | 0;
    if (__ZNK10ime_pinyin12SpellingTrie10is_half_idEt($call, HEAP16[$arrayidx >> 1] | 0) | 0) {
     HEAP16[$searchable + 18 + ($i_025 << 1) >> 1] = __ZNK10ime_pinyin12SpellingTrie12half_to_fullEtPt($call, HEAP16[$arrayidx >> 1] | 0, $searchable + 2 + ($i_025 << 1) | 0) | 0;
    } else {
     HEAP16[$searchable + 18 + ($i_025 << 1) >> 1] = 1;
     HEAP16[$searchable + 2 + ($i_025 << 1) >> 1] = HEAP16[$arrayidx >> 1] | 0;
    }
    $shl = (HEAPU8[__ZN10ime_pinyin12SpellingTrie16get_spelling_strEt($call, HEAP16[$arrayidx >> 1] | 0) | 0] | 0) << ($i_025 << 3 & 24);
    $arrayidx16 = $searchable + 36 + ($i_025 >>> 2 << 2) | 0;
    HEAP32[$arrayidx16 >> 2] = $shl | HEAP32[$arrayidx16 >> 2];
    $i_025 = $i_025 + 1 | 0;
   } while ($i_025 >>> 0 < $conv >>> 0);
   return;
  }
  function __ZN10ime_pinyin8UserDict8get_lpisEPKttPNS_10LmaPsbItemEj($this, $splid_str, $splid_str_len, $lpi_items, $lpi_max) {
   $this = $this | 0;
   $splid_str = $splid_str | 0;
   $splid_str_len = $splid_str_len | 0;
   $lpi_items = $lpi_items | 0;
   $lpi_max = $lpi_max | 0;
   return __ZN10ime_pinyin8UserDict9_get_lpisEPKttPNS_10LmaPsbItemEjPb($this, $splid_str, $splid_str_len, $lpi_items, $lpi_max, 0) | 0;
  }
  function __ZN10ime_pinyin8UserDict10load_cacheEPNS0_18UserDictSearchableEPjS3_($this, $searchable, $offset, $length) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   $offset = $offset | 0;
   $length = $length | 0;
   var $sub = 0, $1 = 0, $tail = 0, $i_0 = 0, $idxprom8 = 0, $j_0 = 0, $conv5 = 0, $inc20 = 0, $sub25_inc20 = 0, $retval_0 = 0, label = 0;
   $sub = (HEAPU16[$searchable >> 1] | 0) - 1 | 0;
   $1 = HEAP16[$this + 588 + ($sub * 68 | 0) + 64 >> 1] | 0;
   $tail = $this + 588 + ($sub * 68 | 0) + 66 | 0;
   if ($1 << 16 >> 16 == (HEAP16[$tail >> 1] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $i_0 = $1;
   }
   L3949 : while (1) {
    $idxprom8 = $i_0 & 65535;
    $j_0 = 0;
    while (1) {
     $conv5 = $j_0 & 65535;
     if (($j_0 & 65535) >= 2) {
      break L3949;
     }
     if ((HEAP32[$this + 588 + ($sub * 68 | 0) + ($idxprom8 << 3) + ($conv5 << 2) >> 2] | 0) == (HEAP32[$searchable + 36 + ($conv5 << 2) >> 2] | 0)) {
      $j_0 = $j_0 + 1 & 65535;
     } else {
      break;
     }
    }
    $inc20 = $i_0 + 1 & 65535;
    $sub25_inc20 = ($inc20 & 65535) > 3 ? $i_0 - 3 & 65535 : $inc20;
    if ($sub25_inc20 << 16 >> 16 == (HEAP16[$tail >> 1] | 0)) {
     $retval_0 = 0;
     label = 3100;
     break;
    } else {
     $i_0 = $sub25_inc20;
    }
   }
   if ((label | 0) == 3100) {
    return $retval_0 | 0;
   }
   HEAP32[$offset >> 2] = HEAP32[$this + 588 + ($sub * 68 | 0) + 32 + ($idxprom8 << 2) >> 2];
   HEAP32[$length >> 2] = HEAP32[$this + 588 + ($sub * 68 | 0) + 48 + ($idxprom8 << 2) >> 2];
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict27remove_lemma_from_sync_listEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   var $syncs_ = 0, $sync_count = 0, $0 = 0, $i_0 = 0, $5 = 0, $6 = 0;
   $syncs_ = $this + 44 | 0;
   $sync_count = $this + 96 | 0;
   $0 = HEAP32[$sync_count >> 2] | 0;
   $i_0 = 0;
   while (1) {
    if ($i_0 >>> 0 >= $0 >>> 0) {
     break;
    }
    if (((HEAP32[(HEAP32[$syncs_ >> 2] | 0) + ($i_0 << 2) >> 2] ^ $offset) & 2147483647 | 0) == 0) {
     break;
    } else {
     $i_0 = $i_0 + 1 | 0;
    }
   }
   $5 = HEAP32[$sync_count >> 2] | 0;
   if ($i_0 >>> 0 >= $5 >>> 0) {
    return;
   }
   $6 = HEAP32[$this + 44 >> 2] | 0;
   HEAP32[$6 + ($i_0 << 2) >> 2] = HEAP32[$6 + ($5 - 1 << 2) >> 2];
   HEAP32[$sync_count >> 2] = (HEAP32[$sync_count >> 2] | 0) - 1;
   return;
  }
  function __ZN10ime_pinyin8UserDict30remove_lemma_from_predict_listEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   var $0 = 0, $predicts_ = 0, $i_0 = 0, $arrayidx = 0, $2 = 0, label = 0;
   $0 = HEAP32[$this + 80 >> 2] | 0;
   $predicts_ = $this + 40 | 0;
   $i_0 = 0;
   while (1) {
    if ($i_0 >>> 0 >= $0 >>> 0) {
     label = 3117;
     break;
    }
    $arrayidx = (HEAP32[$predicts_ >> 2] | 0) + ($i_0 << 2) | 0;
    $2 = HEAP32[$arrayidx >> 2] | 0;
    if ((($2 ^ $offset) & 2147483647 | 0) == 0) {
     break;
    } else {
     $i_0 = $i_0 + 1 | 0;
    }
   }
   if ((label | 0) == 3117) {
    return;
   }
   HEAP32[$arrayidx >> 2] = $2 | -2147483648;
   return;
  }
  function __ZN10ime_pinyin8UserDict18get_dict_file_sizeEPNS0_12UserDictInfoE($this, $info) {
   $this = $this | 0;
   $info = $info | 0;
   var $1 = 0;
   $1 = HEAP32[$info + 12 >> 2] | 0;
   return (HEAP32[$info + 16 >> 2] | 0) + 40 + ($1 << 3) + ((HEAP32[$info + 28 >> 2] | 0) + $1 << 2) | 0;
  }
  function __ZN10ime_pinyin8UserDict9cache_hitEPNS0_18UserDictSearchableEPjS3_($this, $searchable, $offset, $length) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   $offset = $offset | 0;
   $length = $length | 0;
   var $retval_0 = 0;
   if (__ZN10ime_pinyin8UserDict15load_miss_cacheEPNS0_18UserDictSearchableE($this, $searchable) | 0) {
    HEAP32[$offset >> 2] = 0;
    HEAP32[$length >> 2] = 0;
    $retval_0 = 1;
    return $retval_0 | 0;
   } else {
    $retval_0 = __ZN10ime_pinyin8UserDict10load_cacheEPNS0_18UserDictSearchableEPjS3_($this, $searchable, $offset, $length) | 0;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict10cache_pushENS0_17UserDictCacheTypeEPNS0_18UserDictSearchableEjj($this, $type, $searchable, $offset, $length) {
   $this = $this | 0;
   $type = $type | 0;
   $searchable = $searchable | 0;
   $offset = $offset | 0;
   $length = $length | 0;
   if (($type | 0) == 0) {
    __ZN10ime_pinyin8UserDict10save_cacheEPNS0_18UserDictSearchableEjj($this, $searchable, $offset, $length);
    return;
   } else if (($type | 0) == 1) {
    __ZN10ime_pinyin8UserDict15save_miss_cacheEPNS0_18UserDictSearchableE($this, $searchable);
    return;
   } else {
    return;
   }
  }
  function __ZN10ime_pinyin8UserDict15translate_scoreEi($this, $raw_score) {
   $this = $this | 0;
   $raw_score = $raw_score | 0;
   var $call = 0, $0 = 0, $sub$0 = 0, $div$0 = 0, $sub4$0 = 0, $conv5 = 0;
   $call = __ZN10ime_pinyin8UserDict18extract_score_freqEi(0, $raw_score) | 0;
   $0 = HEAP32[$this + 8 >> 2] | 0;
   $sub$0 = _i64Add($0, ($0 | 0) < 0 ? -1 : 0, -1229904e3, -1) | 0;
   $div$0 = ___udivdi3($sub$0, tempRet0, 604800, 0) | 0;
   $sub4$0 = _i64Subtract($div$0 & 65535, tempRet0 & 0, $raw_score >>> 16, 0) | 0;
   $conv5 = $sub4$0;
   return ~~(+Math_log(+(+($call >>> 0 >>> 0) * (($conv5 | 0) > 4 ? 16.0 : +(80 - ($conv5 << 4) | 0)) / +(((HEAP32[$this + 4 >> 2] | 0) + (HEAP32[$this + 100 >> 2] | 0) | 0) >>> 0 >>> 0))) * -800.0) | 0;
  }
  function __ZN10ime_pinyin8UserDict13get_lemma_strEjPtt($this, $id_lemma, $str_buf, $str_max) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $str_buf = $str_buf | 0;
   $str_max = $str_max | 0;
   var $2 = 0, $call7 = 0, $call8 = 0, $sub11 = 0, $cond_off0 = 0, $conv17 = 0, $3 = 0, $4 = 0, $i_012 = 0, $i_0_lcssa = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $id_lemma) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($id_lemma - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $call7 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
   $call8 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0;
   $sub11 = ($str_max & 65535) - 1 | 0;
   $cond_off0 = ($call7 & 255 | 0) < ($sub11 | 0) ? $call7 & 255 : $sub11 & 65535;
   $conv17 = $cond_off0 & 65535;
   if ($cond_off0 << 16 >> 16 == 0) {
    $i_0_lcssa = 0;
   } else {
    $3 = $cond_off0 & 65535;
    $4 = $3 >>> 0 > 1;
    $i_012 = 0;
    do {
     HEAP16[$str_buf + ($i_012 << 1) >> 1] = HEAP16[$call8 + ($i_012 << 1) >> 1] | 0;
     $i_012 = $i_012 + 1 | 0;
    } while (($i_012 | 0) < ($conv17 | 0));
    $i_0_lcssa = $4 ? $3 : 1;
   }
   HEAP16[$str_buf + ($i_0_lcssa << 1) >> 1] = 0;
   $retval_0 = $cond_off0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $id) {
   $this = $this | 0;
   $id = $id | 0;
   var $retval_0 = 0;
   do {
    if ((HEAP32[$this + 16 >> 2] | 0) >>> 0 <= $id >>> 0) {
     if ((__ZN10ime_pinyin8UserDict16get_max_lemma_idEv($this) | 0) >>> 0 < $id >>> 0) {
      break;
     } else {
      $retval_0 = 1;
     }
     return $retval_0 | 0;
    }
   } while (0);
   $retval_0 = 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   var $and = 0, $call = 0;
   $and = $offset & 2147483647;
   $call = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $and) | 0;
   return (HEAP32[$this + 24 >> 2] | 0) + ($and + 2 + (($call & 255) << 1)) | 0;
  }
  function __ZN10ime_pinyin8UserDict16get_lemma_splidsEjPttb($this, $id_lemma, $splids, $splids_max, $arg_valid) {
   $this = $this | 0;
   $id_lemma = $id_lemma | 0;
   $splids = $splids | 0;
   $splids_max = $splids_max | 0;
   $arg_valid = $arg_valid | 0;
   var $2 = 0, $call2 = 0, $call3 = 0, $conv6 = 0, $conv4 = 0, $5 = 0, $8 = 0, $umax = 0, $i_010 = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $id_lemma) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($id_lemma - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $call2 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
   $call3 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0;
   $conv6 = $splids_max & 65535;
   $conv4 = $call2 & 255;
   if (!($call2 << 24 >> 24 != 0 & $splids_max << 16 >> 16 != 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $5 = ($call2 & 255) > 1 ? -($call2 & 255) | 0 : -1;
   $8 = ($splids_max & 65535) > 1 ? -($splids_max & 65535) | 0 : -1;
   $umax = $5 >>> 0 > $8 >>> 0 ? $5 : $8;
   $i_010 = 0;
   do {
    HEAP16[$splids + ($i_010 << 1) >> 1] = HEAP16[$call3 + ($i_010 << 1) >> 1] | 0;
    $i_010 = $i_010 + 1 | 0;
   } while (($i_010 | 0) < ($conv4 | 0) & ($i_010 | 0) < ($conv6 | 0));
   $retval_0 = -$umax & 65535;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict7predictEPKttPNS_12NPredictItemEjj($this, $last_hzs, $hzs_len, $npre_items, $npre_max, $b4_used) {
   $this = $this | 0;
   $last_hzs = $last_hzs | 0;
   $hzs_len = $hzs_len | 0;
   $npre_items = $npre_items | 0;
   $npre_max = $npre_max | 0;
   $b4_used = $b4_used | 0;
   var $sub = 0, $conv = 0, $call = 0, $predicts_ = 0, $1 = 0, $shl = 0, $2 = 0, $new_added_0_ph42 = 0, $j_0_ph41 = 0, $3 = 0, $j_034 = 0, $4 = 0, $j_0_be = 0, $call5 = 0, $conv6 = 0, $call7 = 0, $call8 = 0, $sub25 = 0, $7 = 0, $8 = 0, $inc40 = 0, $inc42 = 0, $retval_0 = 0, label = 0;
   $sub = (HEAP32[$this + 80 >> 2] | 0) - 1 | 0;
   $conv = $hzs_len & 65535;
   $call = __ZN10ime_pinyin8UserDict24locate_first_in_predictsEPKti($this, $last_hzs, $conv) | 0;
   if (($call | 0) == -1 | ($call | 0) > ($sub | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $predicts_ = $this + 40 | 0;
   $1 = $last_hzs;
   $shl = $conv << 1;
   $2 = $this;
   $j_0_ph41 = $call;
   $new_added_0_ph42 = 0;
   L4027 : while (1) {
    $3 = HEAP32[$predicts_ >> 2] | 0;
    $j_034 = $j_0_ph41;
    while (1) {
     $4 = HEAP32[$3 + ($j_034 << 2) >> 2] | 0;
     if (($4 | 0) >= 0) {
      $call5 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $4) | 0;
      $conv6 = $call5 << 24 >> 24;
      $call7 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $4) | 0;
      $call8 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $4) | 0;
      if ($conv6 >>> 0 > $conv >>> 0) {
       break;
      }
     }
     $j_0_be = $j_034 + 1 | 0;
     if (($j_0_be | 0) > ($sub | 0)) {
      $retval_0 = $new_added_0_ph42;
      label = 3171;
      break L4027;
     } else {
      $j_034 = $j_0_be;
     }
    }
    if (!((_memcmp($call7 | 0, $1 | 0, $shl | 0) | 0) == 0 & $new_added_0_ph42 >>> 0 < $npre_max >>> 0)) {
     $retval_0 = $new_added_0_ph42;
     label = 3174;
     break;
    }
    $sub25 = (($call5 & 255) < 7 ? $conv6 << 1 : 14) - $shl | 0;
    HEAP16[$npre_items + ($new_added_0_ph42 * 20 | 0) + 18 >> 1] = $hzs_len;
    HEAPF32[$npre_items + ($new_added_0_ph42 * 20 | 0) >> 2] = +(((FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$2 >> 2] | 0) + 60 >> 2] & 31]($this, $call7, $call8, $call5 << 24 >> 24) | 0) & 65535) >>> 0);
    $7 = $npre_items + ($new_added_0_ph42 * 20 | 0) + 4 | 0;
    $8 = $call7 + ($conv << 1) | 0;
    _memcpy($7 | 0, $8 | 0, $sub25) | 0;
    if ($sub25 >>> 0 < 14) {
     HEAP16[$npre_items + ($new_added_0_ph42 * 20 | 0) + 4 + ($sub25 >>> 1 << 1) >> 1] = 0;
    }
    $inc40 = $new_added_0_ph42 + 1 | 0;
    $inc42 = $j_034 + 1 | 0;
    if (($inc42 | 0) > ($sub | 0)) {
     $retval_0 = $inc40;
     label = 3173;
     break;
    } else {
     $j_0_ph41 = $inc42;
     $new_added_0_ph42 = $inc40;
    }
   }
   if ((label | 0) == 3171) {
    return $retval_0 | 0;
   } else if ((label | 0) == 3173) {
    return $retval_0 | 0;
   } else if ((label | 0) == 3174) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict24locate_first_in_predictsEPKti($this, $words, $lemma_len) {
   $this = $this | 0;
   $words = $words | 0;
   $lemma_len = $lemma_len | 0;
   var $sub = 0, $1 = 0, $begin_0_ph51 = 0, $end_0_ph50 = 0, $last_matched_0_ph49 = 0, $begin_046 = 0, $last_matched_045 = 0, $shr = 0, $2 = 0, $call = 0, $call2 = 0, $conv = 0, $cmp3 = 0, $conv_lemma_len = 0, $k_0 = 0, $3 = 0, $4 = 0, $last_matched_0_shr = 0, $last_matched_228 = 0, $add37 = 0, $last_matched_231 = 0, $sub41 = 0, $last_matched_0_lcssa = 0, label = 0;
   $sub = (HEAP32[$this + 80 >> 2] | 0) - 1 | 0;
   if (($sub | 0) < 0) {
    $last_matched_0_lcssa = -1;
    return $last_matched_0_lcssa | 0;
   }
   $1 = HEAP32[$this + 28 >> 2] | 0;
   $last_matched_0_ph49 = -1;
   $end_0_ph50 = $sub;
   $begin_0_ph51 = 0;
   L4047 : while (1) {
    $last_matched_045 = $last_matched_0_ph49;
    $begin_046 = $begin_0_ph51;
    L4049 : while (1) {
     $shr = $begin_046 + $end_0_ph50 >> 1;
     $2 = HEAP32[$1 + ($shr << 2) >> 2] | 0;
     $call = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
     $call2 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0;
     $conv = $call & 255;
     $cmp3 = ($conv | 0) < ($lemma_len | 0);
     $conv_lemma_len = $cmp3 ? $conv : $lemma_len;
     $k_0 = 0;
     while (1) {
      if ($k_0 >>> 0 >= $conv_lemma_len >>> 0) {
       label = 3182;
       break;
      }
      $3 = HEAP16[$call2 + ($k_0 << 1) >> 1] | 0;
      $4 = HEAP16[$words + ($k_0 << 1) >> 1] | 0;
      if (($3 & 65535) < ($4 & 65535)) {
       $last_matched_228 = $last_matched_045;
       break;
      }
      if (($3 & 65535) > ($4 & 65535)) {
       $last_matched_231 = $last_matched_045;
       break L4049;
      } else {
       $k_0 = $k_0 + 1 | 0;
      }
     }
     if ((label | 0) == 3182) {
      label = 0;
      $last_matched_0_shr = $cmp3 ? $last_matched_045 : $shr;
      if ($cmp3) {
       $last_matched_228 = $last_matched_0_shr;
      } else {
       $last_matched_231 = $last_matched_0_shr;
       break;
      }
     }
     $add37 = $shr + 1 | 0;
     if (($add37 | 0) > ($end_0_ph50 | 0)) {
      $last_matched_0_lcssa = $last_matched_228;
      label = 3186;
      break L4047;
     } else {
      $last_matched_045 = $last_matched_228;
      $begin_046 = $add37;
     }
    }
    $sub41 = $shr - 1 | 0;
    if (($begin_046 | 0) > ($sub41 | 0)) {
     $last_matched_0_lcssa = $last_matched_231;
     label = 3188;
     break;
    } else {
     $last_matched_0_ph49 = $last_matched_231;
     $end_0_ph50 = $sub41;
     $begin_0_ph51 = $begin_046;
    }
   }
   if ((label | 0) == 3188) {
    return $last_matched_0_lcssa | 0;
   } else if ((label | 0) == 3186) {
    return $last_matched_0_lcssa | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, $lemma_str, $splid_str, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splid_str = $splid_str | 0;
   $lemma_len = $lemma_len | 0;
   var $searchable = 0, $start = 0, $count = 0, $0 = 0, $call = 0, $1 = 0, $call2 = 0, $off_0 = 0, $max_off_0 = 0, $offsets_ = 0, $conv19 = 0, $off_123 = 0, $4 = 0, $off_1_be = 0, $call9 = 0, $call18 = 0, $i_0 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 64 | 0;
   $searchable = sp | 0;
   $start = sp + 48 | 0;
   $count = sp + 56 | 0;
   $0 = HEAP32[$this + 80 >> 2] | 0;
   __ZN10ime_pinyin8UserDict14prepare_locateEPNS0_18UserDictSearchableEPKtt(0, $searchable, $splid_str, $lemma_len);
   $call = __ZN10ime_pinyin8UserDict10load_cacheEPNS0_18UserDictSearchableEPjS3_($this, $searchable, $start, $count) | 0;
   if ($call) {
    $1 = HEAP32[$start >> 2] | 0;
    $max_off_0 = (HEAP32[$count >> 2] | 0) + $1 | 0;
    $off_0 = $1;
   } else {
    $call2 = __ZN10ime_pinyin8UserDict23locate_first_in_offsetsEPKNS0_18UserDictSearchableE($this, $searchable) | 0;
    HEAP32[$start >> 2] = $call2;
    $max_off_0 = $0;
    $off_0 = $call2;
   }
   if (!(($off_0 | 0) != -1 & ($off_0 | 0) < ($max_off_0 | 0))) {
    $retval_0 = -1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $offsets_ = $this + 28 | 0;
   $conv19 = $lemma_len & 65535;
   $off_123 = $off_0;
   L4070 : while (1) {
    $4 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($off_123 << 2) >> 2] | 0;
    do {
     if (($4 | 0) >= 0) {
      $call9 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $4) | 0;
      if (!$call) {
       if ((__ZN10ime_pinyin8UserDict22fuzzy_compare_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call9, $lemma_len, $searchable) | 0) != 0) {
        $retval_0 = -1;
        label = 3204;
        break L4070;
       }
      }
      if (!(__ZN10ime_pinyin8UserDict14equal_spell_idEPKttPKNS0_18UserDictSearchableE(0, $call9, $lemma_len, $searchable) | 0)) {
       break;
      }
      $call18 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $4) | 0;
      $i_0 = 0;
      while (1) {
       if ($i_0 >>> 0 >= $conv19 >>> 0) {
        $retval_0 = $off_123;
        label = 3206;
        break L4070;
       }
       if ((HEAP16[$call18 + ($i_0 << 1) >> 1] | 0) == (HEAP16[$lemma_str + ($i_0 << 1) >> 1] | 0)) {
        $i_0 = $i_0 + 1 | 0;
       } else {
        break;
       }
      }
     }
    } while (0);
    $off_1_be = $off_123 + 1 | 0;
    if (($off_1_be | 0) < ($max_off_0 | 0)) {
     $off_123 = $off_1_be;
    } else {
     $retval_0 = -1;
     label = 3205;
     break;
    }
   }
   if ((label | 0) == 3204) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 3205) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 3206) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict34locate_where_to_insert_in_predictsEPKti($this, $words, $lemma_len) {
   $this = $this | 0;
   $words = $words | 0;
   $lemma_len = $lemma_len | 0;
   var $sub = 0, $1 = 0, $begin_0_ph50 = 0, $end_0_ph49 = 0, $last_matched_0_ph48 = 0, $begin_045 = 0, $last_matched_044 = 0, $shr = 0, $2 = 0, $call = 0, $call2 = 0, $conv = 0, $cmp3 = 0, $conv_lemma_len = 0, $k_0 = 0, $3 = 0, $4 = 0, $add33 = 0, $cmp5_130 = 0, $sub37 = 0, $last_matched_0_lcssa = 0, label = 0;
   $sub = (HEAP32[$this + 80 >> 2] | 0) - 1 | 0;
   if (($sub | 0) < 0) {
    $last_matched_0_lcssa = $sub;
    return $last_matched_0_lcssa | 0;
   }
   $1 = HEAP32[$this + 28 >> 2] | 0;
   $last_matched_0_ph48 = $sub;
   $end_0_ph49 = $sub;
   $begin_0_ph50 = 0;
   L4090 : while (1) {
    $last_matched_044 = $last_matched_0_ph48;
    $begin_045 = $begin_0_ph50;
    L4092 : while (1) {
     $shr = $begin_045 + $end_0_ph49 >> 1;
     $2 = HEAP32[$1 + ($shr << 2) >> 2] | 0;
     $call = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
     $call2 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0;
     $conv = $call & 255;
     $cmp3 = ($conv | 0) < ($lemma_len | 0);
     $conv_lemma_len = $cmp3 ? $conv : $lemma_len;
     $k_0 = 0;
     while (1) {
      if ($k_0 >>> 0 >= $conv_lemma_len >>> 0) {
       label = 3214;
       break;
      }
      $3 = HEAP16[$call2 + ($k_0 << 1) >> 1] | 0;
      $4 = HEAP16[$words + ($k_0 << 1) >> 1] | 0;
      if (($3 & 65535) < ($4 & 65535)) {
       break;
      }
      if (($3 & 65535) > ($4 & 65535)) {
       $cmp5_130 = $last_matched_044;
       break L4092;
      } else {
       $k_0 = $k_0 + 1 | 0;
      }
     }
     if ((label | 0) == 3214) {
      label = 0;
      if (!$cmp3) {
       label = 3215;
       break;
      }
     }
     $add33 = $shr + 1 | 0;
     if (($add33 | 0) > ($end_0_ph49 | 0)) {
      $last_matched_0_lcssa = $shr;
      label = 3219;
      break L4090;
     } else {
      $last_matched_044 = $shr;
      $begin_045 = $add33;
     }
    }
    if ((label | 0) == 3215) {
     label = 0;
     $cmp5_130 = ($conv | 0) > ($lemma_len | 0) ? $last_matched_044 : $shr;
    }
    $sub37 = $shr - 1 | 0;
    if (($begin_045 | 0) > ($sub37 | 0)) {
     $last_matched_0_lcssa = $cmp5_130;
     label = 3220;
     break;
    } else {
     $last_matched_0_ph48 = $cmp5_130;
     $end_0_ph49 = $sub37;
     $begin_0_ph50 = $begin_045;
    }
   }
   if ((label | 0) == 3219) {
    return $last_matched_0_lcssa | 0;
   } else if ((label | 0) == 3220) {
    return $last_matched_0_lcssa | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict12get_lemma_idEPtS1_t($this, $lemma_str, $splids, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   var $call = 0, $retval_0 = 0;
   $call = __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, $lemma_str, $splids, $lemma_len) | 0;
   if (($call | 0) == -1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP32[(HEAP32[$this + 36 >> 2] | 0) + ($call << 2) >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict15get_lemma_scoreEj($this, $lemma_id) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   var $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $lemma_id) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin8UserDict15translate_scoreEi($this, __ZN10ime_pinyin8UserDict16_get_lemma_scoreEj($this, $lemma_id) | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict16_get_lemma_scoreEj($this, $lemma_id) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   var $2 = 0, $call7 = 0, $call9 = 0, $call12 = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $lemma_id) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($lemma_id - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $call7 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
   $call9 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0;
   $call12 = __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0, $call9, $call7 << 24 >> 24) | 0;
   if (($call12 | 0) == -1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP32[(HEAP32[$this + 32 >> 2] | 0) + ($call12 << 2) >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict15get_lemma_scoreEPtS1_t($this, $lemma_str, $splids, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   var $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZN10ime_pinyin8UserDict15translate_scoreEi($this, __ZN10ime_pinyin8UserDict16_get_lemma_scoreEPtS1_t($this, $lemma_str, $splids, $lemma_len) | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict16_get_lemma_scoreEPtS1_t($this, $lemma_str, $splids, $lemma_len) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   var $call2 = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call2 = __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, $lemma_str, $splids, $lemma_len) | 0;
   if (($call2 | 0) == -1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP32[(HEAP32[$this + 32 >> 2] | 0) + ($call2 << 2) >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict28remove_lemma_by_offset_indexEi($this, $offset_index) {
   $this = $this | 0;
   $offset_index = $offset_index | 0;
   var $arrayidx = 0, $1 = 0, $conv6 = 0, $free_count = 0, $free_size = 0, $state_ = 0, $retval_0 = 0;
   if (($offset_index | 0) == -1 | (__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0) ^ 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $arrayidx = (HEAP32[$this + 28 >> 2] | 0) + ($offset_index << 2) | 0;
   $1 = HEAP32[$arrayidx >> 2] | 0;
   $conv6 = (__ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $1) | 0) << 24 >> 24;
   HEAP32[$arrayidx >> 2] = $1 | -2147483648;
   __ZN10ime_pinyin8UserDict27remove_lemma_from_sync_listEj($this, $1);
   __ZN10ime_pinyin8UserDict30remove_lemma_from_predict_listEj($this, $1);
   $free_count = $this + 88 | 0;
   HEAP32[$free_count >> 2] = (HEAP32[$free_count >> 2] | 0) + 1;
   $free_size = $this + 92 | 0;
   HEAP32[$free_size >> 2] = (HEAP32[$free_size >> 2] | 0) + ($conv6 << 2 | 2);
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) >= 4) {
    $retval_0 = 1;
    return $retval_0 | 0;
   }
   HEAP32[$state_ >> 2] = 4;
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict12remove_lemmaEj($this, $lemma_id) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   var $2 = 0, $call7 = 0, $call9 = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $lemma_id) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($lemma_id - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $call7 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
   $call9 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0;
   $retval_0 = __ZN10ime_pinyin8UserDict28remove_lemma_by_offset_indexEi($this, __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0, $call9, $call7 << 24 >> 24) | 0) | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict11flush_cacheEv($this) {
   $this = $this | 0;
   var $0 = 0, $call = 0;
   $0 = HEAP32[$this + 16 >> 2] | 0;
   $call = _strdup(HEAP32[$this + 64 >> 2] | 0) | 0;
   if (($call | 0) == 0) {
    return;
   }
   FUNCTION_TABLE_ii[HEAP32[(HEAP32[$this >> 2] | 0) + 12 >> 2] & 31]($this) | 0;
   FUNCTION_TABLE_iiiii[HEAP32[(HEAP32[$this >> 2] | 0) + 8 >> 2] & 31]($this, $call, $0, 6e5) | 0;
   _free($call);
   __ZN10ime_pinyin8UserDict10cache_initEv($this);
   return;
  }
  function __ZN10ime_pinyin8UserDict14write_back_allEi($this, $fd) {
   $this = $this | 0;
   $fd = $fd | 0;
   var $lemma_count = 0;
   if ((_lseek($fd | 0, 4, 0) | 0) == -1) {
    return;
   }
   _write($fd | 0, HEAP32[$this + 24 >> 2] | 0, HEAP32[$this + 84 >> 2] | 0) | 0;
   $lemma_count = $this + 80 | 0;
   _write($fd | 0, HEAP32[$this + 28 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 40 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 32 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 44 >> 2] | 0, HEAP32[$this + 96 >> 2] << 2 | 0) | 0;
   _write($fd | 0, $this + 68 | 0, 36) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict16write_back_lemmaEi($this, $fd) {
   $this = $this | 0;
   $fd = $fd | 0;
   var $sub = 0, $lemma_size = 0, $lemma_count = 0;
   if ((_lseek($fd | 0, 4, 0) | 0) == -1) {
    return;
   }
   $sub = 1088 - (HEAP32[$this + 60 >> 2] | 0) | 0;
   $lemma_size = $this + 84 | 0;
   if ((_lseek($fd | 0, (HEAP32[$lemma_size >> 2] | 0) - $sub | 0, 1) | 0) == -1) {
    return;
   }
   _write($fd | 0, (HEAP32[$this + 24 >> 2] | 0) + ((HEAP32[$lemma_size >> 2] | 0) - $sub) | 0, $sub | 0) | 0;
   $lemma_count = $this + 80 | 0;
   _write($fd | 0, HEAP32[$this + 28 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 40 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 32 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 44 >> 2] | 0, HEAP32[$this + 96 >> 2] << 2 | 0) | 0;
   _write($fd | 0, $this + 68 | 0, 36) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict10save_cacheEPNS0_18UserDictSearchableEjj($this, $searchable, $offset, $length) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   $offset = $offset | 0;
   $length = $length | 0;
   var $sub = 0, $tail = 0, $1 = 0, $idxprom = 0, $inc13 = 0, $sub17_inc13 = 0, $head = 0, $4 = 0, $inc24 = 0;
   $sub = (HEAPU16[$searchable >> 1] | 0) - 1 | 0;
   $tail = $this + 588 + ($sub * 68 | 0) + 66 | 0;
   $1 = HEAP16[$tail >> 1] | 0;
   $idxprom = $1 & 65535;
   HEAP32[$this + 588 + ($sub * 68 | 0) + 32 + ($idxprom << 2) >> 2] = $offset;
   HEAP32[$this + 588 + ($sub * 68 | 0) + 48 + ($idxprom << 2) >> 2] = $length;
   HEAP32[$this + 588 + ($sub * 68 | 0) + ($idxprom << 3) >> 2] = HEAP32[$searchable + 36 >> 2];
   HEAP32[$this + 588 + ($sub * 68 | 0) + ($idxprom << 3) + 4 >> 2] = HEAP32[$searchable + 40 >> 2];
   $inc13 = $1 + 1 & 65535;
   $sub17_inc13 = ($inc13 & 65535) > 3 ? $1 - 3 & 65535 : $inc13;
   $head = $this + 588 + ($sub * 68 | 0) + 64 | 0;
   $4 = HEAP16[$head >> 1] | 0;
   if ($sub17_inc13 << 16 >> 16 != $4 << 16 >> 16) {
    HEAP16[$tail >> 1] = $sub17_inc13;
    return;
   }
   $inc24 = $4 + 1 & 65535;
   HEAP16[$head >> 1] = $inc24;
   if (($inc24 & 65535) <= 3) {
    HEAP16[$tail >> 1] = $sub17_inc13;
    return;
   }
   HEAP16[$head >> 1] = $4 - 3 & 65535;
   HEAP16[$tail >> 1] = $sub17_inc13;
   return;
  }
  function __ZN10ime_pinyin8UserDict15load_miss_cacheEPNS0_18UserDictSearchableE($this, $searchable) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   var $sub = 0, $1 = 0, $tail = 0, $i_0 = 0, $idxprom8 = 0, $j_0 = 0, $conv5 = 0, $inc20 = 0, $sub25_inc20 = 0, $retval_0 = 0, label = 0;
   $sub = (HEAPU16[$searchable >> 1] | 0) - 1 | 0;
   $1 = HEAP16[$this + 108 + ($sub * 60 | 0) + 56 >> 1] | 0;
   $tail = $this + 108 + ($sub * 60 | 0) + 58 | 0;
   if ($1 << 16 >> 16 == (HEAP16[$tail >> 1] | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   } else {
    $i_0 = $1;
   }
   L4189 : while (1) {
    $idxprom8 = $i_0 & 65535;
    $j_0 = 0;
    while (1) {
     $conv5 = $j_0 & 65535;
     if (($j_0 & 65535) >= 2) {
      $retval_0 = 1;
      label = 3300;
      break L4189;
     }
     if ((HEAP32[$this + 108 + ($sub * 60 | 0) + ($idxprom8 << 3) + ($conv5 << 2) >> 2] | 0) == (HEAP32[$searchable + 36 + ($conv5 << 2) >> 2] | 0)) {
      $j_0 = $j_0 + 1 & 65535;
     } else {
      break;
     }
    }
    $inc20 = $i_0 + 1 & 65535;
    $sub25_inc20 = ($inc20 & 65535) > 6 ? $i_0 - 6 & 65535 : $inc20;
    if ($sub25_inc20 << 16 >> 16 == (HEAP16[$tail >> 1] | 0)) {
     $retval_0 = 0;
     label = 3299;
     break;
    } else {
     $i_0 = $sub25_inc20;
    }
   }
   if ((label | 0) == 3300) {
    return $retval_0 | 0;
   } else if ((label | 0) == 3299) {
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict15save_miss_cacheEPNS0_18UserDictSearchableE($this, $searchable) {
   $this = $this | 0;
   $searchable = $searchable | 0;
   var $sub = 0, $tail = 0, $1 = 0, $idxprom6 = 0, $inc9 = 0, $sub13_inc9 = 0, $head = 0, $4 = 0, $inc20 = 0;
   $sub = (HEAPU16[$searchable >> 1] | 0) - 1 | 0;
   $tail = $this + 108 + ($sub * 60 | 0) + 58 | 0;
   $1 = HEAP16[$tail >> 1] | 0;
   $idxprom6 = $1 & 65535;
   HEAP32[$this + 108 + ($sub * 60 | 0) + ($idxprom6 << 3) >> 2] = HEAP32[$searchable + 36 >> 2];
   HEAP32[$this + 108 + ($sub * 60 | 0) + ($idxprom6 << 3) + 4 >> 2] = HEAP32[$searchable + 40 >> 2];
   $inc9 = $1 + 1 & 65535;
   $sub13_inc9 = ($inc9 & 65535) > 6 ? $1 - 6 & 65535 : $inc9;
   $head = $this + 108 + ($sub * 60 | 0) + 56 | 0;
   $4 = HEAP16[$head >> 1] | 0;
   if ($sub13_inc9 << 16 >> 16 != $4 << 16 >> 16) {
    HEAP16[$tail >> 1] = $sub13_inc9;
    return;
   }
   $inc20 = $4 + 1 & 65535;
   HEAP16[$head >> 1] = $inc20;
   if (($inc20 & 65535) <= 6) {
    HEAP16[$tail >> 1] = $sub13_inc9;
    return;
   }
   HEAP16[$head >> 1] = $4 - 6 & 65535;
   HEAP16[$tail >> 1] = $sub13_inc9;
   return;
  }
  function __ZN10ime_pinyin8UserDict14set_lemma_flagEjh($this, $offset, $flag) {
   $this = $this | 0;
   $offset = $offset | 0;
   $flag = $flag | 0;
   var $arrayidx = 0;
   $arrayidx = (HEAP32[$this + 24 >> 2] | 0) + ($offset & 2147483647) | 0;
   HEAP8[$arrayidx] = HEAP8[$arrayidx] | $flag;
   return;
  }
  function __ZN10ime_pinyin8UserDict14get_lemma_flagEj($this, $offset) {
   $this = $this | 0;
   $offset = $offset | 0;
   return HEAP8[(HEAP32[$this + 24 >> 2] | 0) + ($offset & 2147483647) | 0] | 0;
  }
  function __ZN10ime_pinyin8UserDict17write_back_offsetEi($this, $fd) {
   $this = $this | 0;
   $fd = $fd | 0;
   var $lemma_count = 0;
   if ((_lseek($fd | 0, (HEAP32[$this + 84 >> 2] | 0) + 4 | 0, 0) | 0) == -1) {
    return;
   }
   $lemma_count = $this + 80 | 0;
   _write($fd | 0, HEAP32[$this + 28 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 40 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 32 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 44 >> 2] | 0, HEAP32[$this + 96 >> 2] << 2 | 0) | 0;
   _write($fd | 0, $this + 68 | 0, 36) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict16write_back_scoreEi($this, $fd) {
   $this = $this | 0;
   $fd = $fd | 0;
   var $lemma_count = 0;
   $lemma_count = $this + 80 | 0;
   if ((_lseek($fd | 0, (HEAP32[$this + 84 >> 2] | 0) + 4 + (HEAP32[$lemma_count >> 2] << 3) | 0, 0) | 0) == -1) {
    return;
   }
   _write($fd | 0, HEAP32[$this + 32 >> 2] | 0, HEAP32[$lemma_count >> 2] << 2 | 0) | 0;
   _write($fd | 0, HEAP32[$this + 44 >> 2] | 0, HEAP32[$this + 96 >> 2] << 2 | 0) | 0;
   _write($fd | 0, $this + 68 | 0, 36) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict15write_back_syncEi($this, $fd) {
   $this = $this | 0;
   $fd = $fd | 0;
   if ((_lseek($fd | 0, (HEAP32[$this + 84 >> 2] | 0) + 4 + ((HEAP32[$this + 80 >> 2] | 0) * 12 | 0) | 0, 0) | 0) == -1) {
    return;
   }
   _write($fd | 0, HEAP32[$this + 44 >> 2] | 0, HEAP32[$this + 96 >> 2] << 2 | 0) | 0;
   _write($fd | 0, $this + 68 | 0, 36) | 0;
   return;
  }
  function __ZN10ime_pinyin8UserDict11reset_cacheEv($this) {
   $this = $this | 0;
   _memset($this + 588 | 0, 0, 544);
   return;
  }
  function __ZN10ime_pinyin8UserDict16reset_miss_cacheEv($this) {
   $this = $this | 0;
   _memset($this + 108 | 0, 0, 480);
   return;
  }
  function __ZN10ime_pinyin8UserDict10defragmentEv($this) {
   $this = $this | 0;
   var $lemma_count = 0, $offsets_ = 0, $scores_ = 0, $ids_ = 0, $first_freed_0142 = 0, $1 = 0, $2 = 0, $predicts_ = 0, $first_freed_1 = 0, $5 = 0, $add = 0, $9 = 0, $10 = 0, $first_inuse_0136 = 0, $inc29 = 0, $13 = 0, $first_inuse_0_lcssa = 0, $14 = 0, $15 = 0, $arrayidx37 = 0, $16 = 0, $19 = 0, $arrayidx44 = 0, $20 = 0, $23 = 0, $arrayidx52 = 0, $24 = 0, $27 = 0, $first_freed_2132 = 0, $28 = 0, $first_freed_3 = 0, $add83 = 0, $32 = 0, $first_inuse_1 = 0, $36 = 0, $arrayidx105 = 0, $37 = 0, $first_freed_4 = 0, $lemma_size = 0, $41 = 0, $lemma_size_left_ = 0, $add121 = 0, $lemma_count_left_ = 0, $add125 = 0, $dst_0130 = 0, $lemmas_ = 0, $sync_count = 0, $syncs_ = 0, $offsets_201 = 0, $ids_214 = 0, $start_id_ = 0, $offsets_by_id_ = 0, $predicts_219 = 0, $add141 = 0, $end_0126 = 0, $dst_1125 = 0, $add154 = 0, $add154_pn = 0, $call160 = 0, $mul174 = 0, $add171 = 0, $add176 = 0, $end_1114 = 0, $add191 = 0, $end_1_lcssa = 0, $44 = 0, $sub196 = 0, $sub20898 = 0, $sub22797 = 0, $j_0116 = 0, $arrayidx202 = 0, $47 = 0, $arrayidx220 = 0, $55 = 0, $sub24696 = 0, $j234_0118 = 0, $arrayidx239 = 0, $59 = 0, $add255 = 0, $dst_1122 = 0, $start_id_275 = 0, $ids_277 = 0, $offsets_279 = 0, $offsets_by_id_281 = 0, $i_0106 = 0, label = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    return;
   }
   $lemma_count = $this + 80 | 0;
   L4229 : do {
    if ((HEAP32[$lemma_count >> 2] | 0) == 0) {
     $first_freed_4 = 0;
    } else {
     $offsets_ = $this + 28 | 0;
     $scores_ = $this + 32 | 0;
     $ids_ = $this + 36 | 0;
     $first_freed_0142 = 0;
     while (1) {
      $1 = HEAP32[$offsets_ >> 2] | 0;
      $first_freed_1 = $first_freed_0142;
      while (1) {
       if ((HEAP32[$1 + ($first_freed_1 << 2) >> 2] | 0) <= -1) {
        break;
       }
       if ($first_freed_1 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
        $first_freed_1 = $first_freed_1 + 1 | 0;
       } else {
        break;
       }
      }
      $5 = HEAP32[$lemma_count >> 2] | 0;
      if ($first_freed_1 >>> 0 >= $5 >>> 0) {
       $2 = $5;
       break;
      }
      __ZN10ime_pinyin8UserDict14set_lemma_flagEjh($this, HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($first_freed_1 << 2) >> 2] | 0, 1);
      $add = $first_freed_1 + 1 | 0;
      $9 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($add << 2) >> 2] | 0;
      L4238 : do {
       if (($9 | 0) < 0) {
        $first_inuse_0136 = $add;
        $10 = $9;
        while (1) {
         if ($first_inuse_0136 >>> 0 >= (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
          $first_inuse_0_lcssa = $first_inuse_0136;
          break L4238;
         }
         __ZN10ime_pinyin8UserDict14set_lemma_flagEjh($this, $10, 1);
         $inc29 = $first_inuse_0136 + 1 | 0;
         $13 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($inc29 << 2) >> 2] | 0;
         if (($13 | 0) < 0) {
          $first_inuse_0136 = $inc29;
          $10 = $13;
         } else {
          $first_inuse_0_lcssa = $inc29;
          break;
         }
        }
       } else {
        $first_inuse_0_lcssa = $add;
       }
      } while (0);
      $14 = HEAP32[$lemma_count >> 2] | 0;
      if ($first_inuse_0_lcssa >>> 0 >= $14 >>> 0) {
       $2 = $14;
       break;
      }
      $15 = HEAP32[$offsets_ >> 2] | 0;
      $arrayidx37 = $15 + ($first_inuse_0_lcssa << 2) | 0;
      $16 = HEAP32[$arrayidx37 >> 2] | 0;
      HEAP32[$arrayidx37 >> 2] = HEAP32[$15 + ($first_freed_1 << 2) >> 2];
      HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($first_freed_1 << 2) >> 2] = $16;
      $19 = HEAP32[$scores_ >> 2] | 0;
      $arrayidx44 = $19 + ($first_inuse_0_lcssa << 2) | 0;
      $20 = HEAP32[$arrayidx44 >> 2] | 0;
      HEAP32[$arrayidx44 >> 2] = HEAP32[$19 + ($first_freed_1 << 2) >> 2];
      HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($first_freed_1 << 2) >> 2] = $20;
      $23 = HEAP32[$ids_ >> 2] | 0;
      $arrayidx52 = $23 + ($first_inuse_0_lcssa << 2) | 0;
      $24 = HEAP32[$arrayidx52 >> 2] | 0;
      HEAP32[$arrayidx52 >> 2] = HEAP32[$23 + ($first_freed_1 << 2) >> 2];
      HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($first_freed_1 << 2) >> 2] = $24;
      $27 = HEAP32[$lemma_count >> 2] | 0;
      if ($add >>> 0 < $27 >>> 0) {
       $first_freed_0142 = $add;
      } else {
       $2 = $27;
       break;
      }
     }
     if (($2 | 0) == 0) {
      $first_freed_4 = 0;
      break;
     }
     $predicts_ = $this + 40 | 0;
     $first_freed_2132 = 0;
     while (1) {
      $28 = HEAP32[$predicts_ >> 2] | 0;
      $first_freed_3 = $first_freed_2132;
      while (1) {
       if ((HEAP32[$28 + ($first_freed_3 << 2) >> 2] | 0) <= -1) {
        break;
       }
       if ($first_freed_3 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
        $first_freed_3 = $first_freed_3 + 1 | 0;
       } else {
        break;
       }
      }
      if ($first_freed_3 >>> 0 >= (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
       $first_freed_4 = $first_freed_3;
       break L4229;
      }
      $add83 = $first_freed_3 + 1 | 0;
      $32 = HEAP32[$predicts_ >> 2] | 0;
      $first_inuse_1 = $add83;
      while (1) {
       if ((HEAP32[$32 + ($first_inuse_1 << 2) >> 2] | 0) >= 0) {
        break;
       }
       if ($first_inuse_1 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
        $first_inuse_1 = $first_inuse_1 + 1 | 0;
       } else {
        break;
       }
      }
      if ($first_inuse_1 >>> 0 >= (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
       $first_freed_4 = $first_freed_3;
       break L4229;
      }
      $36 = HEAP32[$predicts_ >> 2] | 0;
      $arrayidx105 = $36 + ($first_inuse_1 << 2) | 0;
      $37 = HEAP32[$arrayidx105 >> 2] | 0;
      HEAP32[$arrayidx105 >> 2] = HEAP32[$36 + ($first_freed_3 << 2) >> 2];
      HEAP32[(HEAP32[$predicts_ >> 2] | 0) + ($first_freed_3 << 2) >> 2] = $37;
      if ($add83 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
       $first_freed_2132 = $add83;
      } else {
       $first_freed_4 = $add83;
       break;
      }
     }
    }
   } while (0);
   HEAP32[$lemma_count >> 2] = $first_freed_4;
   $lemma_size = $this + 84 | 0;
   $41 = HEAP32[$lemma_size >> 2] | 0;
   $lemma_size_left_ = $this + 60 | 0;
   $add121 = (HEAP32[$lemma_size_left_ >> 2] | 0) + $41 | 0;
   $lemma_count_left_ = $this + 56 | 0;
   $add125 = (HEAP32[$lemma_count_left_ >> 2] | 0) + $first_freed_4 | 0;
   if (($41 | 0) == 0) {
    return;
   } else {
    $dst_0130 = 0;
   }
   while (1) {
    if (((__ZN10ime_pinyin8UserDict14get_lemma_flagEj($this, $dst_0130) | 0) & 1) != 0) {
     break;
    }
    $add141 = (((__ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $dst_0130) | 0) & 255) << 2 | 2) + $dst_0130 | 0;
    if ($add141 >>> 0 < $41 >>> 0) {
     $dst_0130 = $add141;
    } else {
     label = 3380;
     break;
    }
   }
   if ((label | 0) == 3380) {
    return;
   }
   L4267 : do {
    if ($dst_0130 >>> 0 < $41 >>> 0) {
     $lemmas_ = $this + 24 | 0;
     $sync_count = $this + 96 | 0;
     $syncs_ = $this + 44 | 0;
     $offsets_201 = $this + 28 | 0;
     $ids_214 = $this + 36 | 0;
     $start_id_ = $this + 16 | 0;
     $offsets_by_id_ = $this + 52 | 0;
     $predicts_219 = $this + 40 | 0;
     $dst_1125 = $dst_0130;
     $end_0126 = $dst_0130;
     while (1) {
      $add154 = $end_0126 + 2 + ((__ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $end_0126) | 0) << 24 >> 24 << 2) | 0;
      if ($add154 >>> 0 < $41 >>> 0) {
       $add154_pn = $add154;
      } else {
       $dst_1122 = $dst_1125;
       break L4267;
      }
      while (1) {
       $call160 = __ZN10ime_pinyin8UserDict14get_lemma_flagEj($this, $add154_pn) | 0;
       $mul174 = ((__ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $add154_pn) | 0) & 255) << 2;
       if (($call160 & 1) == 0) {
        break;
       }
       $add171 = ($mul174 | 2) + $add154_pn | 0;
       if ($add171 >>> 0 < $41 >>> 0) {
        $add154_pn = $add171;
       } else {
        $dst_1122 = $dst_1125;
        break L4267;
       }
      }
      $add176 = $add154_pn + 2 + $mul174 | 0;
      L4275 : do {
       if ($add176 >>> 0 < $41 >>> 0) {
        $end_1114 = $add176;
        while (1) {
         if (((__ZN10ime_pinyin8UserDict14get_lemma_flagEj($this, $end_1114) | 0) & 1) != 0) {
          $end_1_lcssa = $end_1114;
          break L4275;
         }
         $add191 = (((__ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $end_1114) | 0) & 255) << 2 | 2) + $end_1114 | 0;
         if ($add191 >>> 0 < $41 >>> 0) {
          $end_1114 = $add191;
         } else {
          $end_1_lcssa = $add191;
          break;
         }
        }
       } else {
        $end_1_lcssa = $add176;
       }
      } while (0);
      $44 = HEAP32[$lemmas_ >> 2] | 0;
      $sub196 = $end_1_lcssa - $add154_pn | 0;
      _memmove($44 + $dst_1125 | 0, $44 + $add154_pn | 0, $sub196 | 0);
      if ((HEAP32[$lemma_count >> 2] | 0) != 0) {
       $sub20898 = $dst_1125 - $add154_pn | 0;
       $sub22797 = $dst_1125 - $add154_pn | 0;
       $j_0116 = 0;
       do {
        $arrayidx202 = (HEAP32[$offsets_201 >> 2] | 0) + ($j_0116 << 2) | 0;
        $47 = HEAP32[$arrayidx202 >> 2] | 0;
        if ($47 >>> 0 >= $add154_pn >>> 0 & $47 >>> 0 < $end_1_lcssa >>> 0) {
         HEAP32[$arrayidx202 >> 2] = $sub20898 + $47;
         HEAP32[(HEAP32[$offsets_by_id_ >> 2] | 0) + ((HEAP32[(HEAP32[$ids_214 >> 2] | 0) + ($j_0116 << 2) >> 2] | 0) - (HEAP32[$start_id_ >> 2] | 0) << 2) >> 2] = HEAP32[(HEAP32[$offsets_201 >> 2] | 0) + ($j_0116 << 2) >> 2];
        }
        $arrayidx220 = (HEAP32[$predicts_219 >> 2] | 0) + ($j_0116 << 2) | 0;
        $55 = HEAP32[$arrayidx220 >> 2] | 0;
        if ($55 >>> 0 >= $add154_pn >>> 0 & $55 >>> 0 < $end_1_lcssa >>> 0) {
         HEAP32[$arrayidx220 >> 2] = $sub22797 + $55;
        }
        $j_0116 = $j_0116 + 1 | 0;
       } while ($j_0116 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0);
      }
      if ((HEAP32[$sync_count >> 2] | 0) != 0) {
       $sub24696 = $dst_1125 - $add154_pn | 0;
       $j234_0118 = 0;
       do {
        $arrayidx239 = (HEAP32[$syncs_ >> 2] | 0) + ($j234_0118 << 2) | 0;
        $59 = HEAP32[$arrayidx239 >> 2] | 0;
        if ($59 >>> 0 >= $add154_pn >>> 0 & $59 >>> 0 < $end_1_lcssa >>> 0) {
         HEAP32[$arrayidx239 >> 2] = $sub24696 + $59;
        }
        $j234_0118 = $j234_0118 + 1 | 0;
       } while ($j234_0118 >>> 0 < (HEAP32[$sync_count >> 2] | 0) >>> 0);
      }
      $add255 = $sub196 + $dst_1125 | 0;
      if ($end_1_lcssa >>> 0 < $41 >>> 0) {
       $dst_1125 = $add255;
       $end_0126 = $end_1_lcssa;
      } else {
       $dst_1122 = $add255;
       break;
      }
     }
    } else {
     $dst_1122 = $dst_0130;
    }
   } while (0);
   HEAP32[$this + 88 >> 2] = 0;
   HEAP32[$this + 92 >> 2] = 0;
   HEAP32[$lemma_size >> 2] = $dst_1122;
   HEAP32[$lemma_size_left_ >> 2] = $add121 - $dst_1122;
   HEAP32[$lemma_count_left_ >> 2] = $add125 - (HEAP32[$lemma_count >> 2] | 0);
   if ((HEAP32[$lemma_count >> 2] | 0) != 0) {
    $start_id_275 = $this + 16 | 0;
    $ids_277 = $this + 36 | 0;
    $offsets_279 = $this + 28 | 0;
    $offsets_by_id_281 = $this + 52 | 0;
    $i_0106 = 0;
    do {
     HEAP32[(HEAP32[$ids_277 >> 2] | 0) + ($i_0106 << 2) >> 2] = (HEAP32[$start_id_275 >> 2] | 0) + $i_0106;
     HEAP32[(HEAP32[$offsets_by_id_281 >> 2] | 0) + ($i_0106 << 2) >> 2] = HEAP32[(HEAP32[$offsets_279 >> 2] | 0) + ($i_0106 << 2) >> 2];
     $i_0106 = $i_0106 + 1 | 0;
    } while ($i_0106 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0);
   }
   HEAP32[$this + 104 >> 2] = 6;
   return;
  }
  function __ZN10ime_pinyin8UserDict17clear_sync_lemmasEjj($this, $start, $end) {
   $this = $this | 0;
   $start = $start | 0;
   $end = $end | 0;
   var $sync_count = 0, $0 = 0, $_end = 0, $1 = 0, $state_ = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    return;
   }
   $sync_count = $this + 96 | 0;
   $0 = HEAP32[$sync_count >> 2] | 0;
   $_end = $0 >>> 0 < $end >>> 0 ? $0 : $end;
   $1 = HEAP32[$this + 44 >> 2] | 0;
   _memmove($1 + ($start << 2) | 0, $1 + ($_end << 2) | 0, $0 - $_end << 2 | 0);
   HEAP32[$sync_count >> 2] = $start - $_end + (HEAP32[$sync_count >> 2] | 0);
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) >= 2) {
    return;
   }
   HEAP32[$state_ >> 2] = 2;
   return;
  }
  function __ZN10ime_pinyin8UserDict14get_sync_countEv($this) {
   $this = $this | 0;
   var $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = HEAP32[$this + 96 >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict17put_lemma_no_syncEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   $count = $count | 0;
   $lmt$0 = $lmt$0 | 0;
   $lmt$1 = $lmt$1 | 0;
   var $lemma_size = 0, $syncs_ = 0, $0 = 0, $call4 = 0, $limit_lemma_size = 0, $add3 = 0, $1 = 0, $2 = 0, $4 = 0, $7 = 0, $call = 0, $call_lcssa = 0, label = 0;
   $lemma_size = $this + 84 | 0;
   $syncs_ = $this + 44 | 0;
   $0 = HEAP32[$syncs_ >> 2] | 0;
   HEAP32[$syncs_ >> 2] = 0;
   $call4 = __ZN10ime_pinyin8UserDict10_put_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) | 0;
   HEAP32[$syncs_ >> 2] = $0;
   if (($call4 | 0) != 0) {
    $call_lcssa = $call4;
    return $call_lcssa | 0;
   }
   $limit_lemma_size = $this + 76 | 0;
   $add3 = ($lemma_len & 65535) << 2 | 2;
   $1 = $this;
   $2 = HEAP32[$this + 72 >> 2] | 0;
   if (($2 | 0) == 0) {
    label = 3399;
   } else {
    if ((HEAP32[$this + 80 >> 2] | 0) >>> 0 < $2 >>> 0) {
     label = 3399;
    }
   }
   do {
    if ((label | 0) == 3399) {
     $4 = HEAP32[$limit_lemma_size >> 2] | 0;
     if (($4 | 0) == 0) {
      $call_lcssa = $call4;
      return $call_lcssa | 0;
     }
     if (((HEAP32[$lemma_size >> 2] | 0) + $add3 | 0) >>> 0 > $4 >>> 0) {
      break;
     } else {
      $call_lcssa = $call4;
     }
     return $call_lcssa | 0;
    }
   } while (0);
   __ZN10ime_pinyin8UserDict7reclaimEv($this);
   __ZN10ime_pinyin8UserDict10defragmentEv($this);
   FUNCTION_TABLE_vi[HEAP32[(HEAP32[$1 >> 2] | 0) + 76 >> 2] & 127]($this);
   $7 = HEAP32[$syncs_ >> 2] | 0;
   HEAP32[$syncs_ >> 2] = 0;
   $call = __ZN10ime_pinyin8UserDict10_put_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) | 0;
   HEAP32[$syncs_ >> 2] = $7;
   $call_lcssa = $call;
   return $call_lcssa | 0;
  }
  function __ZN10ime_pinyin8UserDict10_put_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   $count = $count | 0;
   $lmt$0 = $lmt$0 | 0;
   $lmt$1 = $lmt$1 | 0;
   var $call2 = 0, $conv5 = 0, $scores_ = 0, $total_nfreq = 0, $call7 = 0, $state_ = 0, $7 = 0, $9 = 0, $call41 = 0, $retval_0 = 0, label = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call2 = __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, $lemma_str, $splids, $lemma_len) | 0;
   if (($call2 | 0) != -1) {
    $conv5 = $count & 65535;
    $scores_ = $this + 32 | 0;
    $total_nfreq = $this + 100 | 0;
    HEAP32[$total_nfreq >> 2] = $conv5 - (HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($call2 << 2) >> 2] | 0) + (HEAP32[$total_nfreq >> 2] | 0);
    $call7 = __ZN10ime_pinyin8UserDict11build_scoreEyi(0, $lmt$0, $lmt$1, $conv5) | 0;
    HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($call2 << 2) >> 2] = $call7;
    $state_ = $this + 104 | 0;
    if ((HEAP32[$state_ >> 2] | 0) < 3) {
     HEAP32[$state_ >> 2] = 3;
    }
    $retval_0 = HEAP32[(HEAP32[$this + 36 >> 2] | 0) + ($call2 << 2) >> 2] | 0;
    return $retval_0 | 0;
   }
   $7 = HEAP32[$this + 72 >> 2] | 0;
   do {
    if (($7 | 0) != 0) {
     if ((HEAP32[$this + 80 >> 2] | 0) >>> 0 < $7 >>> 0) {
      break;
     } else {
      $retval_0 = 0;
     }
     return $retval_0 | 0;
    }
   } while (0);
   $9 = HEAP32[$this + 76 >> 2] | 0;
   do {
    if (($9 | 0) != 0) {
     if (((HEAP32[$this + 84 >> 2] | 0) + (($lemma_len & 65535) << 2 | 2) | 0) >>> 0 > $9 >>> 0) {
      $retval_0 = 0;
     } else {
      break;
     }
     return $retval_0 | 0;
    }
   } while (0);
   if ((HEAP32[$this + 56 >> 2] | 0) == 0) {
    label = 3418;
   } else {
    if ((HEAP32[$this + 60 >> 2] | 0) >>> 0 < (($lemma_len & 65535) << 2 | 2) >>> 0) {
     label = 3418;
    }
   }
   if ((label | 0) == 3418) {
    FUNCTION_TABLE_vi[HEAP32[(HEAP32[$this >> 2] | 0) + 76 >> 2] & 127]($this);
   }
   $call41 = __ZN10ime_pinyin8UserDict14append_a_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) | 0;
   if ((HEAP32[$this + 44 >> 2] | 0) == 0 | ($call41 | 0) == 0) {
    $retval_0 = $call41;
    return $retval_0 | 0;
   }
   __ZN10ime_pinyin8UserDict20queue_lemma_for_syncEj($this, $call41);
   $retval_0 = $call41;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict18extract_score_freqEi($this, $raw_score) {
   $this = $this | 0;
   $raw_score = $raw_score | 0;
   return $raw_score & 65535 | 0;
  }
  function __ZN10ime_pinyin8UserDict17extract_score_lmtEi($this, $raw_score) {
   $this = $this | 0;
   $raw_score = $raw_score | 0;
   var $mul$0 = 0, $add$0 = 0;
   $mul$0 = ___muldi3($raw_score >>> 16, 0, 604800, 0) | 0;
   $add$0 = _i64Add($mul$0, tempRet0, 1229904e3, 0) | 0;
   return (tempRet0 = tempRet0, $add$0) | 0;
  }
  function __ZN10ime_pinyin8UserDict11build_scoreEyi($this, $lmt$0, $lmt$1, $freq) {
   $this = $this | 0;
   $lmt$0 = $lmt$0 | 0;
   $lmt$1 = $lmt$1 | 0;
   $freq = $freq | 0;
   var $sub$0 = 0, $div$0 = 0;
   $sub$0 = _i64Add($lmt$0, $lmt$1, -1229904e3, -1) | 0;
   $div$0 = ___udivdi3($sub$0, tempRet0, 604800, 0) | 0;
   return $div$0 << 16 | $freq & 65535 | 0;
  }
  function __ZN10ime_pinyin8UserDict13utf16le_atollEPti($this, $s, $len) {
   $this = $this | 0;
   $s = $s | 0;
   $len = $len | 0;
   var $add_ptr = 0, $0 = 0, $s_addr_0_ph = 0, $flag_0_ph$0 = 0, $flag_0_ph$1 = 0, $1 = 0, $3 = 0, $ret_018$0 = 0, $ret_018$1 = 0, $s_addr_017 = 0, $mul$0 = 0, $mul$1 = 0, $add$0 = 0, $sub$0 = 0, $add16$0 = 0, $add16$1 = 0, $incdec_ptr17 = 0, $4 = 0, $ret_0_lcssa$0 = 0, $ret_0_lcssa$1 = 0, $mul19$0 = 0, $retval_0$0 = 0, $retval_0$1 = 0;
   if (($len | 0) < 1) {
    $retval_0$1 = 0;
    $retval_0$0 = 0;
    return (tempRet0 = $retval_0$1, $retval_0$0) | 0;
   }
   $add_ptr = $s + ($len << 1) | 0;
   $0 = HEAP16[$s >> 1] | 0;
   if (($0 << 16 >> 16 | 0) == 43) {
    $flag_0_ph$1 = 0;
    $flag_0_ph$0 = 1;
    $s_addr_0_ph = $s + 2 | 0;
   } else if (($0 << 16 >> 16 | 0) == 45) {
    $flag_0_ph$1 = -1;
    $flag_0_ph$0 = -1;
    $s_addr_0_ph = $s + 2 | 0;
   } else {
    $flag_0_ph$1 = 0;
    $flag_0_ph$0 = 1;
    $s_addr_0_ph = $s;
   }
   $1 = HEAP16[$s_addr_0_ph >> 1] | 0;
   if (($1 - 48 & 65535) < 10 & $s_addr_0_ph >>> 0 < $add_ptr >>> 0) {
    $s_addr_017 = $s_addr_0_ph;
    $ret_018$1 = 0;
    $ret_018$0 = 0;
    $3 = $1;
    while (1) {
     $mul$0 = ___muldi3($ret_018$0, $ret_018$1, 10, 0) | 0;
     $mul$1 = tempRet0;
     $add$0 = _i64Add($ret_018$0, $ret_018$1, -48, -1) | 0;
     $sub$0 = _i64Add($add$0, tempRet0, $mul$0, $mul$1) | 0;
     $add16$0 = _i64Add($sub$0, tempRet0, $3 & 65535, 0) | 0;
     $add16$1 = tempRet0;
     $incdec_ptr17 = $s_addr_017 + 2 | 0;
     $4 = HEAP16[$incdec_ptr17 >> 1] | 0;
     if (($4 - 48 & 65535) < 10 & $incdec_ptr17 >>> 0 < $add_ptr >>> 0) {
      $s_addr_017 = $incdec_ptr17;
      $ret_018$1 = $add16$1;
      $ret_018$0 = $add16$0;
      $3 = $4;
     } else {
      $ret_0_lcssa$1 = $add16$1;
      $ret_0_lcssa$0 = $add16$0;
      break;
     }
    }
   } else {
    $ret_0_lcssa$1 = 0;
    $ret_0_lcssa$0 = 0;
   }
   $mul19$0 = ___muldi3($flag_0_ph$0, $flag_0_ph$1, $ret_0_lcssa$0, $ret_0_lcssa$1) | 0;
   $retval_0$1 = tempRet0;
   $retval_0$0 = $mul19$0;
   return (tempRet0 = $retval_0$1, $retval_0$0) | 0;
  }
  function __ZN10ime_pinyin8UserDict13utf16le_lltoaExPti($this, $v$0, $v$1, $s, $size) {
   $this = $this | 0;
   $v$0 = $v$0 | 0;
   $v$1 = $v$1 | 0;
   $s = $s | 0;
   $size = $size | 0;
   var $add_ptr = 0, $$etemp$0$1 = 0, $mul$0 = 0, $s_addr_0 = 0, $v_addr_0$0 = 0, $v_addr_0$1 = 0, $ret_len_0 = 0, $ret_len_127 = 0, $v_addr_126$0 = 0, $v_addr_126$1 = 0, $s_addr_125 = 0, $rem$0 = 0, $add$0 = 0, $incdec_ptr7 = 0, $div$0 = 0, $div$1 = 0, $inc8 = 0, $v_addr_126_off$0 = 0, $v_addr_126_off$1 = 0, $$etemp$7$1 = 0, $ret_len_1_lcssa = 0, $v_addr_1_lcssa$0 = 0, $v_addr_1_lcssa$1 = 0, $s_addr_1_lcssa = 0, $s_addr_219 = 0, $s_addr_222 = 0, $b_021 = 0, $incdec_ptr16 = 0, $s_addr_2 = 0, $retval_0 = 0;
   if (($s | 0) == 0 | ($size | 0) < 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $add_ptr = $s + ($size << 1) | 0;
   $$etemp$0$1 = 0;
   if (($v$1 | 0) < ($$etemp$0$1 | 0) | ($v$1 | 0) == ($$etemp$0$1 | 0) & $v$0 >>> 0 < 0 >>> 0) {
    HEAP16[$s >> 1] = 45;
    $mul$0 = _i64Subtract(0, 0, $v$0, $v$1) | 0;
    $ret_len_0 = 1;
    $v_addr_0$1 = tempRet0;
    $v_addr_0$0 = $mul$0;
    $s_addr_0 = $s + 2 | 0;
   } else {
    $ret_len_0 = 0;
    $v_addr_0$1 = $v$1;
    $v_addr_0$0 = $v$0;
    $s_addr_0 = $s;
   }
   if ($s_addr_0 >>> 0 < $add_ptr >>> 0 & (($v_addr_0$0 | 0) != 0 | ($v_addr_0$1 | 0) != 0)) {
    $s_addr_125 = $s_addr_0;
    $v_addr_126$1 = $v_addr_0$1;
    $v_addr_126$0 = $v_addr_0$0;
    $ret_len_127 = $ret_len_0;
    while (1) {
     $rem$0 = ___remdi3($v_addr_126$0, $v_addr_126$1, 10, 0) | 0;
     $add$0 = _i64Add($rem$0, tempRet0, 48, 0) | 0;
     $incdec_ptr7 = $s_addr_125 + 2 | 0;
     HEAP16[$s_addr_125 >> 1] = $add$0 & 65535;
     $div$0 = ___divdi3($v_addr_126$0, $v_addr_126$1, 10, 0) | 0;
     $div$1 = tempRet0;
     $inc8 = $ret_len_127 + 1 | 0;
     $v_addr_126_off$0 = _i64Add($v_addr_126$0, $v_addr_126$1, 9, 0) | 0;
     $v_addr_126_off$1 = tempRet0;
     $$etemp$7$1 = 0;
     if ($incdec_ptr7 >>> 0 < $add_ptr >>> 0 & ($v_addr_126_off$1 >>> 0 > $$etemp$7$1 >>> 0 | $v_addr_126_off$1 >>> 0 == $$etemp$7$1 >>> 0 & $v_addr_126_off$0 >>> 0 > 18 >>> 0)) {
      $s_addr_125 = $incdec_ptr7;
      $v_addr_126$1 = $div$1;
      $v_addr_126$0 = $div$0;
      $ret_len_127 = $inc8;
     } else {
      $s_addr_1_lcssa = $incdec_ptr7;
      $v_addr_1_lcssa$1 = $div$1;
      $v_addr_1_lcssa$0 = $div$0;
      $ret_len_1_lcssa = $inc8;
      break;
     }
    }
   } else {
    $s_addr_1_lcssa = $s_addr_0;
    $v_addr_1_lcssa$1 = $v_addr_0$1;
    $v_addr_1_lcssa$0 = $v_addr_0$0;
    $ret_len_1_lcssa = $ret_len_0;
   }
   if (!(($v_addr_1_lcssa$0 | 0) == 0 & ($v_addr_1_lcssa$1 | 0) == 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $s_addr_219 = $s_addr_1_lcssa - 2 | 0;
   if ($s_addr_0 >>> 0 < $s_addr_219 >>> 0) {
    $b_021 = $s_addr_0;
    $s_addr_222 = $s_addr_219;
   } else {
    $retval_0 = $ret_len_1_lcssa;
    return $retval_0 | 0;
   }
   while (1) {
    HEAP16[$b_021 >> 1] = HEAP16[$s_addr_222 >> 1] | 0;
    $incdec_ptr16 = $b_021 + 2 | 0;
    $s_addr_2 = $s_addr_222 - 2 | 0;
    if ($incdec_ptr16 >>> 0 < $s_addr_2 >>> 0) {
     $b_021 = $incdec_ptr16;
     $s_addr_222 = $s_addr_2;
    } else {
     $retval_0 = $ret_len_1_lcssa;
     break;
    }
   }
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict9set_limitEjjj($this, $max_lemma_count, $max_lemma_size, $reclaim_ratio) {
   $this = $this | 0;
   $max_lemma_count = $max_lemma_count | 0;
   $max_lemma_size = $max_lemma_size | 0;
   $reclaim_ratio = $reclaim_ratio | 0;
   HEAP32[$this + 72 >> 2] = $max_lemma_count;
   HEAP32[$this + 76 >> 2] = $max_lemma_size;
   HEAP32[$this + 68 >> 2] = $reclaim_ratio >>> 0 > 100 ? 100 : $reclaim_ratio;
   return;
  }
  function __ZN10ime_pinyin8UserDict4swapEPNS0_23UserDictScoreOffsetPairEii($this, $sop, $i, $j) {
   $this = $this | 0;
   $sop = $sop | 0;
   $i = $i | 0;
   $j = $j | 0;
   var $score = 0, $0 = 0, $offset_index = 0, $1 = 0, $score4 = 0, $offset_index8 = 0;
   $score = $sop + ($i << 3) | 0;
   $0 = HEAP32[$score >> 2] | 0;
   $offset_index = $sop + ($i << 3) + 4 | 0;
   $1 = HEAP32[$offset_index >> 2] | 0;
   $score4 = $sop + ($j << 3) | 0;
   HEAP32[$score >> 2] = HEAP32[$score4 >> 2];
   $offset_index8 = $sop + ($j << 3) + 4 | 0;
   HEAP32[$offset_index >> 2] = HEAP32[$offset_index8 >> 2];
   HEAP32[$score4 >> 2] = $0;
   HEAP32[$offset_index8 >> 2] = $1;
   return;
  }
  function __ZN10ime_pinyin8UserDict38put_lemmas_no_sync_from_utf16le_stringEPti($this, $lemmas, $len) {
   $this = $this | 0;
   $lemmas = $lemmas | 0;
   $len = $len | 0;
   var $is_pre = 0, $call = 0, $0 = 0, $sub_ptr_rhs_cast = 0, $arraydecay = 0, $sub_ptr_lhs_cast57 = 0, $newly_added_056 = 0, $p_055 = 0, $2 = 0, $3 = 0, $p_149 = 0, $splid_len_048 = 0, $inc_splid_len_0 = 0, $incdec_ptr = 0, $4 = 0, $p_1_lcssa = 0, $splid_len_0_lcssa = 0, $inc14 = 0, $sub_ptr_lhs_cast15 = 0, $incdec_ptr35 = 0, $p_2 = 0, $incdec_ptr56 = 0, $p_3 = 0, $call74$0 = 0, $incdec_ptr76 = 0, $p_4 = 0, $call94$0 = 0, $inc99 = 0, $incdec_ptr100 = 0, $sub_ptr_lhs_cast = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 24 | 0;
   $is_pre = sp + 16 | 0;
   $call = __Znwj(4) | 0;
   $0 = $call;
   __ZN10ime_pinyin14SpellingParserC2Ev($0);
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $sub_ptr_rhs_cast = $lemmas;
   if (($len | 0) <= 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $arraydecay = sp | 0;
   $p_055 = $lemmas;
   $newly_added_056 = 0;
   $sub_ptr_lhs_cast57 = $lemmas;
   while (1) {
    $2 = HEAP16[$p_055 >> 1] | 0;
    L4408 : do {
     if ($2 << 16 >> 16 == 44) {
      $splid_len_0_lcssa = 0;
      $p_1_lcssa = $p_055;
     } else {
      $splid_len_048 = 0;
      $p_149 = $p_055;
      $3 = $2;
      while (1) {
       if (($p_149 - $sub_ptr_rhs_cast >> 1 | 0) >= ($len | 0)) {
        $splid_len_0_lcssa = $splid_len_048;
        $p_1_lcssa = $p_149;
        break L4408;
       }
       $inc_splid_len_0 = ($3 << 16 >> 16 == 32) + $splid_len_048 | 0;
       $incdec_ptr = $p_149 + 2 | 0;
       $4 = HEAP16[$incdec_ptr >> 1] | 0;
       if ($4 << 16 >> 16 == 44) {
        $splid_len_0_lcssa = $inc_splid_len_0;
        $p_1_lcssa = $incdec_ptr;
        break;
       } else {
        $splid_len_048 = $inc_splid_len_0;
        $p_149 = $incdec_ptr;
        $3 = $4;
       }
      }
     }
    } while (0);
    $inc14 = $splid_len_0_lcssa + 1 | 0;
    $sub_ptr_lhs_cast15 = $p_1_lcssa;
    if (($sub_ptr_lhs_cast15 - $sub_ptr_rhs_cast >> 1 | 0) == ($len | 0) | $inc14 >>> 0 > 8) {
     $retval_0 = $newly_added_056;
     label = 3483;
     break;
    }
    if (((__ZN10ime_pinyin14SpellingParser18splstr16_to_idxs_fEPKttPtS3_tRb($0, $p_055, ($sub_ptr_lhs_cast15 - $sub_ptr_lhs_cast57 | 0) >>> 1 & 65535, $arraydecay, 0, 8, $is_pre) | 0) & 65535 | 0) != ($inc14 | 0)) {
     $retval_0 = $newly_added_056;
     label = 3479;
     break;
    }
    $incdec_ptr35 = $p_1_lcssa + 2 | 0;
    $p_2 = $incdec_ptr35;
    while (1) {
     if ((HEAP16[$p_2 >> 1] | 0) == 44) {
      break;
     }
     if (($p_2 - $sub_ptr_rhs_cast >> 1 | 0) < ($len | 0)) {
      $p_2 = $p_2 + 2 | 0;
     } else {
      break;
     }
    }
    if (($p_2 - $incdec_ptr35 >> 1 | 0) != ($inc14 | 0)) {
     $retval_0 = $newly_added_056;
     label = 3482;
     break;
    }
    $incdec_ptr56 = $p_2 + 2 | 0;
    $p_3 = $incdec_ptr56;
    while (1) {
     if ((HEAP16[$p_3 >> 1] | 0) == 44) {
      break;
     }
     if (($p_3 - $sub_ptr_rhs_cast >> 1 | 0) < ($len | 0)) {
      $p_3 = $p_3 + 2 | 0;
     } else {
      break;
     }
    }
    $call74$0 = __ZN10ime_pinyin8UserDict13utf16le_atollEPti(0, $incdec_ptr56, $p_3 - $incdec_ptr56 >> 1) | 0;
    $incdec_ptr76 = $p_3 + 2 | 0;
    $p_4 = $incdec_ptr76;
    while (1) {
     if ((HEAP16[$p_4 >> 1] | 0) == 59) {
      break;
     }
     if (($p_4 - $sub_ptr_rhs_cast >> 1 | 0) < ($len | 0)) {
      $p_4 = $p_4 + 2 | 0;
     } else {
      break;
     }
    }
    $call94$0 = __ZN10ime_pinyin8UserDict13utf16le_atollEPti(0, $incdec_ptr76, $p_4 - $incdec_ptr76 >> 1) | 0;
    __ZN10ime_pinyin8UserDict17put_lemma_no_syncEPtS1_tty($this, $incdec_ptr35, $arraydecay, $inc14 & 65535, $call74$0 & 65535, $call94$0, tempRet0) | 0;
    $inc99 = $newly_added_056 + 1 | 0;
    $incdec_ptr100 = $p_4 + 2 | 0;
    $sub_ptr_lhs_cast = $incdec_ptr100;
    if (($sub_ptr_lhs_cast - $sub_ptr_rhs_cast >> 1 | 0) < ($len | 0)) {
     $p_055 = $incdec_ptr100;
     $newly_added_056 = $inc99;
     $sub_ptr_lhs_cast57 = $sub_ptr_lhs_cast;
    } else {
     $retval_0 = $inc99;
     label = 3478;
     break;
    }
   }
   if ((label | 0) == 3482) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 3483) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 3478) {
    STACKTOP = sp;
    return $retval_0 | 0;
   } else if ((label | 0) == 3479) {
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   return 0;
  }
  function __ZN10ime_pinyin8UserDict48get_sync_lemmas_in_utf16le_string_from_beginningEPtiPi($this, $str, $size, $count) {
   $this = $this | 0;
   $str = $str | 0;
   $size = $size | 0;
   $count = $count | 0;
   var $call2 = 0, $sync_count = 0, $syncs_ = 0, $len_045 = 0, $left_len_044 = 0, $i_043 = 0, $2 = 0, $call6 = 0, $conv7 = 0, $call8 = 0, $call9 = 0, $call11 = 0, $j_034 = 0, $4 = 0, $call16 = 0, $5 = 0, $add_ptr = 0, $inc = 0, $j_1 = 0, $6 = 0, $incdec_ptr26 = 0, $7 = 0, $cmp3536 = 0, $8 = 0, $j_238 = 0, $9 = 0, $inc42 = 0, $10 = 0, $cmp35 = 0, $cmp35_lcssa = 0, $_lcssa = 0, $j_2_lcssa = 0, $conv54$0 = 0, $11 = 0, $call58 = 0, $12 = 0, $add_ptr62 = 0, $call68$0 = 0, $13 = 0, $call72 = 0, $14 = 0, $add_ptr76 = 0, $sub_ptr_sub82 = 0, $sub_ptr_div83 = 0, $16 = 0, $left_len_1 = 0, $len_1 = 0, $inc90 = 0, $len_0_lcssa = 0, $state_ = 0, $retval_0 = 0;
   HEAP32[$count >> 2] = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $call2 = __ZN10ime_pinyin12SpellingTrie12get_instanceEv() | 0;
   if (($call2 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $sync_count = $this + 96 | 0;
   if ((HEAP32[$sync_count >> 2] | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $syncs_ = $this + 44 | 0;
   $i_043 = 0;
   $left_len_044 = $size;
   $len_045 = 0;
   L4443 : while (1) {
    $2 = HEAP32[(HEAP32[$syncs_ >> 2] | 0) + ($i_043 << 2) >> 2] | 0;
    $call6 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
    $conv7 = $call6 << 24 >> 24;
    $call8 = __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0;
    $call9 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0;
    $call11 = __ZN10ime_pinyin8UserDict16_get_lemma_scoreEPtS1_t($this, $call9, $call8, $call6 << 24 >> 24) | 0;
    HEAP32[2002] = 46880;
    L4445 : do {
     if ($call6 << 24 >> 24 == 0) {
      $j_1 = 0;
     } else {
      $j_034 = 0;
      while (1) {
       $4 = HEAP32[2002] | 0;
       $call16 = __ZN10ime_pinyin12SpellingTrie18get_spelling_str16EtPtj($call2, HEAP16[$call8 + ($j_034 << 1) >> 1] | 0, $4, 47904 - $4 >> 1) | 0;
       if (($call16 | 0) < 1) {
        $j_1 = $j_034;
        break L4445;
       }
       $5 = HEAP32[2002] | 0;
       $add_ptr = $5 + ($call16 << 1) | 0;
       HEAP32[2002] = $add_ptr;
       if ($add_ptr >>> 0 >= 47902 >>> 0) {
        $j_1 = 0;
        break L4445;
       }
       HEAP32[2002] = $5 + ($call16 + 1 << 1);
       HEAP16[$add_ptr >> 1] = 32;
       $inc = $j_034 + 1 | 0;
       if ($inc >>> 0 < $conv7 >>> 0) {
        $j_034 = $inc;
       } else {
        $j_1 = $inc;
        break;
       }
      }
     }
    } while (0);
    do {
     if ($j_1 >>> 0 < $conv7 >>> 0) {
      $len_1 = $len_045;
      $left_len_1 = $left_len_044;
     } else {
      $6 = HEAP32[2002] | 0;
      $incdec_ptr26 = $6 - 2 | 0;
      HEAP32[2002] = $incdec_ptr26;
      if ($incdec_ptr26 >>> 0 >= 47902 >>> 0) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      HEAP32[2002] = $6;
      HEAP16[$incdec_ptr26 >> 1] = 44;
      $7 = HEAP32[2002] | 0;
      $cmp3536 = $7 >>> 0 < 47902 >>> 0;
      if ($call6 << 24 >> 24 != 0 & $cmp3536) {
       $j_238 = 0;
       $8 = $7;
       while (1) {
        $9 = HEAP16[$call9 + ($j_238 << 1) >> 1] | 0;
        HEAP32[2002] = $8 + 2;
        HEAP16[$8 >> 1] = $9;
        $inc42 = $j_238 + 1 | 0;
        $10 = HEAP32[2002] | 0;
        $cmp35 = $10 >>> 0 < 47902 >>> 0;
        if ($inc42 >>> 0 < $conv7 >>> 0 & $cmp35) {
         $j_238 = $inc42;
         $8 = $10;
        } else {
         $j_2_lcssa = $inc42;
         $_lcssa = $10;
         $cmp35_lcssa = $cmp35;
         break;
        }
       }
      } else {
       $j_2_lcssa = 0;
       $_lcssa = $7;
       $cmp35_lcssa = $cmp3536;
      }
      if (!($j_2_lcssa >>> 0 >= $conv7 >>> 0 & $cmp35_lcssa)) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      HEAP32[2002] = $_lcssa + 2;
      HEAP16[$_lcssa >> 1] = 44;
      $conv54$0 = __ZN10ime_pinyin8UserDict18extract_score_freqEi(0, $call11) | 0;
      $11 = HEAP32[2002] | 0;
      $call58 = __ZN10ime_pinyin8UserDict13utf16le_lltoaExPti(0, $conv54$0, 0, $11, 47904 - $11 >> 1) | 0;
      if (($call58 | 0) < 1) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      $12 = HEAP32[2002] | 0;
      $add_ptr62 = $12 + ($call58 << 1) | 0;
      HEAP32[2002] = $add_ptr62;
      if ($add_ptr62 >>> 0 >= 47902 >>> 0) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      HEAP32[2002] = $12 + ($call58 + 1 << 1);
      HEAP16[$add_ptr62 >> 1] = 44;
      $call68$0 = __ZN10ime_pinyin8UserDict17extract_score_lmtEi(0, $call11) | 0;
      $13 = HEAP32[2002] | 0;
      $call72 = __ZN10ime_pinyin8UserDict13utf16le_lltoaExPti(0, $call68$0, tempRet0, $13, 47904 - $13 >> 1) | 0;
      if (($call72 | 0) < 1) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      $14 = HEAP32[2002] | 0;
      $add_ptr76 = $14 + ($call72 << 1) | 0;
      HEAP32[2002] = $add_ptr76;
      if ($add_ptr76 >>> 0 >= 47902 >>> 0) {
       $len_1 = $len_045;
       $left_len_1 = $left_len_044;
       break;
      }
      HEAP32[2002] = $14 + ($call72 + 1 << 1);
      HEAP16[$add_ptr76 >> 1] = 59;
      $sub_ptr_sub82 = (HEAP32[2002] | 0) - 46880 | 0;
      $sub_ptr_div83 = $sub_ptr_sub82 >> 1;
      if (($sub_ptr_div83 | 0) > ($left_len_044 | 0)) {
       $len_0_lcssa = $len_045;
       break L4443;
      }
      $16 = $str + ($len_045 << 1) | 0;
      _memcpy($16 | 0, 46880, $sub_ptr_sub82) | 0;
      HEAP32[$count >> 2] = (HEAP32[$count >> 2] | 0) + 1;
      $len_1 = $sub_ptr_div83 + $len_045 | 0;
      $left_len_1 = $left_len_044 - $sub_ptr_div83 | 0;
     }
    } while (0);
    $inc90 = $i_043 + 1 | 0;
    if ($inc90 >>> 0 < (HEAP32[$sync_count >> 2] | 0) >>> 0) {
     $i_043 = $inc90;
     $left_len_044 = $left_len_1;
     $len_045 = $len_1;
    } else {
     $len_0_lcssa = $len_1;
     break;
    }
   }
   if (($len_0_lcssa | 0) <= 0) {
    $retval_0 = $len_0_lcssa;
    return $retval_0 | 0;
   }
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) >= 2) {
    $retval_0 = $len_0_lcssa;
    return $retval_0 | 0;
   }
   HEAP32[$state_ >> 2] = 2;
   $retval_0 = $len_0_lcssa;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict5stateEPNS0_12UserDictStatE($this, $stat) {
   $this = $this | 0;
   $stat = $stat | 0;
   var $dict_info_ = 0, $retval_0 = 0;
   if (($stat | 0) == 0 | (__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0) ^ 1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   HEAP32[$stat >> 2] = HEAP32[$this + 20 >> 2];
   HEAP32[$stat + 4 >> 2] = HEAP32[$this + 64 >> 2];
   HEAP32[$stat + 8 >> 2] = HEAP32[$this + 8 >> 2];
   HEAP32[$stat + 12 >> 2] = HEAP32[$this + 12 >> 2];
   HEAP32[$stat + 16 >> 2] = HEAP32[11850];
   HEAP32[$stat + 20 >> 2] = HEAP32[11851];
   $dict_info_ = $this + 68 | 0;
   HEAP32[$stat + 24 >> 2] = __ZN10ime_pinyin8UserDict18get_dict_file_sizeEPNS0_12UserDictInfoE(0, $dict_info_) | 0;
   HEAP32[$stat + 28 >> 2] = HEAP32[$this + 80 >> 2];
   HEAP32[$stat + 32 >> 2] = HEAP32[$this + 84 >> 2];
   HEAP32[$stat + 36 >> 2] = HEAP32[$this + 88 >> 2];
   HEAP32[$stat + 40 >> 2] = HEAP32[$this + 92 >> 2];
   HEAP32[$stat + 44 >> 2] = HEAP32[$this + 96 >> 2];
   HEAP32[$stat + 52 >> 2] = HEAP32[$this + 72 >> 2];
   HEAP32[$stat + 56 >> 2] = HEAP32[$this + 76 >> 2];
   HEAP32[$stat + 48 >> 2] = HEAP32[$dict_info_ >> 2];
   $retval_0 = 1;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict10shift_downEPNS0_23UserDictScoreOffsetPairEii($this, $sop, $i, $n) {
   $this = $this | 0;
   $sop = $sop | 0;
   $i = $i | 0;
   $n = $n | 0;
   var $par_038 = 0, $add36 = 0, $add2 = 0, $cmp4 = 0, $score = 0, $0 = 0, $par_0_be = 0, $score15 = 0, $4 = 0, label = 0;
   if (($i | 0) < ($n | 0)) {
    $par_038 = $i;
   } else {
    return;
   }
   L4481 : while (1) {
    $add36 = $par_038 << 1 | 1;
    $add2 = $add36 + 1 | 0;
    $cmp4 = ($add2 | 0) < ($n | 0);
    if (!(($add36 | 0) < ($n | 0) | $cmp4)) {
     label = 3532;
     break;
    }
    $score = $sop + ($add36 << 3) | 0;
    $0 = HEAP32[$score >> 2] | 0;
    L4484 : do {
     if ($cmp4) {
      $score15 = $sop + ($add2 << 3) | 0;
      do {
       if (($0 | 0) > (HEAP32[$score15 >> 2] | 0)) {
        if (($0 | 0) <= (HEAP32[$sop + ($par_038 << 3) >> 2] | 0)) {
         break;
        }
        __ZN10ime_pinyin8UserDict4swapEPNS0_23UserDictScoreOffsetPairEii(0, $sop, $add36, $par_038);
        $par_0_be = $add36;
        break L4484;
       }
      } while (0);
      $4 = HEAP32[$score15 >> 2] | 0;
      if (($4 | 0) <= (HEAP32[$score >> 2] | 0)) {
       label = 3536;
       break L4481;
      }
      if (($4 | 0) <= (HEAP32[$sop + ($par_038 << 3) >> 2] | 0)) {
       label = 3537;
       break L4481;
      }
      __ZN10ime_pinyin8UserDict4swapEPNS0_23UserDictScoreOffsetPairEii(0, $sop, $add2, $par_038);
      $par_0_be = $add2;
     } else {
      if (($0 | 0) <= (HEAP32[$sop + ($par_038 << 3) >> 2] | 0)) {
       label = 3534;
       break L4481;
      }
      __ZN10ime_pinyin8UserDict4swapEPNS0_23UserDictScoreOffsetPairEii(0, $sop, $add36, $par_038);
      $par_0_be = $add36;
     }
    } while (0);
    if (($par_0_be | 0) < ($n | 0)) {
     $par_038 = $par_0_be;
    } else {
     label = 3533;
     break;
    }
   }
   if ((label | 0) == 3536) {
    return;
   } else if ((label | 0) == 3537) {
    return;
   } else if ((label | 0) == 3532) {
    return;
   } else if ((label | 0) == 3533) {
    return;
   } else if ((label | 0) == 3534) {
    return;
   }
  }
  function __ZN10ime_pinyin8UserDict9put_lemmaEPtS1_tt($this, $lemma_str, $splids, $lemma_len, $count) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   $count = $count | 0;
   var $call = 0;
   $call = _time(0) | 0;
   return __ZN10ime_pinyin8UserDict10_put_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $call, ($call | 0) < 0 ? -1 : 0) | 0;
  }
  function __ZN10ime_pinyin8UserDict7reclaimEv($this) {
   $this = $this | 0;
   var $0 = 0, $lemma_count = 0, $mul = 0, $div = 0, $call7 = 0, $2 = 0, $4 = 0, $i_036 = 0, $scores_28 = 0, $score31 = 0, $7 = 0, $i14_034 = 0, $i21_033 = 0, $10 = 0, $i42_031 = 0, $state_ = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    return;
   }
   $0 = HEAP32[$this + 68 >> 2] | 0;
   if (($0 | 0) == 0) {
    return;
   } else if (($0 | 0) == 100) {
    ___assert_func(2712, 1958, 4520, 1856);
   } else {
    $lemma_count = $this + 80 | 0;
    $mul = Math_imul(HEAP32[$lemma_count >> 2] | 0, $0) | 0;
    $div = ($mul >>> 0) / 100 | 0;
    $call7 = _malloc($div << 3) | 0;
    $2 = $call7;
    if (($call7 | 0) == 0) {
     return;
    }
    if ($mul >>> 0 > 99) {
     $4 = HEAP32[$this + 32 >> 2] | 0;
     $i_036 = 0;
     do {
      HEAP32[$2 + ($i_036 << 3) >> 2] = HEAP32[$4 + ($i_036 << 2) >> 2];
      HEAP32[$2 + ($i_036 << 3) + 4 >> 2] = $i_036;
      $i_036 = $i_036 + 1 | 0;
     } while (($i_036 | 0) < ($div | 0));
    }
    $i14_034 = ($div + 1 | 0) >>> 1;
    while (1) {
     __ZN10ime_pinyin8UserDict10shift_downEPNS0_23UserDictScoreOffsetPairEii($this, $2, $i14_034, $div);
     if (($i14_034 | 0) > 0) {
      $i14_034 = $i14_034 - 1 | 0;
     } else {
      break;
     }
    }
    if ($div >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0) {
     $scores_28 = $this + 32 | 0;
     $score31 = $call7;
     $7 = $call7 + 4 | 0;
     $i21_033 = $div;
     do {
      $10 = HEAP32[(HEAP32[$scores_28 >> 2] | 0) + ($i21_033 << 2) >> 2] | 0;
      if (($10 | 0) < (HEAP32[$score31 >> 2] | 0)) {
       HEAP32[$score31 >> 2] = $10;
       HEAP32[$7 >> 2] = $i21_033;
       __ZN10ime_pinyin8UserDict10shift_downEPNS0_23UserDictScoreOffsetPairEii($this, $2, 0, $div);
      }
      $i21_033 = $i21_033 + 1 | 0;
     } while ($i21_033 >>> 0 < (HEAP32[$lemma_count >> 2] | 0) >>> 0);
    }
    do {
     if ($mul >>> 0 > 99) {
      $i42_031 = 0;
      do {
       __ZN10ime_pinyin8UserDict28remove_lemma_by_offset_indexEi($this, HEAP32[$2 + ($i42_031 << 3) + 4 >> 2] | 0) | 0;
       $i42_031 = $i42_031 + 1 | 0;
      } while (($i42_031 | 0) < ($div | 0));
      if ($mul >>> 0 <= 99) {
       break;
      }
      $state_ = $this + 104 | 0;
      if ((HEAP32[$state_ >> 2] | 0) >= 4) {
       break;
      }
      HEAP32[$state_ >> 2] = 4;
     }
    } while (0);
    _free($call7);
    return;
   }
  }
  function __ZN10ime_pinyin8UserDict21get_total_lemma_countEv($this) {
   $this = $this | 0;
   return HEAP32[$this + 100 >> 2] | 0;
  }
  function __ZN10ime_pinyin8UserDict31set_total_lemma_count_of_othersEj($this, $count) {
   $this = $this | 0;
   $count = $count | 0;
   HEAP32[$this + 4 >> 2] = $count;
   return;
  }
  function __ZN10ime_pinyin8UserDict16get_max_lemma_idEv($this) {
   $this = $this | 0;
   return (HEAP32[$this + 16 >> 2] | 0) - 1 + (HEAP32[$this + 80 >> 2] | 0) | 0;
  }
  function __ZN10ime_pinyin8UserDict14append_a_lemmaEPtS1_tty($this, $lemma_str, $splids, $lemma_len, $count, $lmt$0, $lmt$1) {
   $this = $this | 0;
   $lemma_str = $lemma_str | 0;
   $splids = $splids | 0;
   $lemma_len = $lemma_len | 0;
   $count = $count | 0;
   $lmt$0 = $lmt$0 | 0;
   $lmt$1 = $lmt$1 | 0;
   var $searchable = 0, $add = 0, $lemma_size = 0, $0 = 0, $lemmas_ = 0, $conv5 = 0, $add8 = 0, $add16 = 0, $i_063 = 0, $shl = 0, $lemma_count = 0, $9 = 0, $offsets_ = 0, $conv23 = 0, $call24 = 0, $scores_ = 0, $ids_ = 0, $predicts_ = 0, $add3461 = 0, $lemma_count_left_ = 0, $lemma_size_left_ = 0, $i42_0 = 0, $21 = 0, $call46 = 0, $22 = 0, $23 = 0, $add_ptr_sum = 0, $shl64 = 0, $27 = 0, $28 = 0, $32 = 0, $33 = 0, $37 = 0, $38 = 0, $call94 = 0, $state_ = 0, $total_nfreq = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 48 | 0;
   $searchable = sp | 0;
   $add = (__ZN10ime_pinyin8UserDict16get_max_lemma_idEv($this) | 0) + 1 | 0;
   $lemma_size = $this + 84 | 0;
   $0 = HEAP32[$lemma_size >> 2] | 0;
   if (($0 | 0) < 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $lemmas_ = $this + 24 | 0;
   HEAP8[(HEAP32[$lemmas_ >> 2] | 0) + $0 | 0] = 0;
   HEAP8[(HEAP32[$lemmas_ >> 2] | 0) + ($0 + 1) | 0] = $lemma_len & 255;
   $conv5 = $lemma_len & 65535;
   if ($lemma_len << 16 >> 16 != 0) {
    $add8 = $0 + 2 | 0;
    $add16 = $add8 + ($conv5 << 1) | 0;
    $i_063 = 0;
    do {
     $shl = $i_063 << 1;
     HEAP16[(HEAP32[$lemmas_ >> 2] | 0) + ($shl + $add8) >> 1] = HEAP16[$splids + ($i_063 << 1) >> 1] | 0;
     HEAP16[(HEAP32[$lemmas_ >> 2] | 0) + ($add16 + $shl) >> 1] = HEAP16[$lemma_str + ($i_063 << 1) >> 1] | 0;
     $i_063 = $i_063 + 1 | 0;
    } while ($i_063 >>> 0 < $conv5 >>> 0);
   }
   $lemma_count = $this + 80 | 0;
   $9 = HEAP32[$lemma_count >> 2] | 0;
   $offsets_ = $this + 28 | 0;
   HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($9 << 2) >> 2] = $0;
   $conv23 = $count & 65535;
   $call24 = __ZN10ime_pinyin8UserDict11build_scoreEyi(0, $lmt$0, $lmt$1, $conv23) | 0;
   $scores_ = $this + 32 | 0;
   HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($9 << 2) >> 2] = $call24;
   $ids_ = $this + 36 | 0;
   HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($9 << 2) >> 2] = $add;
   $predicts_ = $this + 40 | 0;
   HEAP32[(HEAP32[$predicts_ >> 2] | 0) + ($9 << 2) >> 2] = $0;
   HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($add - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] = $0;
   HEAP32[$lemma_count >> 2] = (HEAP32[$lemma_count >> 2] | 0) + 1;
   $add3461 = $conv5 << 2 | 2;
   HEAP32[$lemma_size >> 2] = (HEAP32[$lemma_size >> 2] | 0) + $add3461;
   $lemma_count_left_ = $this + 56 | 0;
   HEAP32[$lemma_count_left_ >> 2] = (HEAP32[$lemma_count_left_ >> 2] | 0) - 1;
   $lemma_size_left_ = $this + 60 | 0;
   HEAP32[$lemma_size_left_ >> 2] = (HEAP32[$lemma_size_left_ >> 2] | 0) - $add3461;
   __ZN10ime_pinyin8UserDict14prepare_locateEPNS0_18UserDictSearchableEPKtt(0, $searchable, $splids, $lemma_len);
   $i42_0 = 0;
   while (1) {
    if ($i42_0 >>> 0 >= $9 >>> 0) {
     break;
    }
    $21 = HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($i42_0 << 2) >> 2] | 0;
    $call46 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $21) | 0;
    if ((__ZN10ime_pinyin8UserDict22fuzzy_compare_spell_idEPKttPKNS0_18UserDictSearchableE(0, __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $21) | 0, $call46 << 24 >> 24, $searchable) | 0) > -1) {
     break;
    } else {
     $i42_0 = $i42_0 + 1 | 0;
    }
   }
   if (($i42_0 | 0) != ($9 | 0)) {
    $22 = HEAP32[$offsets_ >> 2] | 0;
    $23 = HEAP32[$22 + ($9 << 2) >> 2] | 0;
    $add_ptr_sum = $i42_0 + 1 | 0;
    $shl64 = $9 - $i42_0 << 2;
    _memmove($22 + ($add_ptr_sum << 2) | 0, $22 + ($i42_0 << 2) | 0, $shl64 | 0);
    HEAP32[(HEAP32[$offsets_ >> 2] | 0) + ($i42_0 << 2) >> 2] = $23;
    $27 = HEAP32[$scores_ >> 2] | 0;
    $28 = HEAP32[$27 + ($9 << 2) >> 2] | 0;
    _memmove($27 + ($add_ptr_sum << 2) | 0, $27 + ($i42_0 << 2) | 0, $shl64 | 0);
    HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($i42_0 << 2) >> 2] = $28;
    $32 = HEAP32[$ids_ >> 2] | 0;
    $33 = HEAP32[$32 + ($9 << 2) >> 2] | 0;
    _memmove($32 + ($add_ptr_sum << 2) | 0, $32 + ($i42_0 << 2) | 0, $shl64 | 0);
    HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($i42_0 << 2) >> 2] = $33;
   }
   $37 = HEAP32[$predicts_ >> 2] | 0;
   $38 = HEAP32[$37 + ($9 << 2) >> 2] | 0;
   $call94 = __ZN10ime_pinyin8UserDict34locate_where_to_insert_in_predictsEPKti($this, __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $38) | 0, $conv5) | 0;
   if (($call94 | 0) != ($9 | 0)) {
    _memmove($37 + ($call94 + 1 << 2) | 0, $37 + ($call94 << 2) | 0, $9 - $call94 << 2 | 0);
    HEAP32[(HEAP32[$predicts_ >> 2] | 0) + ($call94 << 2) >> 2] = $38;
   }
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) < 5) {
    HEAP32[$state_ >> 2] = 5;
   }
   __ZN10ime_pinyin8UserDict10cache_initEv($this);
   $total_nfreq = $this + 100 | 0;
   HEAP32[$total_nfreq >> 2] = (HEAP32[$total_nfreq >> 2] | 0) + $conv23;
   $retval_0 = $add;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin8UserDict20queue_lemma_for_syncEj($this, $id) {
   $this = $this | 0;
   $id = $id | 0;
   var $sync_count = 0, $0 = 0, $sync_count_size_ = 0, $1 = 0, $4 = 0, $syncs_5 = 0, $call = 0, $12 = 0, $13 = 0;
   $sync_count = $this + 96 | 0;
   $0 = HEAP32[$sync_count >> 2] | 0;
   $sync_count_size_ = $this + 48 | 0;
   $1 = HEAP32[$sync_count_size_ >> 2] | 0;
   if ($0 >>> 0 < $1 >>> 0) {
    $4 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($id - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
    HEAP32[$sync_count >> 2] = $0 + 1;
    HEAP32[(HEAP32[$this + 44 >> 2] | 0) + ($0 << 2) >> 2] = $4;
    return;
   }
   $syncs_5 = $this + 44 | 0;
   $call = _realloc(HEAP32[$syncs_5 >> 2] | 0, ($1 << 2) + 128 | 0) | 0;
   if (($call | 0) == 0) {
    return;
   }
   HEAP32[$sync_count_size_ >> 2] = (HEAP32[$sync_count_size_ >> 2] | 0) + 32;
   HEAP32[$syncs_5 >> 2] = $call;
   $12 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($id - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $13 = HEAP32[$sync_count >> 2] | 0;
   HEAP32[$sync_count >> 2] = $13 + 1;
   HEAP32[(HEAP32[$syncs_5 >> 2] | 0) + ($13 << 2) >> 2] = $12;
   return;
  }
  function __ZN10ime_pinyin8UserDict12update_lemmaEjsb($this, $lemma_id, $delta_count, $selected) {
   $this = $this | 0;
   $lemma_id = $lemma_id | 0;
   $delta_count = $delta_count | 0;
   $selected = $selected | 0;
   var $2 = 0, $call7 = 0, $call8 = 0, $call11 = 0, $scores_ = 0, $4 = 0, $call15 = 0, $call16$0 = 0, $call16$1 = 0, $delta_count_addr_0 = 0, $conv26 = 0, $total_nfreq = 0, $call31 = 0, $lmt_0$0 = 0, $lmt_0$1 = 0, $call34 = 0, $state_ = 0, $ids_ = 0, $retval_0 = 0;
   if (!(__ZN10ime_pinyin8UserDict14is_valid_stateEv($this) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   if (!(__ZN10ime_pinyin8UserDict17is_valid_lemma_idEj($this, $lemma_id) | 0)) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $2 = HEAP32[(HEAP32[$this + 52 >> 2] | 0) + ($lemma_id - (HEAP32[$this + 16 >> 2] | 0) << 2) >> 2] | 0;
   $call7 = __ZN10ime_pinyin8UserDict15get_lemma_ncharEj($this, $2) | 0;
   $call8 = __ZN10ime_pinyin8UserDict14get_lemma_wordEj($this, $2) | 0;
   $call11 = __ZN10ime_pinyin8UserDict17locate_in_offsetsEPtS1_t($this, $call8, __ZN10ime_pinyin8UserDict19get_lemma_spell_idsEj($this, $2) | 0, $call7 & 255) | 0;
   if (($call11 | 0) == -1) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $scores_ = $this + 32 | 0;
   $4 = HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($call11 << 2) >> 2] | 0;
   $call15 = __ZN10ime_pinyin8UserDict18extract_score_freqEi(0, $4) | 0;
   $call16$0 = __ZN10ime_pinyin8UserDict17extract_score_lmtEi(0, $4) | 0;
   $call16$1 = tempRet0;
   if (($call15 + ($delta_count << 16 >> 16) | 0) > 65535 | $delta_count << 16 >> 16 < 0) {
    $delta_count_addr_0 = 65535 - $call15 & 65535;
   } else {
    $delta_count_addr_0 = $delta_count;
   }
   $conv26 = $delta_count_addr_0 << 16 >> 16;
   $total_nfreq = $this + 100 | 0;
   HEAP32[$total_nfreq >> 2] = (HEAP32[$total_nfreq >> 2] | 0) + $conv26;
   if ($selected) {
    $call31 = _time(0) | 0;
    $lmt_0$1 = ($call31 | 0) < 0 ? -1 : 0;
    $lmt_0$0 = $call31;
   } else {
    $lmt_0$1 = $call16$1;
    $lmt_0$0 = $call16$0;
   }
   $call34 = __ZN10ime_pinyin8UserDict11build_scoreEyi(0, $lmt_0$0, $lmt_0$1, $conv26 + $call15 | 0) | 0;
   HEAP32[(HEAP32[$scores_ >> 2] | 0) + ($call11 << 2) >> 2] = $call34;
   $state_ = $this + 104 | 0;
   if ((HEAP32[$state_ >> 2] | 0) < 3) {
    HEAP32[$state_ >> 2] = 3;
   }
   $ids_ = $this + 36 | 0;
   __ZN10ime_pinyin8UserDict20queue_lemma_for_syncEj($this, HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($call11 << 2) >> 2] | 0);
   $retval_0 = HEAP32[(HEAP32[$ids_ >> 2] | 0) + ($call11 << 2) >> 2] | 0;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11Utf16ReaderC2Ev($this) {
   $this = $this | 0;
   _memset($this | 0, 0, 20);
   return;
  }
  function __ZN10ime_pinyin11Utf16ReaderD2Ev($this) {
   $this = $this | 0;
   var $0 = 0, $1 = 0;
   $0 = HEAP32[$this >> 2] | 0;
   if (($0 | 0) != 0) {
    _fclose($0 | 0) | 0;
   }
   $1 = HEAP32[$this + 4 >> 2] | 0;
   if (($1 | 0) == 0) {
    return;
   }
   __ZdaPv($1);
   return;
  }
  function __ZN10ime_pinyin11Utf16Reader4openEPKcj($this, $filename, $buffer_len) {
   $this = $this | 0;
   $filename = $filename | 0;
   $buffer_len = $buffer_len | 0;
   var $header = 0, $buffer_len_addr_0 = 0, $buffer_total_len_ = 0, $buffer_ = 0, $0 = 0, $3$0 = 0, $call = 0, $call18 = 0, $fp_ = 0, $cmp24 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $header = sp | 0;
   if (($filename | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if ($buffer_len >>> 0 < 128) {
    $buffer_len_addr_0 = 128;
   } else {
    $buffer_len_addr_0 = $buffer_len >>> 0 > 65535 ? 65535 : $buffer_len;
   }
   $buffer_total_len_ = $this + 8 | 0;
   HEAP32[$buffer_total_len_ >> 2] = $buffer_len_addr_0;
   $buffer_ = $this + 4 | 0;
   $0 = HEAP32[$buffer_ >> 2] | 0;
   if (($0 | 0) != 0) {
    __ZdaPv($0);
   }
   $3$0 = _llvm_umul_with_overflow_i32(HEAP32[$buffer_total_len_ >> 2] | 0, 2) | 0;
   $call = __Znaj(tempRet0 ? -1 : $3$0) | 0;
   HEAP32[$buffer_ >> 2] = $call;
   if (($call | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $call18 = _fopen($filename | 0, 2072) | 0;
   $fp_ = $this | 0;
   HEAP32[$fp_ >> 2] = $call18;
   if (($call18 | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $cmp24 = (_fread($header | 0, 2, 1, $call18 | 0) | 0) == 1;
   if ($cmp24 & (HEAP16[$header >> 1] | 0) == -257) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _fclose(HEAP32[$fp_ >> 2] | 0) | 0;
   HEAP32[$fp_ >> 2] = 0;
   $retval_0 = 0;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZN10ime_pinyin11Utf16Reader8readlineEPtj($this, $read_buf, $max_len) {
   $this = $this | 0;
   $read_buf = $read_buf | 0;
   $max_len = $max_len | 0;
   var $fp_ = 0, $buffer_valid_len_ = 0, $buffer_next_pos_ = 0, $buffer_ = 0, $buffer_total_len_ = 0, $sub = 0, $buffer_next_pos_21 = 0, $buffer_22 = 0, $1 = 0, $ret_len_0 = 0, $call = 0, $i_032 = 0, $8 = 0, $add26 = 0, $arrayidx30 = 0, $inc = 0, $buffer_next_pos_40 = 0, $inc59 = 0, $14 = 0, $_lcssa = 0, $retval_0 = 0, label = 0;
   $fp_ = $this | 0;
   if ((HEAP32[$fp_ >> 2] | 0) == 0 | ($read_buf | 0) == 0 | ($max_len | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $buffer_valid_len_ = $this + 16 | 0;
   $buffer_next_pos_ = $this + 12 | 0;
   $buffer_ = $this + 4 | 0;
   $buffer_total_len_ = $this + 8 | 0;
   $sub = $max_len - 1 | 0;
   $buffer_next_pos_21 = $this + 12 | 0;
   $buffer_22 = $this + 4 | 0;
   $ret_len_0 = 0;
   $1 = (HEAP32[$buffer_valid_len_ >> 2] | 0) == 0;
   L4625 : while (1) {
    if ($1) {
     HEAP32[$buffer_next_pos_ >> 2] = 0;
     $call = _fread(HEAP32[$buffer_ >> 2] | 0, 2, HEAP32[$buffer_total_len_ >> 2] | 0, HEAP32[$fp_ >> 2] | 0) | 0;
     HEAP32[$buffer_valid_len_ >> 2] = $call;
     if (($call | 0) == 0) {
      label = 3635;
      break;
     } else {
      $i_032 = 0;
      label = 3637;
     }
    } else {
     if ((HEAP32[$buffer_valid_len_ >> 2] | 0) == 0) {
      $_lcssa = 0;
     } else {
      $i_032 = 0;
      label = 3637;
     }
    }
    if ((label | 0) == 3637) {
     while (1) {
      label = 0;
      if (($i_032 | 0) == ($sub | 0)) {
       break L4625;
      }
      $8 = HEAP16[(HEAP32[$buffer_22 >> 2] | 0) + ((HEAP32[$buffer_next_pos_21 >> 2] | 0) + $i_032 << 1) >> 1] | 0;
      if ($8 << 16 >> 16 == 10) {
       break L4625;
      }
      HEAP16[$read_buf + ($i_032 + $ret_len_0 << 1) >> 1] = $8;
      $inc59 = $i_032 + 1 | 0;
      $14 = HEAP32[$buffer_valid_len_ >> 2] | 0;
      if ($inc59 >>> 0 < $14 >>> 0) {
       $i_032 = $inc59;
       label = 3637;
      } else {
       $_lcssa = $14;
       break;
      }
     }
    }
    HEAP32[$buffer_valid_len_ >> 2] = 0;
    $ret_len_0 = $_lcssa + $ret_len_0 | 0;
    $1 = 1;
   }
   if ((label | 0) == 3635) {
    if (($ret_len_0 | 0) == 0) {
     $retval_0 = 0;
     return $retval_0 | 0;
    }
    HEAP16[$read_buf + ($ret_len_0 << 1) >> 1] = 0;
    $retval_0 = $read_buf;
    return $retval_0 | 0;
   }
   $add26 = $i_032 + $ret_len_0 | 0;
   do {
    if (($add26 | 0) == 0) {
     label = 3642;
    } else {
     $arrayidx30 = $read_buf + ($add26 - 1 << 1) | 0;
     if ((HEAP16[$arrayidx30 >> 1] | 0) != 13) {
      label = 3642;
      break;
     }
     HEAP16[$arrayidx30 >> 1] = 0;
    }
   } while (0);
   if ((label | 0) == 3642) {
    HEAP16[$read_buf + ($add26 << 1) >> 1] = 0;
   }
   $inc = $i_032 + 1 | 0;
   $buffer_next_pos_40 = $this + 12 | 0;
   HEAP32[$buffer_next_pos_40 >> 2] = (HEAP32[$buffer_next_pos_40 >> 2] | 0) + $inc;
   HEAP32[$buffer_valid_len_ >> 2] = (HEAP32[$buffer_valid_len_ >> 2] | 0) - $inc;
   if ((HEAP32[$buffer_next_pos_40 >> 2] | 0) != (HEAP32[$this + 8 >> 2] | 0)) {
    $retval_0 = $read_buf;
    return $retval_0 | 0;
   }
   HEAP32[$buffer_next_pos_40 >> 2] = 0;
   HEAP32[$buffer_valid_len_ >> 2] = 0;
   $retval_0 = $read_buf;
   return $retval_0 | 0;
  }
  function __ZNSt9type_infoD2Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZNSt8bad_castD2Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZNKSt8bad_cast4whatEv($this) {
   $this = $this | 0;
   return 1888 | 0;
  }
  function __ZNSt10bad_typeidD2Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZNKSt10bad_typeid4whatEv($this) {
   $this = $this | 0;
   return 3800 | 0;
  }
  function __ZNK10__cxxabiv116__shim_type_info5noop1Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZNK10__cxxabiv116__shim_type_info5noop2Ev($this) {
   $this = $this | 0;
   return;
  }
  function _ConvertUTF32toUTF16($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $cmp7 = 0, $cmp18 = 0, $target_0_ph39 = 0, $source_0_ph38 = 0, $result_0_ph37 = 0, $target_027 = 0, $source_026 = 0, $incdec_ptr = 0, $2 = 0, $add_ptr = 0, $sub = 0, $target_0_be = 0, $target_0_lcssa = 0, $source_0_lcssa = 0, $result_1 = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L8 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $cmp7 = ($flags | 0) == 0;
     $cmp18 = ($flags | 0) == 0;
     $result_0_ph37 = 0;
     $source_0_ph38 = $0;
     $target_0_ph39 = $1;
     while (1) {
      $source_026 = $source_0_ph38;
      $target_027 = $target_0_ph39;
      L12 : while (1) {
       if ($target_027 >>> 0 >= $targetEnd >>> 0) {
        $result_1 = 2;
        $source_0_lcssa = $source_026;
        $target_0_lcssa = $target_027;
        break L8;
       }
       $incdec_ptr = $source_026 + 4 | 0;
       $2 = HEAP32[$source_026 >> 2] | 0;
       do {
        if ($2 >>> 0 < 65536) {
         if (($2 - 55296 | 0) >>> 0 >= 2048) {
          HEAP16[$target_027 >> 1] = $2 & 65535;
          $target_0_be = $target_027 + 2 | 0;
          break;
         }
         if ($cmp7) {
          $result_1 = 3;
          $source_0_lcssa = $source_026;
          $target_0_lcssa = $target_027;
          break L8;
         }
         HEAP16[$target_027 >> 1] = -3;
         $target_0_be = $target_027 + 2 | 0;
        } else {
         if ($2 >>> 0 > 1114111) {
          if ($cmp18) {
           break L12;
          }
          HEAP16[$target_027 >> 1] = -3;
          $target_0_be = $target_027 + 2 | 0;
          break;
         } else {
          $add_ptr = $target_027 + 2 | 0;
          if ($add_ptr >>> 0 >= $targetEnd >>> 0) {
           $result_1 = 2;
           $source_0_lcssa = $source_026;
           $target_0_lcssa = $target_027;
           break L8;
          }
          $sub = $2 - 65536 | 0;
          HEAP16[$target_027 >> 1] = ($sub >>> 10) + 55296 & 65535;
          HEAP16[$add_ptr >> 1] = ($sub & 1023 | 56320) & 65535;
          $target_0_be = $target_027 + 4 | 0;
          break;
         }
        }
       } while (0);
       if ($incdec_ptr >>> 0 < $sourceEnd >>> 0) {
        $source_026 = $incdec_ptr;
        $target_027 = $target_0_be;
       } else {
        $result_1 = $result_0_ph37;
        $source_0_lcssa = $incdec_ptr;
        $target_0_lcssa = $target_0_be;
        break L8;
       }
      }
      if ($incdec_ptr >>> 0 < $sourceEnd >>> 0) {
       $result_0_ph37 = 3;
       $source_0_ph38 = $incdec_ptr;
       $target_0_ph39 = $target_027;
      } else {
       $result_1 = 3;
       $source_0_lcssa = $incdec_ptr;
       $target_0_lcssa = $target_027;
       break;
      }
     }
    } else {
     $result_1 = 0;
     $source_0_lcssa = $0;
     $target_0_lcssa = $1;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_0_lcssa;
   HEAP32[$targetStart >> 2] = $target_0_lcssa;
   return $result_1 | 0;
  }
  function _ConvertUTF16toUTF32($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $cmp13 = 0, $cmp21 = 0, $source_028 = 0, $target_027 = 0, $incdec_ptr = 0, $2 = 0, $conv = 0, $4 = 0, $ch_0 = 0, $source_1 = 0, $incdec_ptr34 = 0, $source_0_lcssa = 0, $target_0_lcssa = 0, $result_0 = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L31 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $cmp13 = ($flags | 0) == 0;
     $cmp21 = ($flags | 0) == 0;
     $target_027 = $1;
     $source_028 = $0;
     while (1) {
      $incdec_ptr = $source_028 + 2 | 0;
      $2 = HEAP16[$source_028 >> 1] | 0;
      $conv = $2 & 65535;
      do {
       if (($2 + 10240 & 65535) < 1024) {
        if ($incdec_ptr >>> 0 >= $sourceEnd >>> 0) {
         $result_0 = 1;
         $target_0_lcssa = $target_027;
         $source_0_lcssa = $source_028;
         break L31;
        }
        $4 = HEAP16[$incdec_ptr >> 1] | 0;
        if (($4 + 9216 & 65535) < 1024) {
         $source_1 = $source_028 + 4 | 0;
         $ch_0 = ($conv << 10) - 56613888 + ($4 & 65535) | 0;
         break;
        } else {
         if ($cmp13) {
          $result_0 = 3;
          $target_0_lcssa = $target_027;
          $source_0_lcssa = $source_028;
          break L31;
         } else {
          $source_1 = $incdec_ptr;
          $ch_0 = $conv;
          break;
         }
        }
       } else {
        if (!$cmp21) {
         $source_1 = $incdec_ptr;
         $ch_0 = $conv;
         break;
        }
        if (($2 + 9216 & 65535) < 1024) {
         $result_0 = 3;
         $target_0_lcssa = $target_027;
         $source_0_lcssa = $source_028;
         break L31;
        } else {
         $source_1 = $incdec_ptr;
         $ch_0 = $conv;
        }
       }
      } while (0);
      if ($target_027 >>> 0 >= $targetEnd >>> 0) {
       $result_0 = 2;
       $target_0_lcssa = $target_027;
       $source_0_lcssa = $source_028;
       break L31;
      }
      $incdec_ptr34 = $target_027 + 4 | 0;
      HEAP32[$target_027 >> 2] = $ch_0;
      if ($source_1 >>> 0 < $sourceEnd >>> 0) {
       $target_027 = $incdec_ptr34;
       $source_028 = $source_1;
      } else {
       $result_0 = 0;
       $target_0_lcssa = $incdec_ptr34;
       $source_0_lcssa = $source_1;
       break;
      }
     }
    } else {
     $result_0 = 0;
     $target_0_lcssa = $1;
     $source_0_lcssa = $0;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_0_lcssa;
   HEAP32[$targetStart >> 2] = $target_0_lcssa;
   return $result_0 | 0;
  }
  function _ConvertUTF16toUTF8($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $cmp13 = 0, $cmp21 = 0, $source_049 = 0, $target_048 = 0, $incdec_ptr = 0, $2 = 0, $conv = 0, $4 = 0, $ch_0 = 0, $source_1 = 0, $cmp40 = 0, $bytesToWrite_0 = 0, $ch_1 = 0, $add_ptr = 0, $incdec_ptr55 = 0, $ch_2 = 0, $target_1 = 0, $incdec_ptr60 = 0, $ch_3 = 0, $target_2 = 0, $incdec_ptr66 = 0, $ch_4 = 0, $target_3 = 0, $incdec_ptr72 = 0, $target_4 = 0, $add_ptr74 = 0, $source_0_lcssa = 0, $target_0_lcssa = 0, $result_0 = 0, label = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L47 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $cmp13 = ($flags | 0) == 0;
     $cmp21 = ($flags | 0) == 0;
     $target_048 = $1;
     $source_049 = $0;
     while (1) {
      $incdec_ptr = $source_049 + 2 | 0;
      $2 = HEAP16[$source_049 >> 1] | 0;
      $conv = $2 & 65535;
      do {
       if (($2 + 10240 & 65535) < 1024) {
        if ($incdec_ptr >>> 0 >= $sourceEnd >>> 0) {
         $result_0 = 1;
         $target_0_lcssa = $target_048;
         $source_0_lcssa = $source_049;
         break L47;
        }
        $4 = HEAP16[$incdec_ptr >> 1] | 0;
        if (($4 + 9216 & 65535) < 1024) {
         $source_1 = $source_049 + 4 | 0;
         $ch_0 = ($conv << 10) - 56613888 + ($4 & 65535) | 0;
         break;
        } else {
         if ($cmp13) {
          $result_0 = 3;
          $target_0_lcssa = $target_048;
          $source_0_lcssa = $source_049;
          break L47;
         } else {
          $source_1 = $incdec_ptr;
          $ch_0 = $conv;
          break;
         }
        }
       } else {
        if (!$cmp21) {
         $source_1 = $incdec_ptr;
         $ch_0 = $conv;
         break;
        }
        if (($2 + 9216 & 65535) < 1024) {
         $result_0 = 3;
         $target_0_lcssa = $target_048;
         $source_0_lcssa = $source_049;
         break L47;
        } else {
         $source_1 = $incdec_ptr;
         $ch_0 = $conv;
        }
       }
      } while (0);
      do {
       if ($ch_0 >>> 0 < 128) {
        $ch_1 = $ch_0;
        $bytesToWrite_0 = 1;
       } else {
        if ($ch_0 >>> 0 < 2048) {
         $ch_1 = $ch_0;
         $bytesToWrite_0 = 2;
         break;
        }
        if ($ch_0 >>> 0 < 65536) {
         $ch_1 = $ch_0;
         $bytesToWrite_0 = 3;
         break;
        }
        $cmp40 = $ch_0 >>> 0 < 1114112;
        $ch_1 = $cmp40 ? $ch_0 : 65533;
        $bytesToWrite_0 = $cmp40 ? 4 : 3;
       }
      } while (0);
      $add_ptr = $target_048 + $bytesToWrite_0 | 0;
      if ($add_ptr >>> 0 > $targetEnd >>> 0) {
       $result_0 = 2;
       $target_0_lcssa = $target_048;
       $source_0_lcssa = $source_049;
       break L47;
      }
      if (($bytesToWrite_0 | 0) == 4) {
       $incdec_ptr55 = $target_048 + ($bytesToWrite_0 - 1) | 0;
       HEAP8[$incdec_ptr55] = ($ch_1 & 63 | 128) & 255;
       $target_1 = $incdec_ptr55;
       $ch_2 = $ch_1 >>> 6;
       label = 53;
      } else if (($bytesToWrite_0 | 0) == 3) {
       $target_1 = $add_ptr;
       $ch_2 = $ch_1;
       label = 53;
      } else if (($bytesToWrite_0 | 0) == 2) {
       $target_2 = $add_ptr;
       $ch_3 = $ch_1;
       label = 54;
      } else if (($bytesToWrite_0 | 0) == 1) {
       $target_3 = $add_ptr;
       $ch_4 = $ch_1;
       label = 55;
      } else {
       $target_4 = $add_ptr;
      }
      if ((label | 0) == 53) {
       label = 0;
       $incdec_ptr60 = $target_1 - 1 | 0;
       HEAP8[$incdec_ptr60] = ($ch_2 & 63 | 128) & 255;
       $target_2 = $incdec_ptr60;
       $ch_3 = $ch_2 >>> 6;
       label = 54;
      }
      if ((label | 0) == 54) {
       label = 0;
       $incdec_ptr66 = $target_2 - 1 | 0;
       HEAP8[$incdec_ptr66] = ($ch_3 & 63 | 128) & 255;
       $target_3 = $incdec_ptr66;
       $ch_4 = $ch_3 >>> 6;
       label = 55;
      }
      if ((label | 0) == 55) {
       label = 0;
       $incdec_ptr72 = $target_3 - 1 | 0;
       HEAP8[$incdec_ptr72] = (HEAPU8[11264 + $bytesToWrite_0 | 0] | 0 | $ch_4) & 255;
       $target_4 = $incdec_ptr72;
      }
      $add_ptr74 = $target_4 + $bytesToWrite_0 | 0;
      if ($source_1 >>> 0 < $sourceEnd >>> 0) {
       $target_048 = $add_ptr74;
       $source_049 = $source_1;
      } else {
       $result_0 = 0;
       $target_0_lcssa = $add_ptr74;
       $source_0_lcssa = $source_1;
       break;
      }
     }
    } else {
     $result_0 = 0;
     $target_0_lcssa = $1;
     $source_0_lcssa = $0;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_0_lcssa;
   HEAP32[$targetStart >> 2] = $target_0_lcssa;
   return $result_0 | 0;
  }
  function __ZL11isLegalUTF8PKhi($source, $length) {
   $source = $source | 0;
   $length = $length | 0;
   var $add_ptr = 0, $incdec_ptr = 0, $0 = 0, $srcptr_0 = 0, $incdec_ptr4 = 0, $1 = 0, $srcptr_1 = 0, $2 = 0, $conv18 = 0, $4 = 0, $retval_0 = 0, label = 0;
   $add_ptr = $source + $length | 0;
   if (($length | 0) == 4) {
    $incdec_ptr = $source + ($length - 1) | 0;
    $0 = HEAP8[$incdec_ptr] | 0;
    if ($0 << 24 >> 24 > -1 | ($0 & 255) > 191) {
     $retval_0 = 0;
    } else {
     $srcptr_0 = $incdec_ptr;
     label = 60;
    }
   } else if (($length | 0) == 3) {
    $srcptr_0 = $add_ptr;
    label = 60;
   } else if (($length | 0) == 2) {
    $srcptr_1 = $add_ptr;
    label = 61;
   } else if (($length | 0) == 1) {
    label = 68;
   } else {
    $retval_0 = 0;
   }
   if ((label | 0) == 60) {
    $incdec_ptr4 = $srcptr_0 - 1 | 0;
    $1 = HEAP8[$incdec_ptr4] | 0;
    if ($1 << 24 >> 24 > -1 | ($1 & 255) > 191) {
     $retval_0 = 0;
    } else {
     $srcptr_1 = $incdec_ptr4;
     label = 61;
    }
   }
   do {
    if ((label | 0) == 61) {
     $2 = HEAP8[$srcptr_1 - 1 | 0] | 0;
     if (($2 & 255) > 191) {
      $retval_0 = 0;
      break;
     }
     $conv18 = HEAPU8[$source] | 0;
     if (($conv18 | 0) == 224) {
      if (($2 & 255) < 160) {
       $retval_0 = 0;
       break;
      } else {
       label = 68;
       break;
      }
     } else if (($conv18 | 0) == 237) {
      if (($2 & 255) > 159) {
       $retval_0 = 0;
       break;
      } else {
       label = 68;
       break;
      }
     } else if (($conv18 | 0) == 240) {
      if (($2 & 255) < 144) {
       $retval_0 = 0;
       break;
      } else {
       label = 68;
       break;
      }
     } else if (($conv18 | 0) == 244) {
      if (($2 & 255) > 143) {
       $retval_0 = 0;
       break;
      } else {
       label = 68;
       break;
      }
     } else {
      if ($2 << 24 >> 24 > -1) {
       $retval_0 = 0;
       break;
      } else {
       label = 68;
       break;
      }
     }
    }
   } while (0);
   do {
    if ((label | 0) == 68) {
     $4 = HEAP8[$source] | 0;
     if ($4 << 24 >> 24 < 0 & ($4 & 255) < 194) {
      $retval_0 = 0;
      break;
     }
     $retval_0 = ($4 & 255) < 245 | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function _ConvertUTF32toUTF8($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $cmp1 = 0, $result_036 = 0, $source_035 = 0, $target_034 = 0, $incdec_ptr = 0, $2 = 0, $cmp15 = 0, $ch_0 = 0, $bytesToWrite_0 = 0, $result_1 = 0, $add_ptr = 0, $incdec_ptr30 = 0, $target_1 = 0, $ch_1 = 0, $incdec_ptr35 = 0, $target_2 = 0, $ch_2 = 0, $incdec_ptr41 = 0, $target_3 = 0, $ch_3 = 0, $incdec_ptr47 = 0, $target_4 = 0, $add_ptr49 = 0, $source_0_lcssa = 0, $target_0_lcssa = 0, $result_2 = 0, label = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L95 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $cmp1 = ($flags | 0) == 0;
     $target_034 = $1;
     $source_035 = $0;
     $result_036 = 0;
     while (1) {
      $incdec_ptr = $source_035 + 4 | 0;
      $2 = HEAP32[$source_035 >> 2] | 0;
      if ($cmp1) {
       if (($2 - 55296 | 0) >>> 0 < 2048) {
        $result_2 = 3;
        $target_0_lcssa = $target_034;
        $source_0_lcssa = $source_035;
        break L95;
       }
      }
      do {
       if ($2 >>> 0 < 128) {
        $result_1 = $result_036;
        $bytesToWrite_0 = 1;
        $ch_0 = $2;
       } else {
        if ($2 >>> 0 < 2048) {
         $result_1 = $result_036;
         $bytesToWrite_0 = 2;
         $ch_0 = $2;
         break;
        }
        if ($2 >>> 0 < 65536) {
         $result_1 = $result_036;
         $bytesToWrite_0 = 3;
         $ch_0 = $2;
         break;
        }
        $cmp15 = $2 >>> 0 < 1114112;
        $result_1 = $cmp15 ? $result_036 : 3;
        $bytesToWrite_0 = $cmp15 ? 4 : 3;
        $ch_0 = $cmp15 ? $2 : 65533;
       }
      } while (0);
      $add_ptr = $target_034 + $bytesToWrite_0 | 0;
      if ($add_ptr >>> 0 > $targetEnd >>> 0) {
       $result_2 = 2;
       $target_0_lcssa = $target_034;
       $source_0_lcssa = $source_035;
       break L95;
      }
      if (($bytesToWrite_0 | 0) == 4) {
       $incdec_ptr30 = $target_034 + ($bytesToWrite_0 - 1) | 0;
       HEAP8[$incdec_ptr30] = ($ch_0 & 63 | 128) & 255;
       $ch_1 = $ch_0 >>> 6;
       $target_1 = $incdec_ptr30;
       label = 82;
      } else if (($bytesToWrite_0 | 0) == 3) {
       $ch_1 = $ch_0;
       $target_1 = $add_ptr;
       label = 82;
      } else if (($bytesToWrite_0 | 0) == 2) {
       $ch_2 = $ch_0;
       $target_2 = $add_ptr;
       label = 83;
      } else if (($bytesToWrite_0 | 0) == 1) {
       $ch_3 = $ch_0;
       $target_3 = $add_ptr;
       label = 84;
      } else {
       $target_4 = $add_ptr;
      }
      if ((label | 0) == 82) {
       label = 0;
       $incdec_ptr35 = $target_1 - 1 | 0;
       HEAP8[$incdec_ptr35] = ($ch_1 & 63 | 128) & 255;
       $ch_2 = $ch_1 >>> 6;
       $target_2 = $incdec_ptr35;
       label = 83;
      }
      if ((label | 0) == 83) {
       label = 0;
       $incdec_ptr41 = $target_2 - 1 | 0;
       HEAP8[$incdec_ptr41] = ($ch_2 & 63 | 128) & 255;
       $ch_3 = $ch_2 >>> 6;
       $target_3 = $incdec_ptr41;
       label = 84;
      }
      if ((label | 0) == 84) {
       label = 0;
       $incdec_ptr47 = $target_3 - 1 | 0;
       HEAP8[$incdec_ptr47] = (HEAPU8[11264 + $bytesToWrite_0 | 0] | 0 | $ch_3) & 255;
       $target_4 = $incdec_ptr47;
      }
      $add_ptr49 = $target_4 + $bytesToWrite_0 | 0;
      if ($incdec_ptr >>> 0 < $sourceEnd >>> 0) {
       $target_034 = $add_ptr49;
       $source_035 = $incdec_ptr;
       $result_036 = $result_1;
      } else {
       $result_2 = $result_1;
       $target_0_lcssa = $add_ptr49;
       $source_0_lcssa = $incdec_ptr;
       break;
      }
     }
    } else {
     $result_2 = 0;
     $target_0_lcssa = $1;
     $source_0_lcssa = $0;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_0_lcssa;
   HEAP32[$targetStart >> 2] = $target_0_lcssa;
   return $result_2 | 0;
  }
  function __ZNSt8bad_castC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8080;
   return;
  }
  function __ZNSt10bad_typeidC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8144;
   return;
  }
  function __ZN10ime_pinyin11Utf16Reader5closeEv($this) {
   $this = $this | 0;
   var $fp_ = 0, $0 = 0, $buffer_ = 0, $1 = 0;
   $fp_ = $this | 0;
   $0 = HEAP32[$fp_ >> 2] | 0;
   if (($0 | 0) != 0) {
    _fclose($0 | 0) | 0;
   }
   HEAP32[$fp_ >> 2] = 0;
   $buffer_ = $this + 4 | 0;
   $1 = HEAP32[$buffer_ >> 2] | 0;
   if (($1 | 0) == 0) {
    HEAP32[$buffer_ >> 2] = 0;
    return 1;
   }
   __ZdaPv($1);
   HEAP32[$buffer_ >> 2] = 0;
   return 1;
  }
  function _isLegalUTF8Sequence($source, $sourceEnd) {
   $source = $source | 0;
   $sourceEnd = $sourceEnd | 0;
   var $add = 0, $retval_0 = 0;
   $add = (HEAP8[10984 + (HEAPU8[$source] | 0) | 0] | 0) + 1 | 0;
   if (($source + $add | 0) >>> 0 > $sourceEnd >>> 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $retval_0 = __ZL11isLegalUTF8PKhi($source, $add) | 0;
   return $retval_0 | 0;
  }
  function _ConvertUTF8toUTF16($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $cmp46 = 0, $cmp61 = 0, $target_070 = 0, $source_069 = 0, $idxprom = 0, $conv1 = 0, $source_1 = 0, $ch_0 = 0, $source_2 = 0, $ch_1 = 0, $source_3 = 0, $ch_2 = 0, $source_4 = 0, $ch_3 = 0, $source_5 = 0, $ch_4 = 0, $source_6 = 0, $ch_5 = 0, $sub = 0, $target_0_be = 0, $add_ptr71 = 0, $sub79 = 0, $target_061 = 0, $source_7 = 0, $result_0 = 0, label = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L134 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $cmp46 = ($flags | 0) == 0;
     $cmp61 = ($flags | 0) == 0;
     $source_069 = $0;
     $target_070 = $1;
     L136 : while (1) {
      $idxprom = HEAPU8[$source_069] | 0;
      $conv1 = HEAP8[10984 + $idxprom | 0] & 65535;
      if (($source_069 + $conv1 | 0) >>> 0 >= $sourceEnd >>> 0) {
       $result_0 = 1;
       $source_7 = $source_069;
       $target_061 = $target_070;
       break L134;
      }
      if ((__ZL11isLegalUTF8PKhi($source_069, $conv1 + 1 | 0) | 0) << 24 >> 24 == 0) {
       $result_0 = 3;
       $source_7 = $source_069;
       $target_061 = $target_070;
       break L134;
      }
      if (($conv1 | 0) == 5) {
       $ch_0 = $idxprom << 6;
       $source_1 = $source_069 + 1 | 0;
       label = 107;
      } else if (($conv1 | 0) == 4) {
       $ch_0 = 0;
       $source_1 = $source_069;
       label = 107;
      } else if (($conv1 | 0) == 3) {
       $ch_1 = 0;
       $source_2 = $source_069;
       label = 108;
      } else if (($conv1 | 0) == 2) {
       $ch_2 = 0;
       $source_3 = $source_069;
       label = 109;
      } else if (($conv1 | 0) == 1) {
       $ch_3 = 0;
       $source_4 = $source_069;
       label = 110;
      } else if (($conv1 | 0) == 0) {
       $ch_4 = 0;
       $source_5 = $source_069;
       label = 111;
      } else {
       $ch_5 = 0;
       $source_6 = $source_069;
      }
      if ((label | 0) == 107) {
       label = 0;
       $ch_1 = (HEAPU8[$source_1] | 0) + $ch_0 << 6;
       $source_2 = $source_1 + 1 | 0;
       label = 108;
      }
      if ((label | 0) == 108) {
       label = 0;
       $ch_2 = (HEAPU8[$source_2] | 0) + $ch_1 << 6;
       $source_3 = $source_2 + 1 | 0;
       label = 109;
      }
      if ((label | 0) == 109) {
       label = 0;
       $ch_3 = (HEAPU8[$source_3] | 0) + $ch_2 << 6;
       $source_4 = $source_3 + 1 | 0;
       label = 110;
      }
      if ((label | 0) == 110) {
       label = 0;
       $ch_4 = (HEAPU8[$source_4] | 0) + $ch_3 << 6;
       $source_5 = $source_4 + 1 | 0;
       label = 111;
      }
      if ((label | 0) == 111) {
       label = 0;
       $ch_5 = (HEAPU8[$source_5] | 0) + $ch_4 | 0;
       $source_6 = $source_5 + 1 | 0;
      }
      $sub = $ch_5 - (HEAP32[11240 + ($conv1 << 2) >> 2] | 0) | 0;
      if ($target_070 >>> 0 >= $targetEnd >>> 0) {
       label = 113;
       break;
      }
      do {
       if ($sub >>> 0 < 65536) {
        if (($sub - 55296 | 0) >>> 0 >= 2048) {
         HEAP16[$target_070 >> 1] = $sub & 65535;
         $target_0_be = $target_070 + 2 | 0;
         break;
        }
        if ($cmp46) {
         label = 117;
         break L136;
        }
        HEAP16[$target_070 >> 1] = -3;
        $target_0_be = $target_070 + 2 | 0;
       } else {
        if ($sub >>> 0 > 1114111) {
         if ($cmp61) {
          label = 122;
          break L136;
         }
         HEAP16[$target_070 >> 1] = -3;
         $target_0_be = $target_070 + 2 | 0;
         break;
        } else {
         $add_ptr71 = $target_070 + 2 | 0;
         if ($add_ptr71 >>> 0 >= $targetEnd >>> 0) {
          label = 126;
          break L136;
         }
         $sub79 = $sub - 65536 | 0;
         HEAP16[$target_070 >> 1] = ($sub79 >>> 10) + 55296 & 65535;
         HEAP16[$add_ptr71 >> 1] = ($sub79 & 1023 | 56320) & 65535;
         $target_0_be = $target_070 + 4 | 0;
         break;
        }
       }
      } while (0);
      if ($source_6 >>> 0 < $sourceEnd >>> 0) {
       $source_069 = $source_6;
       $target_070 = $target_0_be;
      } else {
       $result_0 = 0;
       $source_7 = $source_6;
       $target_061 = $target_0_be;
       break L134;
      }
     }
     if ((label | 0) == 113) {
      $result_0 = 2;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_061 = $target_070;
      break;
     } else if ((label | 0) == 117) {
      $result_0 = 3;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_061 = $target_070;
      break;
     } else if ((label | 0) == 122) {
      $result_0 = 3;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_061 = $target_070;
      break;
     } else if ((label | 0) == 126) {
      $result_0 = 2;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_061 = $target_070;
      break;
     }
    } else {
     $result_0 = 0;
     $source_7 = $0;
     $target_061 = $1;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_7;
   HEAP32[$targetStart >> 2] = $target_061;
   return $result_0 | 0;
  }
  function _ConvertUTF8toUTF32($sourceStart, $sourceEnd, $targetStart, $targetEnd, $flags) {
   $sourceStart = $sourceStart | 0;
   $sourceEnd = $sourceEnd | 0;
   $targetStart = $targetStart | 0;
   $targetEnd = $targetEnd | 0;
   $flags = $flags | 0;
   var $0 = 0, $1 = 0, $result_0_ph71 = 0, $target_0_ph70 = 0, $source_0_ph69 = 0, $target_053 = 0, $source_052 = 0, $idxprom = 0, $conv1 = 0, $source_1 = 0, $ch_0 = 0, $source_2 = 0, $ch_1 = 0, $source_3 = 0, $ch_2 = 0, $source_4 = 0, $ch_3 = 0, $source_5 = 0, $ch_4 = 0, $source_6 = 0, $ch_5 = 0, $sub = 0, $_not = 0, $target_0_be = 0, $incdec_ptr58 = 0, $target_046 = 0, $source_7 = 0, $result_1 = 0, label = 0;
   $0 = HEAP32[$sourceStart >> 2] | 0;
   $1 = HEAP32[$targetStart >> 2] | 0;
   L174 : do {
    if ($0 >>> 0 < $sourceEnd >>> 0) {
     $source_0_ph69 = $0;
     $target_0_ph70 = $1;
     $result_0_ph71 = 0;
     L176 : while (1) {
      $source_052 = $source_0_ph69;
      $target_053 = $target_0_ph70;
      while (1) {
       $idxprom = HEAPU8[$source_052] | 0;
       $conv1 = HEAP8[10984 + $idxprom | 0] & 65535;
       if (($source_052 + $conv1 | 0) >>> 0 >= $sourceEnd >>> 0) {
        $result_1 = 1;
        $source_7 = $source_052;
        $target_046 = $target_053;
        break L174;
       }
       if ((__ZL11isLegalUTF8PKhi($source_052, $conv1 + 1 | 0) | 0) << 24 >> 24 == 0) {
        $result_1 = 3;
        $source_7 = $source_052;
        $target_046 = $target_053;
        break L174;
       }
       if (($conv1 | 0) == 5) {
        $ch_0 = $idxprom << 6;
        $source_1 = $source_052 + 1 | 0;
        label = 136;
       } else if (($conv1 | 0) == 4) {
        $ch_0 = 0;
        $source_1 = $source_052;
        label = 136;
       } else if (($conv1 | 0) == 3) {
        $ch_1 = 0;
        $source_2 = $source_052;
        label = 137;
       } else if (($conv1 | 0) == 2) {
        $ch_2 = 0;
        $source_3 = $source_052;
        label = 138;
       } else if (($conv1 | 0) == 1) {
        $ch_3 = 0;
        $source_4 = $source_052;
        label = 139;
       } else if (($conv1 | 0) == 0) {
        $ch_4 = 0;
        $source_5 = $source_052;
        label = 140;
       } else {
        $ch_5 = 0;
        $source_6 = $source_052;
       }
       if ((label | 0) == 136) {
        label = 0;
        $ch_1 = (HEAPU8[$source_1] | 0) + $ch_0 << 6;
        $source_2 = $source_1 + 1 | 0;
        label = 137;
       }
       if ((label | 0) == 137) {
        label = 0;
        $ch_2 = (HEAPU8[$source_2] | 0) + $ch_1 << 6;
        $source_3 = $source_2 + 1 | 0;
        label = 138;
       }
       if ((label | 0) == 138) {
        label = 0;
        $ch_3 = (HEAPU8[$source_3] | 0) + $ch_2 << 6;
        $source_4 = $source_3 + 1 | 0;
        label = 139;
       }
       if ((label | 0) == 139) {
        label = 0;
        $ch_4 = (HEAPU8[$source_4] | 0) + $ch_3 << 6;
        $source_5 = $source_4 + 1 | 0;
        label = 140;
       }
       if ((label | 0) == 140) {
        label = 0;
        $ch_5 = (HEAPU8[$source_5] | 0) + $ch_4 | 0;
        $source_6 = $source_5 + 1 | 0;
       }
       $sub = $ch_5 - (HEAP32[11240 + ($conv1 << 2) >> 2] | 0) | 0;
       if ($target_053 >>> 0 >= $targetEnd >>> 0) {
        label = 142;
        break L176;
       }
       if ($sub >>> 0 >= 1114112) {
        break;
       }
       $_not = ($sub - 55296 | 0) >>> 0 > 2047;
       if (!($_not | ($flags | 0) != 0)) {
        label = 145;
        break L176;
       }
       $target_0_be = $target_053 + 4 | 0;
       HEAP32[$target_053 >> 2] = $_not ? $sub : 65533;
       if ($source_6 >>> 0 < $sourceEnd >>> 0) {
        $source_052 = $source_6;
        $target_053 = $target_0_be;
       } else {
        $result_1 = $result_0_ph71;
        $source_7 = $source_6;
        $target_046 = $target_0_be;
        break L174;
       }
      }
      $incdec_ptr58 = $target_053 + 4 | 0;
      HEAP32[$target_053 >> 2] = 65533;
      if ($source_6 >>> 0 < $sourceEnd >>> 0) {
       $source_0_ph69 = $source_6;
       $target_0_ph70 = $incdec_ptr58;
       $result_0_ph71 = 3;
      } else {
       $result_1 = 3;
       $source_7 = $source_6;
       $target_046 = $incdec_ptr58;
       break L174;
      }
     }
     if ((label | 0) == 142) {
      $result_1 = 2;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_046 = $target_053;
      break;
     } else if ((label | 0) == 145) {
      $result_1 = 3;
      $source_7 = $source_6 + ~$conv1 | 0;
      $target_046 = $target_053;
      break;
     }
    } else {
     $result_1 = 0;
     $source_7 = $0;
     $target_046 = $1;
    }
   } while (0);
   HEAP32[$sourceStart >> 2] = $source_7;
   HEAP32[$targetStart >> 2] = $target_046;
   return $result_1 | 0;
  }
  function __ZNSt9type_infoD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function __ZNSt8bad_castD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function __ZNSt10bad_typeidD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv116__shim_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv116__shim_type_infoD2Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   return;
  }
  function __ZN10__cxxabiv123__fundamental_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv117__array_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv120__function_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv116__enum_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZNK10__cxxabiv117__array_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $0, $1) {
   $this = $this | 0;
   $0 = $0 | 0;
   $1 = $1 | 0;
   return 0;
  }
  function __ZNK10__cxxabiv120__function_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $0, $1) {
   $this = $this | 0;
   $0 = $0 | 0;
   $1 = $1 | 0;
   return 0;
  }
  function __ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $0) {
   $this = $this | 0;
   $thrown_type = $thrown_type | 0;
   $0 = $0 | 0;
   return ($this | 0) == ($thrown_type | 0) | 0;
  }
  function __ZNK10__cxxabiv116__enum_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $0) {
   $this = $this | 0;
   $thrown_type = $thrown_type | 0;
   $0 = $0 | 0;
   return ($this | 0) == ($thrown_type | 0) | 0;
  }
  function __ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $adjustedPtr = $adjustedPtr | 0;
   $path_below = $path_below | 0;
   var $dst_ptr_leading_to_static_ptr = 0, $0 = 0, $path_dst_ptr_to_static_ptr6 = 0, $number_to_static_ptr11 = 0;
   $dst_ptr_leading_to_static_ptr = $info + 16 | 0;
   $0 = HEAP32[$dst_ptr_leading_to_static_ptr >> 2] | 0;
   if (($0 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr >> 2] = $adjustedPtr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    return;
   }
   if (($0 | 0) != ($adjustedPtr | 0)) {
    $number_to_static_ptr11 = $info + 36 | 0;
    HEAP32[$number_to_static_ptr11 >> 2] = (HEAP32[$number_to_static_ptr11 >> 2] | 0) + 1;
    HEAP32[$info + 24 >> 2] = 2;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr6 = $info + 24 | 0;
   if ((HEAP32[$path_dst_ptr_to_static_ptr6 >> 2] | 0) != 2) {
    return;
   }
   HEAP32[$path_dst_ptr_to_static_ptr6 >> 2] = $path_below;
   return;
  }
  function __ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $adjustedPtr = $adjustedPtr | 0;
   $path_below = $path_below | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $1 = 0, $path_dst_ptr_to_static_ptr6_i = 0, $number_to_static_ptr11_i = 0;
   if ((HEAP32[$info + 8 >> 2] | 0) != ($this | 0)) {
    return;
   }
   $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
   $1 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
   if (($1 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $adjustedPtr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    return;
   }
   if (($1 | 0) != ($adjustedPtr | 0)) {
    $number_to_static_ptr11_i = $info + 36 | 0;
    HEAP32[$number_to_static_ptr11_i >> 2] = (HEAP32[$number_to_static_ptr11_i >> 2] | 0) + 1;
    HEAP32[$info + 24 >> 2] = 2;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr6_i = $info + 24 | 0;
   if ((HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] | 0) != 2) {
    return;
   }
   HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] = $path_below;
   return;
  }
  function __ZNK10__cxxabiv117__pbase_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $0) {
   $this = $this | 0;
   $thrown_type = $thrown_type | 0;
   $0 = $0 | 0;
   var $2 = 0;
   $2 = $thrown_type | 0;
   return ($this | 0) == ($2 | 0) | ($2 | 0) == 10880 | 0;
  }
  function __ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i($this, $info, $dst_ptr, $current_ptr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $dst_ptr = $dst_ptr | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   var $dst_ptr_leading_to_static_ptr = 0, $1 = 0, $path_dst_ptr_to_static_ptr12 = 0, $3 = 0, $4 = 0, $number_to_static_ptr26 = 0;
   HEAP8[$info + 53 | 0] = 1;
   if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
    return;
   }
   HEAP8[$info + 52 | 0] = 1;
   $dst_ptr_leading_to_static_ptr = $info + 16 | 0;
   $1 = HEAP32[$dst_ptr_leading_to_static_ptr >> 2] | 0;
   if (($1 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr >> 2] = $dst_ptr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($path_below | 0) == 1)) {
     return;
    }
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   if (($1 | 0) != ($dst_ptr | 0)) {
    $number_to_static_ptr26 = $info + 36 | 0;
    HEAP32[$number_to_static_ptr26 >> 2] = (HEAP32[$number_to_static_ptr26 >> 2] | 0) + 1;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr12 = $info + 24 | 0;
   $3 = HEAP32[$path_dst_ptr_to_static_ptr12 >> 2] | 0;
   if (($3 | 0) == 2) {
    HEAP32[$path_dst_ptr_to_static_ptr12 >> 2] = $path_below;
    $4 = $path_below;
   } else {
    $4 = $3;
   }
   if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($4 | 0) == 1)) {
    return;
   }
   HEAP8[$info + 54 | 0] = 1;
   return;
  }
  function __ZNK10__cxxabiv117__class_type_info29process_static_type_below_dstEPNS_19__dynamic_cast_infoEPKvi($this, $info, $current_ptr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   var $path_dynamic_ptr_to_static_ptr = 0;
   if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
    return;
   }
   $path_dynamic_ptr_to_static_ptr = $info + 28 | 0;
   if ((HEAP32[$path_dynamic_ptr_to_static_ptr >> 2] | 0) == 1) {
    return;
   }
   HEAP32[$path_dynamic_ptr_to_static_ptr >> 2] = $path_below;
   return;
  }
  function __ZN10__cxxabiv117__class_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv120__si_class_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv121__vmi_class_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv117__pbase_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv119__pointer_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev($this) {
   $this = $this | 0;
   __ZNSt9type_infoD2Ev($this | 0);
   __ZdlPv($this);
   return;
  }
  function __ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $adjustedPtr) {
   $this = $this | 0;
   $thrown_type = $thrown_type | 0;
   $adjustedPtr = $adjustedPtr | 0;
   var $info = 0, $4 = 0, $5 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 56 | 0;
   $info = sp | 0;
   if (($this | 0) == ($thrown_type | 0)) {
    $retval_0 = 1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   if (($thrown_type | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $4 = ___dynamic_cast($thrown_type, 10840, 10808, -1) | 0;
   $5 = $4;
   if (($4 | 0) == 0) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   _memset($info | 0, 0, 56);
   HEAP32[$info >> 2] = $5;
   HEAP32[$info + 8 >> 2] = $this;
   HEAP32[$info + 12 >> 2] = -1;
   HEAP32[$info + 48 >> 2] = 1;
   FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$4 >> 2] | 0) + 28 >> 2] & 7]($5, $info, HEAP32[$adjustedPtr >> 2] | 0, 1);
   if ((HEAP32[$info + 24 >> 2] | 0) != 1) {
    $retval_0 = 0;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   HEAP32[$adjustedPtr >> 2] = HEAP32[$info + 16 >> 2];
   $retval_0 = 1;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $adjustedPtr = $adjustedPtr | 0;
   $path_below = $path_below | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $3 = 0, $path_dst_ptr_to_static_ptr6_i = 0, $number_to_static_ptr11_i = 0, $6 = 0;
   if (($this | 0) != (HEAP32[$info + 8 >> 2] | 0)) {
    $6 = HEAP32[$this + 8 >> 2] | 0;
    FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$6 >> 2] | 0) + 28 >> 2] & 7]($6, $info, $adjustedPtr, $path_below);
    return;
   }
   $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
   $3 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
   if (($3 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $adjustedPtr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    return;
   }
   if (($3 | 0) != ($adjustedPtr | 0)) {
    $number_to_static_ptr11_i = $info + 36 | 0;
    HEAP32[$number_to_static_ptr11_i >> 2] = (HEAP32[$number_to_static_ptr11_i >> 2] | 0) + 1;
    HEAP32[$info + 24 >> 2] = 2;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr6_i = $info + 24 | 0;
   if ((HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] | 0) != 2) {
    return;
   }
   HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] = $path_below;
   return;
  }
  function __ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $adjustedPtr = $adjustedPtr | 0;
   $path_below = $path_below | 0;
   var $0 = 0, $shr = 0, $offset_to_base_0 = 0, $5 = 0;
   $0 = HEAP32[$this + 4 >> 2] | 0;
   $shr = $0 >> 8;
   if (($0 & 1 | 0) == 0) {
    $offset_to_base_0 = $shr;
   } else {
    $offset_to_base_0 = HEAP32[(HEAP32[$adjustedPtr >> 2] | 0) + $shr >> 2] | 0;
   }
   $5 = HEAP32[$this >> 2] | 0;
   FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$5 >> 2] | 0) + 28 >> 2] & 7]($5, $info, $adjustedPtr + $offset_to_base_0 | 0, ($0 & 2 | 0) != 0 ? $path_below : 2);
   return;
  }
  function __ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) {
   $this = $this | 0;
   $info = $info | 0;
   $adjustedPtr = $adjustedPtr | 0;
   $path_below = $path_below | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $3 = 0, $path_dst_ptr_to_static_ptr6_i = 0, $number_to_static_ptr11_i = 0, $6 = 0, $add_ptr = 0, $7 = 0, $shr_i16 = 0, $offset_to_base_0_i21 = 0, $12 = 0, $search_done = 0, $15 = 0, $p_0 = 0, $16 = 0, $shr_i = 0, $offset_to_base_0_i = 0, $20 = 0, $incdec_ptr6 = 0, label = 0;
   if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) {
    $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
    $3 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
    if (($3 | 0) == 0) {
     HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $adjustedPtr;
     HEAP32[$info + 24 >> 2] = $path_below;
     HEAP32[$info + 36 >> 2] = 1;
     return;
    }
    if (($3 | 0) != ($adjustedPtr | 0)) {
     $number_to_static_ptr11_i = $info + 36 | 0;
     HEAP32[$number_to_static_ptr11_i >> 2] = (HEAP32[$number_to_static_ptr11_i >> 2] | 0) + 1;
     HEAP32[$info + 24 >> 2] = 2;
     HEAP8[$info + 54 | 0] = 1;
     return;
    }
    $path_dst_ptr_to_static_ptr6_i = $info + 24 | 0;
    if ((HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] | 0) != 2) {
     return;
    }
    HEAP32[$path_dst_ptr_to_static_ptr6_i >> 2] = $path_below;
    return;
   }
   $6 = HEAP32[$this + 12 >> 2] | 0;
   $add_ptr = $this + 16 + ($6 << 3) | 0;
   $7 = HEAP32[$this + 20 >> 2] | 0;
   $shr_i16 = $7 >> 8;
   if (($7 & 1 | 0) == 0) {
    $offset_to_base_0_i21 = $shr_i16;
   } else {
    $offset_to_base_0_i21 = HEAP32[(HEAP32[$adjustedPtr >> 2] | 0) + $shr_i16 >> 2] | 0;
   }
   $12 = HEAP32[$this + 16 >> 2] | 0;
   FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$12 >> 2] | 0) + 28 >> 2] & 7]($12, $info, $adjustedPtr + $offset_to_base_0_i21 | 0, ($7 & 2 | 0) != 0 ? $path_below : 2);
   if (($6 | 0) <= 1) {
    return;
   }
   $search_done = $info + 54 | 0;
   $15 = $adjustedPtr;
   $p_0 = $this + 24 | 0;
   while (1) {
    $16 = HEAP32[$p_0 + 4 >> 2] | 0;
    $shr_i = $16 >> 8;
    if (($16 & 1 | 0) == 0) {
     $offset_to_base_0_i = $shr_i;
    } else {
     $offset_to_base_0_i = HEAP32[(HEAP32[$15 >> 2] | 0) + $shr_i >> 2] | 0;
    }
    $20 = HEAP32[$p_0 >> 2] | 0;
    FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$20 >> 2] | 0) + 28 >> 2] & 7]($20, $info, $adjustedPtr + $offset_to_base_0_i | 0, ($16 & 2 | 0) != 0 ? $path_below : 2);
    if ((HEAP8[$search_done] & 1) != 0) {
     label = 266;
     break;
    }
    $incdec_ptr6 = $p_0 + 8 | 0;
    if ($incdec_ptr6 >>> 0 < $add_ptr >>> 0) {
     $p_0 = $incdec_ptr6;
    } else {
     label = 267;
     break;
    }
   }
   if ((label | 0) == 266) {
    return;
   } else if ((label | 0) == 267) {
    return;
   }
  }
  function __ZNK10__cxxabiv119__pointer_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $adjustedPtr) {
   $this = $this | 0;
   $thrown_type = $thrown_type | 0;
   $adjustedPtr = $adjustedPtr | 0;
   var $info = 0, $4 = 0, $7 = 0, $11 = 0, $13 = 0, $17 = 0, $19 = 0, $22 = 0, $23 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 56 | 0;
   $info = sp | 0;
   HEAP32[$adjustedPtr >> 2] = HEAP32[HEAP32[$adjustedPtr >> 2] >> 2];
   $4 = $thrown_type | 0;
   do {
    if (($this | 0) == ($4 | 0) | ($4 | 0) == 10880) {
     $retval_0 = 1;
    } else {
     if (($thrown_type | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     $7 = ___dynamic_cast($thrown_type, 10840, 10776, -1) | 0;
     if (($7 | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     if ((HEAP32[$7 + 8 >> 2] & ~HEAP32[$this + 8 >> 2] | 0) != 0) {
      $retval_0 = 0;
      break;
     }
     $11 = HEAP32[$this + 12 >> 2] | 0;
     $13 = $7 + 12 | 0;
     if (($11 | 0) == (HEAP32[$13 >> 2] | 0) | ($11 | 0) == 9912) {
      $retval_0 = 1;
      break;
     }
     if (($11 | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     $17 = ___dynamic_cast($11, 10840, 10808, -1) | 0;
     if (($17 | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     $19 = HEAP32[$13 >> 2] | 0;
     if (($19 | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     $22 = ___dynamic_cast($19, 10840, 10808, -1) | 0;
     $23 = $22;
     if (($22 | 0) == 0) {
      $retval_0 = 0;
      break;
     }
     _memset($info | 0, 0, 56);
     HEAP32[$info >> 2] = $23;
     HEAP32[$info + 8 >> 2] = $17;
     HEAP32[$info + 12 >> 2] = -1;
     HEAP32[$info + 48 >> 2] = 1;
     FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$22 >> 2] | 0) + 28 >> 2] & 7]($23, $info, HEAP32[$adjustedPtr >> 2] | 0, 1);
     if ((HEAP32[$info + 24 >> 2] | 0) != 1) {
      $retval_0 = 0;
      break;
     }
     HEAP32[$adjustedPtr >> 2] = HEAP32[$info + 16 >> 2];
     $retval_0 = 1;
    }
   } while (0);
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function ___dynamic_cast($static_ptr, $static_type, $dst_type, $src2dst_offset) {
   $static_ptr = $static_ptr | 0;
   $static_type = $static_type | 0;
   $dst_type = $dst_type | 0;
   $src2dst_offset = $src2dst_offset | 0;
   var $info = 0, $1 = 0, $add_ptr = 0, $4 = 0, $5 = 0, $dst_ptr_leading_to_static_ptr = 0, $dst_ptr_not_leading_to_static_ptr = 0, $path_dst_ptr_to_static_ptr = 0, $path_dynamic_ptr_to_static_ptr = 0, $path_dynamic_ptr_to_dst_ptr = 0, $number_to_dst_ptr = 0, $14 = 0, $dst_ptr_0 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 56 | 0;
   $info = sp | 0;
   $1 = HEAP32[$static_ptr >> 2] | 0;
   $add_ptr = $static_ptr + (HEAP32[$1 - 8 >> 2] | 0) | 0;
   $4 = HEAP32[$1 - 4 >> 2] | 0;
   $5 = $4;
   HEAP32[$info >> 2] = $dst_type;
   HEAP32[$info + 4 >> 2] = $static_ptr;
   HEAP32[$info + 8 >> 2] = $static_type;
   HEAP32[$info + 12 >> 2] = $src2dst_offset;
   $dst_ptr_leading_to_static_ptr = $info + 16 | 0;
   $dst_ptr_not_leading_to_static_ptr = $info + 20 | 0;
   $path_dst_ptr_to_static_ptr = $info + 24 | 0;
   $path_dynamic_ptr_to_static_ptr = $info + 28 | 0;
   $path_dynamic_ptr_to_dst_ptr = $info + 32 | 0;
   $number_to_dst_ptr = $info + 40 | 0;
   _memset($dst_ptr_leading_to_static_ptr | 0, 0, 39);
   if (($4 | 0) == ($dst_type | 0)) {
    HEAP32[$info + 48 >> 2] = 1;
    FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$4 >> 2] | 0) + 20 >> 2] & 7]($5, $info, $add_ptr, $add_ptr, 1, 0);
    STACKTOP = sp;
    return ((HEAP32[$path_dst_ptr_to_static_ptr >> 2] | 0) == 1 ? $add_ptr : 0) | 0;
   }
   FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$4 >> 2] | 0) + 24 >> 2] & 7]($5, $info, $add_ptr, 1, 0);
   $14 = HEAP32[$info + 36 >> 2] | 0;
   if (($14 | 0) == 0) {
    if ((HEAP32[$number_to_dst_ptr >> 2] | 0) != 1) {
     $dst_ptr_0 = 0;
     STACKTOP = sp;
     return $dst_ptr_0 | 0;
    }
    if ((HEAP32[$path_dynamic_ptr_to_static_ptr >> 2] | 0) != 1) {
     $dst_ptr_0 = 0;
     STACKTOP = sp;
     return $dst_ptr_0 | 0;
    }
    $dst_ptr_0 = (HEAP32[$path_dynamic_ptr_to_dst_ptr >> 2] | 0) == 1 ? HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] | 0 : 0;
    STACKTOP = sp;
    return $dst_ptr_0 | 0;
   } else if (($14 | 0) == 1) {
    do {
     if ((HEAP32[$path_dst_ptr_to_static_ptr >> 2] | 0) != 1) {
      if ((HEAP32[$number_to_dst_ptr >> 2] | 0) != 0) {
       $dst_ptr_0 = 0;
       STACKTOP = sp;
       return $dst_ptr_0 | 0;
      }
      if ((HEAP32[$path_dynamic_ptr_to_static_ptr >> 2] | 0) != 1) {
       $dst_ptr_0 = 0;
       STACKTOP = sp;
       return $dst_ptr_0 | 0;
      }
      if ((HEAP32[$path_dynamic_ptr_to_dst_ptr >> 2] | 0) == 1) {
       break;
      } else {
       $dst_ptr_0 = 0;
      }
      STACKTOP = sp;
      return $dst_ptr_0 | 0;
     }
    } while (0);
    $dst_ptr_0 = HEAP32[$dst_ptr_leading_to_static_ptr >> 2] | 0;
    STACKTOP = sp;
    return $dst_ptr_0 | 0;
   } else {
    $dst_ptr_0 = 0;
    STACKTOP = sp;
    return $dst_ptr_0 | 0;
   }
   return 0;
  }
  function __ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $path_dynamic_ptr_to_static_ptr_i = 0, $dst_ptr_not_leading_to_static_ptr = 0, $number_to_dst_ptr = 0;
   if ((HEAP32[$info + 8 >> 2] | 0) == ($this | 0)) {
    if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
     return;
    }
    $path_dynamic_ptr_to_static_ptr_i = $info + 28 | 0;
    if ((HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] | 0) == 1) {
     return;
    }
    HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] = $path_below;
    return;
   }
   if ((HEAP32[$info >> 2] | 0) != ($this | 0)) {
    return;
   }
   do {
    if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) {
     $dst_ptr_not_leading_to_static_ptr = $info + 20 | 0;
     if ((HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] | 0) == ($current_ptr | 0)) {
      break;
     }
     HEAP32[$info + 32 >> 2] = $path_below;
     HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] = $current_ptr;
     $number_to_dst_ptr = $info + 40 | 0;
     HEAP32[$number_to_dst_ptr >> 2] = (HEAP32[$number_to_dst_ptr >> 2] | 0) + 1;
     do {
      if ((HEAP32[$info + 36 >> 2] | 0) == 1) {
       if ((HEAP32[$info + 24 >> 2] | 0) != 2) {
        break;
       }
       HEAP8[$info + 54 | 0] = 1;
      }
     } while (0);
     HEAP32[$info + 44 >> 2] = 4;
     return;
    }
   } while (0);
   if (($path_below | 0) != 1) {
    return;
   }
   HEAP32[$info + 32 >> 2] = 1;
   return;
  }
  function __ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $0 = 0, $path_dynamic_ptr_to_static_ptr_i = 0, $dst_ptr_not_leading_to_static_ptr = 0, $is_dst_type_derived_from_static_type = 0, $10 = 0, $add_ptr = 0, $found_our_static_ptr = 0, $found_any_static_type = 0, $search_done = 0, $__flags34 = 0, $path_dst_ptr_to_static_ptr = 0, $11 = 0, $is_dst_type_derived_from_static_type13_0_off0140 = 0, $p_0139 = 0, $does_dst_type_point_to_our_static_type_0_off0138 = 0, $12 = 0, $shr_i107 = 0, $offset_to_base_0_i112 = 0, $16 = 0, $does_dst_type_point_to_our_static_type_1_off0 = 0, $is_dst_type_derived_from_static_type13_1_off0 = 0, $incdec_ptr = 0, $does_dst_type_point_to_our_static_type_0_off0_lcssa = 0, $is_dst_type_derived_from_static_type13_2_off0 = 0, $is_dst_type_derived_from_static_type13_2_off0146 = 0, $number_to_dst_ptr = 0, $is_dst_type_derived_from_static_type13_2_off0147 = 0, $33 = 0, $add_ptr64 = 0, $34 = 0, $shr_i121 = 0, $offset_to_base_0_i126 = 0, $39 = 0, $incdec_ptr69 = 0, $42 = 0, $number_to_static_ptr76 = 0, $search_done79 = 0, $44 = 0, $p65_0 = 0, $47 = 0, $shr_i92 = 0, $offset_to_base_0_i97 = 0, $51 = 0, $incdec_ptr84 = 0, $path_dst_ptr_to_static_ptr99 = 0, $search_done92 = 0, $54 = 0, $search_done110 = 0, $55 = 0, $p65_1 = 0, $60 = 0, $shr_i76 = 0, $offset_to_base_0_i81 = 0, $64 = 0, $incdec_ptr105 = 0, $p65_2 = 0, $70 = 0, $shr_i = 0, $offset_to_base_0_i = 0, $74 = 0, $incdec_ptr120 = 0, label = 0;
   $0 = $this | 0;
   if (($0 | 0) == (HEAP32[$info + 8 >> 2] | 0)) {
    if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
     return;
    }
    $path_dynamic_ptr_to_static_ptr_i = $info + 28 | 0;
    if ((HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] | 0) == 1) {
     return;
    }
    HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] = $path_below;
    return;
   }
   if (($0 | 0) == (HEAP32[$info >> 2] | 0)) {
    do {
     if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) {
      $dst_ptr_not_leading_to_static_ptr = $info + 20 | 0;
      if ((HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] | 0) == ($current_ptr | 0)) {
       break;
      }
      HEAP32[$info + 32 >> 2] = $path_below;
      $is_dst_type_derived_from_static_type = $info + 44 | 0;
      if ((HEAP32[$is_dst_type_derived_from_static_type >> 2] | 0) == 4) {
       return;
      }
      $10 = HEAP32[$this + 12 >> 2] | 0;
      $add_ptr = $this + 16 + ($10 << 3) | 0;
      L433 : do {
       if (($10 | 0) > 0) {
        $found_our_static_ptr = $info + 52 | 0;
        $found_any_static_type = $info + 53 | 0;
        $search_done = $info + 54 | 0;
        $__flags34 = $this + 8 | 0;
        $path_dst_ptr_to_static_ptr = $info + 24 | 0;
        $11 = $current_ptr;
        $does_dst_type_point_to_our_static_type_0_off0138 = 0;
        $p_0139 = $this + 16 | 0;
        $is_dst_type_derived_from_static_type13_0_off0140 = 0;
        L435 : while (1) {
         HEAP8[$found_our_static_ptr] = 0;
         HEAP8[$found_any_static_type] = 0;
         $12 = HEAP32[$p_0139 + 4 >> 2] | 0;
         $shr_i107 = $12 >> 8;
         if (($12 & 1 | 0) == 0) {
          $offset_to_base_0_i112 = $shr_i107;
         } else {
          $offset_to_base_0_i112 = HEAP32[(HEAP32[$11 >> 2] | 0) + $shr_i107 >> 2] | 0;
         }
         $16 = HEAP32[$p_0139 >> 2] | 0;
         FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$16 >> 2] | 0) + 20 >> 2] & 7]($16, $info, $current_ptr, $current_ptr + $offset_to_base_0_i112 | 0, 2 - ($12 >>> 1 & 1) | 0, $use_strcmp);
         if ((HEAP8[$search_done] & 1) != 0) {
          $is_dst_type_derived_from_static_type13_2_off0 = $is_dst_type_derived_from_static_type13_0_off0140;
          $does_dst_type_point_to_our_static_type_0_off0_lcssa = $does_dst_type_point_to_our_static_type_0_off0138;
          break;
         }
         do {
          if ((HEAP8[$found_any_static_type] & 1) == 0) {
           $is_dst_type_derived_from_static_type13_1_off0 = $is_dst_type_derived_from_static_type13_0_off0140;
           $does_dst_type_point_to_our_static_type_1_off0 = $does_dst_type_point_to_our_static_type_0_off0138;
          } else {
           if ((HEAP8[$found_our_static_ptr] & 1) == 0) {
            if ((HEAP32[$__flags34 >> 2] & 1 | 0) == 0) {
             $is_dst_type_derived_from_static_type13_2_off0 = 1;
             $does_dst_type_point_to_our_static_type_0_off0_lcssa = $does_dst_type_point_to_our_static_type_0_off0138;
             break L435;
            } else {
             $is_dst_type_derived_from_static_type13_1_off0 = 1;
             $does_dst_type_point_to_our_static_type_1_off0 = $does_dst_type_point_to_our_static_type_0_off0138;
             break;
            }
           }
           if ((HEAP32[$path_dst_ptr_to_static_ptr >> 2] | 0) == 1) {
            label = 347;
            break L433;
           }
           if ((HEAP32[$__flags34 >> 2] & 2 | 0) == 0) {
            label = 347;
            break L433;
           } else {
            $is_dst_type_derived_from_static_type13_1_off0 = 1;
            $does_dst_type_point_to_our_static_type_1_off0 = 1;
           }
          }
         } while (0);
         $incdec_ptr = $p_0139 + 8 | 0;
         if ($incdec_ptr >>> 0 < $add_ptr >>> 0) {
          $does_dst_type_point_to_our_static_type_0_off0138 = $does_dst_type_point_to_our_static_type_1_off0;
          $p_0139 = $incdec_ptr;
          $is_dst_type_derived_from_static_type13_0_off0140 = $is_dst_type_derived_from_static_type13_1_off0;
         } else {
          $is_dst_type_derived_from_static_type13_2_off0 = $is_dst_type_derived_from_static_type13_1_off0;
          $does_dst_type_point_to_our_static_type_0_off0_lcssa = $does_dst_type_point_to_our_static_type_1_off0;
          break;
         }
        }
        if ($does_dst_type_point_to_our_static_type_0_off0_lcssa) {
         $is_dst_type_derived_from_static_type13_2_off0147 = $is_dst_type_derived_from_static_type13_2_off0;
         label = 346;
        } else {
         $is_dst_type_derived_from_static_type13_2_off0146 = $is_dst_type_derived_from_static_type13_2_off0;
         label = 343;
        }
       } else {
        $is_dst_type_derived_from_static_type13_2_off0146 = 0;
        label = 343;
       }
      } while (0);
      do {
       if ((label | 0) == 343) {
        HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] = $current_ptr;
        $number_to_dst_ptr = $info + 40 | 0;
        HEAP32[$number_to_dst_ptr >> 2] = (HEAP32[$number_to_dst_ptr >> 2] | 0) + 1;
        if ((HEAP32[$info + 36 >> 2] | 0) != 1) {
         $is_dst_type_derived_from_static_type13_2_off0147 = $is_dst_type_derived_from_static_type13_2_off0146;
         label = 346;
         break;
        }
        if ((HEAP32[$info + 24 >> 2] | 0) != 2) {
         $is_dst_type_derived_from_static_type13_2_off0147 = $is_dst_type_derived_from_static_type13_2_off0146;
         label = 346;
         break;
        }
        HEAP8[$info + 54 | 0] = 1;
        if ($is_dst_type_derived_from_static_type13_2_off0146) {
         label = 347;
        } else {
         label = 348;
        }
       }
      } while (0);
      if ((label | 0) == 346) {
       if ($is_dst_type_derived_from_static_type13_2_off0147) {
        label = 347;
       } else {
        label = 348;
       }
      }
      if ((label | 0) == 347) {
       HEAP32[$is_dst_type_derived_from_static_type >> 2] = 3;
       return;
      } else if ((label | 0) == 348) {
       HEAP32[$is_dst_type_derived_from_static_type >> 2] = 4;
       return;
      }
     }
    } while (0);
    if (($path_below | 0) != 1) {
     return;
    }
    HEAP32[$info + 32 >> 2] = 1;
    return;
   }
   $33 = HEAP32[$this + 12 >> 2] | 0;
   $add_ptr64 = $this + 16 + ($33 << 3) | 0;
   $34 = HEAP32[$this + 20 >> 2] | 0;
   $shr_i121 = $34 >> 8;
   if (($34 & 1 | 0) == 0) {
    $offset_to_base_0_i126 = $shr_i121;
   } else {
    $offset_to_base_0_i126 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $shr_i121 >> 2] | 0;
   }
   $39 = HEAP32[$this + 16 >> 2] | 0;
   FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$39 >> 2] | 0) + 24 >> 2] & 7]($39, $info, $current_ptr + $offset_to_base_0_i126 | 0, ($34 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
   $incdec_ptr69 = $this + 24 | 0;
   if (($33 | 0) <= 1) {
    return;
   }
   $42 = HEAP32[$this + 8 >> 2] | 0;
   do {
    if (($42 & 2 | 0) == 0) {
     $number_to_static_ptr76 = $info + 36 | 0;
     if ((HEAP32[$number_to_static_ptr76 >> 2] | 0) == 1) {
      break;
     }
     if (($42 & 1 | 0) == 0) {
      $search_done110 = $info + 54 | 0;
      $55 = $current_ptr;
      $p65_2 = $incdec_ptr69;
      while (1) {
       if ((HEAP8[$search_done110] & 1) != 0) {
        label = 388;
        break;
       }
       if ((HEAP32[$number_to_static_ptr76 >> 2] | 0) == 1) {
        label = 389;
        break;
       }
       $70 = HEAP32[$p65_2 + 4 >> 2] | 0;
       $shr_i = $70 >> 8;
       if (($70 & 1 | 0) == 0) {
        $offset_to_base_0_i = $shr_i;
       } else {
        $offset_to_base_0_i = HEAP32[(HEAP32[$55 >> 2] | 0) + $shr_i >> 2] | 0;
       }
       $74 = HEAP32[$p65_2 >> 2] | 0;
       FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$74 >> 2] | 0) + 24 >> 2] & 7]($74, $info, $current_ptr + $offset_to_base_0_i | 0, ($70 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
       $incdec_ptr120 = $p65_2 + 8 | 0;
       if ($incdec_ptr120 >>> 0 < $add_ptr64 >>> 0) {
        $p65_2 = $incdec_ptr120;
       } else {
        label = 390;
        break;
       }
      }
      if ((label | 0) == 388) {
       return;
      } else if ((label | 0) == 389) {
       return;
      } else if ((label | 0) == 390) {
       return;
      }
     }
     $path_dst_ptr_to_static_ptr99 = $info + 24 | 0;
     $search_done92 = $info + 54 | 0;
     $54 = $current_ptr;
     $p65_1 = $incdec_ptr69;
     while (1) {
      if ((HEAP8[$search_done92] & 1) != 0) {
       label = 385;
       break;
      }
      if ((HEAP32[$number_to_static_ptr76 >> 2] | 0) == 1) {
       if ((HEAP32[$path_dst_ptr_to_static_ptr99 >> 2] | 0) == 1) {
        label = 386;
        break;
       }
      }
      $60 = HEAP32[$p65_1 + 4 >> 2] | 0;
      $shr_i76 = $60 >> 8;
      if (($60 & 1 | 0) == 0) {
       $offset_to_base_0_i81 = $shr_i76;
      } else {
       $offset_to_base_0_i81 = HEAP32[(HEAP32[$54 >> 2] | 0) + $shr_i76 >> 2] | 0;
      }
      $64 = HEAP32[$p65_1 >> 2] | 0;
      FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$64 >> 2] | 0) + 24 >> 2] & 7]($64, $info, $current_ptr + $offset_to_base_0_i81 | 0, ($60 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
      $incdec_ptr105 = $p65_1 + 8 | 0;
      if ($incdec_ptr105 >>> 0 < $add_ptr64 >>> 0) {
       $p65_1 = $incdec_ptr105;
      } else {
       label = 387;
       break;
      }
     }
     if ((label | 0) == 385) {
      return;
     } else if ((label | 0) == 386) {
      return;
     } else if ((label | 0) == 387) {
      return;
     }
    }
   } while (0);
   $search_done79 = $info + 54 | 0;
   $44 = $current_ptr;
   $p65_0 = $incdec_ptr69;
   while (1) {
    if ((HEAP8[$search_done79] & 1) != 0) {
     label = 383;
     break;
    }
    $47 = HEAP32[$p65_0 + 4 >> 2] | 0;
    $shr_i92 = $47 >> 8;
    if (($47 & 1 | 0) == 0) {
     $offset_to_base_0_i97 = $shr_i92;
    } else {
     $offset_to_base_0_i97 = HEAP32[(HEAP32[$44 >> 2] | 0) + $shr_i92 >> 2] | 0;
    }
    $51 = HEAP32[$p65_0 >> 2] | 0;
    FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$51 >> 2] | 0) + 24 >> 2] & 7]($51, $info, $current_ptr + $offset_to_base_0_i97 | 0, ($47 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
    $incdec_ptr84 = $p65_0 + 8 | 0;
    if ($incdec_ptr84 >>> 0 < $add_ptr64 >>> 0) {
     $p65_0 = $incdec_ptr84;
    } else {
     label = 384;
     break;
    }
   }
   if ((label | 0) == 383) {
    return;
   } else if ((label | 0) == 384) {
    return;
   }
  }
  function __ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $dst_ptr = $dst_ptr | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $0 = 0, $shr = 0, $offset_to_base_0 = 0, $5 = 0;
   $0 = HEAP32[$this + 4 >> 2] | 0;
   $shr = $0 >> 8;
   if (($0 & 1 | 0) == 0) {
    $offset_to_base_0 = $shr;
   } else {
    $offset_to_base_0 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $shr >> 2] | 0;
   }
   $5 = HEAP32[$this >> 2] | 0;
   FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$5 >> 2] | 0) + 20 >> 2] & 7]($5, $info, $dst_ptr, $current_ptr + $offset_to_base_0 | 0, ($0 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
   return;
  }
  function __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $0 = 0, $shr = 0, $offset_to_base_0 = 0, $5 = 0;
   $0 = HEAP32[$this + 4 >> 2] | 0;
   $shr = $0 >> 8;
   if (($0 & 1 | 0) == 0) {
    $offset_to_base_0 = $shr;
   } else {
    $offset_to_base_0 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $shr >> 2] | 0;
   }
   $5 = HEAP32[$this >> 2] | 0;
   FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$5 >> 2] | 0) + 24 >> 2] & 7]($5, $info, $current_ptr + $offset_to_base_0 | 0, ($0 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
   return;
  }
  function __ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $0 = 0, $path_dynamic_ptr_to_static_ptr_i = 0, $dst_ptr_not_leading_to_static_ptr = 0, $is_dst_type_derived_from_static_type = 0, $found_our_static_ptr = 0, $found_any_static_type = 0, $10 = 0, $is_dst_type_derived_from_static_type13_0_off034 = 0, $number_to_dst_ptr = 0, $20 = 0, label = 0;
   $0 = $this | 0;
   if (($0 | 0) == (HEAP32[$info + 8 >> 2] | 0)) {
    if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
     return;
    }
    $path_dynamic_ptr_to_static_ptr_i = $info + 28 | 0;
    if ((HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] | 0) == 1) {
     return;
    }
    HEAP32[$path_dynamic_ptr_to_static_ptr_i >> 2] = $path_below;
    return;
   }
   if (($0 | 0) != (HEAP32[$info >> 2] | 0)) {
    $20 = HEAP32[$this + 8 >> 2] | 0;
    FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$20 >> 2] | 0) + 24 >> 2] & 7]($20, $info, $current_ptr, $path_below, $use_strcmp);
    return;
   }
   do {
    if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) {
     $dst_ptr_not_leading_to_static_ptr = $info + 20 | 0;
     if ((HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] | 0) == ($current_ptr | 0)) {
      break;
     }
     HEAP32[$info + 32 >> 2] = $path_below;
     $is_dst_type_derived_from_static_type = $info + 44 | 0;
     if ((HEAP32[$is_dst_type_derived_from_static_type >> 2] | 0) == 4) {
      return;
     }
     $found_our_static_ptr = $info + 52 | 0;
     HEAP8[$found_our_static_ptr] = 0;
     $found_any_static_type = $info + 53 | 0;
     HEAP8[$found_any_static_type] = 0;
     $10 = HEAP32[$this + 8 >> 2] | 0;
     FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$10 >> 2] | 0) + 20 >> 2] & 7]($10, $info, $current_ptr, $current_ptr, 1, $use_strcmp);
     if ((HEAP8[$found_any_static_type] & 1) == 0) {
      $is_dst_type_derived_from_static_type13_0_off034 = 0;
      label = 409;
     } else {
      if ((HEAP8[$found_our_static_ptr] & 1) == 0) {
       $is_dst_type_derived_from_static_type13_0_off034 = 1;
       label = 409;
      }
     }
     L543 : do {
      if ((label | 0) == 409) {
       HEAP32[$dst_ptr_not_leading_to_static_ptr >> 2] = $current_ptr;
       $number_to_dst_ptr = $info + 40 | 0;
       HEAP32[$number_to_dst_ptr >> 2] = (HEAP32[$number_to_dst_ptr >> 2] | 0) + 1;
       do {
        if ((HEAP32[$info + 36 >> 2] | 0) == 1) {
         if ((HEAP32[$info + 24 >> 2] | 0) != 2) {
          label = 412;
          break;
         }
         HEAP8[$info + 54 | 0] = 1;
         if ($is_dst_type_derived_from_static_type13_0_off034) {
          break L543;
         }
        } else {
         label = 412;
        }
       } while (0);
       if ((label | 0) == 412) {
        if ($is_dst_type_derived_from_static_type13_0_off034) {
         break;
        }
       }
       HEAP32[$is_dst_type_derived_from_static_type >> 2] = 4;
       return;
      }
     } while (0);
     HEAP32[$is_dst_type_derived_from_static_type >> 2] = 3;
     return;
    }
   } while (0);
   if (($path_below | 0) != 1) {
    return;
   }
   HEAP32[$info + 32 >> 2] = 1;
   return;
  }
  function __ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $dst_ptr = $dst_ptr | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $4 = 0, $path_dst_ptr_to_static_ptr12_i = 0, $6 = 0, $7 = 0, $number_to_static_ptr26_i = 0, $found_our_static_ptr2 = 0, $11 = 0, $found_any_static_type5 = 0, $13 = 0, $14 = 0, $add_ptr = 0, $15 = 0, $shr_i30 = 0, $offset_to_base_0_i35 = 0, $20 = 0, $path_dst_ptr_to_static_ptr = 0, $__flags = 0, $search_done = 0, $23 = 0, $p_0 = 0, $33 = 0, $shr_i = 0, $offset_to_base_0_i = 0, $37 = 0;
   if (($this | 0) != (HEAP32[$info + 8 >> 2] | 0)) {
    $found_our_static_ptr2 = $info + 52 | 0;
    $11 = HEAP8[$found_our_static_ptr2] & 1;
    $found_any_static_type5 = $info + 53 | 0;
    $13 = HEAP8[$found_any_static_type5] & 1;
    $14 = HEAP32[$this + 12 >> 2] | 0;
    $add_ptr = $this + 16 + ($14 << 3) | 0;
    HEAP8[$found_our_static_ptr2] = 0;
    HEAP8[$found_any_static_type5] = 0;
    $15 = HEAP32[$this + 20 >> 2] | 0;
    $shr_i30 = $15 >> 8;
    if (($15 & 1 | 0) == 0) {
     $offset_to_base_0_i35 = $shr_i30;
    } else {
     $offset_to_base_0_i35 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $shr_i30 >> 2] | 0;
    }
    $20 = HEAP32[$this + 16 >> 2] | 0;
    FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$20 >> 2] | 0) + 20 >> 2] & 7]($20, $info, $dst_ptr, $current_ptr + $offset_to_base_0_i35 | 0, ($15 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
    L565 : do {
     if (($14 | 0) > 1) {
      $path_dst_ptr_to_static_ptr = $info + 24 | 0;
      $__flags = $this + 8 | 0;
      $search_done = $info + 54 | 0;
      $23 = $current_ptr;
      $p_0 = $this + 24 | 0;
      do {
       if ((HEAP8[$search_done] & 1) != 0) {
        break L565;
       }
       do {
        if ((HEAP8[$found_our_static_ptr2] & 1) == 0) {
         if ((HEAP8[$found_any_static_type5] & 1) == 0) {
          break;
         }
         if ((HEAP32[$__flags >> 2] & 1 | 0) == 0) {
          break L565;
         }
        } else {
         if ((HEAP32[$path_dst_ptr_to_static_ptr >> 2] | 0) == 1) {
          break L565;
         }
         if ((HEAP32[$__flags >> 2] & 2 | 0) == 0) {
          break L565;
         }
        }
       } while (0);
       HEAP8[$found_our_static_ptr2] = 0;
       HEAP8[$found_any_static_type5] = 0;
       $33 = HEAP32[$p_0 + 4 >> 2] | 0;
       $shr_i = $33 >> 8;
       if (($33 & 1 | 0) == 0) {
        $offset_to_base_0_i = $shr_i;
       } else {
        $offset_to_base_0_i = HEAP32[(HEAP32[$23 >> 2] | 0) + $shr_i >> 2] | 0;
       }
       $37 = HEAP32[$p_0 >> 2] | 0;
       FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$37 >> 2] | 0) + 20 >> 2] & 7]($37, $info, $dst_ptr, $current_ptr + $offset_to_base_0_i | 0, ($33 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp);
       $p_0 = $p_0 + 8 | 0;
      } while ($p_0 >>> 0 < $add_ptr >>> 0);
     }
    } while (0);
    HEAP8[$found_our_static_ptr2] = $11;
    HEAP8[$found_any_static_type5] = $13;
    return;
   }
   HEAP8[$info + 53 | 0] = 1;
   if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
    return;
   }
   HEAP8[$info + 52 | 0] = 1;
   $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
   $4 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
   if (($4 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $dst_ptr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($path_below | 0) == 1)) {
     return;
    }
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   if (($4 | 0) != ($dst_ptr | 0)) {
    $number_to_static_ptr26_i = $info + 36 | 0;
    HEAP32[$number_to_static_ptr26_i >> 2] = (HEAP32[$number_to_static_ptr26_i >> 2] | 0) + 1;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr12_i = $info + 24 | 0;
   $6 = HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] | 0;
   if (($6 | 0) == 2) {
    HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] = $path_below;
    $7 = $path_below;
   } else {
    $7 = $6;
   }
   if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($7 | 0) == 1)) {
    return;
   }
   HEAP8[$info + 54 | 0] = 1;
   return;
  }
  function __ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $dst_ptr = $dst_ptr | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $4 = 0, $path_dst_ptr_to_static_ptr12_i = 0, $6 = 0, $7 = 0, $number_to_static_ptr26_i = 0, $10 = 0;
   if (($this | 0) != (HEAP32[$info + 8 >> 2] | 0)) {
    $10 = HEAP32[$this + 8 >> 2] | 0;
    FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$10 >> 2] | 0) + 20 >> 2] & 7]($10, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp);
    return;
   }
   HEAP8[$info + 53 | 0] = 1;
   if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
    return;
   }
   HEAP8[$info + 52 | 0] = 1;
   $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
   $4 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
   if (($4 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $dst_ptr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($path_below | 0) == 1)) {
     return;
    }
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   if (($4 | 0) != ($dst_ptr | 0)) {
    $number_to_static_ptr26_i = $info + 36 | 0;
    HEAP32[$number_to_static_ptr26_i >> 2] = (HEAP32[$number_to_static_ptr26_i >> 2] | 0) + 1;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr12_i = $info + 24 | 0;
   $6 = HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] | 0;
   if (($6 | 0) == 2) {
    HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] = $path_below;
    $7 = $path_below;
   } else {
    $7 = $6;
   }
   if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($7 | 0) == 1)) {
    return;
   }
   HEAP8[$info + 54 | 0] = 1;
   return;
  }
  function __ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) {
   $this = $this | 0;
   $info = $info | 0;
   $dst_ptr = $dst_ptr | 0;
   $current_ptr = $current_ptr | 0;
   $path_below = $path_below | 0;
   $use_strcmp = $use_strcmp | 0;
   var $dst_ptr_leading_to_static_ptr_i = 0, $2 = 0, $path_dst_ptr_to_static_ptr12_i = 0, $4 = 0, $5 = 0, $number_to_static_ptr26_i = 0;
   if ((HEAP32[$info + 8 >> 2] | 0) != ($this | 0)) {
    return;
   }
   HEAP8[$info + 53 | 0] = 1;
   if ((HEAP32[$info + 4 >> 2] | 0) != ($current_ptr | 0)) {
    return;
   }
   HEAP8[$info + 52 | 0] = 1;
   $dst_ptr_leading_to_static_ptr_i = $info + 16 | 0;
   $2 = HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] | 0;
   if (($2 | 0) == 0) {
    HEAP32[$dst_ptr_leading_to_static_ptr_i >> 2] = $dst_ptr;
    HEAP32[$info + 24 >> 2] = $path_below;
    HEAP32[$info + 36 >> 2] = 1;
    if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($path_below | 0) == 1)) {
     return;
    }
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   if (($2 | 0) != ($dst_ptr | 0)) {
    $number_to_static_ptr26_i = $info + 36 | 0;
    HEAP32[$number_to_static_ptr26_i >> 2] = (HEAP32[$number_to_static_ptr26_i >> 2] | 0) + 1;
    HEAP8[$info + 54 | 0] = 1;
    return;
   }
   $path_dst_ptr_to_static_ptr12_i = $info + 24 | 0;
   $4 = HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] | 0;
   if (($4 | 0) == 2) {
    HEAP32[$path_dst_ptr_to_static_ptr12_i >> 2] = $path_below;
    $5 = $path_below;
   } else {
    $5 = $4;
   }
   if (!((HEAP32[$info + 48 >> 2] | 0) == 1 & ($5 | 0) == 1)) {
    return;
   }
   HEAP8[$info + 54 | 0] = 1;
   return;
  }
  function _malloc($bytes) {
   $bytes = $bytes | 0;
   var $cond = 0, $shr = 0, $0 = 0, $shr3 = 0, $add8 = 0, $shl = 0, $1 = 0, $2 = 0, $3 = 0, $fd9 = 0, $4 = 0, $bk = 0, $shl22 = 0, $9 = 0, $shl37 = 0, $and41 = 0, $sub44 = 0, $and46 = 0, $shr47 = 0, $and49 = 0, $shr51 = 0, $and53 = 0, $shr55 = 0, $and57 = 0, $shr59 = 0, $and61 = 0, $add64 = 0, $shl65 = 0, $13 = 0, $14 = 0, $15 = 0, $fd69 = 0, $16 = 0, $bk78 = 0, $shl90 = 0, $sub91 = 0, $20 = 0, $21 = 0, $23 = 0, $24 = 0, $shr101 = 0, $shl102 = 0, $25 = 0, $26 = 0, $shl105 = 0, $27 = 0, $28 = 0, $_pre_phi = 0, $F104_0 = 0, $32 = 0, $sub2_i = 0, $and3_i = 0, $shr4_i = 0, $and6_i = 0, $shr7_i = 0, $and9_i = 0, $shr11_i = 0, $and13_i = 0, $shr15_i = 0, $and17_i = 0, $33 = 0, $rsize_0_i = 0, $v_0_i = 0, $t_0_i = 0, $35 = 0, $36 = 0, $cond7_i = 0, $sub31_i = 0, $cmp32_i = 0, $38 = 0, $39 = 0, $add_ptr_i = 0, $40 = 0, $41 = 0, $42 = 0, $43 = 0, $bk47_i = 0, $fd50_i = 0, $arrayidx61_i = 0, $47 = 0, $arrayidx65_i = 0, $48 = 0, $RP_0_i = 0, $R_0_i = 0, $arrayidx71_i = 0, $49 = 0, $arrayidx75_i = 0, $50 = 0, $R_1_i = 0, $index_i = 0, $arrayidx94_i = 0, $arrayidx113_i = 0, $61 = 0, $64 = 0, $add177_i = 0, $67 = 0, $70 = 0, $71 = 0, $shr194_i = 0, $shl195_i = 0, $72 = 0, $73 = 0, $shl198_i = 0, $74 = 0, $75 = 0, $_pre_phi_i = 0, $F197_0_i = 0, $add_ptr225_i = 0, $add143 = 0, $and144 = 0, $79 = 0, $sub_i107 = 0, $shr_i108 = 0, $and_i112 = 0, $shl_i113 = 0, $and8_i = 0, $shl9_i = 0, $and12_i = 0, $add17_i = 0, $idx_0_i = 0, $80 = 0, $cond_i = 0, $rst_0_i = 0, $sizebits_0_i = 0, $t_0_i121 = 0, $rsize_0_i122 = 0, $v_0_i123 = 0, $and32_i = 0, $sub33_i = 0, $rsize_1_i = 0, $v_1_i = 0, $82 = 0, $83 = 0, $rst_1_i = 0, $t_1_i = 0, $rsize_2_i = 0, $v_2_i = 0, $shl59_i = 0, $and63_i = 0, $sub69_i = 0, $and72_i = 0, $shr74_i = 0, $and76_i = 0, $shr78_i = 0, $and80_i = 0, $shr82_i = 0, $and84_i = 0, $shr86_i = 0, $and88_i = 0, $t_2_ph_i = 0, $v_326_i = 0, $rsize_325_i = 0, $t_224_i = 0, $sub100_i = 0, $cmp101_i = 0, $sub100_rsize_3_i = 0, $t_2_v_3_i = 0, $86 = 0, $87 = 0, $v_3_lcssa_i = 0, $rsize_3_lcssa_i = 0, $89 = 0, $90 = 0, $add_ptr_i128 = 0, $91 = 0, $92 = 0, $93 = 0, $94 = 0, $bk135_i = 0, $fd138_i = 0, $arrayidx150_i = 0, $98 = 0, $arrayidx154_i133 = 0, $99 = 0, $RP_0_i136 = 0, $R_0_i137 = 0, $arrayidx160_i = 0, $100 = 0, $arrayidx164_i = 0, $101 = 0, $R_1_i139 = 0, $index_i140 = 0, $arrayidx183_i = 0, $arrayidx203_i = 0, $112 = 0, $115 = 0, $add267_i = 0, $118 = 0, $shr282_i = 0, $shl287_i = 0, $121 = 0, $122 = 0, $shl290_i = 0, $123 = 0, $124 = 0, $_pre_phi_i147 = 0, $F289_0_i = 0, $129 = 0, $shr317_i = 0, $and330_i = 0, $shl332_i = 0, $and335_i = 0, $shl337_i = 0, $and340_i = 0, $add345_i = 0, $I315_0_i = 0, $arrayidx354_i = 0, $132 = 0, $shl361_i = 0, $cond382_i = 0, $T_0_i = 0, $K372_0_i = 0, $arrayidx393_i = 0, $139 = 0, $fd412_i = 0, $145 = 0, $147 = 0, $add_ptr436_i = 0, $nb_0 = 0, $153 = 0, $sub159 = 0, $154 = 0, $155 = 0, $159 = 0, $162 = 0, $sub187 = 0, $163 = 0, $164 = 0, $call_i_i = 0, $add_i149 = 0, $169 = 0, $sub_i150 = 0, $add9_i = 0, $neg_i151 = 0, $and11_i = 0, $170 = 0, $171 = 0, $add17_i152 = 0, $173 = 0, $174 = 0, $sp_0_i_i = 0, $base_i_i = 0, $175 = 0, $size_i_i = 0, $177 = 0, $call34_i = 0, $178 = 0, $179 = 0, $sub38_i = 0, $ssize_0_i = 0, $180 = 0, $add51_i = 0, $181 = 0, $call65_i = 0, $cmp66_i160 = 0, $and77_i = 0, $call80_i = 0, $cmp82_i = 0, $ssize_1_i = 0, $br_0_i = 0, $tsize_0_i = 0, $tbase_0_i = 0, $sub109_i = 0, $185 = 0, $and101_i = 0, $ssize_2_i = 0, $tsize_0758385_i = 0, $tsize_1_i = 0, $call128_i = 0, $call129_i = 0, $sub_ptr_sub_i = 0, $cmp138_i166 = 0, $call128_tbase_1_i = 0, $tbase_292_i = 0, $tsize_291_i = 0, $add147_i = 0, $189 = 0, $190 = 0, $i_02_i_i = 0, $shl_i_i = 0, $192 = 0, $195 = 0, $cond_i_i = 0, $sub5_i_i = 0, $sp_0105_i = 0, $201 = 0, $size185_i = 0, $202 = 0, $203 = 0, $205 = 0, $206 = 0, $add212_i = 0, $208 = 0, $209 = 0, $cond_i28_i = 0, $sub5_i30_i = 0, $add_ptr224_i = 0, $sp_1101_i = 0, $base223_i = 0, $217 = 0, $size242_i = 0, $220 = 0, $cond_i43_i = 0, $222 = 0, $cond15_i_i = 0, $add_ptr16_i_i = 0, $224 = 0, $add_ptr4_sum_i50_i = 0, $add_ptr17_i_i = 0, $225 = 0, $sub18_i_i = 0, $add_i_i = 0, $add26_i_i = 0, $add_ptr16_sum_i_i = 0, $234 = 0, $and37_i_i = 0, $shr_i55_i = 0, $236 = 0, $238 = 0, $239 = 0, $fd59_i_i = 0, $fd68_pre_phi_i_i = 0, $247 = 0, $249 = 0, $251 = 0, $253 = 0, $bk82_i_i = 0, $fd85_i_i = 0, $add_ptr16_sum56_i_i = 0, $258 = 0, $259 = 0, $arrayidx99_i_i = 0, $260 = 0, $RP_0_i_i = 0, $R_0_i_i = 0, $arrayidx103_i_i = 0, $261 = 0, $arrayidx107_i_i = 0, $262 = 0, $R_1_i_i = 0, $265 = 0, $arrayidx123_i_i = 0, $arrayidx143_i_i = 0, $add_ptr16_sum2728_i_i = 0, $275 = 0, $279 = 0, $qsize_0_i_i = 0, $oldfirst_0_i_i = 0, $head208_i_i = 0, $shr214_i_i = 0, $shl221_i_i = 0, $285 = 0, $286 = 0, $shl226_i_i = 0, $287 = 0, $288 = 0, $_pre_phi_i68_i = 0, $F224_0_i_i = 0, $293 = 0, $shr253_i_i = 0, $and264_i_i = 0, $shl265_i_i = 0, $and268_i_i = 0, $shl270_i_i = 0, $and273_i_i = 0, $add278_i_i = 0, $I252_0_i_i = 0, $arrayidx287_i_i = 0, $296 = 0, $shl294_i_i = 0, $cond315_i_i = 0, $T_0_i69_i = 0, $K305_0_i_i = 0, $arrayidx325_i_i = 0, $303 = 0, $fd344_i_i = 0, $309 = 0, $311 = 0, $316 = 0, $sp_0_i_i_i = 0, $317 = 0, $318 = 0, $add_ptr_i_i_i = 0, $320 = 0, $cond_i18_i = 0, $add_ptr7_i_i = 0, $cond13_i_i = 0, $add_ptr14_i_i = 0, $323 = 0, $cond_i_i_i = 0, $sub5_i_i_i = 0, $330 = 0, $add_ptr2416_i_i = 0, $332 = 0, $sub_ptr_sub_i_i = 0, $335 = 0, $shr_i_i = 0, $shl_i21_i = 0, $337 = 0, $338 = 0, $shl39_i_i = 0, $339 = 0, $340 = 0, $_pre_phi_i_i = 0, $F_0_i_i = 0, $343 = 0, $shr58_i_i = 0, $and69_i_i = 0, $shl70_i_i = 0, $and73_i_i = 0, $shl75_i_i = 0, $and78_i_i = 0, $add83_i_i = 0, $I57_0_i_i = 0, $arrayidx91_i_i = 0, $345 = 0, $shl95_i_i = 0, $cond115_i_i = 0, $T_0_i_i = 0, $K105_0_i_i = 0, $arrayidx126_i_i = 0, $348 = 0, $fd145_i_i = 0, $351 = 0, $353 = 0, $355 = 0, $sub253_i = 0, $356 = 0, $357 = 0, $mem_0 = 0, label = 0;
   do {
    if ($bytes >>> 0 < 245) {
     if ($bytes >>> 0 < 11) {
      $cond = 16;
     } else {
      $cond = $bytes + 11 & -8;
     }
     $shr = $cond >>> 3;
     $0 = HEAP32[11602] | 0;
     $shr3 = $0 >>> ($shr >>> 0);
     if (($shr3 & 3 | 0) != 0) {
      $add8 = ($shr3 & 1 ^ 1) + $shr | 0;
      $shl = $add8 << 1;
      $1 = 46448 + ($shl << 2) | 0;
      $2 = 46448 + ($shl + 2 << 2) | 0;
      $3 = HEAP32[$2 >> 2] | 0;
      $fd9 = $3 + 8 | 0;
      $4 = HEAP32[$fd9 >> 2] | 0;
      do {
       if (($1 | 0) == ($4 | 0)) {
        HEAP32[11602] = $0 & ~(1 << $add8);
       } else {
        if ($4 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
         _abort();
         return 0;
        }
        $bk = $4 + 12 | 0;
        if ((HEAP32[$bk >> 2] | 0) == ($3 | 0)) {
         HEAP32[$bk >> 2] = $1;
         HEAP32[$2 >> 2] = $4;
         break;
        } else {
         _abort();
         return 0;
        }
       }
      } while (0);
      $shl22 = $add8 << 3;
      HEAP32[$3 + 4 >> 2] = $shl22 | 3;
      $9 = $3 + ($shl22 | 4) | 0;
      HEAP32[$9 >> 2] = HEAP32[$9 >> 2] | 1;
      $mem_0 = $fd9;
      return $mem_0 | 0;
     }
     if ($cond >>> 0 <= (HEAP32[11604] | 0) >>> 0) {
      $nb_0 = $cond;
      break;
     }
     if (($shr3 | 0) != 0) {
      $shl37 = 2 << $shr;
      $and41 = $shr3 << $shr & ($shl37 | -$shl37);
      $sub44 = ($and41 & -$and41) - 1 | 0;
      $and46 = $sub44 >>> 12 & 16;
      $shr47 = $sub44 >>> ($and46 >>> 0);
      $and49 = $shr47 >>> 5 & 8;
      $shr51 = $shr47 >>> ($and49 >>> 0);
      $and53 = $shr51 >>> 2 & 4;
      $shr55 = $shr51 >>> ($and53 >>> 0);
      $and57 = $shr55 >>> 1 & 2;
      $shr59 = $shr55 >>> ($and57 >>> 0);
      $and61 = $shr59 >>> 1 & 1;
      $add64 = ($and49 | $and46 | $and53 | $and57 | $and61) + ($shr59 >>> ($and61 >>> 0)) | 0;
      $shl65 = $add64 << 1;
      $13 = 46448 + ($shl65 << 2) | 0;
      $14 = 46448 + ($shl65 + 2 << 2) | 0;
      $15 = HEAP32[$14 >> 2] | 0;
      $fd69 = $15 + 8 | 0;
      $16 = HEAP32[$fd69 >> 2] | 0;
      do {
       if (($13 | 0) == ($16 | 0)) {
        HEAP32[11602] = $0 & ~(1 << $add64);
       } else {
        if ($16 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
         _abort();
         return 0;
        }
        $bk78 = $16 + 12 | 0;
        if ((HEAP32[$bk78 >> 2] | 0) == ($15 | 0)) {
         HEAP32[$bk78 >> 2] = $13;
         HEAP32[$14 >> 2] = $16;
         break;
        } else {
         _abort();
         return 0;
        }
       }
      } while (0);
      $shl90 = $add64 << 3;
      $sub91 = $shl90 - $cond | 0;
      HEAP32[$15 + 4 >> 2] = $cond | 3;
      $20 = $15;
      $21 = $20 + $cond | 0;
      HEAP32[$20 + ($cond | 4) >> 2] = $sub91 | 1;
      HEAP32[$20 + $shl90 >> 2] = $sub91;
      $23 = HEAP32[11604] | 0;
      if (($23 | 0) != 0) {
       $24 = HEAP32[11607] | 0;
       $shr101 = $23 >>> 3;
       $shl102 = $shr101 << 1;
       $25 = 46448 + ($shl102 << 2) | 0;
       $26 = HEAP32[11602] | 0;
       $shl105 = 1 << $shr101;
       do {
        if (($26 & $shl105 | 0) == 0) {
         HEAP32[11602] = $26 | $shl105;
         $F104_0 = $25;
         $_pre_phi = 46448 + ($shl102 + 2 << 2) | 0;
        } else {
         $27 = 46448 + ($shl102 + 2 << 2) | 0;
         $28 = HEAP32[$27 >> 2] | 0;
         if ($28 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
          $F104_0 = $28;
          $_pre_phi = $27;
          break;
         }
         _abort();
         return 0;
        }
       } while (0);
       HEAP32[$_pre_phi >> 2] = $24;
       HEAP32[$F104_0 + 12 >> 2] = $24;
       HEAP32[$24 + 8 >> 2] = $F104_0;
       HEAP32[$24 + 12 >> 2] = $25;
      }
      HEAP32[11604] = $sub91;
      HEAP32[11607] = $21;
      $mem_0 = $fd69;
      return $mem_0 | 0;
     }
     $32 = HEAP32[11603] | 0;
     if (($32 | 0) == 0) {
      $nb_0 = $cond;
      break;
     }
     $sub2_i = ($32 & -$32) - 1 | 0;
     $and3_i = $sub2_i >>> 12 & 16;
     $shr4_i = $sub2_i >>> ($and3_i >>> 0);
     $and6_i = $shr4_i >>> 5 & 8;
     $shr7_i = $shr4_i >>> ($and6_i >>> 0);
     $and9_i = $shr7_i >>> 2 & 4;
     $shr11_i = $shr7_i >>> ($and9_i >>> 0);
     $and13_i = $shr11_i >>> 1 & 2;
     $shr15_i = $shr11_i >>> ($and13_i >>> 0);
     $and17_i = $shr15_i >>> 1 & 1;
     $33 = HEAP32[46712 + (($and6_i | $and3_i | $and9_i | $and13_i | $and17_i) + ($shr15_i >>> ($and17_i >>> 0)) << 2) >> 2] | 0;
     $t_0_i = $33;
     $v_0_i = $33;
     $rsize_0_i = (HEAP32[$33 + 4 >> 2] & -8) - $cond | 0;
     while (1) {
      $35 = HEAP32[$t_0_i + 16 >> 2] | 0;
      if (($35 | 0) == 0) {
       $36 = HEAP32[$t_0_i + 20 >> 2] | 0;
       if (($36 | 0) == 0) {
        break;
       } else {
        $cond7_i = $36;
       }
      } else {
       $cond7_i = $35;
      }
      $sub31_i = (HEAP32[$cond7_i + 4 >> 2] & -8) - $cond | 0;
      $cmp32_i = $sub31_i >>> 0 < $rsize_0_i >>> 0;
      $t_0_i = $cond7_i;
      $v_0_i = $cmp32_i ? $cond7_i : $v_0_i;
      $rsize_0_i = $cmp32_i ? $sub31_i : $rsize_0_i;
     }
     $38 = $v_0_i;
     $39 = HEAP32[11606] | 0;
     if ($38 >>> 0 < $39 >>> 0) {
      _abort();
      return 0;
     }
     $add_ptr_i = $38 + $cond | 0;
     $40 = $add_ptr_i;
     if ($38 >>> 0 >= $add_ptr_i >>> 0) {
      _abort();
      return 0;
     }
     $41 = HEAP32[$v_0_i + 24 >> 2] | 0;
     $42 = HEAP32[$v_0_i + 12 >> 2] | 0;
     do {
      if (($42 | 0) == ($v_0_i | 0)) {
       $arrayidx61_i = $v_0_i + 20 | 0;
       $47 = HEAP32[$arrayidx61_i >> 2] | 0;
       if (($47 | 0) == 0) {
        $arrayidx65_i = $v_0_i + 16 | 0;
        $48 = HEAP32[$arrayidx65_i >> 2] | 0;
        if (($48 | 0) == 0) {
         $R_1_i = 0;
         break;
        } else {
         $R_0_i = $48;
         $RP_0_i = $arrayidx65_i;
        }
       } else {
        $R_0_i = $47;
        $RP_0_i = $arrayidx61_i;
       }
       while (1) {
        $arrayidx71_i = $R_0_i + 20 | 0;
        $49 = HEAP32[$arrayidx71_i >> 2] | 0;
        if (($49 | 0) != 0) {
         $R_0_i = $49;
         $RP_0_i = $arrayidx71_i;
         continue;
        }
        $arrayidx75_i = $R_0_i + 16 | 0;
        $50 = HEAP32[$arrayidx75_i >> 2] | 0;
        if (($50 | 0) == 0) {
         break;
        } else {
         $R_0_i = $50;
         $RP_0_i = $arrayidx75_i;
        }
       }
       if ($RP_0_i >>> 0 < $39 >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$RP_0_i >> 2] = 0;
        $R_1_i = $R_0_i;
        break;
       }
      } else {
       $43 = HEAP32[$v_0_i + 8 >> 2] | 0;
       if ($43 >>> 0 < $39 >>> 0) {
        _abort();
        return 0;
       }
       $bk47_i = $43 + 12 | 0;
       if ((HEAP32[$bk47_i >> 2] | 0) != ($v_0_i | 0)) {
        _abort();
        return 0;
       }
       $fd50_i = $42 + 8 | 0;
       if ((HEAP32[$fd50_i >> 2] | 0) == ($v_0_i | 0)) {
        HEAP32[$bk47_i >> 2] = $42;
        HEAP32[$fd50_i >> 2] = $43;
        $R_1_i = $42;
        break;
       } else {
        _abort();
        return 0;
       }
      }
     } while (0);
     L732 : do {
      if (($41 | 0) != 0) {
       $index_i = $v_0_i + 28 | 0;
       $arrayidx94_i = 46712 + (HEAP32[$index_i >> 2] << 2) | 0;
       do {
        if (($v_0_i | 0) == (HEAP32[$arrayidx94_i >> 2] | 0)) {
         HEAP32[$arrayidx94_i >> 2] = $R_1_i;
         if (($R_1_i | 0) != 0) {
          break;
         }
         HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$index_i >> 2]);
         break L732;
        } else {
         if ($41 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
          return 0;
         }
         $arrayidx113_i = $41 + 16 | 0;
         if ((HEAP32[$arrayidx113_i >> 2] | 0) == ($v_0_i | 0)) {
          HEAP32[$arrayidx113_i >> 2] = $R_1_i;
         } else {
          HEAP32[$41 + 20 >> 2] = $R_1_i;
         }
         if (($R_1_i | 0) == 0) {
          break L732;
         }
        }
       } while (0);
       if ($R_1_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       }
       HEAP32[$R_1_i + 24 >> 2] = $41;
       $61 = HEAP32[$v_0_i + 16 >> 2] | 0;
       do {
        if (($61 | 0) != 0) {
         if ($61 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
          return 0;
         } else {
          HEAP32[$R_1_i + 16 >> 2] = $61;
          HEAP32[$61 + 24 >> 2] = $R_1_i;
          break;
         }
        }
       } while (0);
       $64 = HEAP32[$v_0_i + 20 >> 2] | 0;
       if (($64 | 0) == 0) {
        break;
       }
       if ($64 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$R_1_i + 20 >> 2] = $64;
        HEAP32[$64 + 24 >> 2] = $R_1_i;
        break;
       }
      }
     } while (0);
     if ($rsize_0_i >>> 0 < 16) {
      $add177_i = $rsize_0_i + $cond | 0;
      HEAP32[$v_0_i + 4 >> 2] = $add177_i | 3;
      $67 = $38 + ($add177_i + 4) | 0;
      HEAP32[$67 >> 2] = HEAP32[$67 >> 2] | 1;
     } else {
      HEAP32[$v_0_i + 4 >> 2] = $cond | 3;
      HEAP32[$38 + ($cond | 4) >> 2] = $rsize_0_i | 1;
      HEAP32[$38 + ($rsize_0_i + $cond) >> 2] = $rsize_0_i;
      $70 = HEAP32[11604] | 0;
      if (($70 | 0) != 0) {
       $71 = HEAP32[11607] | 0;
       $shr194_i = $70 >>> 3;
       $shl195_i = $shr194_i << 1;
       $72 = 46448 + ($shl195_i << 2) | 0;
       $73 = HEAP32[11602] | 0;
       $shl198_i = 1 << $shr194_i;
       do {
        if (($73 & $shl198_i | 0) == 0) {
         HEAP32[11602] = $73 | $shl198_i;
         $F197_0_i = $72;
         $_pre_phi_i = 46448 + ($shl195_i + 2 << 2) | 0;
        } else {
         $74 = 46448 + ($shl195_i + 2 << 2) | 0;
         $75 = HEAP32[$74 >> 2] | 0;
         if ($75 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
          $F197_0_i = $75;
          $_pre_phi_i = $74;
          break;
         }
         _abort();
         return 0;
        }
       } while (0);
       HEAP32[$_pre_phi_i >> 2] = $71;
       HEAP32[$F197_0_i + 12 >> 2] = $71;
       HEAP32[$71 + 8 >> 2] = $F197_0_i;
       HEAP32[$71 + 12 >> 2] = $72;
      }
      HEAP32[11604] = $rsize_0_i;
      HEAP32[11607] = $40;
     }
     $add_ptr225_i = $v_0_i + 8 | 0;
     if (($add_ptr225_i | 0) == 0) {
      $nb_0 = $cond;
      break;
     } else {
      $mem_0 = $add_ptr225_i;
     }
     return $mem_0 | 0;
    } else {
     if ($bytes >>> 0 > 4294967231) {
      $nb_0 = -1;
      break;
     }
     $add143 = $bytes + 11 | 0;
     $and144 = $add143 & -8;
     $79 = HEAP32[11603] | 0;
     if (($79 | 0) == 0) {
      $nb_0 = $and144;
      break;
     }
     $sub_i107 = -$and144 | 0;
     $shr_i108 = $add143 >>> 8;
     do {
      if (($shr_i108 | 0) == 0) {
       $idx_0_i = 0;
      } else {
       if ($and144 >>> 0 > 16777215) {
        $idx_0_i = 31;
        break;
       }
       $and_i112 = ($shr_i108 + 1048320 | 0) >>> 16 & 8;
       $shl_i113 = $shr_i108 << $and_i112;
       $and8_i = ($shl_i113 + 520192 | 0) >>> 16 & 4;
       $shl9_i = $shl_i113 << $and8_i;
       $and12_i = ($shl9_i + 245760 | 0) >>> 16 & 2;
       $add17_i = 14 - ($and8_i | $and_i112 | $and12_i) + ($shl9_i << $and12_i >>> 15) | 0;
       $idx_0_i = $and144 >>> (($add17_i + 7 | 0) >>> 0) & 1 | $add17_i << 1;
      }
     } while (0);
     $80 = HEAP32[46712 + ($idx_0_i << 2) >> 2] | 0;
     L780 : do {
      if (($80 | 0) == 0) {
       $v_2_i = 0;
       $rsize_2_i = $sub_i107;
       $t_1_i = 0;
      } else {
       if (($idx_0_i | 0) == 31) {
        $cond_i = 0;
       } else {
        $cond_i = 25 - ($idx_0_i >>> 1) | 0;
       }
       $v_0_i123 = 0;
       $rsize_0_i122 = $sub_i107;
       $t_0_i121 = $80;
       $sizebits_0_i = $and144 << $cond_i;
       $rst_0_i = 0;
       while (1) {
        $and32_i = HEAP32[$t_0_i121 + 4 >> 2] & -8;
        $sub33_i = $and32_i - $and144 | 0;
        if ($sub33_i >>> 0 < $rsize_0_i122 >>> 0) {
         if (($and32_i | 0) == ($and144 | 0)) {
          $v_2_i = $t_0_i121;
          $rsize_2_i = $sub33_i;
          $t_1_i = $t_0_i121;
          break L780;
         } else {
          $v_1_i = $t_0_i121;
          $rsize_1_i = $sub33_i;
         }
        } else {
         $v_1_i = $v_0_i123;
         $rsize_1_i = $rsize_0_i122;
        }
        $82 = HEAP32[$t_0_i121 + 20 >> 2] | 0;
        $83 = HEAP32[$t_0_i121 + 16 + ($sizebits_0_i >>> 31 << 2) >> 2] | 0;
        $rst_1_i = ($82 | 0) == 0 | ($82 | 0) == ($83 | 0) ? $rst_0_i : $82;
        if (($83 | 0) == 0) {
         $v_2_i = $v_1_i;
         $rsize_2_i = $rsize_1_i;
         $t_1_i = $rst_1_i;
         break;
        } else {
         $v_0_i123 = $v_1_i;
         $rsize_0_i122 = $rsize_1_i;
         $t_0_i121 = $83;
         $sizebits_0_i = $sizebits_0_i << 1;
         $rst_0_i = $rst_1_i;
        }
       }
      }
     } while (0);
     if (($t_1_i | 0) == 0 & ($v_2_i | 0) == 0) {
      $shl59_i = 2 << $idx_0_i;
      $and63_i = $79 & ($shl59_i | -$shl59_i);
      if (($and63_i | 0) == 0) {
       $nb_0 = $and144;
       break;
      }
      $sub69_i = ($and63_i & -$and63_i) - 1 | 0;
      $and72_i = $sub69_i >>> 12 & 16;
      $shr74_i = $sub69_i >>> ($and72_i >>> 0);
      $and76_i = $shr74_i >>> 5 & 8;
      $shr78_i = $shr74_i >>> ($and76_i >>> 0);
      $and80_i = $shr78_i >>> 2 & 4;
      $shr82_i = $shr78_i >>> ($and80_i >>> 0);
      $and84_i = $shr82_i >>> 1 & 2;
      $shr86_i = $shr82_i >>> ($and84_i >>> 0);
      $and88_i = $shr86_i >>> 1 & 1;
      $t_2_ph_i = HEAP32[46712 + (($and76_i | $and72_i | $and80_i | $and84_i | $and88_i) + ($shr86_i >>> ($and88_i >>> 0)) << 2) >> 2] | 0;
     } else {
      $t_2_ph_i = $t_1_i;
     }
     if (($t_2_ph_i | 0) == 0) {
      $rsize_3_lcssa_i = $rsize_2_i;
      $v_3_lcssa_i = $v_2_i;
     } else {
      $t_224_i = $t_2_ph_i;
      $rsize_325_i = $rsize_2_i;
      $v_326_i = $v_2_i;
      while (1) {
       $sub100_i = (HEAP32[$t_224_i + 4 >> 2] & -8) - $and144 | 0;
       $cmp101_i = $sub100_i >>> 0 < $rsize_325_i >>> 0;
       $sub100_rsize_3_i = $cmp101_i ? $sub100_i : $rsize_325_i;
       $t_2_v_3_i = $cmp101_i ? $t_224_i : $v_326_i;
       $86 = HEAP32[$t_224_i + 16 >> 2] | 0;
       if (($86 | 0) != 0) {
        $t_224_i = $86;
        $rsize_325_i = $sub100_rsize_3_i;
        $v_326_i = $t_2_v_3_i;
        continue;
       }
       $87 = HEAP32[$t_224_i + 20 >> 2] | 0;
       if (($87 | 0) == 0) {
        $rsize_3_lcssa_i = $sub100_rsize_3_i;
        $v_3_lcssa_i = $t_2_v_3_i;
        break;
       } else {
        $t_224_i = $87;
        $rsize_325_i = $sub100_rsize_3_i;
        $v_326_i = $t_2_v_3_i;
       }
      }
     }
     if (($v_3_lcssa_i | 0) == 0) {
      $nb_0 = $and144;
      break;
     }
     if ($rsize_3_lcssa_i >>> 0 >= ((HEAP32[11604] | 0) - $and144 | 0) >>> 0) {
      $nb_0 = $and144;
      break;
     }
     $89 = $v_3_lcssa_i;
     $90 = HEAP32[11606] | 0;
     if ($89 >>> 0 < $90 >>> 0) {
      _abort();
      return 0;
     }
     $add_ptr_i128 = $89 + $and144 | 0;
     $91 = $add_ptr_i128;
     if ($89 >>> 0 >= $add_ptr_i128 >>> 0) {
      _abort();
      return 0;
     }
     $92 = HEAP32[$v_3_lcssa_i + 24 >> 2] | 0;
     $93 = HEAP32[$v_3_lcssa_i + 12 >> 2] | 0;
     do {
      if (($93 | 0) == ($v_3_lcssa_i | 0)) {
       $arrayidx150_i = $v_3_lcssa_i + 20 | 0;
       $98 = HEAP32[$arrayidx150_i >> 2] | 0;
       if (($98 | 0) == 0) {
        $arrayidx154_i133 = $v_3_lcssa_i + 16 | 0;
        $99 = HEAP32[$arrayidx154_i133 >> 2] | 0;
        if (($99 | 0) == 0) {
         $R_1_i139 = 0;
         break;
        } else {
         $R_0_i137 = $99;
         $RP_0_i136 = $arrayidx154_i133;
        }
       } else {
        $R_0_i137 = $98;
        $RP_0_i136 = $arrayidx150_i;
       }
       while (1) {
        $arrayidx160_i = $R_0_i137 + 20 | 0;
        $100 = HEAP32[$arrayidx160_i >> 2] | 0;
        if (($100 | 0) != 0) {
         $R_0_i137 = $100;
         $RP_0_i136 = $arrayidx160_i;
         continue;
        }
        $arrayidx164_i = $R_0_i137 + 16 | 0;
        $101 = HEAP32[$arrayidx164_i >> 2] | 0;
        if (($101 | 0) == 0) {
         break;
        } else {
         $R_0_i137 = $101;
         $RP_0_i136 = $arrayidx164_i;
        }
       }
       if ($RP_0_i136 >>> 0 < $90 >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$RP_0_i136 >> 2] = 0;
        $R_1_i139 = $R_0_i137;
        break;
       }
      } else {
       $94 = HEAP32[$v_3_lcssa_i + 8 >> 2] | 0;
       if ($94 >>> 0 < $90 >>> 0) {
        _abort();
        return 0;
       }
       $bk135_i = $94 + 12 | 0;
       if ((HEAP32[$bk135_i >> 2] | 0) != ($v_3_lcssa_i | 0)) {
        _abort();
        return 0;
       }
       $fd138_i = $93 + 8 | 0;
       if ((HEAP32[$fd138_i >> 2] | 0) == ($v_3_lcssa_i | 0)) {
        HEAP32[$bk135_i >> 2] = $93;
        HEAP32[$fd138_i >> 2] = $94;
        $R_1_i139 = $93;
        break;
       } else {
        _abort();
        return 0;
       }
      }
     } while (0);
     L830 : do {
      if (($92 | 0) != 0) {
       $index_i140 = $v_3_lcssa_i + 28 | 0;
       $arrayidx183_i = 46712 + (HEAP32[$index_i140 >> 2] << 2) | 0;
       do {
        if (($v_3_lcssa_i | 0) == (HEAP32[$arrayidx183_i >> 2] | 0)) {
         HEAP32[$arrayidx183_i >> 2] = $R_1_i139;
         if (($R_1_i139 | 0) != 0) {
          break;
         }
         HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$index_i140 >> 2]);
         break L830;
        } else {
         if ($92 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
          return 0;
         }
         $arrayidx203_i = $92 + 16 | 0;
         if ((HEAP32[$arrayidx203_i >> 2] | 0) == ($v_3_lcssa_i | 0)) {
          HEAP32[$arrayidx203_i >> 2] = $R_1_i139;
         } else {
          HEAP32[$92 + 20 >> 2] = $R_1_i139;
         }
         if (($R_1_i139 | 0) == 0) {
          break L830;
         }
        }
       } while (0);
       if ($R_1_i139 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       }
       HEAP32[$R_1_i139 + 24 >> 2] = $92;
       $112 = HEAP32[$v_3_lcssa_i + 16 >> 2] | 0;
       do {
        if (($112 | 0) != 0) {
         if ($112 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
          return 0;
         } else {
          HEAP32[$R_1_i139 + 16 >> 2] = $112;
          HEAP32[$112 + 24 >> 2] = $R_1_i139;
          break;
         }
        }
       } while (0);
       $115 = HEAP32[$v_3_lcssa_i + 20 >> 2] | 0;
       if (($115 | 0) == 0) {
        break;
       }
       if ($115 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$R_1_i139 + 20 >> 2] = $115;
        HEAP32[$115 + 24 >> 2] = $R_1_i139;
        break;
       }
      }
     } while (0);
     do {
      if ($rsize_3_lcssa_i >>> 0 < 16) {
       $add267_i = $rsize_3_lcssa_i + $and144 | 0;
       HEAP32[$v_3_lcssa_i + 4 >> 2] = $add267_i | 3;
       $118 = $89 + ($add267_i + 4) | 0;
       HEAP32[$118 >> 2] = HEAP32[$118 >> 2] | 1;
      } else {
       HEAP32[$v_3_lcssa_i + 4 >> 2] = $and144 | 3;
       HEAP32[$89 + ($and144 | 4) >> 2] = $rsize_3_lcssa_i | 1;
       HEAP32[$89 + ($rsize_3_lcssa_i + $and144) >> 2] = $rsize_3_lcssa_i;
       $shr282_i = $rsize_3_lcssa_i >>> 3;
       if ($rsize_3_lcssa_i >>> 0 < 256) {
        $shl287_i = $shr282_i << 1;
        $121 = 46448 + ($shl287_i << 2) | 0;
        $122 = HEAP32[11602] | 0;
        $shl290_i = 1 << $shr282_i;
        do {
         if (($122 & $shl290_i | 0) == 0) {
          HEAP32[11602] = $122 | $shl290_i;
          $F289_0_i = $121;
          $_pre_phi_i147 = 46448 + ($shl287_i + 2 << 2) | 0;
         } else {
          $123 = 46448 + ($shl287_i + 2 << 2) | 0;
          $124 = HEAP32[$123 >> 2] | 0;
          if ($124 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
           $F289_0_i = $124;
           $_pre_phi_i147 = $123;
           break;
          }
          _abort();
          return 0;
         }
        } while (0);
        HEAP32[$_pre_phi_i147 >> 2] = $91;
        HEAP32[$F289_0_i + 12 >> 2] = $91;
        HEAP32[$89 + ($and144 + 8) >> 2] = $F289_0_i;
        HEAP32[$89 + ($and144 + 12) >> 2] = $121;
        break;
       }
       $129 = $add_ptr_i128;
       $shr317_i = $rsize_3_lcssa_i >>> 8;
       do {
        if (($shr317_i | 0) == 0) {
         $I315_0_i = 0;
        } else {
         if ($rsize_3_lcssa_i >>> 0 > 16777215) {
          $I315_0_i = 31;
          break;
         }
         $and330_i = ($shr317_i + 1048320 | 0) >>> 16 & 8;
         $shl332_i = $shr317_i << $and330_i;
         $and335_i = ($shl332_i + 520192 | 0) >>> 16 & 4;
         $shl337_i = $shl332_i << $and335_i;
         $and340_i = ($shl337_i + 245760 | 0) >>> 16 & 2;
         $add345_i = 14 - ($and335_i | $and330_i | $and340_i) + ($shl337_i << $and340_i >>> 15) | 0;
         $I315_0_i = $rsize_3_lcssa_i >>> (($add345_i + 7 | 0) >>> 0) & 1 | $add345_i << 1;
        }
       } while (0);
       $arrayidx354_i = 46712 + ($I315_0_i << 2) | 0;
       HEAP32[$89 + ($and144 + 28) >> 2] = $I315_0_i;
       HEAP32[$89 + ($and144 + 20) >> 2] = 0;
       HEAP32[$89 + ($and144 + 16) >> 2] = 0;
       $132 = HEAP32[11603] | 0;
       $shl361_i = 1 << $I315_0_i;
       if (($132 & $shl361_i | 0) == 0) {
        HEAP32[11603] = $132 | $shl361_i;
        HEAP32[$arrayidx354_i >> 2] = $129;
        HEAP32[$89 + ($and144 + 24) >> 2] = $arrayidx354_i;
        HEAP32[$89 + ($and144 + 12) >> 2] = $129;
        HEAP32[$89 + ($and144 + 8) >> 2] = $129;
        break;
       }
       if (($I315_0_i | 0) == 31) {
        $cond382_i = 0;
       } else {
        $cond382_i = 25 - ($I315_0_i >>> 1) | 0;
       }
       $K372_0_i = $rsize_3_lcssa_i << $cond382_i;
       $T_0_i = HEAP32[$arrayidx354_i >> 2] | 0;
       while (1) {
        if ((HEAP32[$T_0_i + 4 >> 2] & -8 | 0) == ($rsize_3_lcssa_i | 0)) {
         break;
        }
        $arrayidx393_i = $T_0_i + 16 + ($K372_0_i >>> 31 << 2) | 0;
        $139 = HEAP32[$arrayidx393_i >> 2] | 0;
        if (($139 | 0) == 0) {
         label = 648;
         break;
        } else {
         $K372_0_i = $K372_0_i << 1;
         $T_0_i = $139;
        }
       }
       if ((label | 0) == 648) {
        if ($arrayidx393_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
         _abort();
         return 0;
        } else {
         HEAP32[$arrayidx393_i >> 2] = $129;
         HEAP32[$89 + ($and144 + 24) >> 2] = $T_0_i;
         HEAP32[$89 + ($and144 + 12) >> 2] = $129;
         HEAP32[$89 + ($and144 + 8) >> 2] = $129;
         break;
        }
       }
       $fd412_i = $T_0_i + 8 | 0;
       $145 = HEAP32[$fd412_i >> 2] | 0;
       $147 = HEAP32[11606] | 0;
       if ($T_0_i >>> 0 < $147 >>> 0) {
        _abort();
        return 0;
       }
       if ($145 >>> 0 < $147 >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$145 + 12 >> 2] = $129;
        HEAP32[$fd412_i >> 2] = $129;
        HEAP32[$89 + ($and144 + 8) >> 2] = $145;
        HEAP32[$89 + ($and144 + 12) >> 2] = $T_0_i;
        HEAP32[$89 + ($and144 + 24) >> 2] = 0;
        break;
       }
      }
     } while (0);
     $add_ptr436_i = $v_3_lcssa_i + 8 | 0;
     if (($add_ptr436_i | 0) == 0) {
      $nb_0 = $and144;
      break;
     } else {
      $mem_0 = $add_ptr436_i;
     }
     return $mem_0 | 0;
    }
   } while (0);
   $153 = HEAP32[11604] | 0;
   if ($nb_0 >>> 0 <= $153 >>> 0) {
    $sub159 = $153 - $nb_0 | 0;
    $154 = HEAP32[11607] | 0;
    if ($sub159 >>> 0 > 15) {
     $155 = $154;
     HEAP32[11607] = $155 + $nb_0;
     HEAP32[11604] = $sub159;
     HEAP32[$155 + ($nb_0 + 4) >> 2] = $sub159 | 1;
     HEAP32[$155 + $153 >> 2] = $sub159;
     HEAP32[$154 + 4 >> 2] = $nb_0 | 3;
    } else {
     HEAP32[11604] = 0;
     HEAP32[11607] = 0;
     HEAP32[$154 + 4 >> 2] = $153 | 3;
     $159 = $154 + ($153 + 4) | 0;
     HEAP32[$159 >> 2] = HEAP32[$159 >> 2] | 1;
    }
    $mem_0 = $154 + 8 | 0;
    return $mem_0 | 0;
   }
   $162 = HEAP32[11605] | 0;
   if ($nb_0 >>> 0 < $162 >>> 0) {
    $sub187 = $162 - $nb_0 | 0;
    HEAP32[11605] = $sub187;
    $163 = HEAP32[11608] | 0;
    $164 = $163;
    HEAP32[11608] = $164 + $nb_0;
    HEAP32[$164 + ($nb_0 + 4) >> 2] = $sub187 | 1;
    HEAP32[$163 + 4 >> 2] = $nb_0 | 3;
    $mem_0 = $163 + 8 | 0;
    return $mem_0 | 0;
   }
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i_i = _sysconf(8) | 0;
     if (($call_i_i - 1 & $call_i_i | 0) == 0) {
      HEAP32[10826] = $call_i_i;
      HEAP32[10825] = $call_i_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
      return 0;
     }
    }
   } while (0);
   $add_i149 = $nb_0 + 48 | 0;
   $169 = HEAP32[10826] | 0;
   $sub_i150 = $nb_0 + 47 | 0;
   $add9_i = $169 + $sub_i150 | 0;
   $neg_i151 = -$169 | 0;
   $and11_i = $add9_i & $neg_i151;
   if ($and11_i >>> 0 <= $nb_0 >>> 0) {
    $mem_0 = 0;
    return $mem_0 | 0;
   }
   $170 = HEAP32[11712] | 0;
   do {
    if (($170 | 0) != 0) {
     $171 = HEAP32[11710] | 0;
     $add17_i152 = $171 + $and11_i | 0;
     if ($add17_i152 >>> 0 <= $171 >>> 0 | $add17_i152 >>> 0 > $170 >>> 0) {
      $mem_0 = 0;
     } else {
      break;
     }
     return $mem_0 | 0;
    }
   } while (0);
   L922 : do {
    if ((HEAP32[11713] & 4 | 0) == 0) {
     $173 = HEAP32[11608] | 0;
     L924 : do {
      if (($173 | 0) == 0) {
       label = 678;
      } else {
       $174 = $173;
       $sp_0_i_i = 46856;
       while (1) {
        $base_i_i = $sp_0_i_i | 0;
        $175 = HEAP32[$base_i_i >> 2] | 0;
        if ($175 >>> 0 <= $174 >>> 0) {
         $size_i_i = $sp_0_i_i + 4 | 0;
         if (($175 + (HEAP32[$size_i_i >> 2] | 0) | 0) >>> 0 > $174 >>> 0) {
          break;
         }
        }
        $177 = HEAP32[$sp_0_i_i + 8 >> 2] | 0;
        if (($177 | 0) == 0) {
         label = 678;
         break L924;
        } else {
         $sp_0_i_i = $177;
        }
       }
       if (($sp_0_i_i | 0) == 0) {
        label = 678;
        break;
       }
       $and77_i = $add9_i - (HEAP32[11605] | 0) & $neg_i151;
       if ($and77_i >>> 0 >= 2147483647) {
        $tsize_0758385_i = 0;
        break;
       }
       $call80_i = _sbrk($and77_i | 0) | 0;
       $cmp82_i = ($call80_i | 0) == ((HEAP32[$base_i_i >> 2] | 0) + (HEAP32[$size_i_i >> 2] | 0) | 0);
       $tbase_0_i = $cmp82_i ? $call80_i : -1;
       $tsize_0_i = $cmp82_i ? $and77_i : 0;
       $br_0_i = $call80_i;
       $ssize_1_i = $and77_i;
       label = 687;
      }
     } while (0);
     do {
      if ((label | 0) == 678) {
       $call34_i = _sbrk(0) | 0;
       if (($call34_i | 0) == -1) {
        $tsize_0758385_i = 0;
        break;
       }
       $178 = $call34_i;
       $179 = HEAP32[10825] | 0;
       $sub38_i = $179 - 1 | 0;
       if (($sub38_i & $178 | 0) == 0) {
        $ssize_0_i = $and11_i;
       } else {
        $ssize_0_i = $and11_i - $178 + ($sub38_i + $178 & -$179) | 0;
       }
       $180 = HEAP32[11710] | 0;
       $add51_i = $180 + $ssize_0_i | 0;
       if (!($ssize_0_i >>> 0 > $nb_0 >>> 0 & $ssize_0_i >>> 0 < 2147483647)) {
        $tsize_0758385_i = 0;
        break;
       }
       $181 = HEAP32[11712] | 0;
       if (($181 | 0) != 0) {
        if ($add51_i >>> 0 <= $180 >>> 0 | $add51_i >>> 0 > $181 >>> 0) {
         $tsize_0758385_i = 0;
         break;
        }
       }
       $call65_i = _sbrk($ssize_0_i | 0) | 0;
       $cmp66_i160 = ($call65_i | 0) == ($call34_i | 0);
       $tbase_0_i = $cmp66_i160 ? $call34_i : -1;
       $tsize_0_i = $cmp66_i160 ? $ssize_0_i : 0;
       $br_0_i = $call65_i;
       $ssize_1_i = $ssize_0_i;
       label = 687;
      }
     } while (0);
     L944 : do {
      if ((label | 0) == 687) {
       $sub109_i = -$ssize_1_i | 0;
       if (($tbase_0_i | 0) != -1) {
        $tsize_291_i = $tsize_0_i;
        $tbase_292_i = $tbase_0_i;
        label = 698;
        break L922;
       }
       do {
        if (($br_0_i | 0) != -1 & $ssize_1_i >>> 0 < 2147483647 & $ssize_1_i >>> 0 < $add_i149 >>> 0) {
         $185 = HEAP32[10826] | 0;
         $and101_i = $sub_i150 - $ssize_1_i + $185 & -$185;
         if ($and101_i >>> 0 >= 2147483647) {
          $ssize_2_i = $ssize_1_i;
          break;
         }
         if ((_sbrk($and101_i | 0) | 0) == -1) {
          _sbrk($sub109_i | 0) | 0;
          $tsize_0758385_i = $tsize_0_i;
          break L944;
         } else {
          $ssize_2_i = $and101_i + $ssize_1_i | 0;
          break;
         }
        } else {
         $ssize_2_i = $ssize_1_i;
        }
       } while (0);
       if (($br_0_i | 0) == -1) {
        $tsize_0758385_i = $tsize_0_i;
       } else {
        $tsize_291_i = $ssize_2_i;
        $tbase_292_i = $br_0_i;
        label = 698;
        break L922;
       }
      }
     } while (0);
     HEAP32[11713] = HEAP32[11713] | 4;
     $tsize_1_i = $tsize_0758385_i;
     label = 695;
    } else {
     $tsize_1_i = 0;
     label = 695;
    }
   } while (0);
   do {
    if ((label | 0) == 695) {
     if ($and11_i >>> 0 >= 2147483647) {
      break;
     }
     $call128_i = _sbrk($and11_i | 0) | 0;
     $call129_i = _sbrk(0) | 0;
     if (!(($call129_i | 0) != -1 & ($call128_i | 0) != -1 & $call128_i >>> 0 < $call129_i >>> 0)) {
      break;
     }
     $sub_ptr_sub_i = $call129_i - $call128_i | 0;
     $cmp138_i166 = $sub_ptr_sub_i >>> 0 > ($nb_0 + 40 | 0) >>> 0;
     $call128_tbase_1_i = $cmp138_i166 ? $call128_i : -1;
     if (($call128_tbase_1_i | 0) != -1) {
      $tsize_291_i = $cmp138_i166 ? $sub_ptr_sub_i : $tsize_1_i;
      $tbase_292_i = $call128_tbase_1_i;
      label = 698;
     }
    }
   } while (0);
   do {
    if ((label | 0) == 698) {
     $add147_i = (HEAP32[11710] | 0) + $tsize_291_i | 0;
     HEAP32[11710] = $add147_i;
     if ($add147_i >>> 0 > (HEAP32[11711] | 0) >>> 0) {
      HEAP32[11711] = $add147_i;
     }
     $189 = HEAP32[11608] | 0;
     L964 : do {
      if (($189 | 0) == 0) {
       $190 = HEAP32[11606] | 0;
       if (($190 | 0) == 0 | $tbase_292_i >>> 0 < $190 >>> 0) {
        HEAP32[11606] = $tbase_292_i;
       }
       HEAP32[11714] = $tbase_292_i;
       HEAP32[11715] = $tsize_291_i;
       HEAP32[11717] = 0;
       HEAP32[11611] = HEAP32[10824];
       HEAP32[11610] = -1;
       $i_02_i_i = 0;
       do {
        $shl_i_i = $i_02_i_i << 1;
        $192 = 46448 + ($shl_i_i << 2) | 0;
        HEAP32[46448 + ($shl_i_i + 3 << 2) >> 2] = $192;
        HEAP32[46448 + ($shl_i_i + 2 << 2) >> 2] = $192;
        $i_02_i_i = $i_02_i_i + 1 | 0;
       } while ($i_02_i_i >>> 0 < 32);
       $195 = $tbase_292_i + 8 | 0;
       if (($195 & 7 | 0) == 0) {
        $cond_i_i = 0;
       } else {
        $cond_i_i = -$195 & 7;
       }
       $sub5_i_i = $tsize_291_i - 40 - $cond_i_i | 0;
       HEAP32[11608] = $tbase_292_i + $cond_i_i;
       HEAP32[11605] = $sub5_i_i;
       HEAP32[$tbase_292_i + ($cond_i_i + 4) >> 2] = $sub5_i_i | 1;
       HEAP32[$tbase_292_i + ($tsize_291_i - 36) >> 2] = 40;
       HEAP32[11609] = HEAP32[10828];
      } else {
       $sp_0105_i = 46856;
       while (1) {
        $201 = HEAP32[$sp_0105_i >> 2] | 0;
        $size185_i = $sp_0105_i + 4 | 0;
        $202 = HEAP32[$size185_i >> 2] | 0;
        if (($tbase_292_i | 0) == ($201 + $202 | 0)) {
         label = 710;
         break;
        }
        $203 = HEAP32[$sp_0105_i + 8 >> 2] | 0;
        if (($203 | 0) == 0) {
         break;
        } else {
         $sp_0105_i = $203;
        }
       }
       do {
        if ((label | 0) == 710) {
         if ((HEAP32[$sp_0105_i + 12 >> 2] & 8 | 0) != 0) {
          break;
         }
         $205 = $189;
         if (!($205 >>> 0 >= $201 >>> 0 & $205 >>> 0 < $tbase_292_i >>> 0)) {
          break;
         }
         HEAP32[$size185_i >> 2] = $202 + $tsize_291_i;
         $206 = HEAP32[11608] | 0;
         $add212_i = (HEAP32[11605] | 0) + $tsize_291_i | 0;
         $208 = $206;
         $209 = $206 + 8 | 0;
         if (($209 & 7 | 0) == 0) {
          $cond_i28_i = 0;
         } else {
          $cond_i28_i = -$209 & 7;
         }
         $sub5_i30_i = $add212_i - $cond_i28_i | 0;
         HEAP32[11608] = $208 + $cond_i28_i;
         HEAP32[11605] = $sub5_i30_i;
         HEAP32[$208 + ($cond_i28_i + 4) >> 2] = $sub5_i30_i | 1;
         HEAP32[$208 + ($add212_i + 4) >> 2] = 40;
         HEAP32[11609] = HEAP32[10828];
         break L964;
        }
       } while (0);
       if ($tbase_292_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        HEAP32[11606] = $tbase_292_i;
       }
       $add_ptr224_i = $tbase_292_i + $tsize_291_i | 0;
       $sp_1101_i = 46856;
       while (1) {
        $base223_i = $sp_1101_i | 0;
        if ((HEAP32[$base223_i >> 2] | 0) == ($add_ptr224_i | 0)) {
         label = 720;
         break;
        }
        $217 = HEAP32[$sp_1101_i + 8 >> 2] | 0;
        if (($217 | 0) == 0) {
         break;
        } else {
         $sp_1101_i = $217;
        }
       }
       do {
        if ((label | 0) == 720) {
         if ((HEAP32[$sp_1101_i + 12 >> 2] & 8 | 0) != 0) {
          break;
         }
         HEAP32[$base223_i >> 2] = $tbase_292_i;
         $size242_i = $sp_1101_i + 4 | 0;
         HEAP32[$size242_i >> 2] = (HEAP32[$size242_i >> 2] | 0) + $tsize_291_i;
         $220 = $tbase_292_i + 8 | 0;
         if (($220 & 7 | 0) == 0) {
          $cond_i43_i = 0;
         } else {
          $cond_i43_i = -$220 & 7;
         }
         $222 = $tbase_292_i + ($tsize_291_i + 8) | 0;
         if (($222 & 7 | 0) == 0) {
          $cond15_i_i = 0;
         } else {
          $cond15_i_i = -$222 & 7;
         }
         $add_ptr16_i_i = $tbase_292_i + ($cond15_i_i + $tsize_291_i) | 0;
         $224 = $add_ptr16_i_i;
         $add_ptr4_sum_i50_i = $cond_i43_i + $nb_0 | 0;
         $add_ptr17_i_i = $tbase_292_i + $add_ptr4_sum_i50_i | 0;
         $225 = $add_ptr17_i_i;
         $sub18_i_i = $add_ptr16_i_i - ($tbase_292_i + $cond_i43_i) - $nb_0 | 0;
         HEAP32[$tbase_292_i + ($cond_i43_i + 4) >> 2] = $nb_0 | 3;
         do {
          if (($224 | 0) == (HEAP32[11608] | 0)) {
           $add_i_i = (HEAP32[11605] | 0) + $sub18_i_i | 0;
           HEAP32[11605] = $add_i_i;
           HEAP32[11608] = $225;
           HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 4) >> 2] = $add_i_i | 1;
          } else {
           if (($224 | 0) == (HEAP32[11607] | 0)) {
            $add26_i_i = (HEAP32[11604] | 0) + $sub18_i_i | 0;
            HEAP32[11604] = $add26_i_i;
            HEAP32[11607] = $225;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 4) >> 2] = $add26_i_i | 1;
            HEAP32[$tbase_292_i + ($add26_i_i + $add_ptr4_sum_i50_i) >> 2] = $add26_i_i;
            break;
           }
           $add_ptr16_sum_i_i = $tsize_291_i + 4 | 0;
           $234 = HEAP32[$tbase_292_i + ($add_ptr16_sum_i_i + $cond15_i_i) >> 2] | 0;
           if (($234 & 3 | 0) == 1) {
            $and37_i_i = $234 & -8;
            $shr_i55_i = $234 >>> 3;
            L1009 : do {
             if ($234 >>> 0 < 256) {
              $236 = HEAP32[$tbase_292_i + (($cond15_i_i | 8) + $tsize_291_i) >> 2] | 0;
              $238 = HEAP32[$tbase_292_i + ($tsize_291_i + 12 + $cond15_i_i) >> 2] | 0;
              $239 = 46448 + ($shr_i55_i << 1 << 2) | 0;
              do {
               if (($236 | 0) != ($239 | 0)) {
                if ($236 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                }
                if ((HEAP32[$236 + 12 >> 2] | 0) == ($224 | 0)) {
                 break;
                }
                _abort();
                return 0;
               }
              } while (0);
              if (($238 | 0) == ($236 | 0)) {
               HEAP32[11602] = HEAP32[11602] & ~(1 << $shr_i55_i);
               break;
              }
              do {
               if (($238 | 0) == ($239 | 0)) {
                $fd68_pre_phi_i_i = $238 + 8 | 0;
               } else {
                if ($238 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                }
                $fd59_i_i = $238 + 8 | 0;
                if ((HEAP32[$fd59_i_i >> 2] | 0) == ($224 | 0)) {
                 $fd68_pre_phi_i_i = $fd59_i_i;
                 break;
                }
                _abort();
                return 0;
               }
              } while (0);
              HEAP32[$236 + 12 >> 2] = $238;
              HEAP32[$fd68_pre_phi_i_i >> 2] = $236;
             } else {
              $247 = $add_ptr16_i_i;
              $249 = HEAP32[$tbase_292_i + (($cond15_i_i | 24) + $tsize_291_i) >> 2] | 0;
              $251 = HEAP32[$tbase_292_i + ($tsize_291_i + 12 + $cond15_i_i) >> 2] | 0;
              do {
               if (($251 | 0) == ($247 | 0)) {
                $add_ptr16_sum56_i_i = $cond15_i_i | 16;
                $258 = $tbase_292_i + ($add_ptr16_sum_i_i + $add_ptr16_sum56_i_i) | 0;
                $259 = HEAP32[$258 >> 2] | 0;
                if (($259 | 0) == 0) {
                 $arrayidx99_i_i = $tbase_292_i + ($add_ptr16_sum56_i_i + $tsize_291_i) | 0;
                 $260 = HEAP32[$arrayidx99_i_i >> 2] | 0;
                 if (($260 | 0) == 0) {
                  $R_1_i_i = 0;
                  break;
                 } else {
                  $R_0_i_i = $260;
                  $RP_0_i_i = $arrayidx99_i_i;
                 }
                } else {
                 $R_0_i_i = $259;
                 $RP_0_i_i = $258;
                }
                while (1) {
                 $arrayidx103_i_i = $R_0_i_i + 20 | 0;
                 $261 = HEAP32[$arrayidx103_i_i >> 2] | 0;
                 if (($261 | 0) != 0) {
                  $R_0_i_i = $261;
                  $RP_0_i_i = $arrayidx103_i_i;
                  continue;
                 }
                 $arrayidx107_i_i = $R_0_i_i + 16 | 0;
                 $262 = HEAP32[$arrayidx107_i_i >> 2] | 0;
                 if (($262 | 0) == 0) {
                  break;
                 } else {
                  $R_0_i_i = $262;
                  $RP_0_i_i = $arrayidx107_i_i;
                 }
                }
                if ($RP_0_i_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                } else {
                 HEAP32[$RP_0_i_i >> 2] = 0;
                 $R_1_i_i = $R_0_i_i;
                 break;
                }
               } else {
                $253 = HEAP32[$tbase_292_i + (($cond15_i_i | 8) + $tsize_291_i) >> 2] | 0;
                if ($253 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                }
                $bk82_i_i = $253 + 12 | 0;
                if ((HEAP32[$bk82_i_i >> 2] | 0) != ($247 | 0)) {
                 _abort();
                 return 0;
                }
                $fd85_i_i = $251 + 8 | 0;
                if ((HEAP32[$fd85_i_i >> 2] | 0) == ($247 | 0)) {
                 HEAP32[$bk82_i_i >> 2] = $251;
                 HEAP32[$fd85_i_i >> 2] = $253;
                 $R_1_i_i = $251;
                 break;
                } else {
                 _abort();
                 return 0;
                }
               }
              } while (0);
              if (($249 | 0) == 0) {
               break;
              }
              $265 = $tbase_292_i + ($tsize_291_i + 28 + $cond15_i_i) | 0;
              $arrayidx123_i_i = 46712 + (HEAP32[$265 >> 2] << 2) | 0;
              do {
               if (($247 | 0) == (HEAP32[$arrayidx123_i_i >> 2] | 0)) {
                HEAP32[$arrayidx123_i_i >> 2] = $R_1_i_i;
                if (($R_1_i_i | 0) != 0) {
                 break;
                }
                HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$265 >> 2]);
                break L1009;
               } else {
                if ($249 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                }
                $arrayidx143_i_i = $249 + 16 | 0;
                if ((HEAP32[$arrayidx143_i_i >> 2] | 0) == ($247 | 0)) {
                 HEAP32[$arrayidx143_i_i >> 2] = $R_1_i_i;
                } else {
                 HEAP32[$249 + 20 >> 2] = $R_1_i_i;
                }
                if (($R_1_i_i | 0) == 0) {
                 break L1009;
                }
               }
              } while (0);
              if ($R_1_i_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
               _abort();
               return 0;
              }
              HEAP32[$R_1_i_i + 24 >> 2] = $249;
              $add_ptr16_sum2728_i_i = $cond15_i_i | 16;
              $275 = HEAP32[$tbase_292_i + ($add_ptr16_sum2728_i_i + $tsize_291_i) >> 2] | 0;
              do {
               if (($275 | 0) != 0) {
                if ($275 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
                 _abort();
                 return 0;
                } else {
                 HEAP32[$R_1_i_i + 16 >> 2] = $275;
                 HEAP32[$275 + 24 >> 2] = $R_1_i_i;
                 break;
                }
               }
              } while (0);
              $279 = HEAP32[$tbase_292_i + ($add_ptr16_sum_i_i + $add_ptr16_sum2728_i_i) >> 2] | 0;
              if (($279 | 0) == 0) {
               break;
              }
              if ($279 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
               _abort();
               return 0;
              } else {
               HEAP32[$R_1_i_i + 20 >> 2] = $279;
               HEAP32[$279 + 24 >> 2] = $R_1_i_i;
               break;
              }
             }
            } while (0);
            $oldfirst_0_i_i = $tbase_292_i + (($and37_i_i | $cond15_i_i) + $tsize_291_i) | 0;
            $qsize_0_i_i = $and37_i_i + $sub18_i_i | 0;
           } else {
            $oldfirst_0_i_i = $224;
            $qsize_0_i_i = $sub18_i_i;
           }
           $head208_i_i = $oldfirst_0_i_i + 4 | 0;
           HEAP32[$head208_i_i >> 2] = HEAP32[$head208_i_i >> 2] & -2;
           HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 4) >> 2] = $qsize_0_i_i | 1;
           HEAP32[$tbase_292_i + ($qsize_0_i_i + $add_ptr4_sum_i50_i) >> 2] = $qsize_0_i_i;
           $shr214_i_i = $qsize_0_i_i >>> 3;
           if ($qsize_0_i_i >>> 0 < 256) {
            $shl221_i_i = $shr214_i_i << 1;
            $285 = 46448 + ($shl221_i_i << 2) | 0;
            $286 = HEAP32[11602] | 0;
            $shl226_i_i = 1 << $shr214_i_i;
            do {
             if (($286 & $shl226_i_i | 0) == 0) {
              HEAP32[11602] = $286 | $shl226_i_i;
              $F224_0_i_i = $285;
              $_pre_phi_i68_i = 46448 + ($shl221_i_i + 2 << 2) | 0;
             } else {
              $287 = 46448 + ($shl221_i_i + 2 << 2) | 0;
              $288 = HEAP32[$287 >> 2] | 0;
              if ($288 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
               $F224_0_i_i = $288;
               $_pre_phi_i68_i = $287;
               break;
              }
              _abort();
              return 0;
             }
            } while (0);
            HEAP32[$_pre_phi_i68_i >> 2] = $225;
            HEAP32[$F224_0_i_i + 12 >> 2] = $225;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 8) >> 2] = $F224_0_i_i;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 12) >> 2] = $285;
            break;
           }
           $293 = $add_ptr17_i_i;
           $shr253_i_i = $qsize_0_i_i >>> 8;
           do {
            if (($shr253_i_i | 0) == 0) {
             $I252_0_i_i = 0;
            } else {
             if ($qsize_0_i_i >>> 0 > 16777215) {
              $I252_0_i_i = 31;
              break;
             }
             $and264_i_i = ($shr253_i_i + 1048320 | 0) >>> 16 & 8;
             $shl265_i_i = $shr253_i_i << $and264_i_i;
             $and268_i_i = ($shl265_i_i + 520192 | 0) >>> 16 & 4;
             $shl270_i_i = $shl265_i_i << $and268_i_i;
             $and273_i_i = ($shl270_i_i + 245760 | 0) >>> 16 & 2;
             $add278_i_i = 14 - ($and268_i_i | $and264_i_i | $and273_i_i) + ($shl270_i_i << $and273_i_i >>> 15) | 0;
             $I252_0_i_i = $qsize_0_i_i >>> (($add278_i_i + 7 | 0) >>> 0) & 1 | $add278_i_i << 1;
            }
           } while (0);
           $arrayidx287_i_i = 46712 + ($I252_0_i_i << 2) | 0;
           HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 28) >> 2] = $I252_0_i_i;
           HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 20) >> 2] = 0;
           HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 16) >> 2] = 0;
           $296 = HEAP32[11603] | 0;
           $shl294_i_i = 1 << $I252_0_i_i;
           if (($296 & $shl294_i_i | 0) == 0) {
            HEAP32[11603] = $296 | $shl294_i_i;
            HEAP32[$arrayidx287_i_i >> 2] = $293;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 24) >> 2] = $arrayidx287_i_i;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 12) >> 2] = $293;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 8) >> 2] = $293;
            break;
           }
           if (($I252_0_i_i | 0) == 31) {
            $cond315_i_i = 0;
           } else {
            $cond315_i_i = 25 - ($I252_0_i_i >>> 1) | 0;
           }
           $K305_0_i_i = $qsize_0_i_i << $cond315_i_i;
           $T_0_i69_i = HEAP32[$arrayidx287_i_i >> 2] | 0;
           while (1) {
            if ((HEAP32[$T_0_i69_i + 4 >> 2] & -8 | 0) == ($qsize_0_i_i | 0)) {
             break;
            }
            $arrayidx325_i_i = $T_0_i69_i + 16 + ($K305_0_i_i >>> 31 << 2) | 0;
            $303 = HEAP32[$arrayidx325_i_i >> 2] | 0;
            if (($303 | 0) == 0) {
             label = 793;
             break;
            } else {
             $K305_0_i_i = $K305_0_i_i << 1;
             $T_0_i69_i = $303;
            }
           }
           if ((label | 0) == 793) {
            if ($arrayidx325_i_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
             _abort();
             return 0;
            } else {
             HEAP32[$arrayidx325_i_i >> 2] = $293;
             HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 24) >> 2] = $T_0_i69_i;
             HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 12) >> 2] = $293;
             HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 8) >> 2] = $293;
             break;
            }
           }
           $fd344_i_i = $T_0_i69_i + 8 | 0;
           $309 = HEAP32[$fd344_i_i >> 2] | 0;
           $311 = HEAP32[11606] | 0;
           if ($T_0_i69_i >>> 0 < $311 >>> 0) {
            _abort();
            return 0;
           }
           if ($309 >>> 0 < $311 >>> 0) {
            _abort();
            return 0;
           } else {
            HEAP32[$309 + 12 >> 2] = $293;
            HEAP32[$fd344_i_i >> 2] = $293;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 8) >> 2] = $309;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 12) >> 2] = $T_0_i69_i;
            HEAP32[$tbase_292_i + ($add_ptr4_sum_i50_i + 24) >> 2] = 0;
            break;
           }
          }
         } while (0);
         $mem_0 = $tbase_292_i + ($cond_i43_i | 8) | 0;
         return $mem_0 | 0;
        }
       } while (0);
       $316 = $189;
       $sp_0_i_i_i = 46856;
       while (1) {
        $317 = HEAP32[$sp_0_i_i_i >> 2] | 0;
        if ($317 >>> 0 <= $316 >>> 0) {
         $318 = HEAP32[$sp_0_i_i_i + 4 >> 2] | 0;
         $add_ptr_i_i_i = $317 + $318 | 0;
         if ($add_ptr_i_i_i >>> 0 > $316 >>> 0) {
          break;
         }
        }
        $sp_0_i_i_i = HEAP32[$sp_0_i_i_i + 8 >> 2] | 0;
       }
       $320 = $317 + ($318 - 39) | 0;
       if (($320 & 7 | 0) == 0) {
        $cond_i18_i = 0;
       } else {
        $cond_i18_i = -$320 & 7;
       }
       $add_ptr7_i_i = $317 + ($318 - 47 + $cond_i18_i) | 0;
       $cond13_i_i = $add_ptr7_i_i >>> 0 < ($189 + 16 | 0) >>> 0 ? $316 : $add_ptr7_i_i;
       $add_ptr14_i_i = $cond13_i_i + 8 | 0;
       $323 = $tbase_292_i + 8 | 0;
       if (($323 & 7 | 0) == 0) {
        $cond_i_i_i = 0;
       } else {
        $cond_i_i_i = -$323 & 7;
       }
       $sub5_i_i_i = $tsize_291_i - 40 - $cond_i_i_i | 0;
       HEAP32[11608] = $tbase_292_i + $cond_i_i_i;
       HEAP32[11605] = $sub5_i_i_i;
       HEAP32[$tbase_292_i + ($cond_i_i_i + 4) >> 2] = $sub5_i_i_i | 1;
       HEAP32[$tbase_292_i + ($tsize_291_i - 36) >> 2] = 40;
       HEAP32[11609] = HEAP32[10828];
       HEAP32[$cond13_i_i + 4 >> 2] = 27;
       HEAP32[$add_ptr14_i_i >> 2] = HEAP32[11714];
       HEAP32[$add_ptr14_i_i + 4 >> 2] = HEAP32[46860 >> 2];
       HEAP32[$add_ptr14_i_i + 8 >> 2] = HEAP32[46864 >> 2];
       HEAP32[$add_ptr14_i_i + 12 >> 2] = HEAP32[46868 >> 2];
       HEAP32[11714] = $tbase_292_i;
       HEAP32[11715] = $tsize_291_i;
       HEAP32[11717] = 0;
       HEAP32[11716] = $add_ptr14_i_i;
       $330 = $cond13_i_i + 28 | 0;
       HEAP32[$330 >> 2] = 7;
       if (($cond13_i_i + 32 | 0) >>> 0 < $add_ptr_i_i_i >>> 0) {
        $add_ptr2416_i_i = $330;
        while (1) {
         $332 = $add_ptr2416_i_i + 4 | 0;
         HEAP32[$332 >> 2] = 7;
         if (($add_ptr2416_i_i + 8 | 0) >>> 0 < $add_ptr_i_i_i >>> 0) {
          $add_ptr2416_i_i = $332;
         } else {
          break;
         }
        }
       }
       if (($cond13_i_i | 0) == ($316 | 0)) {
        break;
       }
       $sub_ptr_sub_i_i = $cond13_i_i - $189 | 0;
       $335 = $316 + ($sub_ptr_sub_i_i + 4) | 0;
       HEAP32[$335 >> 2] = HEAP32[$335 >> 2] & -2;
       HEAP32[$189 + 4 >> 2] = $sub_ptr_sub_i_i | 1;
       HEAP32[$316 + $sub_ptr_sub_i_i >> 2] = $sub_ptr_sub_i_i;
       $shr_i_i = $sub_ptr_sub_i_i >>> 3;
       if ($sub_ptr_sub_i_i >>> 0 < 256) {
        $shl_i21_i = $shr_i_i << 1;
        $337 = 46448 + ($shl_i21_i << 2) | 0;
        $338 = HEAP32[11602] | 0;
        $shl39_i_i = 1 << $shr_i_i;
        do {
         if (($338 & $shl39_i_i | 0) == 0) {
          HEAP32[11602] = $338 | $shl39_i_i;
          $F_0_i_i = $337;
          $_pre_phi_i_i = 46448 + ($shl_i21_i + 2 << 2) | 0;
         } else {
          $339 = 46448 + ($shl_i21_i + 2 << 2) | 0;
          $340 = HEAP32[$339 >> 2] | 0;
          if ($340 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
           $F_0_i_i = $340;
           $_pre_phi_i_i = $339;
           break;
          }
          _abort();
          return 0;
         }
        } while (0);
        HEAP32[$_pre_phi_i_i >> 2] = $189;
        HEAP32[$F_0_i_i + 12 >> 2] = $189;
        HEAP32[$189 + 8 >> 2] = $F_0_i_i;
        HEAP32[$189 + 12 >> 2] = $337;
        break;
       }
       $343 = $189;
       $shr58_i_i = $sub_ptr_sub_i_i >>> 8;
       do {
        if (($shr58_i_i | 0) == 0) {
         $I57_0_i_i = 0;
        } else {
         if ($sub_ptr_sub_i_i >>> 0 > 16777215) {
          $I57_0_i_i = 31;
          break;
         }
         $and69_i_i = ($shr58_i_i + 1048320 | 0) >>> 16 & 8;
         $shl70_i_i = $shr58_i_i << $and69_i_i;
         $and73_i_i = ($shl70_i_i + 520192 | 0) >>> 16 & 4;
         $shl75_i_i = $shl70_i_i << $and73_i_i;
         $and78_i_i = ($shl75_i_i + 245760 | 0) >>> 16 & 2;
         $add83_i_i = 14 - ($and73_i_i | $and69_i_i | $and78_i_i) + ($shl75_i_i << $and78_i_i >>> 15) | 0;
         $I57_0_i_i = $sub_ptr_sub_i_i >>> (($add83_i_i + 7 | 0) >>> 0) & 1 | $add83_i_i << 1;
        }
       } while (0);
       $arrayidx91_i_i = 46712 + ($I57_0_i_i << 2) | 0;
       HEAP32[$189 + 28 >> 2] = $I57_0_i_i;
       HEAP32[$189 + 20 >> 2] = 0;
       HEAP32[$189 + 16 >> 2] = 0;
       $345 = HEAP32[11603] | 0;
       $shl95_i_i = 1 << $I57_0_i_i;
       if (($345 & $shl95_i_i | 0) == 0) {
        HEAP32[11603] = $345 | $shl95_i_i;
        HEAP32[$arrayidx91_i_i >> 2] = $343;
        HEAP32[$189 + 24 >> 2] = $arrayidx91_i_i;
        HEAP32[$189 + 12 >> 2] = $189;
        HEAP32[$189 + 8 >> 2] = $189;
        break;
       }
       if (($I57_0_i_i | 0) == 31) {
        $cond115_i_i = 0;
       } else {
        $cond115_i_i = 25 - ($I57_0_i_i >>> 1) | 0;
       }
       $K105_0_i_i = $sub_ptr_sub_i_i << $cond115_i_i;
       $T_0_i_i = HEAP32[$arrayidx91_i_i >> 2] | 0;
       while (1) {
        if ((HEAP32[$T_0_i_i + 4 >> 2] & -8 | 0) == ($sub_ptr_sub_i_i | 0)) {
         break;
        }
        $arrayidx126_i_i = $T_0_i_i + 16 + ($K105_0_i_i >>> 31 << 2) | 0;
        $348 = HEAP32[$arrayidx126_i_i >> 2] | 0;
        if (($348 | 0) == 0) {
         label = 828;
         break;
        } else {
         $K105_0_i_i = $K105_0_i_i << 1;
         $T_0_i_i = $348;
        }
       }
       if ((label | 0) == 828) {
        if ($arrayidx126_i_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
         _abort();
         return 0;
        } else {
         HEAP32[$arrayidx126_i_i >> 2] = $343;
         HEAP32[$189 + 24 >> 2] = $T_0_i_i;
         HEAP32[$189 + 12 >> 2] = $189;
         HEAP32[$189 + 8 >> 2] = $189;
         break;
        }
       }
       $fd145_i_i = $T_0_i_i + 8 | 0;
       $351 = HEAP32[$fd145_i_i >> 2] | 0;
       $353 = HEAP32[11606] | 0;
       if ($T_0_i_i >>> 0 < $353 >>> 0) {
        _abort();
        return 0;
       }
       if ($351 >>> 0 < $353 >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$351 + 12 >> 2] = $343;
        HEAP32[$fd145_i_i >> 2] = $343;
        HEAP32[$189 + 8 >> 2] = $351;
        HEAP32[$189 + 12 >> 2] = $T_0_i_i;
        HEAP32[$189 + 24 >> 2] = 0;
        break;
       }
      }
     } while (0);
     $355 = HEAP32[11605] | 0;
     if ($355 >>> 0 <= $nb_0 >>> 0) {
      break;
     }
     $sub253_i = $355 - $nb_0 | 0;
     HEAP32[11605] = $sub253_i;
     $356 = HEAP32[11608] | 0;
     $357 = $356;
     HEAP32[11608] = $357 + $nb_0;
     HEAP32[$357 + ($nb_0 + 4) >> 2] = $sub253_i | 1;
     HEAP32[$356 + 4 >> 2] = $nb_0 | 3;
     $mem_0 = $356 + 8 | 0;
     return $mem_0 | 0;
    }
   } while (0);
   HEAP32[(___errno_location() | 0) >> 2] = 12;
   $mem_0 = 0;
   return $mem_0 | 0;
  }
  function _free($mem) {
   $mem = $mem | 0;
   var $add_ptr = 0, $0 = 0, $1 = 0, $3 = 0, $and = 0, $and5 = 0, $add_ptr6 = 0, $4 = 0, $5 = 0, $add_ptr_sum232 = 0, $add_ptr16 = 0, $6 = 0, $add17 = 0, $shr = 0, $9 = 0, $11 = 0, $12 = 0, $fd56 = 0, $fd67_pre_phi = 0, $18 = 0, $20 = 0, $22 = 0, $24 = 0, $bk82 = 0, $fd86 = 0, $28 = 0, $29 = 0, $arrayidx103 = 0, $30 = 0, $RP_0 = 0, $R_0 = 0, $arrayidx108 = 0, $31 = 0, $arrayidx113 = 0, $32 = 0, $R_1 = 0, $34 = 0, $arrayidx130 = 0, $arrayidx149 = 0, $44 = 0, $48 = 0, $51 = 0, $psize_0 = 0, $p_0 = 0, $55 = 0, $56 = 0, $57 = 0, $add243 = 0, $add258 = 0, $add266 = 0, $shr267 = 0, $66 = 0, $68 = 0, $69 = 0, $fd310 = 0, $fd321_pre_phi = 0, $77 = 0, $79 = 0, $81 = 0, $83 = 0, $bk342 = 0, $fd346 = 0, $88 = 0, $89 = 0, $arrayidx366 = 0, $90 = 0, $RP359_0 = 0, $R331_0 = 0, $arrayidx373 = 0, $91 = 0, $arrayidx378 = 0, $92 = 0, $R331_1 = 0, $95 = 0, $arrayidx399 = 0, $arrayidx418 = 0, $105 = 0, $109 = 0, $psize_1 = 0, $shr497 = 0, $shl504 = 0, $113 = 0, $114 = 0, $shl507 = 0, $115 = 0, $116 = 0, $_pre_phi = 0, $F506_0 = 0, $119 = 0, $shr531 = 0, $and541 = 0, $shl542 = 0, $and545 = 0, $shl547 = 0, $and550 = 0, $add555 = 0, $I530_0 = 0, $arrayidx563 = 0, $121 = 0, $shl569 = 0, $cond = 0, $T_0 = 0, $K579_0 = 0, $arrayidx595 = 0, $124 = 0, $fd613 = 0, $127 = 0, $129 = 0, $dec = 0, $sp_0_in_i = 0, $sp_0_i = 0, label = 0;
   if (($mem | 0) == 0) {
    return;
   }
   $add_ptr = $mem - 8 | 0;
   $0 = $add_ptr;
   $1 = HEAP32[11606] | 0;
   if ($add_ptr >>> 0 < $1 >>> 0) {
    _abort();
   }
   $3 = HEAP32[$mem - 4 >> 2] | 0;
   $and = $3 & 3;
   if (($and | 0) == 1) {
    _abort();
   }
   $and5 = $3 & -8;
   $add_ptr6 = $mem + ($and5 - 8) | 0;
   $4 = $add_ptr6;
   L1181 : do {
    if (($3 & 1 | 0) == 0) {
     $5 = HEAP32[$add_ptr >> 2] | 0;
     if (($and | 0) == 0) {
      return;
     }
     $add_ptr_sum232 = -8 - $5 | 0;
     $add_ptr16 = $mem + $add_ptr_sum232 | 0;
     $6 = $add_ptr16;
     $add17 = $5 + $and5 | 0;
     if ($add_ptr16 >>> 0 < $1 >>> 0) {
      _abort();
     }
     if (($6 | 0) == (HEAP32[11607] | 0)) {
      $51 = $mem + ($and5 - 4) | 0;
      if ((HEAP32[$51 >> 2] & 3 | 0) != 3) {
       $p_0 = $6;
       $psize_0 = $add17;
       break;
      }
      HEAP32[11604] = $add17;
      HEAP32[$51 >> 2] = HEAP32[$51 >> 2] & -2;
      HEAP32[$mem + ($add_ptr_sum232 + 4) >> 2] = $add17 | 1;
      HEAP32[$add_ptr6 >> 2] = $add17;
      return;
     }
     $shr = $5 >>> 3;
     if ($5 >>> 0 < 256) {
      $9 = HEAP32[$mem + ($add_ptr_sum232 + 8) >> 2] | 0;
      $11 = HEAP32[$mem + ($add_ptr_sum232 + 12) >> 2] | 0;
      $12 = 46448 + ($shr << 1 << 2) | 0;
      do {
       if (($9 | 0) != ($12 | 0)) {
        if ($9 >>> 0 < $1 >>> 0) {
         _abort();
        }
        if ((HEAP32[$9 + 12 >> 2] | 0) == ($6 | 0)) {
         break;
        }
        _abort();
       }
      } while (0);
      if (($11 | 0) == ($9 | 0)) {
       HEAP32[11602] = HEAP32[11602] & ~(1 << $shr);
       $p_0 = $6;
       $psize_0 = $add17;
       break;
      }
      do {
       if (($11 | 0) == ($12 | 0)) {
        $fd67_pre_phi = $11 + 8 | 0;
       } else {
        if ($11 >>> 0 < $1 >>> 0) {
         _abort();
        }
        $fd56 = $11 + 8 | 0;
        if ((HEAP32[$fd56 >> 2] | 0) == ($6 | 0)) {
         $fd67_pre_phi = $fd56;
         break;
        }
        _abort();
       }
      } while (0);
      HEAP32[$9 + 12 >> 2] = $11;
      HEAP32[$fd67_pre_phi >> 2] = $9;
      $p_0 = $6;
      $psize_0 = $add17;
      break;
     }
     $18 = $add_ptr16;
     $20 = HEAP32[$mem + ($add_ptr_sum232 + 24) >> 2] | 0;
     $22 = HEAP32[$mem + ($add_ptr_sum232 + 12) >> 2] | 0;
     do {
      if (($22 | 0) == ($18 | 0)) {
       $28 = $mem + ($add_ptr_sum232 + 20) | 0;
       $29 = HEAP32[$28 >> 2] | 0;
       if (($29 | 0) == 0) {
        $arrayidx103 = $mem + ($add_ptr_sum232 + 16) | 0;
        $30 = HEAP32[$arrayidx103 >> 2] | 0;
        if (($30 | 0) == 0) {
         $R_1 = 0;
         break;
        } else {
         $R_0 = $30;
         $RP_0 = $arrayidx103;
        }
       } else {
        $R_0 = $29;
        $RP_0 = $28;
       }
       while (1) {
        $arrayidx108 = $R_0 + 20 | 0;
        $31 = HEAP32[$arrayidx108 >> 2] | 0;
        if (($31 | 0) != 0) {
         $R_0 = $31;
         $RP_0 = $arrayidx108;
         continue;
        }
        $arrayidx113 = $R_0 + 16 | 0;
        $32 = HEAP32[$arrayidx113 >> 2] | 0;
        if (($32 | 0) == 0) {
         break;
        } else {
         $R_0 = $32;
         $RP_0 = $arrayidx113;
        }
       }
       if ($RP_0 >>> 0 < $1 >>> 0) {
        _abort();
       } else {
        HEAP32[$RP_0 >> 2] = 0;
        $R_1 = $R_0;
        break;
       }
      } else {
       $24 = HEAP32[$mem + ($add_ptr_sum232 + 8) >> 2] | 0;
       if ($24 >>> 0 < $1 >>> 0) {
        _abort();
       }
       $bk82 = $24 + 12 | 0;
       if ((HEAP32[$bk82 >> 2] | 0) != ($18 | 0)) {
        _abort();
       }
       $fd86 = $22 + 8 | 0;
       if ((HEAP32[$fd86 >> 2] | 0) == ($18 | 0)) {
        HEAP32[$bk82 >> 2] = $22;
        HEAP32[$fd86 >> 2] = $24;
        $R_1 = $22;
        break;
       } else {
        _abort();
       }
      }
     } while (0);
     if (($20 | 0) == 0) {
      $p_0 = $6;
      $psize_0 = $add17;
      break;
     }
     $34 = $mem + ($add_ptr_sum232 + 28) | 0;
     $arrayidx130 = 46712 + (HEAP32[$34 >> 2] << 2) | 0;
     do {
      if (($18 | 0) == (HEAP32[$arrayidx130 >> 2] | 0)) {
       HEAP32[$arrayidx130 >> 2] = $R_1;
       if (($R_1 | 0) != 0) {
        break;
       }
       HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$34 >> 2]);
       $p_0 = $6;
       $psize_0 = $add17;
       break L1181;
      } else {
       if ($20 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       }
       $arrayidx149 = $20 + 16 | 0;
       if ((HEAP32[$arrayidx149 >> 2] | 0) == ($18 | 0)) {
        HEAP32[$arrayidx149 >> 2] = $R_1;
       } else {
        HEAP32[$20 + 20 >> 2] = $R_1;
       }
       if (($R_1 | 0) == 0) {
        $p_0 = $6;
        $psize_0 = $add17;
        break L1181;
       }
      }
     } while (0);
     if ($R_1 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
     }
     HEAP32[$R_1 + 24 >> 2] = $20;
     $44 = HEAP32[$mem + ($add_ptr_sum232 + 16) >> 2] | 0;
     do {
      if (($44 | 0) != 0) {
       if ($44 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[$R_1 + 16 >> 2] = $44;
        HEAP32[$44 + 24 >> 2] = $R_1;
        break;
       }
      }
     } while (0);
     $48 = HEAP32[$mem + ($add_ptr_sum232 + 20) >> 2] | 0;
     if (($48 | 0) == 0) {
      $p_0 = $6;
      $psize_0 = $add17;
      break;
     }
     if ($48 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[$R_1 + 20 >> 2] = $48;
      HEAP32[$48 + 24 >> 2] = $R_1;
      $p_0 = $6;
      $psize_0 = $add17;
      break;
     }
    } else {
     $p_0 = $0;
     $psize_0 = $and5;
    }
   } while (0);
   $55 = $p_0;
   if ($55 >>> 0 >= $add_ptr6 >>> 0) {
    _abort();
   }
   $56 = $mem + ($and5 - 4) | 0;
   $57 = HEAP32[$56 >> 2] | 0;
   if (($57 & 1 | 0) == 0) {
    _abort();
   }
   do {
    if (($57 & 2 | 0) == 0) {
     if (($4 | 0) == (HEAP32[11608] | 0)) {
      $add243 = (HEAP32[11605] | 0) + $psize_0 | 0;
      HEAP32[11605] = $add243;
      HEAP32[11608] = $p_0;
      HEAP32[$p_0 + 4 >> 2] = $add243 | 1;
      if (($p_0 | 0) == (HEAP32[11607] | 0)) {
       HEAP32[11607] = 0;
       HEAP32[11604] = 0;
      }
      if ($add243 >>> 0 <= (HEAP32[11609] | 0) >>> 0) {
       return;
      }
      _sys_trim(0) | 0;
      return;
     }
     if (($4 | 0) == (HEAP32[11607] | 0)) {
      $add258 = (HEAP32[11604] | 0) + $psize_0 | 0;
      HEAP32[11604] = $add258;
      HEAP32[11607] = $p_0;
      HEAP32[$p_0 + 4 >> 2] = $add258 | 1;
      HEAP32[$55 + $add258 >> 2] = $add258;
      return;
     }
     $add266 = ($57 & -8) + $psize_0 | 0;
     $shr267 = $57 >>> 3;
     L1287 : do {
      if ($57 >>> 0 < 256) {
       $66 = HEAP32[$mem + $and5 >> 2] | 0;
       $68 = HEAP32[$mem + ($and5 | 4) >> 2] | 0;
       $69 = 46448 + ($shr267 << 1 << 2) | 0;
       do {
        if (($66 | 0) != ($69 | 0)) {
         if ($66 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         }
         if ((HEAP32[$66 + 12 >> 2] | 0) == ($4 | 0)) {
          break;
         }
         _abort();
        }
       } while (0);
       if (($68 | 0) == ($66 | 0)) {
        HEAP32[11602] = HEAP32[11602] & ~(1 << $shr267);
        break;
       }
       do {
        if (($68 | 0) == ($69 | 0)) {
         $fd321_pre_phi = $68 + 8 | 0;
        } else {
         if ($68 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         }
         $fd310 = $68 + 8 | 0;
         if ((HEAP32[$fd310 >> 2] | 0) == ($4 | 0)) {
          $fd321_pre_phi = $fd310;
          break;
         }
         _abort();
        }
       } while (0);
       HEAP32[$66 + 12 >> 2] = $68;
       HEAP32[$fd321_pre_phi >> 2] = $66;
      } else {
       $77 = $add_ptr6;
       $79 = HEAP32[$mem + ($and5 + 16) >> 2] | 0;
       $81 = HEAP32[$mem + ($and5 | 4) >> 2] | 0;
       do {
        if (($81 | 0) == ($77 | 0)) {
         $88 = $mem + ($and5 + 12) | 0;
         $89 = HEAP32[$88 >> 2] | 0;
         if (($89 | 0) == 0) {
          $arrayidx366 = $mem + ($and5 + 8) | 0;
          $90 = HEAP32[$arrayidx366 >> 2] | 0;
          if (($90 | 0) == 0) {
           $R331_1 = 0;
           break;
          } else {
           $R331_0 = $90;
           $RP359_0 = $arrayidx366;
          }
         } else {
          $R331_0 = $89;
          $RP359_0 = $88;
         }
         while (1) {
          $arrayidx373 = $R331_0 + 20 | 0;
          $91 = HEAP32[$arrayidx373 >> 2] | 0;
          if (($91 | 0) != 0) {
           $R331_0 = $91;
           $RP359_0 = $arrayidx373;
           continue;
          }
          $arrayidx378 = $R331_0 + 16 | 0;
          $92 = HEAP32[$arrayidx378 >> 2] | 0;
          if (($92 | 0) == 0) {
           break;
          } else {
           $R331_0 = $92;
           $RP359_0 = $arrayidx378;
          }
         }
         if ($RP359_0 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[$RP359_0 >> 2] = 0;
          $R331_1 = $R331_0;
          break;
         }
        } else {
         $83 = HEAP32[$mem + $and5 >> 2] | 0;
         if ($83 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         }
         $bk342 = $83 + 12 | 0;
         if ((HEAP32[$bk342 >> 2] | 0) != ($77 | 0)) {
          _abort();
         }
         $fd346 = $81 + 8 | 0;
         if ((HEAP32[$fd346 >> 2] | 0) == ($77 | 0)) {
          HEAP32[$bk342 >> 2] = $81;
          HEAP32[$fd346 >> 2] = $83;
          $R331_1 = $81;
          break;
         } else {
          _abort();
         }
        }
       } while (0);
       if (($79 | 0) == 0) {
        break;
       }
       $95 = $mem + ($and5 + 20) | 0;
       $arrayidx399 = 46712 + (HEAP32[$95 >> 2] << 2) | 0;
       do {
        if (($77 | 0) == (HEAP32[$arrayidx399 >> 2] | 0)) {
         HEAP32[$arrayidx399 >> 2] = $R331_1;
         if (($R331_1 | 0) != 0) {
          break;
         }
         HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$95 >> 2]);
         break L1287;
        } else {
         if ($79 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         }
         $arrayidx418 = $79 + 16 | 0;
         if ((HEAP32[$arrayidx418 >> 2] | 0) == ($77 | 0)) {
          HEAP32[$arrayidx418 >> 2] = $R331_1;
         } else {
          HEAP32[$79 + 20 >> 2] = $R331_1;
         }
         if (($R331_1 | 0) == 0) {
          break L1287;
         }
        }
       } while (0);
       if ($R331_1 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       }
       HEAP32[$R331_1 + 24 >> 2] = $79;
       $105 = HEAP32[$mem + ($and5 + 8) >> 2] | 0;
       do {
        if (($105 | 0) != 0) {
         if ($105 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[$R331_1 + 16 >> 2] = $105;
          HEAP32[$105 + 24 >> 2] = $R331_1;
          break;
         }
        }
       } while (0);
       $109 = HEAP32[$mem + ($and5 + 12) >> 2] | 0;
       if (($109 | 0) == 0) {
        break;
       }
       if ($109 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[$R331_1 + 20 >> 2] = $109;
        HEAP32[$109 + 24 >> 2] = $R331_1;
        break;
       }
      }
     } while (0);
     HEAP32[$p_0 + 4 >> 2] = $add266 | 1;
     HEAP32[$55 + $add266 >> 2] = $add266;
     if (($p_0 | 0) != (HEAP32[11607] | 0)) {
      $psize_1 = $add266;
      break;
     }
     HEAP32[11604] = $add266;
     return;
    } else {
     HEAP32[$56 >> 2] = $57 & -2;
     HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
     HEAP32[$55 + $psize_0 >> 2] = $psize_0;
     $psize_1 = $psize_0;
    }
   } while (0);
   $shr497 = $psize_1 >>> 3;
   if ($psize_1 >>> 0 < 256) {
    $shl504 = $shr497 << 1;
    $113 = 46448 + ($shl504 << 2) | 0;
    $114 = HEAP32[11602] | 0;
    $shl507 = 1 << $shr497;
    do {
     if (($114 & $shl507 | 0) == 0) {
      HEAP32[11602] = $114 | $shl507;
      $F506_0 = $113;
      $_pre_phi = 46448 + ($shl504 + 2 << 2) | 0;
     } else {
      $115 = 46448 + ($shl504 + 2 << 2) | 0;
      $116 = HEAP32[$115 >> 2] | 0;
      if ($116 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
       $F506_0 = $116;
       $_pre_phi = $115;
       break;
      }
      _abort();
     }
    } while (0);
    HEAP32[$_pre_phi >> 2] = $p_0;
    HEAP32[$F506_0 + 12 >> 2] = $p_0;
    HEAP32[$p_0 + 8 >> 2] = $F506_0;
    HEAP32[$p_0 + 12 >> 2] = $113;
    return;
   }
   $119 = $p_0;
   $shr531 = $psize_1 >>> 8;
   do {
    if (($shr531 | 0) == 0) {
     $I530_0 = 0;
    } else {
     if ($psize_1 >>> 0 > 16777215) {
      $I530_0 = 31;
      break;
     }
     $and541 = ($shr531 + 1048320 | 0) >>> 16 & 8;
     $shl542 = $shr531 << $and541;
     $and545 = ($shl542 + 520192 | 0) >>> 16 & 4;
     $shl547 = $shl542 << $and545;
     $and550 = ($shl547 + 245760 | 0) >>> 16 & 2;
     $add555 = 14 - ($and545 | $and541 | $and550) + ($shl547 << $and550 >>> 15) | 0;
     $I530_0 = $psize_1 >>> (($add555 + 7 | 0) >>> 0) & 1 | $add555 << 1;
    }
   } while (0);
   $arrayidx563 = 46712 + ($I530_0 << 2) | 0;
   HEAP32[$p_0 + 28 >> 2] = $I530_0;
   HEAP32[$p_0 + 20 >> 2] = 0;
   HEAP32[$p_0 + 16 >> 2] = 0;
   $121 = HEAP32[11603] | 0;
   $shl569 = 1 << $I530_0;
   do {
    if (($121 & $shl569 | 0) == 0) {
     HEAP32[11603] = $121 | $shl569;
     HEAP32[$arrayidx563 >> 2] = $119;
     HEAP32[$p_0 + 24 >> 2] = $arrayidx563;
     HEAP32[$p_0 + 12 >> 2] = $p_0;
     HEAP32[$p_0 + 8 >> 2] = $p_0;
    } else {
     if (($I530_0 | 0) == 31) {
      $cond = 0;
     } else {
      $cond = 25 - ($I530_0 >>> 1) | 0;
     }
     $K579_0 = $psize_1 << $cond;
     $T_0 = HEAP32[$arrayidx563 >> 2] | 0;
     while (1) {
      if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_1 | 0)) {
       break;
      }
      $arrayidx595 = $T_0 + 16 + ($K579_0 >>> 31 << 2) | 0;
      $124 = HEAP32[$arrayidx595 >> 2] | 0;
      if (($124 | 0) == 0) {
       label = 1007;
       break;
      } else {
       $K579_0 = $K579_0 << 1;
       $T_0 = $124;
      }
     }
     if ((label | 0) == 1007) {
      if ($arrayidx595 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[$arrayidx595 >> 2] = $119;
       HEAP32[$p_0 + 24 >> 2] = $T_0;
       HEAP32[$p_0 + 12 >> 2] = $p_0;
       HEAP32[$p_0 + 8 >> 2] = $p_0;
       break;
      }
     }
     $fd613 = $T_0 + 8 | 0;
     $127 = HEAP32[$fd613 >> 2] | 0;
     $129 = HEAP32[11606] | 0;
     if ($T_0 >>> 0 < $129 >>> 0) {
      _abort();
     }
     if ($127 >>> 0 < $129 >>> 0) {
      _abort();
     } else {
      HEAP32[$127 + 12 >> 2] = $119;
      HEAP32[$fd613 >> 2] = $119;
      HEAP32[$p_0 + 8 >> 2] = $127;
      HEAP32[$p_0 + 12 >> 2] = $T_0;
      HEAP32[$p_0 + 24 >> 2] = 0;
      break;
     }
    }
   } while (0);
   $dec = (HEAP32[11610] | 0) - 1 | 0;
   HEAP32[11610] = $dec;
   if (($dec | 0) == 0) {
    $sp_0_in_i = 46864;
   } else {
    return;
   }
   while (1) {
    $sp_0_i = HEAP32[$sp_0_in_i >> 2] | 0;
    if (($sp_0_i | 0) == 0) {
     break;
    } else {
     $sp_0_in_i = $sp_0_i + 8 | 0;
    }
   }
   HEAP32[11610] = -1;
   return;
  }
  function _calloc($n_elements, $elem_size) {
   $n_elements = $n_elements | 0;
   $elem_size = $elem_size | 0;
   var $mul = 0, $req_0 = 0, $call = 0;
   do {
    if (($n_elements | 0) == 0) {
     $req_0 = 0;
    } else {
     $mul = Math_imul($elem_size, $n_elements) | 0;
     if (($elem_size | $n_elements) >>> 0 <= 65535) {
      $req_0 = $mul;
      break;
     }
     $req_0 = (($mul >>> 0) / ($n_elements >>> 0) | 0 | 0) == ($elem_size | 0) ? $mul : -1;
    }
   } while (0);
   $call = _malloc($req_0) | 0;
   if (($call | 0) == 0) {
    return $call | 0;
   }
   if ((HEAP32[$call - 4 >> 2] & 3 | 0) == 0) {
    return $call | 0;
   }
   _memset($call | 0, 0, $req_0 | 0);
   return $call | 0;
  }
  function _realloc($oldmem, $bytes) {
   $oldmem = $oldmem | 0;
   $bytes = $bytes | 0;
   var $cond = 0, $call7 = 0, $call12 = 0, $3 = 0, $sub = 0, $cond24 = 0, $mem_0 = 0;
   if (($oldmem | 0) == 0) {
    $mem_0 = _malloc($bytes) | 0;
    return $mem_0 | 0;
   }
   if ($bytes >>> 0 > 4294967231) {
    HEAP32[(___errno_location() | 0) >> 2] = 12;
    $mem_0 = 0;
    return $mem_0 | 0;
   }
   if ($bytes >>> 0 < 11) {
    $cond = 16;
   } else {
    $cond = $bytes + 11 & -8;
   }
   $call7 = _try_realloc_chunk($oldmem - 8 | 0, $cond) | 0;
   if (($call7 | 0) != 0) {
    $mem_0 = $call7 + 8 | 0;
    return $mem_0 | 0;
   }
   $call12 = _malloc($bytes) | 0;
   if (($call12 | 0) == 0) {
    $mem_0 = 0;
    return $mem_0 | 0;
   }
   $3 = HEAP32[$oldmem - 4 >> 2] | 0;
   $sub = ($3 & -8) - (($3 & 3 | 0) == 0 ? 8 : 4) | 0;
   $cond24 = $sub >>> 0 < $bytes >>> 0 ? $sub : $bytes;
   _memcpy($call12 | 0, $oldmem | 0, $cond24) | 0;
   _free($oldmem);
   $mem_0 = $call12;
   return $mem_0 | 0;
  }
  function _realloc_in_place($oldmem, $bytes) {
   $oldmem = $oldmem | 0;
   $bytes = $bytes | 0;
   var $cond = 0, $0 = 0;
   if (($oldmem | 0) == 0) {
    return 0;
   }
   if ($bytes >>> 0 > 4294967231) {
    HEAP32[(___errno_location() | 0) >> 2] = 12;
    return 0;
   }
   if ($bytes >>> 0 < 11) {
    $cond = 16;
   } else {
    $cond = $bytes + 11 & -8;
   }
   $0 = $oldmem - 8 | 0;
   return ((_try_realloc_chunk($0, $cond) | 0) == ($0 | 0) ? $oldmem : 0) | 0;
  }
  function _memalign($alignment, $bytes) {
   $alignment = $alignment | 0;
   $bytes = $bytes | 0;
   var $retval_0 = 0;
   if ($alignment >>> 0 < 9) {
    $retval_0 = _malloc($bytes) | 0;
    return $retval_0 | 0;
   } else {
    $retval_0 = _internal_memalign($alignment, $bytes) | 0;
    return $retval_0 | 0;
   }
   return 0;
  }
  function _sys_trim($pad) {
   $pad = $pad | 0;
   var $call_i = 0, $1 = 0, $2 = 0, $3 = 0, $mul = 0, $4 = 0, $sp_0_i = 0, $5 = 0, $7 = 0, $retval_0_i = 0, $call20 = 0, $size = 0, $call24 = 0, $call25 = 0, $sub_ptr_sub = 0, $13 = 0, $sub41 = 0, $15 = 0, $16 = 0, $cond_i = 0, $sub5_i = 0, $released_2 = 0;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i = _sysconf(8) | 0;
     if (($call_i - 1 & $call_i | 0) == 0) {
      HEAP32[10826] = $call_i;
      HEAP32[10825] = $call_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
      return 0;
     }
    }
   } while (0);
   if ($pad >>> 0 >= 4294967232) {
    $released_2 = 0;
    return $released_2 | 0;
   }
   $1 = HEAP32[11608] | 0;
   if (($1 | 0) == 0) {
    $released_2 = 0;
    return $released_2 | 0;
   }
   $2 = HEAP32[11605] | 0;
   do {
    if ($2 >>> 0 > ($pad + 40 | 0) >>> 0) {
     $3 = HEAP32[10826] | 0;
     $mul = Math_imul((((-40 - $pad - 1 + $2 + $3 | 0) >>> 0) / ($3 >>> 0) | 0) - 1 | 0, $3) | 0;
     $4 = $1;
     $sp_0_i = 46856;
     while (1) {
      $5 = HEAP32[$sp_0_i >> 2] | 0;
      if ($5 >>> 0 <= $4 >>> 0) {
       if (($5 + (HEAP32[$sp_0_i + 4 >> 2] | 0) | 0) >>> 0 > $4 >>> 0) {
        $retval_0_i = $sp_0_i;
        break;
       }
      }
      $7 = HEAP32[$sp_0_i + 8 >> 2] | 0;
      if (($7 | 0) == 0) {
       $retval_0_i = 0;
       break;
      } else {
       $sp_0_i = $7;
      }
     }
     if ((HEAP32[$retval_0_i + 12 >> 2] & 8 | 0) != 0) {
      break;
     }
     $call20 = _sbrk(0) | 0;
     $size = $retval_0_i + 4 | 0;
     if (($call20 | 0) != ((HEAP32[$retval_0_i >> 2] | 0) + (HEAP32[$size >> 2] | 0) | 0)) {
      break;
     }
     $call24 = _sbrk(-($mul >>> 0 > 2147483646 ? -2147483648 - $3 | 0 : $mul) | 0) | 0;
     $call25 = _sbrk(0) | 0;
     if (!(($call24 | 0) != -1 & $call25 >>> 0 < $call20 >>> 0)) {
      break;
     }
     $sub_ptr_sub = $call20 - $call25 | 0;
     if (($call20 | 0) == ($call25 | 0)) {
      break;
     }
     HEAP32[$size >> 2] = (HEAP32[$size >> 2] | 0) - $sub_ptr_sub;
     HEAP32[11710] = (HEAP32[11710] | 0) - $sub_ptr_sub;
     $13 = HEAP32[11608] | 0;
     $sub41 = (HEAP32[11605] | 0) - $sub_ptr_sub | 0;
     $15 = $13;
     $16 = $13 + 8 | 0;
     if (($16 & 7 | 0) == 0) {
      $cond_i = 0;
     } else {
      $cond_i = -$16 & 7;
     }
     $sub5_i = $sub41 - $cond_i | 0;
     HEAP32[11608] = $15 + $cond_i;
     HEAP32[11605] = $sub5_i;
     HEAP32[$15 + ($cond_i + 4) >> 2] = $sub5_i | 1;
     HEAP32[$15 + ($sub41 + 4) >> 2] = 40;
     HEAP32[11609] = HEAP32[10828];
     $released_2 = ($call20 | 0) != ($call25 | 0) | 0;
     return $released_2 | 0;
    }
   } while (0);
   if ((HEAP32[11605] | 0) >>> 0 <= (HEAP32[11609] | 0) >>> 0) {
    $released_2 = 0;
    return $released_2 | 0;
   }
   HEAP32[11609] = -1;
   $released_2 = 0;
   return $released_2 | 0;
  }
  function _try_realloc_chunk($p, $nb) {
   $p = $p | 0;
   $nb = $nb | 0;
   var $head = 0, $0 = 0, $and = 0, $1 = 0, $add_ptr = 0, $2 = 0, $3 = 0, $and2 = 0, $4 = 0, $5 = 0, $sub = 0, $add = 0, $sub40 = 0, $add58 = 0, $sub62 = 0, $18 = 0, $20 = 0, $storemerge18 = 0, $storemerge = 0, $add105 = 0, $sub110 = 0, $shr = 0, $23 = 0, $25 = 0, $26 = 0, $fd138 = 0, $fd148_pre_phi = 0, $32 = 0, $34 = 0, $36 = 0, $38 = 0, $bk164 = 0, $fd167 = 0, $42 = 0, $43 = 0, $arrayidx182 = 0, $44 = 0, $RP_0 = 0, $R_0 = 0, $arrayidx186 = 0, $45 = 0, $arrayidx190 = 0, $46 = 0, $R_1 = 0, $48 = 0, $arrayidx206 = 0, $arrayidx226 = 0, $58 = 0, $62 = 0, $66 = 0, $71 = 0, $newp_0 = 0;
   $head = $p + 4 | 0;
   $0 = HEAP32[$head >> 2] | 0;
   $and = $0 & -8;
   $1 = $p;
   $add_ptr = $1 + $and | 0;
   $2 = $add_ptr;
   $3 = HEAP32[11606] | 0;
   if ($1 >>> 0 < $3 >>> 0) {
    _abort();
    return 0;
   }
   $and2 = $0 & 3;
   if (!(($and2 | 0) != 1 & $1 >>> 0 < $add_ptr >>> 0)) {
    _abort();
    return 0;
   }
   $4 = $1 + ($and | 4) | 0;
   $5 = HEAP32[$4 >> 2] | 0;
   if (($5 & 1 | 0) == 0) {
    _abort();
    return 0;
   }
   if (($and2 | 0) == 0) {
    if ($nb >>> 0 < 256) {
     $newp_0 = 0;
     return $newp_0 | 0;
    }
    do {
     if ($and >>> 0 >= ($nb + 4 | 0) >>> 0) {
      if (($and - $nb | 0) >>> 0 > HEAP32[10826] << 1 >>> 0) {
       break;
      } else {
       $newp_0 = $p;
      }
      return $newp_0 | 0;
     }
    } while (0);
    $newp_0 = 0;
    return $newp_0 | 0;
   }
   if ($and >>> 0 >= $nb >>> 0) {
    $sub = $and - $nb | 0;
    if ($sub >>> 0 <= 15) {
     $newp_0 = $p;
     return $newp_0 | 0;
    }
    HEAP32[$head >> 2] = $0 & 1 | $nb | 2;
    HEAP32[$1 + ($nb + 4) >> 2] = $sub | 3;
    HEAP32[$4 >> 2] = HEAP32[$4 >> 2] | 1;
    _dispose_chunk($1 + $nb | 0, $sub);
    $newp_0 = $p;
    return $newp_0 | 0;
   }
   if (($2 | 0) == (HEAP32[11608] | 0)) {
    $add = (HEAP32[11605] | 0) + $and | 0;
    if ($add >>> 0 <= $nb >>> 0) {
     $newp_0 = 0;
     return $newp_0 | 0;
    }
    $sub40 = $add - $nb | 0;
    HEAP32[$head >> 2] = $0 & 1 | $nb | 2;
    HEAP32[$1 + ($nb + 4) >> 2] = $sub40 | 1;
    HEAP32[11608] = $1 + $nb;
    HEAP32[11605] = $sub40;
    $newp_0 = $p;
    return $newp_0 | 0;
   }
   if (($2 | 0) == (HEAP32[11607] | 0)) {
    $add58 = (HEAP32[11604] | 0) + $and | 0;
    if ($add58 >>> 0 < $nb >>> 0) {
     $newp_0 = 0;
     return $newp_0 | 0;
    }
    $sub62 = $add58 - $nb | 0;
    if ($sub62 >>> 0 > 15) {
     HEAP32[$head >> 2] = $0 & 1 | $nb | 2;
     HEAP32[$1 + ($nb + 4) >> 2] = $sub62 | 1;
     HEAP32[$1 + $add58 >> 2] = $sub62;
     $18 = $1 + ($add58 + 4) | 0;
     HEAP32[$18 >> 2] = HEAP32[$18 >> 2] & -2;
     $storemerge = $1 + $nb | 0;
     $storemerge18 = $sub62;
    } else {
     HEAP32[$head >> 2] = $0 & 1 | $add58 | 2;
     $20 = $1 + ($add58 + 4) | 0;
     HEAP32[$20 >> 2] = HEAP32[$20 >> 2] | 1;
     $storemerge = 0;
     $storemerge18 = 0;
    }
    HEAP32[11604] = $storemerge18;
    HEAP32[11607] = $storemerge;
    $newp_0 = $p;
    return $newp_0 | 0;
   }
   if (($5 & 2 | 0) != 0) {
    $newp_0 = 0;
    return $newp_0 | 0;
   }
   $add105 = ($5 & -8) + $and | 0;
   if ($add105 >>> 0 < $nb >>> 0) {
    $newp_0 = 0;
    return $newp_0 | 0;
   }
   $sub110 = $add105 - $nb | 0;
   $shr = $5 >>> 3;
   L1536 : do {
    if ($5 >>> 0 < 256) {
     $23 = HEAP32[$1 + ($and + 8) >> 2] | 0;
     $25 = HEAP32[$1 + ($and + 12) >> 2] | 0;
     $26 = 46448 + ($shr << 1 << 2) | 0;
     do {
      if (($23 | 0) != ($26 | 0)) {
       if ($23 >>> 0 < $3 >>> 0) {
        _abort();
        return 0;
       }
       if ((HEAP32[$23 + 12 >> 2] | 0) == ($2 | 0)) {
        break;
       }
       _abort();
       return 0;
      }
     } while (0);
     if (($25 | 0) == ($23 | 0)) {
      HEAP32[11602] = HEAP32[11602] & ~(1 << $shr);
      break;
     }
     do {
      if (($25 | 0) == ($26 | 0)) {
       $fd148_pre_phi = $25 + 8 | 0;
      } else {
       if ($25 >>> 0 < $3 >>> 0) {
        _abort();
        return 0;
       }
       $fd138 = $25 + 8 | 0;
       if ((HEAP32[$fd138 >> 2] | 0) == ($2 | 0)) {
        $fd148_pre_phi = $fd138;
        break;
       }
       _abort();
       return 0;
      }
     } while (0);
     HEAP32[$23 + 12 >> 2] = $25;
     HEAP32[$fd148_pre_phi >> 2] = $23;
    } else {
     $32 = $add_ptr;
     $34 = HEAP32[$1 + ($and + 24) >> 2] | 0;
     $36 = HEAP32[$1 + ($and + 12) >> 2] | 0;
     do {
      if (($36 | 0) == ($32 | 0)) {
       $42 = $1 + ($and + 20) | 0;
       $43 = HEAP32[$42 >> 2] | 0;
       if (($43 | 0) == 0) {
        $arrayidx182 = $1 + ($and + 16) | 0;
        $44 = HEAP32[$arrayidx182 >> 2] | 0;
        if (($44 | 0) == 0) {
         $R_1 = 0;
         break;
        } else {
         $R_0 = $44;
         $RP_0 = $arrayidx182;
        }
       } else {
        $R_0 = $43;
        $RP_0 = $42;
       }
       while (1) {
        $arrayidx186 = $R_0 + 20 | 0;
        $45 = HEAP32[$arrayidx186 >> 2] | 0;
        if (($45 | 0) != 0) {
         $R_0 = $45;
         $RP_0 = $arrayidx186;
         continue;
        }
        $arrayidx190 = $R_0 + 16 | 0;
        $46 = HEAP32[$arrayidx190 >> 2] | 0;
        if (($46 | 0) == 0) {
         break;
        } else {
         $R_0 = $46;
         $RP_0 = $arrayidx190;
        }
       }
       if ($RP_0 >>> 0 < $3 >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$RP_0 >> 2] = 0;
        $R_1 = $R_0;
        break;
       }
      } else {
       $38 = HEAP32[$1 + ($and + 8) >> 2] | 0;
       if ($38 >>> 0 < $3 >>> 0) {
        _abort();
        return 0;
       }
       $bk164 = $38 + 12 | 0;
       if ((HEAP32[$bk164 >> 2] | 0) != ($32 | 0)) {
        _abort();
        return 0;
       }
       $fd167 = $36 + 8 | 0;
       if ((HEAP32[$fd167 >> 2] | 0) == ($32 | 0)) {
        HEAP32[$bk164 >> 2] = $36;
        HEAP32[$fd167 >> 2] = $38;
        $R_1 = $36;
        break;
       } else {
        _abort();
        return 0;
       }
      }
     } while (0);
     if (($34 | 0) == 0) {
      break;
     }
     $48 = $1 + ($and + 28) | 0;
     $arrayidx206 = 46712 + (HEAP32[$48 >> 2] << 2) | 0;
     do {
      if (($32 | 0) == (HEAP32[$arrayidx206 >> 2] | 0)) {
       HEAP32[$arrayidx206 >> 2] = $R_1;
       if (($R_1 | 0) != 0) {
        break;
       }
       HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$48 >> 2]);
       break L1536;
      } else {
       if ($34 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       }
       $arrayidx226 = $34 + 16 | 0;
       if ((HEAP32[$arrayidx226 >> 2] | 0) == ($32 | 0)) {
        HEAP32[$arrayidx226 >> 2] = $R_1;
       } else {
        HEAP32[$34 + 20 >> 2] = $R_1;
       }
       if (($R_1 | 0) == 0) {
        break L1536;
       }
      }
     } while (0);
     if ($R_1 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
      return 0;
     }
     HEAP32[$R_1 + 24 >> 2] = $34;
     $58 = HEAP32[$1 + ($and + 16) >> 2] | 0;
     do {
      if (($58 | 0) != 0) {
       if ($58 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
        return 0;
       } else {
        HEAP32[$R_1 + 16 >> 2] = $58;
        HEAP32[$58 + 24 >> 2] = $R_1;
        break;
       }
      }
     } while (0);
     $62 = HEAP32[$1 + ($and + 20) >> 2] | 0;
     if (($62 | 0) == 0) {
      break;
     }
     if ($62 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
      return 0;
     } else {
      HEAP32[$R_1 + 20 >> 2] = $62;
      HEAP32[$62 + 24 >> 2] = $R_1;
      break;
     }
    }
   } while (0);
   if ($sub110 >>> 0 < 16) {
    HEAP32[$head >> 2] = $add105 | HEAP32[$head >> 2] & 1 | 2;
    $66 = $1 + ($add105 | 4) | 0;
    HEAP32[$66 >> 2] = HEAP32[$66 >> 2] | 1;
    $newp_0 = $p;
    return $newp_0 | 0;
   } else {
    HEAP32[$head >> 2] = HEAP32[$head >> 2] & 1 | $nb | 2;
    HEAP32[$1 + ($nb + 4) >> 2] = $sub110 | 3;
    $71 = $1 + ($add105 | 4) | 0;
    HEAP32[$71 >> 2] = HEAP32[$71 >> 2] | 1;
    _dispose_chunk($1 + $nb | 0, $sub110);
    $newp_0 = $p;
    return $newp_0 | 0;
   }
   return 0;
  }
  function _malloc_footprint() {
   return HEAP32[11710] | 0;
  }
  function _malloc_max_footprint() {
   return HEAP32[11711] | 0;
  }
  function _malloc_footprint_limit() {
   var $0 = 0;
   $0 = HEAP32[11712] | 0;
   return (($0 | 0) == 0 ? -1 : $0) | 0;
  }
  function _malloc_set_footprint_limit($bytes) {
   $bytes = $bytes | 0;
   var $0 = 0, $result_0 = 0;
   if (($bytes | 0) == -1) {
    $result_0 = 0;
   } else {
    $0 = HEAP32[10826] | 0;
    $result_0 = $bytes - 1 + $0 & -$0;
   }
   HEAP32[11712] = $result_0;
   return $result_0 | 0;
  }
  function _internal_memalign($alignment, $bytes) {
   $alignment = $alignment | 0;
   $bytes = $bytes | 0;
   var $_alignment = 0, $a_0 = 0, $alignment_addr_1 = 0, $cond = 0, $call17 = 0, $add_ptr = 0, $0 = 0, $sub20 = 0, $3 = 0, $add_ptr28 = 0, $sub_ptr_rhs_cast = 0, $cond34 = 0, $4 = 0, $sub_ptr_sub37 = 0, $5 = 0, $6 = 0, $sub39 = 0, $9 = 0, $11 = 0, $14 = 0, $p_0 = 0, $head65 = 0, $16 = 0, $and70 = 0, $sub74 = 0, $17 = 0, $20 = 0, $mem_0 = 0;
   $_alignment = $alignment >>> 0 < 16 ? 16 : $alignment;
   if (($_alignment - 1 & $_alignment | 0) == 0) {
    $alignment_addr_1 = $_alignment;
   } else {
    $a_0 = 16;
    while (1) {
     if ($a_0 >>> 0 < $_alignment >>> 0) {
      $a_0 = $a_0 << 1;
     } else {
      $alignment_addr_1 = $a_0;
      break;
     }
    }
   }
   if ((-64 - $alignment_addr_1 | 0) >>> 0 <= $bytes >>> 0) {
    HEAP32[(___errno_location() | 0) >> 2] = 12;
    $mem_0 = 0;
    return $mem_0 | 0;
   }
   if ($bytes >>> 0 < 11) {
    $cond = 16;
   } else {
    $cond = $bytes + 11 & -8;
   }
   $call17 = _malloc($alignment_addr_1 + 12 + $cond | 0) | 0;
   if (($call17 | 0) == 0) {
    $mem_0 = 0;
    return $mem_0 | 0;
   }
   $add_ptr = $call17 - 8 | 0;
   $0 = $add_ptr;
   $sub20 = $alignment_addr_1 - 1 | 0;
   do {
    if (($call17 & $sub20 | 0) == 0) {
     $p_0 = $0;
    } else {
     $3 = $call17 + $sub20 & -$alignment_addr_1;
     $add_ptr28 = $3 - 8 | 0;
     $sub_ptr_rhs_cast = $add_ptr;
     if (($add_ptr28 - $sub_ptr_rhs_cast | 0) >>> 0 > 15) {
      $cond34 = $add_ptr28;
     } else {
      $cond34 = $3 + ($alignment_addr_1 - 8) | 0;
     }
     $4 = $cond34;
     $sub_ptr_sub37 = $cond34 - $sub_ptr_rhs_cast | 0;
     $5 = $call17 - 4 | 0;
     $6 = HEAP32[$5 >> 2] | 0;
     $sub39 = ($6 & -8) - $sub_ptr_sub37 | 0;
     if (($6 & 3 | 0) == 0) {
      HEAP32[$cond34 >> 2] = (HEAP32[$add_ptr >> 2] | 0) + $sub_ptr_sub37;
      HEAP32[$cond34 + 4 >> 2] = $sub39;
      $p_0 = $4;
      break;
     } else {
      $9 = $cond34 + 4 | 0;
      HEAP32[$9 >> 2] = $sub39 | HEAP32[$9 >> 2] & 1 | 2;
      $11 = $cond34 + ($sub39 + 4) | 0;
      HEAP32[$11 >> 2] = HEAP32[$11 >> 2] | 1;
      HEAP32[$5 >> 2] = $sub_ptr_sub37 | HEAP32[$5 >> 2] & 1 | 2;
      $14 = $call17 + ($sub_ptr_sub37 - 4) | 0;
      HEAP32[$14 >> 2] = HEAP32[$14 >> 2] | 1;
      _dispose_chunk($0, $sub_ptr_sub37);
      $p_0 = $4;
      break;
     }
    }
   } while (0);
   $head65 = $p_0 + 4 | 0;
   $16 = HEAP32[$head65 >> 2] | 0;
   do {
    if (($16 & 3 | 0) != 0) {
     $and70 = $16 & -8;
     if ($and70 >>> 0 <= ($cond + 16 | 0) >>> 0) {
      break;
     }
     $sub74 = $and70 - $cond | 0;
     $17 = $p_0;
     HEAP32[$head65 >> 2] = $cond | $16 & 1 | 2;
     HEAP32[$17 + ($cond | 4) >> 2] = $sub74 | 3;
     $20 = $17 + ($and70 | 4) | 0;
     HEAP32[$20 >> 2] = HEAP32[$20 >> 2] | 1;
     _dispose_chunk($17 + $cond | 0, $sub74);
    }
   } while (0);
   $mem_0 = $p_0 + 8 | 0;
   return $mem_0 | 0;
  }
  function _posix_memalign($pp, $alignment, $bytes) {
   $pp = $pp | 0;
   $alignment = $alignment | 0;
   $bytes = $bytes | 0;
   var $div = 0, $mem_0 = 0, $retval_0 = 0, label = 0;
   do {
    if (($alignment | 0) == 8) {
     $mem_0 = _malloc($bytes) | 0;
     label = 1246;
    } else {
     $div = $alignment >>> 2;
     if (($alignment & 3 | 0) != 0 | ($div | 0) == 0) {
      $retval_0 = 22;
      break;
     }
     if (($div + 1073741823 & $div | 0) != 0) {
      $retval_0 = 22;
      break;
     }
     if ((-64 - $alignment | 0) >>> 0 < $bytes >>> 0) {
      $retval_0 = 12;
      break;
     }
     $mem_0 = _internal_memalign($alignment >>> 0 < 16 ? 16 : $alignment, $bytes) | 0;
     label = 1246;
    }
   } while (0);
   do {
    if ((label | 0) == 1246) {
     if (($mem_0 | 0) == 0) {
      $retval_0 = 12;
      break;
     }
     HEAP32[$pp >> 2] = $mem_0;
     $retval_0 = 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function _independent_calloc($n_elements, $elem_size, $chunks) {
   $n_elements = $n_elements | 0;
   $elem_size = $elem_size | 0;
   $chunks = $chunks | 0;
   var $sz = 0, $call = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $sz = sp | 0;
   HEAP32[$sz >> 2] = $elem_size;
   $call = _ialloc($n_elements, $sz, 3, $chunks) | 0;
   STACKTOP = sp;
   return $call | 0;
  }
  function _independent_comalloc($n_elements, $sizes, $chunks) {
   $n_elements = $n_elements | 0;
   $sizes = $sizes | 0;
   $chunks = $chunks | 0;
   return _ialloc($n_elements, $sizes, 0, $chunks) | 0;
  }
  function _valloc($bytes) {
   $bytes = $bytes | 0;
   var $call_i = 0, $1 = 0, $call1 = 0;
   if ((HEAP32[10824] | 0) != 0) {
    $1 = HEAP32[10825] | 0;
    $call1 = _memalign($1, $bytes) | 0;
    return $call1 | 0;
   }
   $call_i = _sysconf(8) | 0;
   if (($call_i - 1 & $call_i | 0) != 0) {
    _abort();
    return 0;
   }
   HEAP32[10826] = $call_i;
   HEAP32[10825] = $call_i;
   HEAP32[10827] = -1;
   HEAP32[10828] = 2097152;
   HEAP32[10829] = 0;
   HEAP32[11713] = 0;
   HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
   $1 = HEAP32[10825] | 0;
   $call1 = _memalign($1, $bytes) | 0;
   return $call1 | 0;
  }
  function _pvalloc($bytes) {
   $bytes = $bytes | 0;
   var $call_i = 0, $1 = 0;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i = _sysconf(8) | 0;
     if (($call_i - 1 & $call_i | 0) == 0) {
      HEAP32[10826] = $call_i;
      HEAP32[10825] = $call_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
      return 0;
     }
    }
   } while (0);
   $1 = HEAP32[10825] | 0;
   return _memalign($1, $bytes - 1 + $1 & -$1) | 0;
  }
  function _ialloc($n_elements, $sizes, $opts, $chunks) {
   $n_elements = $n_elements | 0;
   $sizes = $sizes | 0;
   $opts = $opts | 0;
   $chunks = $chunks | 0;
   var $call_i = 0, $cmp2 = 0, $mul = 0, $array_size_0 = 0, $marray_0 = 0, $2 = 0, $cond22 = 0, $i_09 = 0, $contents_size_08 = 0, $3 = 0, $cond34 = 0, $add35 = 0, $inc = 0, $contents_size_1 = 0, $element_size_0 = 0, $call39 = 0, $add_ptr = 0, $and47 = 0, $remainder_size_0 = 0, $marray_1 = 0, $sub65 = 0, $i_15_us = 0, $remainder_size_14_us = 0, $p_0_in3_us = 0, $8 = 0, $size_0_us = 0, $sub82_us = 0, $add_ptr86_us = 0, $inc93_us = 0, $i_15 = 0, $remainder_size_14 = 0, $p_0_in3 = 0, $sub82 = 0, $add_ptr86 = 0, $inc93 = 0, $remainder_size_1_lcssa = 0, $p_0_in_lcssa = 0, $retval_0 = 0;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i = _sysconf(8) | 0;
     if (($call_i - 1 & $call_i | 0) == 0) {
      HEAP32[10826] = $call_i;
      HEAP32[10825] = $call_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
      return 0;
     }
    }
   } while (0);
   $cmp2 = ($n_elements | 0) == 0;
   do {
    if (($chunks | 0) == 0) {
     if ($cmp2) {
      $retval_0 = _malloc(0) | 0;
      return $retval_0 | 0;
     } else {
      $mul = $n_elements << 2;
      if ($mul >>> 0 < 11) {
       $marray_0 = 0;
       $array_size_0 = 16;
       break;
      }
      $marray_0 = 0;
      $array_size_0 = $mul + 11 & -8;
      break;
     }
    } else {
     if ($cmp2) {
      $retval_0 = $chunks;
     } else {
      $marray_0 = $chunks;
      $array_size_0 = 0;
      break;
     }
     return $retval_0 | 0;
    }
   } while (0);
   do {
    if (($opts & 1 | 0) == 0) {
     if ($cmp2) {
      $element_size_0 = 0;
      $contents_size_1 = 0;
      break;
     } else {
      $contents_size_08 = 0;
      $i_09 = 0;
     }
     while (1) {
      $3 = HEAP32[$sizes + ($i_09 << 2) >> 2] | 0;
      if ($3 >>> 0 < 11) {
       $cond34 = 16;
      } else {
       $cond34 = $3 + 11 & -8;
      }
      $add35 = $cond34 + $contents_size_08 | 0;
      $inc = $i_09 + 1 | 0;
      if (($inc | 0) == ($n_elements | 0)) {
       $element_size_0 = 0;
       $contents_size_1 = $add35;
       break;
      } else {
       $contents_size_08 = $add35;
       $i_09 = $inc;
      }
     }
    } else {
     $2 = HEAP32[$sizes >> 2] | 0;
     if ($2 >>> 0 < 11) {
      $cond22 = 16;
     } else {
      $cond22 = $2 + 11 & -8;
     }
     $element_size_0 = $cond22;
     $contents_size_1 = Math_imul($cond22, $n_elements) | 0;
    }
   } while (0);
   $call39 = _malloc($array_size_0 - 4 + $contents_size_1 | 0) | 0;
   if (($call39 | 0) == 0) {
    $retval_0 = 0;
    return $retval_0 | 0;
   }
   $add_ptr = $call39 - 8 | 0;
   $and47 = HEAP32[$call39 - 4 >> 2] & -8;
   if (($opts & 2 | 0) != 0) {
    _memset($call39 | 0, 0, -4 - $array_size_0 + $and47 | 0);
   }
   if (($marray_0 | 0) == 0) {
    HEAP32[$call39 + ($contents_size_1 - 4) >> 2] = $and47 - $contents_size_1 | 3;
    $marray_1 = $call39 + $contents_size_1 | 0;
    $remainder_size_0 = $contents_size_1;
   } else {
    $marray_1 = $marray_0;
    $remainder_size_0 = $and47;
   }
   HEAP32[$marray_1 >> 2] = $call39;
   $sub65 = $n_elements - 1 | 0;
   L1713 : do {
    if (($sub65 | 0) == 0) {
     $p_0_in_lcssa = $add_ptr;
     $remainder_size_1_lcssa = $remainder_size_0;
    } else {
     if (($element_size_0 | 0) == 0) {
      $p_0_in3_us = $add_ptr;
      $remainder_size_14_us = $remainder_size_0;
      $i_15_us = 0;
     } else {
      $p_0_in3 = $add_ptr;
      $remainder_size_14 = $remainder_size_0;
      $i_15 = 0;
      while (1) {
       $sub82 = $remainder_size_14 - $element_size_0 | 0;
       HEAP32[$p_0_in3 + 4 >> 2] = $element_size_0 | 3;
       $add_ptr86 = $p_0_in3 + $element_size_0 | 0;
       $inc93 = $i_15 + 1 | 0;
       HEAP32[$marray_1 + ($inc93 << 2) >> 2] = $p_0_in3 + ($element_size_0 + 8);
       if (($inc93 | 0) == ($sub65 | 0)) {
        $p_0_in_lcssa = $add_ptr86;
        $remainder_size_1_lcssa = $sub82;
        break L1713;
       } else {
        $p_0_in3 = $add_ptr86;
        $remainder_size_14 = $sub82;
        $i_15 = $inc93;
       }
      }
     }
     while (1) {
      $8 = HEAP32[$sizes + ($i_15_us << 2) >> 2] | 0;
      if ($8 >>> 0 < 11) {
       $size_0_us = 16;
      } else {
       $size_0_us = $8 + 11 & -8;
      }
      $sub82_us = $remainder_size_14_us - $size_0_us | 0;
      HEAP32[$p_0_in3_us + 4 >> 2] = $size_0_us | 3;
      $add_ptr86_us = $p_0_in3_us + $size_0_us | 0;
      $inc93_us = $i_15_us + 1 | 0;
      HEAP32[$marray_1 + ($inc93_us << 2) >> 2] = $p_0_in3_us + ($size_0_us + 8);
      if (($inc93_us | 0) == ($sub65 | 0)) {
       $p_0_in_lcssa = $add_ptr86_us;
       $remainder_size_1_lcssa = $sub82_us;
       break;
      } else {
       $p_0_in3_us = $add_ptr86_us;
       $remainder_size_14_us = $sub82_us;
       $i_15_us = $inc93_us;
      }
     }
    }
   } while (0);
   HEAP32[$p_0_in_lcssa + 4 >> 2] = $remainder_size_1_lcssa | 3;
   $retval_0 = $marray_1;
   return $retval_0 | 0;
  }
  function _bulk_free($array, $nelem) {
   $array = $array | 0;
   $nelem = $nelem | 0;
   var $arrayidx_i = 0, $a_07_i = 0, $0 = 0, $add_ptr_i = 0, $1 = 0, $2 = 0, $and_i = 0, $5 = 0, $add_ptr7_i = 0, $add_ptr_sum_i = 0, $add_i = 0, $9 = 0, $incdec_ptr_pre_phi_i = 0, label = 0;
   $arrayidx_i = $array + ($nelem << 2) | 0;
   L1726 : do {
    if (($nelem | 0) != 0) {
     $a_07_i = $array;
     L1727 : while (1) {
      $0 = HEAP32[$a_07_i >> 2] | 0;
      L1729 : do {
       if (($0 | 0) == 0) {
        $incdec_ptr_pre_phi_i = $a_07_i + 4 | 0;
       } else {
        $add_ptr_i = $0 - 8 | 0;
        $1 = $add_ptr_i;
        $2 = $0 - 4 | 0;
        $and_i = HEAP32[$2 >> 2] & -8;
        HEAP32[$a_07_i >> 2] = 0;
        if ($add_ptr_i >>> 0 < (HEAP32[11606] | 0) >>> 0) {
         label = 1312;
         break L1727;
        }
        $5 = HEAP32[$2 >> 2] | 0;
        if (($5 & 3 | 0) == 1) {
         label = 1313;
         break L1727;
        }
        $add_ptr7_i = $a_07_i + 4 | 0;
        $add_ptr_sum_i = $5 - 8 & -8;
        do {
         if (($add_ptr7_i | 0) != ($arrayidx_i | 0)) {
          if ((HEAP32[$add_ptr7_i >> 2] | 0) != ($0 + ($add_ptr_sum_i + 8) | 0)) {
           break;
          }
          $add_i = (HEAP32[$0 + ($add_ptr_sum_i | 4) >> 2] & -8) + $and_i | 0;
          HEAP32[$2 >> 2] = $5 & 1 | $add_i | 2;
          $9 = $0 + ($add_i - 4) | 0;
          HEAP32[$9 >> 2] = HEAP32[$9 >> 2] | 1;
          HEAP32[$add_ptr7_i >> 2] = $0;
          $incdec_ptr_pre_phi_i = $add_ptr7_i;
          break L1729;
         }
        } while (0);
        _dispose_chunk($1, $and_i);
        $incdec_ptr_pre_phi_i = $add_ptr7_i;
       }
      } while (0);
      if (($incdec_ptr_pre_phi_i | 0) == ($arrayidx_i | 0)) {
       break L1726;
      } else {
       $a_07_i = $incdec_ptr_pre_phi_i;
      }
     }
     if ((label | 0) == 1312) {
      _abort();
      return 0;
     } else if ((label | 0) == 1313) {
      _abort();
      return 0;
     }
    }
   } while (0);
   if ((HEAP32[11605] | 0) >>> 0 <= (HEAP32[11609] | 0) >>> 0) {
    return 0;
   }
   _sys_trim(0) | 0;
   return 0;
  }
  function _malloc_trim($pad) {
   $pad = $pad | 0;
   var $call_i = 0, $call1 = 0;
   if ((HEAP32[10824] | 0) != 0) {
    $call1 = _sys_trim($pad) | 0;
    return $call1 | 0;
   }
   $call_i = _sysconf(8) | 0;
   if (($call_i - 1 & $call_i | 0) != 0) {
    _abort();
    return 0;
   }
   HEAP32[10826] = $call_i;
   HEAP32[10825] = $call_i;
   HEAP32[10827] = -1;
   HEAP32[10828] = 2097152;
   HEAP32[10829] = 0;
   HEAP32[11713] = 0;
   HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
   $call1 = _sys_trim($pad) | 0;
   return $call1 | 0;
  }
  function _mallinfo($agg_result) {
   $agg_result = $agg_result | 0;
   var $call_i_i = 0, $1 = 0, $2 = 0, $add_i = 0, $s_011_i = 0, $sum_010_i = 0, $mfree_09_i = 0, $nfree_08_i = 0, $3 = 0, $4 = 0, $cond_i = 0, $add_ptr14_i = 0, $q_0_in5_i = 0, $sum_14_i = 0, $mfree_13_i = 0, $nfree_12_i = 0, $8 = 0, $and22_i = 0, $add23_i = 0, $nfree_2_i = 0, $mfree_2_i = 0, $add_ptr31_i = 0, $sum_1_lcssa_i = 0, $mfree_1_lcssa_i = 0, $nfree_1_lcssa_i = 0, $9 = 0, $10 = 0, $nm_sroa_7_0_i = 0, $nm_sroa_6_0_i = 0, $nm_sroa_4_0_i = 0, $nm_sroa_3_0_i = 0, $nm_sroa_1_0_i = 0, $nm_sroa_0_0_i = 0, $nm_sroa_8_0_i = 0, $12 = 0;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i_i = _sysconf(8) | 0;
     if (($call_i_i - 1 & $call_i_i | 0) == 0) {
      HEAP32[10826] = $call_i_i;
      HEAP32[10825] = $call_i_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   $1 = HEAP32[11608] | 0;
   if (($1 | 0) == 0) {
    $nm_sroa_8_0_i = 0;
    $nm_sroa_0_0_i = 0;
    $nm_sroa_1_0_i = 0;
    $nm_sroa_3_0_i = 0;
    $nm_sroa_4_0_i = 0;
    $nm_sroa_6_0_i = 0;
    $nm_sroa_7_0_i = 0;
   } else {
    $2 = HEAP32[11605] | 0;
    $add_i = $2 + 40 | 0;
    $nfree_08_i = 1;
    $mfree_09_i = $add_i;
    $sum_010_i = $add_i;
    $s_011_i = 46856;
    while (1) {
     $3 = HEAP32[$s_011_i >> 2] | 0;
     $4 = $3 + 8 | 0;
     if (($4 & 7 | 0) == 0) {
      $cond_i = 0;
     } else {
      $cond_i = -$4 & 7;
     }
     $add_ptr14_i = $3 + (HEAP32[$s_011_i + 4 >> 2] | 0) | 0;
     $nfree_12_i = $nfree_08_i;
     $mfree_13_i = $mfree_09_i;
     $sum_14_i = $sum_010_i;
     $q_0_in5_i = $3 + $cond_i | 0;
     while (1) {
      if ($q_0_in5_i >>> 0 >= $add_ptr14_i >>> 0 | ($q_0_in5_i | 0) == ($1 | 0)) {
       $nfree_1_lcssa_i = $nfree_12_i;
       $mfree_1_lcssa_i = $mfree_13_i;
       $sum_1_lcssa_i = $sum_14_i;
       break;
      }
      $8 = HEAP32[$q_0_in5_i + 4 >> 2] | 0;
      if (($8 | 0) == 7) {
       $nfree_1_lcssa_i = $nfree_12_i;
       $mfree_1_lcssa_i = $mfree_13_i;
       $sum_1_lcssa_i = $sum_14_i;
       break;
      }
      $and22_i = $8 & -8;
      $add23_i = $and22_i + $sum_14_i | 0;
      if (($8 & 3 | 0) == 1) {
       $mfree_2_i = $and22_i + $mfree_13_i | 0;
       $nfree_2_i = $nfree_12_i + 1 | 0;
      } else {
       $mfree_2_i = $mfree_13_i;
       $nfree_2_i = $nfree_12_i;
      }
      $add_ptr31_i = $q_0_in5_i + $and22_i | 0;
      if ($add_ptr31_i >>> 0 < $3 >>> 0) {
       $nfree_1_lcssa_i = $nfree_2_i;
       $mfree_1_lcssa_i = $mfree_2_i;
       $sum_1_lcssa_i = $add23_i;
       break;
      } else {
       $nfree_12_i = $nfree_2_i;
       $mfree_13_i = $mfree_2_i;
       $sum_14_i = $add23_i;
       $q_0_in5_i = $add_ptr31_i;
      }
     }
     $9 = HEAP32[$s_011_i + 8 >> 2] | 0;
     if (($9 | 0) == 0) {
      break;
     } else {
      $nfree_08_i = $nfree_1_lcssa_i;
      $mfree_09_i = $mfree_1_lcssa_i;
      $sum_010_i = $sum_1_lcssa_i;
      $s_011_i = $9;
     }
    }
    $10 = HEAP32[11710] | 0;
    $nm_sroa_8_0_i = $2;
    $nm_sroa_0_0_i = $sum_1_lcssa_i;
    $nm_sroa_1_0_i = $nfree_1_lcssa_i;
    $nm_sroa_3_0_i = $10 - $sum_1_lcssa_i | 0;
    $nm_sroa_4_0_i = HEAP32[11711] | 0;
    $nm_sroa_6_0_i = $10 - $mfree_1_lcssa_i | 0;
    $nm_sroa_7_0_i = $mfree_1_lcssa_i;
   }
   HEAP32[$agg_result >> 2] = $nm_sroa_0_0_i;
   HEAP32[$agg_result + 4 >> 2] = $nm_sroa_1_0_i;
   $12 = $agg_result + 8 | 0;
   HEAP32[$12 >> 2] = 0;
   HEAP32[$12 + 4 >> 2] = 0;
   HEAP32[$agg_result + 16 >> 2] = $nm_sroa_3_0_i;
   HEAP32[$agg_result + 20 >> 2] = $nm_sroa_4_0_i;
   HEAP32[$agg_result + 24 >> 2] = 0;
   HEAP32[$agg_result + 28 >> 2] = $nm_sroa_6_0_i;
   HEAP32[$agg_result + 32 >> 2] = $nm_sroa_7_0_i;
   HEAP32[$agg_result + 36 >> 2] = $nm_sroa_8_0_i;
   return;
  }
  function _malloc_stats() {
   var $call_i_i = 0, $1 = 0, $2 = 0, $3 = 0, $s_05_i = 0, $used_04_i = 0, $5 = 0, $6 = 0, $cond_i = 0, $add_ptr15_i = 0, $q_0_in3_i = 0, $used_12_i = 0, $10 = 0, $and27_i = 0, $used_2_i = 0, $add_ptr31_i = 0, $used_1_lcssa_i = 0, $11 = 0, $maxfp_0_i = 0, $fp_0_i = 0, $used_3_i = 0, sp = 0;
   sp = STACKTOP;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i_i = _sysconf(8) | 0;
     if (($call_i_i - 1 & $call_i_i | 0) == 0) {
      HEAP32[10826] = $call_i_i;
      HEAP32[10825] = $call_i_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   $1 = HEAP32[11608] | 0;
   if (($1 | 0) == 0) {
    $used_3_i = 0;
    $fp_0_i = 0;
    $maxfp_0_i = 0;
   } else {
    $2 = HEAP32[11711] | 0;
    $3 = HEAP32[11710] | 0;
    $used_04_i = $3 - 40 - (HEAP32[11605] | 0) | 0;
    $s_05_i = 46856;
    while (1) {
     $5 = HEAP32[$s_05_i >> 2] | 0;
     $6 = $5 + 8 | 0;
     if (($6 & 7 | 0) == 0) {
      $cond_i = 0;
     } else {
      $cond_i = -$6 & 7;
     }
     $add_ptr15_i = $5 + (HEAP32[$s_05_i + 4 >> 2] | 0) | 0;
     $used_12_i = $used_04_i;
     $q_0_in3_i = $5 + $cond_i | 0;
     while (1) {
      if ($q_0_in3_i >>> 0 >= $add_ptr15_i >>> 0 | ($q_0_in3_i | 0) == ($1 | 0)) {
       $used_1_lcssa_i = $used_12_i;
       break;
      }
      $10 = HEAP32[$q_0_in3_i + 4 >> 2] | 0;
      if (($10 | 0) == 7) {
       $used_1_lcssa_i = $used_12_i;
       break;
      }
      $and27_i = $10 & -8;
      $used_2_i = $used_12_i - (($10 & 3 | 0) == 1 ? $and27_i : 0) | 0;
      $add_ptr31_i = $q_0_in3_i + $and27_i | 0;
      if ($add_ptr31_i >>> 0 < $5 >>> 0) {
       $used_1_lcssa_i = $used_2_i;
       break;
      } else {
       $used_12_i = $used_2_i;
       $q_0_in3_i = $add_ptr31_i;
      }
     }
     $11 = HEAP32[$s_05_i + 8 >> 2] | 0;
     if (($11 | 0) == 0) {
      $used_3_i = $used_1_lcssa_i;
      $fp_0_i = $3;
      $maxfp_0_i = $2;
      break;
     } else {
      $used_04_i = $used_1_lcssa_i;
      $s_05_i = $11;
     }
    }
   }
   _fprintf(HEAP32[_stderr >> 2] | 0, 1768, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $maxfp_0_i, tempInt) | 0) | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 3768, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $fp_0_i, tempInt) | 0) | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 2680, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $used_3_i, tempInt) | 0) | 0;
   STACKTOP = sp;
   return;
  }
  function _malloc_usable_size($mem) {
   $mem = $mem | 0;
   var $1 = 0, $and = 0, $retval_0 = 0;
   do {
    if (($mem | 0) == 0) {
     $retval_0 = 0;
    } else {
     $1 = HEAP32[$mem - 4 >> 2] | 0;
     $and = $1 & 3;
     if (($and | 0) == 1) {
      $retval_0 = 0;
      break;
     }
     $retval_0 = ($1 & -8) - (($and | 0) == 0 ? 8 : 4) | 0;
    }
   } while (0);
   return $retval_0 | 0;
  }
  function _mallopt($param_number, $value) {
   $param_number = $param_number | 0;
   $value = $value | 0;
   var $call_i_i = 0, $retval_0_i = 0;
   do {
    if ((HEAP32[10824] | 0) == 0) {
     $call_i_i = _sysconf(8) | 0;
     if (($call_i_i - 1 & $call_i_i | 0) == 0) {
      HEAP32[10826] = $call_i_i;
      HEAP32[10825] = $call_i_i;
      HEAP32[10827] = -1;
      HEAP32[10828] = 2097152;
      HEAP32[10829] = 0;
      HEAP32[11713] = 0;
      HEAP32[10824] = (_time(0) | 0) & -16 ^ 1431655768;
      break;
     } else {
      _abort();
      return 0;
     }
    }
   } while (0);
   if (($param_number | 0) == (-1 | 0)) {
    HEAP32[10828] = $value;
    $retval_0_i = 1;
    return $retval_0_i | 0;
   } else if (($param_number | 0) == (-2 | 0)) {
    if ((HEAP32[10825] | 0) >>> 0 > $value >>> 0) {
     $retval_0_i = 0;
     return $retval_0_i | 0;
    }
    if (($value - 1 & $value | 0) != 0) {
     $retval_0_i = 0;
     return $retval_0_i | 0;
    }
    HEAP32[10826] = $value;
    $retval_0_i = 1;
    return $retval_0_i | 0;
   } else if (($param_number | 0) == (-3 | 0)) {
    HEAP32[10827] = $value;
    $retval_0_i = 1;
    return $retval_0_i | 0;
   } else {
    $retval_0_i = 0;
    return $retval_0_i | 0;
   }
   return 0;
  }
  function __ZSt15get_new_handlerv() {
   return (tempValue = HEAP32[11858] | 0, HEAP32[11858] = tempValue + 0, tempValue) | 0;
  }
  function _dispose_chunk($p, $psize) {
   $p = $p | 0;
   $psize = $psize | 0;
   var $0 = 0, $add_ptr = 0, $1 = 0, $2 = 0, $3 = 0, $add_ptr5 = 0, $4 = 0, $add6 = 0, $5 = 0, $shr = 0, $8 = 0, $10 = 0, $11 = 0, $fd43 = 0, $fd53_pre_phi = 0, $17 = 0, $19 = 0, $21 = 0, $23 = 0, $bk70 = 0, $fd74 = 0, $add_ptr5_sum24 = 0, $27 = 0, $28 = 0, $arrayidx90 = 0, $29 = 0, $RP_0 = 0, $R_0 = 0, $arrayidx95 = 0, $30 = 0, $arrayidx100 = 0, $31 = 0, $R_1 = 0, $33 = 0, $arrayidx118 = 0, $arrayidx138 = 0, $add_ptr5_sum26 = 0, $43 = 0, $47 = 0, $50 = 0, $psize_addr_0 = 0, $p_addr_0 = 0, $54 = 0, $55 = 0, $56 = 0, $add229 = 0, $add246 = 0, $add255 = 0, $shr256 = 0, $64 = 0, $66 = 0, $67 = 0, $fd304 = 0, $fd315_pre_phi = 0, $73 = 0, $75 = 0, $77 = 0, $79 = 0, $bk337 = 0, $fd341 = 0, $83 = 0, $84 = 0, $arrayidx361 = 0, $85 = 0, $RP354_0 = 0, $R325_0 = 0, $arrayidx368 = 0, $86 = 0, $arrayidx373 = 0, $87 = 0, $R325_1 = 0, $89 = 0, $arrayidx396 = 0, $arrayidx417 = 0, $99 = 0, $103 = 0, $psize_addr_1 = 0, $shr501 = 0, $shl508 = 0, $109 = 0, $110 = 0, $shl513 = 0, $111 = 0, $112 = 0, $_pre_phi = 0, $F511_0 = 0, $115 = 0, $shr540 = 0, $and550 = 0, $shl551 = 0, $and554 = 0, $shl556 = 0, $and559 = 0, $add564 = 0, $I539_0 = 0, $arrayidx573 = 0, $117 = 0, $shl580 = 0, $cond = 0, $T_0 = 0, $K591_0 = 0, $arrayidx607 = 0, $120 = 0, $fd626 = 0, $123 = 0, $125 = 0, label = 0;
   $0 = $p;
   $add_ptr = $0 + $psize | 0;
   $1 = $add_ptr;
   $2 = HEAP32[$p + 4 >> 2] | 0;
   L1827 : do {
    if (($2 & 1 | 0) == 0) {
     $3 = HEAP32[$p >> 2] | 0;
     if (($2 & 3 | 0) == 0) {
      return;
     }
     $add_ptr5 = $0 + (-$3 | 0) | 0;
     $4 = $add_ptr5;
     $add6 = $3 + $psize | 0;
     $5 = HEAP32[11606] | 0;
     if ($add_ptr5 >>> 0 < $5 >>> 0) {
      _abort();
     }
     if (($4 | 0) == (HEAP32[11607] | 0)) {
      $50 = $0 + ($psize + 4) | 0;
      if ((HEAP32[$50 >> 2] & 3 | 0) != 3) {
       $p_addr_0 = $4;
       $psize_addr_0 = $add6;
       break;
      }
      HEAP32[11604] = $add6;
      HEAP32[$50 >> 2] = HEAP32[$50 >> 2] & -2;
      HEAP32[$0 + (4 - $3) >> 2] = $add6 | 1;
      HEAP32[$add_ptr >> 2] = $add6;
      return;
     }
     $shr = $3 >>> 3;
     if ($3 >>> 0 < 256) {
      $8 = HEAP32[$0 + (8 - $3) >> 2] | 0;
      $10 = HEAP32[$0 + (12 - $3) >> 2] | 0;
      $11 = 46448 + ($shr << 1 << 2) | 0;
      do {
       if (($8 | 0) != ($11 | 0)) {
        if ($8 >>> 0 < $5 >>> 0) {
         _abort();
        }
        if ((HEAP32[$8 + 12 >> 2] | 0) == ($4 | 0)) {
         break;
        }
        _abort();
       }
      } while (0);
      if (($10 | 0) == ($8 | 0)) {
       HEAP32[11602] = HEAP32[11602] & ~(1 << $shr);
       $p_addr_0 = $4;
       $psize_addr_0 = $add6;
       break;
      }
      do {
       if (($10 | 0) == ($11 | 0)) {
        $fd53_pre_phi = $10 + 8 | 0;
       } else {
        if ($10 >>> 0 < $5 >>> 0) {
         _abort();
        }
        $fd43 = $10 + 8 | 0;
        if ((HEAP32[$fd43 >> 2] | 0) == ($4 | 0)) {
         $fd53_pre_phi = $fd43;
         break;
        }
        _abort();
       }
      } while (0);
      HEAP32[$8 + 12 >> 2] = $10;
      HEAP32[$fd53_pre_phi >> 2] = $8;
      $p_addr_0 = $4;
      $psize_addr_0 = $add6;
      break;
     }
     $17 = $add_ptr5;
     $19 = HEAP32[$0 + (24 - $3) >> 2] | 0;
     $21 = HEAP32[$0 + (12 - $3) >> 2] | 0;
     do {
      if (($21 | 0) == ($17 | 0)) {
       $add_ptr5_sum24 = 16 - $3 | 0;
       $27 = $0 + ($add_ptr5_sum24 + 4) | 0;
       $28 = HEAP32[$27 >> 2] | 0;
       if (($28 | 0) == 0) {
        $arrayidx90 = $0 + $add_ptr5_sum24 | 0;
        $29 = HEAP32[$arrayidx90 >> 2] | 0;
        if (($29 | 0) == 0) {
         $R_1 = 0;
         break;
        } else {
         $R_0 = $29;
         $RP_0 = $arrayidx90;
        }
       } else {
        $R_0 = $28;
        $RP_0 = $27;
       }
       while (1) {
        $arrayidx95 = $R_0 + 20 | 0;
        $30 = HEAP32[$arrayidx95 >> 2] | 0;
        if (($30 | 0) != 0) {
         $R_0 = $30;
         $RP_0 = $arrayidx95;
         continue;
        }
        $arrayidx100 = $R_0 + 16 | 0;
        $31 = HEAP32[$arrayidx100 >> 2] | 0;
        if (($31 | 0) == 0) {
         break;
        } else {
         $R_0 = $31;
         $RP_0 = $arrayidx100;
        }
       }
       if ($RP_0 >>> 0 < $5 >>> 0) {
        _abort();
       } else {
        HEAP32[$RP_0 >> 2] = 0;
        $R_1 = $R_0;
        break;
       }
      } else {
       $23 = HEAP32[$0 + (8 - $3) >> 2] | 0;
       if ($23 >>> 0 < $5 >>> 0) {
        _abort();
       }
       $bk70 = $23 + 12 | 0;
       if ((HEAP32[$bk70 >> 2] | 0) != ($17 | 0)) {
        _abort();
       }
       $fd74 = $21 + 8 | 0;
       if ((HEAP32[$fd74 >> 2] | 0) == ($17 | 0)) {
        HEAP32[$bk70 >> 2] = $21;
        HEAP32[$fd74 >> 2] = $23;
        $R_1 = $21;
        break;
       } else {
        _abort();
       }
      }
     } while (0);
     if (($19 | 0) == 0) {
      $p_addr_0 = $4;
      $psize_addr_0 = $add6;
      break;
     }
     $33 = $0 + (28 - $3) | 0;
     $arrayidx118 = 46712 + (HEAP32[$33 >> 2] << 2) | 0;
     do {
      if (($17 | 0) == (HEAP32[$arrayidx118 >> 2] | 0)) {
       HEAP32[$arrayidx118 >> 2] = $R_1;
       if (($R_1 | 0) != 0) {
        break;
       }
       HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$33 >> 2]);
       $p_addr_0 = $4;
       $psize_addr_0 = $add6;
       break L1827;
      } else {
       if ($19 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       }
       $arrayidx138 = $19 + 16 | 0;
       if ((HEAP32[$arrayidx138 >> 2] | 0) == ($17 | 0)) {
        HEAP32[$arrayidx138 >> 2] = $R_1;
       } else {
        HEAP32[$19 + 20 >> 2] = $R_1;
       }
       if (($R_1 | 0) == 0) {
        $p_addr_0 = $4;
        $psize_addr_0 = $add6;
        break L1827;
       }
      }
     } while (0);
     if ($R_1 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
     }
     HEAP32[$R_1 + 24 >> 2] = $19;
     $add_ptr5_sum26 = 16 - $3 | 0;
     $43 = HEAP32[$0 + $add_ptr5_sum26 >> 2] | 0;
     do {
      if (($43 | 0) != 0) {
       if ($43 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[$R_1 + 16 >> 2] = $43;
        HEAP32[$43 + 24 >> 2] = $R_1;
        break;
       }
      }
     } while (0);
     $47 = HEAP32[$0 + ($add_ptr5_sum26 + 4) >> 2] | 0;
     if (($47 | 0) == 0) {
      $p_addr_0 = $4;
      $psize_addr_0 = $add6;
      break;
     }
     if ($47 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[$R_1 + 20 >> 2] = $47;
      HEAP32[$47 + 24 >> 2] = $R_1;
      $p_addr_0 = $4;
      $psize_addr_0 = $add6;
      break;
     }
    } else {
     $p_addr_0 = $p;
     $psize_addr_0 = $psize;
    }
   } while (0);
   $54 = HEAP32[11606] | 0;
   if ($add_ptr >>> 0 < $54 >>> 0) {
    _abort();
   }
   $55 = $0 + ($psize + 4) | 0;
   $56 = HEAP32[$55 >> 2] | 0;
   do {
    if (($56 & 2 | 0) == 0) {
     if (($1 | 0) == (HEAP32[11608] | 0)) {
      $add229 = (HEAP32[11605] | 0) + $psize_addr_0 | 0;
      HEAP32[11605] = $add229;
      HEAP32[11608] = $p_addr_0;
      HEAP32[$p_addr_0 + 4 >> 2] = $add229 | 1;
      if (($p_addr_0 | 0) != (HEAP32[11607] | 0)) {
       return;
      }
      HEAP32[11607] = 0;
      HEAP32[11604] = 0;
      return;
     }
     if (($1 | 0) == (HEAP32[11607] | 0)) {
      $add246 = (HEAP32[11604] | 0) + $psize_addr_0 | 0;
      HEAP32[11604] = $add246;
      HEAP32[11607] = $p_addr_0;
      HEAP32[$p_addr_0 + 4 >> 2] = $add246 | 1;
      HEAP32[$p_addr_0 + $add246 >> 2] = $add246;
      return;
     }
     $add255 = ($56 & -8) + $psize_addr_0 | 0;
     $shr256 = $56 >>> 3;
     L1926 : do {
      if ($56 >>> 0 < 256) {
       $64 = HEAP32[$0 + ($psize + 8) >> 2] | 0;
       $66 = HEAP32[$0 + ($psize + 12) >> 2] | 0;
       $67 = 46448 + ($shr256 << 1 << 2) | 0;
       do {
        if (($64 | 0) != ($67 | 0)) {
         if ($64 >>> 0 < $54 >>> 0) {
          _abort();
         }
         if ((HEAP32[$64 + 12 >> 2] | 0) == ($1 | 0)) {
          break;
         }
         _abort();
        }
       } while (0);
       if (($66 | 0) == ($64 | 0)) {
        HEAP32[11602] = HEAP32[11602] & ~(1 << $shr256);
        break;
       }
       do {
        if (($66 | 0) == ($67 | 0)) {
         $fd315_pre_phi = $66 + 8 | 0;
        } else {
         if ($66 >>> 0 < $54 >>> 0) {
          _abort();
         }
         $fd304 = $66 + 8 | 0;
         if ((HEAP32[$fd304 >> 2] | 0) == ($1 | 0)) {
          $fd315_pre_phi = $fd304;
          break;
         }
         _abort();
        }
       } while (0);
       HEAP32[$64 + 12 >> 2] = $66;
       HEAP32[$fd315_pre_phi >> 2] = $64;
      } else {
       $73 = $add_ptr;
       $75 = HEAP32[$0 + ($psize + 24) >> 2] | 0;
       $77 = HEAP32[$0 + ($psize + 12) >> 2] | 0;
       do {
        if (($77 | 0) == ($73 | 0)) {
         $83 = $0 + ($psize + 20) | 0;
         $84 = HEAP32[$83 >> 2] | 0;
         if (($84 | 0) == 0) {
          $arrayidx361 = $0 + ($psize + 16) | 0;
          $85 = HEAP32[$arrayidx361 >> 2] | 0;
          if (($85 | 0) == 0) {
           $R325_1 = 0;
           break;
          } else {
           $R325_0 = $85;
           $RP354_0 = $arrayidx361;
          }
         } else {
          $R325_0 = $84;
          $RP354_0 = $83;
         }
         while (1) {
          $arrayidx368 = $R325_0 + 20 | 0;
          $86 = HEAP32[$arrayidx368 >> 2] | 0;
          if (($86 | 0) != 0) {
           $R325_0 = $86;
           $RP354_0 = $arrayidx368;
           continue;
          }
          $arrayidx373 = $R325_0 + 16 | 0;
          $87 = HEAP32[$arrayidx373 >> 2] | 0;
          if (($87 | 0) == 0) {
           break;
          } else {
           $R325_0 = $87;
           $RP354_0 = $arrayidx373;
          }
         }
         if ($RP354_0 >>> 0 < $54 >>> 0) {
          _abort();
         } else {
          HEAP32[$RP354_0 >> 2] = 0;
          $R325_1 = $R325_0;
          break;
         }
        } else {
         $79 = HEAP32[$0 + ($psize + 8) >> 2] | 0;
         if ($79 >>> 0 < $54 >>> 0) {
          _abort();
         }
         $bk337 = $79 + 12 | 0;
         if ((HEAP32[$bk337 >> 2] | 0) != ($73 | 0)) {
          _abort();
         }
         $fd341 = $77 + 8 | 0;
         if ((HEAP32[$fd341 >> 2] | 0) == ($73 | 0)) {
          HEAP32[$bk337 >> 2] = $77;
          HEAP32[$fd341 >> 2] = $79;
          $R325_1 = $77;
          break;
         } else {
          _abort();
         }
        }
       } while (0);
       if (($75 | 0) == 0) {
        break;
       }
       $89 = $0 + ($psize + 28) | 0;
       $arrayidx396 = 46712 + (HEAP32[$89 >> 2] << 2) | 0;
       do {
        if (($73 | 0) == (HEAP32[$arrayidx396 >> 2] | 0)) {
         HEAP32[$arrayidx396 >> 2] = $R325_1;
         if (($R325_1 | 0) != 0) {
          break;
         }
         HEAP32[11603] = HEAP32[11603] & ~(1 << HEAP32[$89 >> 2]);
         break L1926;
        } else {
         if ($75 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         }
         $arrayidx417 = $75 + 16 | 0;
         if ((HEAP32[$arrayidx417 >> 2] | 0) == ($73 | 0)) {
          HEAP32[$arrayidx417 >> 2] = $R325_1;
         } else {
          HEAP32[$75 + 20 >> 2] = $R325_1;
         }
         if (($R325_1 | 0) == 0) {
          break L1926;
         }
        }
       } while (0);
       if ($R325_1 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       }
       HEAP32[$R325_1 + 24 >> 2] = $75;
       $99 = HEAP32[$0 + ($psize + 16) >> 2] | 0;
       do {
        if (($99 | 0) != 0) {
         if ($99 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[$R325_1 + 16 >> 2] = $99;
          HEAP32[$99 + 24 >> 2] = $R325_1;
          break;
         }
        }
       } while (0);
       $103 = HEAP32[$0 + ($psize + 20) >> 2] | 0;
       if (($103 | 0) == 0) {
        break;
       }
       if ($103 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[$R325_1 + 20 >> 2] = $103;
        HEAP32[$103 + 24 >> 2] = $R325_1;
        break;
       }
      }
     } while (0);
     HEAP32[$p_addr_0 + 4 >> 2] = $add255 | 1;
     HEAP32[$p_addr_0 + $add255 >> 2] = $add255;
     if (($p_addr_0 | 0) != (HEAP32[11607] | 0)) {
      $psize_addr_1 = $add255;
      break;
     }
     HEAP32[11604] = $add255;
     return;
    } else {
     HEAP32[$55 >> 2] = $56 & -2;
     HEAP32[$p_addr_0 + 4 >> 2] = $psize_addr_0 | 1;
     HEAP32[$p_addr_0 + $psize_addr_0 >> 2] = $psize_addr_0;
     $psize_addr_1 = $psize_addr_0;
    }
   } while (0);
   $shr501 = $psize_addr_1 >>> 3;
   if ($psize_addr_1 >>> 0 < 256) {
    $shl508 = $shr501 << 1;
    $109 = 46448 + ($shl508 << 2) | 0;
    $110 = HEAP32[11602] | 0;
    $shl513 = 1 << $shr501;
    do {
     if (($110 & $shl513 | 0) == 0) {
      HEAP32[11602] = $110 | $shl513;
      $F511_0 = $109;
      $_pre_phi = 46448 + ($shl508 + 2 << 2) | 0;
     } else {
      $111 = 46448 + ($shl508 + 2 << 2) | 0;
      $112 = HEAP32[$111 >> 2] | 0;
      if ($112 >>> 0 >= (HEAP32[11606] | 0) >>> 0) {
       $F511_0 = $112;
       $_pre_phi = $111;
       break;
      }
      _abort();
     }
    } while (0);
    HEAP32[$_pre_phi >> 2] = $p_addr_0;
    HEAP32[$F511_0 + 12 >> 2] = $p_addr_0;
    HEAP32[$p_addr_0 + 8 >> 2] = $F511_0;
    HEAP32[$p_addr_0 + 12 >> 2] = $109;
    return;
   }
   $115 = $p_addr_0;
   $shr540 = $psize_addr_1 >>> 8;
   do {
    if (($shr540 | 0) == 0) {
     $I539_0 = 0;
    } else {
     if ($psize_addr_1 >>> 0 > 16777215) {
      $I539_0 = 31;
      break;
     }
     $and550 = ($shr540 + 1048320 | 0) >>> 16 & 8;
     $shl551 = $shr540 << $and550;
     $and554 = ($shl551 + 520192 | 0) >>> 16 & 4;
     $shl556 = $shl551 << $and554;
     $and559 = ($shl556 + 245760 | 0) >>> 16 & 2;
     $add564 = 14 - ($and554 | $and550 | $and559) + ($shl556 << $and559 >>> 15) | 0;
     $I539_0 = $psize_addr_1 >>> (($add564 + 7 | 0) >>> 0) & 1 | $add564 << 1;
    }
   } while (0);
   $arrayidx573 = 46712 + ($I539_0 << 2) | 0;
   HEAP32[$p_addr_0 + 28 >> 2] = $I539_0;
   HEAP32[$p_addr_0 + 20 >> 2] = 0;
   HEAP32[$p_addr_0 + 16 >> 2] = 0;
   $117 = HEAP32[11603] | 0;
   $shl580 = 1 << $I539_0;
   if (($117 & $shl580 | 0) == 0) {
    HEAP32[11603] = $117 | $shl580;
    HEAP32[$arrayidx573 >> 2] = $115;
    HEAP32[$p_addr_0 + 24 >> 2] = $arrayidx573;
    HEAP32[$p_addr_0 + 12 >> 2] = $p_addr_0;
    HEAP32[$p_addr_0 + 8 >> 2] = $p_addr_0;
    return;
   }
   if (($I539_0 | 0) == 31) {
    $cond = 0;
   } else {
    $cond = 25 - ($I539_0 >>> 1) | 0;
   }
   $K591_0 = $psize_addr_1 << $cond;
   $T_0 = HEAP32[$arrayidx573 >> 2] | 0;
   while (1) {
    if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_addr_1 | 0)) {
     break;
    }
    $arrayidx607 = $T_0 + 16 + ($K591_0 >>> 31 << 2) | 0;
    $120 = HEAP32[$arrayidx607 >> 2] | 0;
    if (($120 | 0) == 0) {
     label = 1501;
     break;
    } else {
     $K591_0 = $K591_0 << 1;
     $T_0 = $120;
    }
   }
   if ((label | 0) == 1501) {
    if ($arrayidx607 >>> 0 < (HEAP32[11606] | 0) >>> 0) {
     _abort();
    }
    HEAP32[$arrayidx607 >> 2] = $115;
    HEAP32[$p_addr_0 + 24 >> 2] = $T_0;
    HEAP32[$p_addr_0 + 12 >> 2] = $p_addr_0;
    HEAP32[$p_addr_0 + 8 >> 2] = $p_addr_0;
    return;
   }
   $fd626 = $T_0 + 8 | 0;
   $123 = HEAP32[$fd626 >> 2] | 0;
   $125 = HEAP32[11606] | 0;
   if ($T_0 >>> 0 < $125 >>> 0) {
    _abort();
   }
   if ($123 >>> 0 < $125 >>> 0) {
    _abort();
   }
   HEAP32[$123 + 12 >> 2] = $115;
   HEAP32[$fd626 >> 2] = $115;
   HEAP32[$p_addr_0 + 8 >> 2] = $123;
   HEAP32[$p_addr_0 + 12 >> 2] = $T_0;
   HEAP32[$p_addr_0 + 24 >> 2] = 0;
   return;
  }
  function __Znwj($size) {
   $size = $size | 0;
   var $_size = 0, $call = 0, $0 = 0, $exception = 0, label = 0;
   $_size = ($size | 0) == 0 ? 1 : $size;
   while (1) {
    $call = _malloc($_size) | 0;
    if (($call | 0) != 0) {
     label = 1545;
     break;
    }
    $0 = (tempValue = HEAP32[11858] | 0, HEAP32[11858] = tempValue + 0, tempValue);
    if (($0 | 0) == 0) {
     break;
    }
    FUNCTION_TABLE_v[$0 & 3]();
   }
   if ((label | 0) == 1545) {
    return $call | 0;
   }
   $exception = ___cxa_allocate_exception(4) | 0;
   HEAP32[$exception >> 2] = 8048;
   ___cxa_throw($exception | 0, 9944, 38);
   return 0;
  }
  function __ZNSt9bad_allocD2Ev($this) {
   $this = $this | 0;
   return;
  }
  function __ZNKSt9bad_alloc4whatEv($this) {
   $this = $this | 0;
   return 1752 | 0;
  }
  function __ZNKSt20bad_array_new_length4whatEv($this) {
   $this = $this | 0;
   return 3616 | 0;
  }
  function __ZSt15set_new_handlerPFvvE($handler) {
   $handler = $handler | 0;
   return (tempValue = HEAP32[11858] | 0, HEAP32[11858] = $handler, tempValue) | 0;
  }
  function __ZNSt9bad_allocC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8048;
   return;
  }
  function __ZNSt20bad_array_new_lengthC2Ev($this) {
   $this = $this | 0;
   HEAP32[$this >> 2] = 8112;
   return;
  }
  function __ZdlPv($ptr) {
   $ptr = $ptr | 0;
   if (($ptr | 0) == 0) {
    return;
   }
   _free($ptr);
   return;
  }
  function __ZdlPvRKSt9nothrow_t($ptr, $0) {
   $ptr = $ptr | 0;
   $0 = $0 | 0;
   __ZdlPv($ptr);
   return;
  }
  function __ZdaPv($ptr) {
   $ptr = $ptr | 0;
   __ZdlPv($ptr);
   return;
  }
  function __ZdaPvRKSt9nothrow_t($ptr, $0) {
   $ptr = $ptr | 0;
   $0 = $0 | 0;
   __ZdaPv($ptr);
   return;
  }
  function __ZNSt9bad_allocD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function __ZNSt20bad_array_new_lengthD0Ev($this) {
   $this = $this | 0;
   __ZdlPv($this);
   return;
  }
  function _getopt($nargc, $nargv, $options) {
   $nargc = $nargc | 0;
   $nargv = $nargv | 0;
   $options = $options | 0;
   return _getopt_internal($nargc, $nargv, $options, 0, 0, 0) | 0;
  }
  function _getopt_internal($nargc, $nargv, $options, $long_options, $idx, $flags) {
   $nargc = $nargc | 0;
   $nargv = $nargv | 0;
   $options = $options | 0;
   $long_options = $long_options | 0;
   $idx = $idx | 0;
   $flags = $flags | 0;
   var $0 = 0, $_pre137 = 0, $1 = 0, $2 = 0, $3 = 0, $conv = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $and_flags = 0, $flags_addr_0146 = 0, $flags_addr_0147 = 0, $options_addr_0 = 0, $_pr = 0, $8 = 0, $9 = 0, $10 = 0, $12 = 0, $13 = 0, $14 = 0, $sub_i = 0, $sub1_i = 0, $rem_i_i = 0, $c_07_i_i = 0, $b_addr_06_i_i = 0, $rem1_i_i = 0, $b_addr_0_lcssa_i_i = 0, $div_i = 0, $15 = 0, $16 = 0, $pos_023_us_i = 0, $j_022_us_i = 0, $pos_1_us_i = 0, $arrayidx_us_i = 0, $17 = 0, $inc_us_i = 0, $i_025_us_i = 0, $add_us_i = 0, $arrayidx9_us_i = 0, $18 = 0, $19 = 0, $20 = 0, $arrayidx = 0, $21 = 0, $arrayidx54 = 0, $23 = 0, $25 = 0, $26 = 0, $sub_i56 = 0, $sub1_i57 = 0, $rem_i_i58 = 0, $c_07_i_i60 = 0, $b_addr_06_i_i61 = 0, $rem1_i_i62 = 0, $b_addr_0_lcssa_i_i65 = 0, $div_i67 = 0, $27 = 0, $28 = 0, $pos_023_us_i75 = 0, $j_022_us_i76 = 0, $pos_1_us_i79 = 0, $arrayidx_us_i80 = 0, $29 = 0, $inc_us_i81 = 0, $i_025_us_i84 = 0, $add_us_i85 = 0, $arrayidx9_us_i86 = 0, $_pr_pre_pre = 0, $30 = 0, $31 = 0, $32 = 0, $_pr_pre = 0, $33 = 0, $inc82 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $inc106 = 0, $sub_i90 = 0, $sub1_i91 = 0, $rem_i_i92 = 0, $c_07_i_i94 = 0, $b_addr_06_i_i95 = 0, $rem1_i_i96 = 0, $b_addr_0_lcssa_i_i99 = 0, $div_i101 = 0, $40 = 0, $41 = 0, $pos_023_us_i109 = 0, $j_022_us_i110 = 0, $pos_1_us_i113 = 0, $arrayidx_us_i114 = 0, $42 = 0, $inc_us_i115 = 0, $i_025_us_i118 = 0, $add_us_i119 = 0, $arrayidx9_us_i120 = 0, $43 = 0, $44 = 0, $45 = 0, $46 = 0, $47 = 0, $cmp115 = 0, $49 = 0, $short_too_0 = 0, $call146 = 0, $50 = 0, $incdec_ptr152 = 0, $51 = 0, $conv153 = 0, $call164 = 0, $56 = 0, $inc202 = 0, $call220 = 0, $inc240 = 0, $retval_0 = 0, label = 0, sp = 0;
   sp = STACKTOP;
   if (($options | 0) == 0) {
    $retval_0 = -1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   $0 = HEAP32[70] | 0;
   if (($0 | 0) == 0) {
    HEAP32[10820] = 1;
    HEAP32[70] = 1;
    $3 = 1;
    $2 = 1;
    label = 1569;
   } else {
    $_pre137 = HEAP32[10820] | 0;
    $1 = HEAP32[100] | 0;
    if (($1 | 0) == -1 | ($_pre137 | 0) != 0) {
     $3 = $_pre137;
     $2 = $0;
     label = 1569;
    } else {
     $6 = $1;
     $5 = $_pre137;
     $4 = $0;
    }
   }
   if ((label | 0) == 1569) {
    $conv = (_getenv(1216) | 0) != 0 | 0;
    HEAP32[100] = $conv;
    $6 = $conv;
    $5 = $3;
    $4 = $2;
   }
   $7 = HEAP8[$options] | 0;
   if ($7 << 24 >> 24 == 45) {
    $flags_addr_0146 = $flags | 2;
    label = 1573;
   } else {
    $and_flags = ($6 | 0) != 0 | $7 << 24 >> 24 == 43 ? $flags & -2 : $flags;
    if ($7 << 24 >> 24 == 43) {
     $flags_addr_0146 = $and_flags;
     label = 1573;
    } else {
     $options_addr_0 = $options;
     $flags_addr_0147 = $and_flags;
    }
   }
   if ((label | 0) == 1573) {
    $options_addr_0 = $options + 1 | 0;
    $flags_addr_0147 = $flags_addr_0146;
   }
   HEAP32[10822] = 0;
   if (($5 | 0) == 0) {
    $9 = $4;
    label = 1577;
   } else {
    HEAP32[76] = -1;
    HEAP32[74] = -1;
    $8 = $4;
    $_pr = $5;
    label = 1576;
   }
   while (1) {
    if ((label | 0) == 1576) {
     label = 0;
     if (($_pr | 0) == 0) {
      $9 = $8;
      label = 1577;
      continue;
     } else {
      $12 = $8;
     }
    } else if ((label | 0) == 1577) {
     label = 0;
     $10 = HEAP32[66] | 0;
     if ((HEAP8[$10] | 0) == 0) {
      $12 = $9;
     } else {
      $47 = $10;
      $46 = $9;
      break;
     }
    }
    HEAP32[10820] = 0;
    if (($12 | 0) >= ($nargc | 0)) {
     label = 1579;
     break;
    }
    $arrayidx = $nargv + ($12 << 2) | 0;
    $21 = HEAP32[$arrayidx >> 2] | 0;
    HEAP32[66] = $21;
    if ((HEAP8[$21] | 0) == 45) {
     $arrayidx54 = $21 + 1 | 0;
     $23 = HEAP8[$arrayidx54] | 0;
     if ($23 << 24 >> 24 != 0) {
      label = 1611;
      break;
     }
     if ((_strchr($options_addr_0 | 0, 45) | 0) != 0) {
      label = 1611;
      break;
     }
    }
    HEAP32[66] = 46400;
    if (($flags_addr_0147 & 2 | 0) != 0) {
     label = 1596;
     break;
    }
    if (($flags_addr_0147 & 1 | 0) == 0) {
     $retval_0 = -1;
     label = 1681;
     break;
    }
    $25 = HEAP32[74] | 0;
    do {
     if (($25 | 0) == -1) {
      HEAP32[74] = $12;
      $33 = $12;
      $_pr_pre = 0;
     } else {
      $26 = HEAP32[76] | 0;
      if (($26 | 0) == -1) {
       $33 = $12;
       $_pr_pre = 0;
       break;
      }
      $sub_i56 = $26 - $25 | 0;
      $sub1_i57 = $12 - $26 | 0;
      $rem_i_i58 = ($sub_i56 | 0) % ($sub1_i57 | 0) | 0;
      if (($rem_i_i58 | 0) == 0) {
       $b_addr_0_lcssa_i_i65 = $sub1_i57;
      } else {
       $b_addr_06_i_i61 = $sub1_i57;
       $c_07_i_i60 = $rem_i_i58;
       while (1) {
        $rem1_i_i62 = ($b_addr_06_i_i61 | 0) % ($c_07_i_i60 | 0) | 0;
        if (($rem1_i_i62 | 0) == 0) {
         $b_addr_0_lcssa_i_i65 = $c_07_i_i60;
         break;
        } else {
         $b_addr_06_i_i61 = $c_07_i_i60;
         $c_07_i_i60 = $rem1_i_i62;
        }
       }
      }
      $div_i67 = ($12 - $25 | 0) / ($b_addr_0_lcssa_i_i65 | 0) | 0;
      do {
       if (($b_addr_0_lcssa_i_i65 | 0) > 0) {
        $27 = -$sub_i56 | 0;
        if (($div_i67 | 0) > 0) {
         $i_025_us_i84 = 0;
        } else {
         $32 = $12;
         $31 = $26;
         $30 = $25;
         $_pr_pre_pre = 0;
         break;
        }
        do {
         $add_us_i85 = $i_025_us_i84 + $26 | 0;
         $arrayidx9_us_i86 = $nargv + ($add_us_i85 << 2) | 0;
         $j_022_us_i76 = 0;
         $pos_023_us_i75 = $add_us_i85;
         $28 = HEAP32[$arrayidx9_us_i86 >> 2] | 0;
         while (1) {
          $pos_1_us_i79 = (($pos_023_us_i75 | 0) < ($26 | 0) ? $sub1_i57 : $27) + $pos_023_us_i75 | 0;
          $arrayidx_us_i80 = $nargv + ($pos_1_us_i79 << 2) | 0;
          $29 = HEAP32[$arrayidx_us_i80 >> 2] | 0;
          HEAP32[$arrayidx_us_i80 >> 2] = $28;
          HEAP32[$arrayidx9_us_i86 >> 2] = $29;
          $inc_us_i81 = $j_022_us_i76 + 1 | 0;
          if (($inc_us_i81 | 0) < ($div_i67 | 0)) {
           $j_022_us_i76 = $inc_us_i81;
           $pos_023_us_i75 = $pos_1_us_i79;
           $28 = $29;
          } else {
           break;
          }
         }
         $i_025_us_i84 = $i_025_us_i84 + 1 | 0;
        } while (($i_025_us_i84 | 0) < ($b_addr_0_lcssa_i_i65 | 0));
        $32 = HEAP32[70] | 0;
        $31 = HEAP32[76] | 0;
        $30 = HEAP32[74] | 0;
        $_pr_pre_pre = HEAP32[10820] | 0;
       } else {
        $32 = $12;
        $31 = $26;
        $30 = $25;
        $_pr_pre_pre = 0;
       }
      } while (0);
      HEAP32[74] = $32 - $31 + $30;
      HEAP32[76] = -1;
      $33 = $32;
      $_pr_pre = $_pr_pre_pre;
     }
    } while (0);
    $inc82 = $33 + 1 | 0;
    HEAP32[70] = $inc82;
    $8 = $inc82;
    $_pr = $_pr_pre;
    label = 1576;
   }
   do {
    if ((label | 0) == 1579) {
     HEAP32[66] = 46400;
     $13 = HEAP32[76] | 0;
     $14 = HEAP32[74] | 0;
     do {
      if (($13 | 0) == -1) {
       if (($14 | 0) == -1) {
        break;
       }
       HEAP32[70] = $14;
      } else {
       $sub_i = $13 - $14 | 0;
       $sub1_i = $12 - $13 | 0;
       $rem_i_i = ($sub_i | 0) % ($sub1_i | 0) | 0;
       if (($rem_i_i | 0) == 0) {
        $b_addr_0_lcssa_i_i = $sub1_i;
       } else {
        $b_addr_06_i_i = $sub1_i;
        $c_07_i_i = $rem_i_i;
        while (1) {
         $rem1_i_i = ($b_addr_06_i_i | 0) % ($c_07_i_i | 0) | 0;
         if (($rem1_i_i | 0) == 0) {
          $b_addr_0_lcssa_i_i = $c_07_i_i;
          break;
         } else {
          $b_addr_06_i_i = $c_07_i_i;
          $c_07_i_i = $rem1_i_i;
         }
        }
       }
       $div_i = ($12 - $14 | 0) / ($b_addr_0_lcssa_i_i | 0) | 0;
       do {
        if (($b_addr_0_lcssa_i_i | 0) > 0) {
         $15 = -$sub_i | 0;
         if (($div_i | 0) > 0) {
          $i_025_us_i = 0;
         } else {
          $20 = $13;
          $19 = $14;
          $18 = $12;
          break;
         }
         do {
          $add_us_i = $i_025_us_i + $13 | 0;
          $arrayidx9_us_i = $nargv + ($add_us_i << 2) | 0;
          $j_022_us_i = 0;
          $pos_023_us_i = $add_us_i;
          $16 = HEAP32[$arrayidx9_us_i >> 2] | 0;
          while (1) {
           $pos_1_us_i = (($pos_023_us_i | 0) < ($13 | 0) ? $sub1_i : $15) + $pos_023_us_i | 0;
           $arrayidx_us_i = $nargv + ($pos_1_us_i << 2) | 0;
           $17 = HEAP32[$arrayidx_us_i >> 2] | 0;
           HEAP32[$arrayidx_us_i >> 2] = $16;
           HEAP32[$arrayidx9_us_i >> 2] = $17;
           $inc_us_i = $j_022_us_i + 1 | 0;
           if (($inc_us_i | 0) < ($div_i | 0)) {
            $j_022_us_i = $inc_us_i;
            $pos_023_us_i = $pos_1_us_i;
            $16 = $17;
           } else {
            break;
           }
          }
          $i_025_us_i = $i_025_us_i + 1 | 0;
         } while (($i_025_us_i | 0) < ($b_addr_0_lcssa_i_i | 0));
         $20 = HEAP32[76] | 0;
         $19 = HEAP32[74] | 0;
         $18 = HEAP32[70] | 0;
        } else {
         $20 = $13;
         $19 = $14;
         $18 = $12;
        }
       } while (0);
       HEAP32[70] = $19 - $20 + $18;
      }
     } while (0);
     HEAP32[76] = -1;
     HEAP32[74] = -1;
     $retval_0 = -1;
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 1611) {
     $34 = HEAP32[74] | 0;
     $35 = HEAP32[76] | 0;
     if (($34 | 0) != -1 & ($35 | 0) == -1) {
      HEAP32[76] = $12;
      $37 = HEAP8[$arrayidx54] | 0;
      $36 = $12;
     } else {
      $37 = $23;
      $36 = $35;
     }
     if ($37 << 24 >> 24 == 0) {
      $47 = $21;
      $46 = $12;
      break;
     }
     HEAP32[66] = $arrayidx54;
     if ((HEAP8[$arrayidx54] | 0) != 45) {
      $47 = $arrayidx54;
      $46 = $12;
      break;
     }
     if ((HEAP8[$21 + 2 | 0] | 0) != 0) {
      $47 = $arrayidx54;
      $46 = $12;
      break;
     }
     $inc106 = $12 + 1 | 0;
     HEAP32[70] = $inc106;
     HEAP32[66] = 46400;
     if (($36 | 0) != -1) {
      $sub_i90 = $36 - $34 | 0;
      $sub1_i91 = $inc106 - $36 | 0;
      $rem_i_i92 = ($sub_i90 | 0) % ($sub1_i91 | 0) | 0;
      if (($rem_i_i92 | 0) == 0) {
       $b_addr_0_lcssa_i_i99 = $sub1_i91;
      } else {
       $b_addr_06_i_i95 = $sub1_i91;
       $c_07_i_i94 = $rem_i_i92;
       while (1) {
        $rem1_i_i96 = ($b_addr_06_i_i95 | 0) % ($c_07_i_i94 | 0) | 0;
        if (($rem1_i_i96 | 0) == 0) {
         $b_addr_0_lcssa_i_i99 = $c_07_i_i94;
         break;
        } else {
         $b_addr_06_i_i95 = $c_07_i_i94;
         $c_07_i_i94 = $rem1_i_i96;
        }
       }
      }
      $div_i101 = ($inc106 - $34 | 0) / ($b_addr_0_lcssa_i_i99 | 0) | 0;
      do {
       if (($b_addr_0_lcssa_i_i99 | 0) > 0) {
        $40 = -$sub_i90 | 0;
        if (($div_i101 | 0) > 0) {
         $i_025_us_i118 = 0;
        } else {
         $45 = $36;
         $44 = $34;
         $43 = $inc106;
         break;
        }
        do {
         $add_us_i119 = $i_025_us_i118 + $36 | 0;
         $arrayidx9_us_i120 = $nargv + ($add_us_i119 << 2) | 0;
         $j_022_us_i110 = 0;
         $pos_023_us_i109 = $add_us_i119;
         $41 = HEAP32[$arrayidx9_us_i120 >> 2] | 0;
         while (1) {
          $pos_1_us_i113 = (($pos_023_us_i109 | 0) < ($36 | 0) ? $sub1_i91 : $40) + $pos_023_us_i109 | 0;
          $arrayidx_us_i114 = $nargv + ($pos_1_us_i113 << 2) | 0;
          $42 = HEAP32[$arrayidx_us_i114 >> 2] | 0;
          HEAP32[$arrayidx_us_i114 >> 2] = $41;
          HEAP32[$arrayidx9_us_i120 >> 2] = $42;
          $inc_us_i115 = $j_022_us_i110 + 1 | 0;
          if (($inc_us_i115 | 0) < ($div_i101 | 0)) {
           $j_022_us_i110 = $inc_us_i115;
           $pos_023_us_i109 = $pos_1_us_i113;
           $41 = $42;
          } else {
           break;
          }
         }
         $i_025_us_i118 = $i_025_us_i118 + 1 | 0;
        } while (($i_025_us_i118 | 0) < ($b_addr_0_lcssa_i_i99 | 0));
        $45 = HEAP32[76] | 0;
        $44 = HEAP32[74] | 0;
        $43 = HEAP32[70] | 0;
       } else {
        $45 = $36;
        $44 = $34;
        $43 = $inc106;
       }
      } while (0);
      HEAP32[70] = $44 - $45 + $43;
     }
     HEAP32[76] = -1;
     HEAP32[74] = -1;
     $retval_0 = -1;
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 1596) {
     HEAP32[70] = $12 + 1;
     HEAP32[10822] = HEAP32[$arrayidx >> 2];
     $retval_0 = 1;
     STACKTOP = sp;
     return $retval_0 | 0;
    } else if ((label | 0) == 1681) {
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } while (0);
   $cmp115 = ($long_options | 0) != 0;
   L2160 : do {
    if ($cmp115) {
     if (($47 | 0) == (HEAP32[$nargv + ($46 << 2) >> 2] | 0)) {
      $50 = $47;
      break;
     }
     $49 = HEAP8[$47] | 0;
     do {
      if ($49 << 24 >> 24 == 45) {
       HEAP32[66] = $47 + 1;
       $short_too_0 = 0;
      } else {
       if (($flags_addr_0147 & 4 | 0) == 0) {
        $50 = $47;
        break L2160;
       }
       if ($49 << 24 >> 24 == 58) {
        $short_too_0 = 0;
        break;
       }
       $short_too_0 = (_strchr($options_addr_0 | 0, $49 << 24 >> 24 | 0) | 0) != 0 | 0;
      }
     } while (0);
     $call146 = _parse_long_options($nargv, $options_addr_0, $long_options, $idx, $short_too_0) | 0;
     if (($call146 | 0) == -1) {
      $50 = HEAP32[66] | 0;
      break;
     }
     HEAP32[66] = 46400;
     $retval_0 = $call146;
     STACKTOP = sp;
     return $retval_0 | 0;
    } else {
     $50 = $47;
    }
   } while (0);
   $incdec_ptr152 = $50 + 1 | 0;
   HEAP32[66] = $incdec_ptr152;
   $51 = HEAP8[$50] | 0;
   $conv153 = $51 << 24 >> 24;
   if (($51 << 24 >> 24 | 0) == 58) {
    label = 1642;
   } else if (($51 << 24 >> 24 | 0) == 45) {
    if ((HEAP8[$incdec_ptr152] | 0) == 0) {
     label = 1639;
    }
   } else {
    label = 1639;
   }
   do {
    if ((label | 0) == 1639) {
     $call164 = _strchr($options_addr_0 | 0, $conv153 | 0) | 0;
     if (($call164 | 0) == 0) {
      if ($51 << 24 >> 24 != 45) {
       label = 1642;
       break;
      }
      if ((HEAP8[$incdec_ptr152] | 0) == 0) {
       $retval_0 = -1;
      } else {
       break;
      }
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     $56 = HEAP8[$call164 + 1 | 0] | 0;
     if ($cmp115 & $51 << 24 >> 24 == 87 & $56 << 24 >> 24 == 59) {
      do {
       if ((HEAP8[$incdec_ptr152] | 0) == 0) {
        $inc202 = (HEAP32[70] | 0) + 1 | 0;
        HEAP32[70] = $inc202;
        if (($inc202 | 0) < ($nargc | 0)) {
         HEAP32[66] = HEAP32[$nargv + ($inc202 << 2) >> 2];
         break;
        }
        HEAP32[66] = 46400;
        do {
         if ((HEAP32[72] | 0) != 0) {
          if ((HEAP8[$options_addr_0] | 0) == 58) {
           break;
          }
          __warnx(152, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $conv153, tempInt) | 0);
         }
        } while (0);
        HEAP32[68] = $conv153;
        $retval_0 = (HEAP8[$options_addr_0] | 0) == 58 ? 58 : 63;
        STACKTOP = sp;
        return $retval_0 | 0;
       }
      } while (0);
      $call220 = _parse_long_options($nargv, $options_addr_0, $long_options, $idx, 0) | 0;
      HEAP32[66] = 46400;
      $retval_0 = $call220;
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     if ($56 << 24 >> 24 != 58) {
      if ((HEAP8[$incdec_ptr152] | 0) != 0) {
       $retval_0 = $conv153;
       STACKTOP = sp;
       return $retval_0 | 0;
      }
      HEAP32[70] = (HEAP32[70] | 0) + 1;
      $retval_0 = $conv153;
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     HEAP32[10822] = 0;
     do {
      if ((HEAP8[$incdec_ptr152] | 0) == 0) {
       if ((HEAP8[$call164 + 2 | 0] | 0) == 58) {
        break;
       }
       $inc240 = (HEAP32[70] | 0) + 1 | 0;
       HEAP32[70] = $inc240;
       if (($inc240 | 0) < ($nargc | 0)) {
        HEAP32[10822] = HEAP32[$nargv + ($inc240 << 2) >> 2];
        break;
       }
       HEAP32[66] = 46400;
       do {
        if ((HEAP32[72] | 0) != 0) {
         if ((HEAP8[$options_addr_0] | 0) == 58) {
          break;
         }
         __warnx(152, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $conv153, tempInt) | 0);
        }
       } while (0);
       HEAP32[68] = $conv153;
       $retval_0 = (HEAP8[$options_addr_0] | 0) == 58 ? 58 : 63;
       STACKTOP = sp;
       return $retval_0 | 0;
      } else {
       HEAP32[10822] = $incdec_ptr152;
      }
     } while (0);
     HEAP32[66] = 46400;
     HEAP32[70] = (HEAP32[70] | 0) + 1;
     $retval_0 = $conv153;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } while (0);
   do {
    if ((label | 0) == 1642) {
     if ((HEAP8[$incdec_ptr152] | 0) != 0) {
      break;
     }
     HEAP32[70] = (HEAP32[70] | 0) + 1;
    }
   } while (0);
   do {
    if ((HEAP32[72] | 0) != 0) {
     if ((HEAP8[$options_addr_0] | 0) == 58) {
      break;
     }
     __warnx(376, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $conv153, tempInt) | 0);
    }
   } while (0);
   HEAP32[68] = $conv153;
   $retval_0 = 63;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function _getopt_long($nargc, $nargv, $options, $long_options, $idx) {
   $nargc = $nargc | 0;
   $nargv = $nargv | 0;
   $options = $options | 0;
   $long_options = $long_options | 0;
   $idx = $idx | 0;
   return _getopt_internal($nargc, $nargv, $options, $long_options, $idx, 1) | 0;
  }
  function _getopt_long_only($nargc, $nargv, $options, $long_options, $idx) {
   $nargc = $nargc | 0;
   $nargv = $nargv | 0;
   $options = $options | 0;
   $long_options = $long_options | 0;
   $idx = $idx | 0;
   return _getopt_internal($nargc, $nargv, $options, $long_options, $idx, 5) | 0;
  }
  function __ZnwjRKSt9nothrow_t($size, $0) {
   $size = $size | 0;
   $0 = $0 | 0;
   return __Znwj($size) | 0;
  }
  function __Znaj($size) {
   $size = $size | 0;
   return __Znwj($size) | 0;
  }
  function __ZnajRKSt9nothrow_t($size, $0) {
   $size = $size | 0;
   $0 = $0 | 0;
   return __Znaj($size) | 0;
  }
  function __ZSt17__throw_bad_allocv() {
   var $exception = 0;
   $exception = ___cxa_allocate_exception(4) | 0;
   HEAP32[$exception >> 2] = 8048;
   ___cxa_throw($exception | 0, 9944, 38);
  }
  function _parse_long_options($nargv, $options, $long_options, $idx, $short_too) {
   $nargv = $nargv | 0;
   $options = $options | 0;
   $long_options = $long_options | 0;
   $idx = $idx | 0;
   $short_too = $short_too | 0;
   var $0 = 0, $1 = 0, $inc = 0, $call = 0, $has_equal_0 = 0, $current_argv_len_0 = 0, $2 = 0, $3 = 0, $i_061_us = 0, $5 = 0, $match_062 = 0, $i_061 = 0, $match_1 = 0, $inc28 = 0, $8 = 0, $match_2 = 0, $has_arg = 0, $9 = 0, $tobool36 = 0, $storemerge56 = 0, $storemerge = 0, $26 = 0, $27 = 0, $retval_0 = 0, sp = 0;
   sp = STACKTOP;
   $0 = HEAP32[66] | 0;
   $1 = HEAP32[70] | 0;
   $inc = $1 + 1 | 0;
   HEAP32[70] = $inc;
   $call = _strchr($0 | 0, 61) | 0;
   if (($call | 0) == 0) {
    $current_argv_len_0 = _strlen($0 | 0) | 0;
    $has_equal_0 = 0;
   } else {
    $current_argv_len_0 = $call - $0 | 0;
    $has_equal_0 = $call + 1 | 0;
   }
   $2 = HEAP32[$long_options >> 2] | 0;
   L2242 : do {
    if (($2 | 0) != 0) {
     L2244 : do {
      if (($short_too | 0) != 0 & ($current_argv_len_0 | 0) == 1) {
       $i_061_us = 0;
       $3 = $2;
       while (1) {
        if ((HEAP8[$0] | 0) == (HEAP8[$3] | 0)) {
         if ((_strlen($3 | 0) | 0) == 1) {
          $match_2 = $i_061_us;
          break L2244;
         }
        }
        $i_061_us = $i_061_us + 1 | 0;
        $3 = HEAP32[$long_options + ($i_061_us << 4) >> 2] | 0;
        if (($3 | 0) == 0) {
         break L2242;
        }
       }
      } else {
       $i_061 = 0;
       $match_062 = -1;
       $5 = $2;
       while (1) {
        if ((_strncmp($0 | 0, $5 | 0, $current_argv_len_0 | 0) | 0) == 0) {
         if ((_strlen($5 | 0) | 0) == ($current_argv_len_0 | 0)) {
          $match_2 = $i_061;
          break L2244;
         }
         if (($match_062 | 0) == -1) {
          $match_1 = $i_061;
         } else {
          break;
         }
        } else {
         $match_1 = $match_062;
        }
        $inc28 = $i_061 + 1 | 0;
        $8 = HEAP32[$long_options + ($inc28 << 4) >> 2] | 0;
        if (($8 | 0) == 0) {
         $match_2 = $match_1;
         break L2244;
        } else {
         $i_061 = $inc28;
         $match_062 = $match_1;
         $5 = $8;
        }
       }
       do {
        if ((HEAP32[72] | 0) != 0) {
         if ((HEAP8[$options] | 0) == 58) {
          break;
         }
         __warnx(408, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAP32[tempInt >> 2] = $current_argv_len_0, HEAP32[tempInt + 8 >> 2] = $0, tempInt) | 0);
        }
       } while (0);
       HEAP32[68] = 0;
       $retval_0 = 63;
       STACKTOP = sp;
       return $retval_0 | 0;
      }
     } while (0);
     if (($match_2 | 0) == -1) {
      break;
     }
     $has_arg = $long_options + ($match_2 << 4) + 4 | 0;
     $9 = HEAP32[$has_arg >> 2] | 0;
     $tobool36 = ($has_equal_0 | 0) == 0;
     if (!(($9 | 0) != 0 | $tobool36)) {
      do {
       if ((HEAP32[72] | 0) != 0) {
        if ((HEAP8[$options] | 0) == 58) {
         break;
        }
        __warnx(312, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAP32[tempInt >> 2] = $current_argv_len_0, HEAP32[tempInt + 8 >> 2] = $0, tempInt) | 0);
       }
      } while (0);
      if ((HEAP32[$long_options + ($match_2 << 4) + 8 >> 2] | 0) == 0) {
       $storemerge56 = HEAP32[$long_options + ($match_2 << 4) + 12 >> 2] | 0;
      } else {
       $storemerge56 = 0;
      }
      HEAP32[68] = $storemerge56;
      $retval_0 = (HEAP8[$options] | 0) == 58 ? 58 : 63;
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     do {
      if (($9 - 1 | 0) >>> 0 < 2) {
       if (!$tobool36) {
        HEAP32[10822] = $has_equal_0;
        break;
       }
       if (($9 | 0) != 1) {
        break;
       }
       HEAP32[70] = $1 + 2;
       HEAP32[10822] = HEAP32[$nargv + ($inc << 2) >> 2];
      }
     } while (0);
     if (!((HEAP32[$has_arg >> 2] | 0) == 1 & (HEAP32[10822] | 0) == 0)) {
      if (($idx | 0) != 0) {
       HEAP32[$idx >> 2] = $match_2;
      }
      $26 = HEAP32[$long_options + ($match_2 << 4) + 8 >> 2] | 0;
      $27 = HEAP32[$long_options + ($match_2 << 4) + 12 >> 2] | 0;
      if (($26 | 0) == 0) {
       $retval_0 = $27;
       STACKTOP = sp;
       return $retval_0 | 0;
      }
      HEAP32[$26 >> 2] = $27;
      $retval_0 = 0;
      STACKTOP = sp;
      return $retval_0 | 0;
     }
     do {
      if ((HEAP32[72] | 0) != 0) {
       if ((HEAP8[$options] | 0) == 58) {
        break;
       }
       __warnx(112, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $0, tempInt) | 0);
      }
     } while (0);
     if ((HEAP32[$long_options + ($match_2 << 4) + 8 >> 2] | 0) == 0) {
      $storemerge = HEAP32[$long_options + ($match_2 << 4) + 12 >> 2] | 0;
     } else {
      $storemerge = 0;
     }
     HEAP32[68] = $storemerge;
     HEAP32[70] = (HEAP32[70] | 0) - 1;
     $retval_0 = (HEAP8[$options] | 0) == 58 ? 58 : 63;
     STACKTOP = sp;
     return $retval_0 | 0;
    }
   } while (0);
   if (($short_too | 0) != 0) {
    HEAP32[70] = $1;
    $retval_0 = -1;
    STACKTOP = sp;
    return $retval_0 | 0;
   }
   do {
    if ((HEAP32[72] | 0) != 0) {
     if ((HEAP8[$options] | 0) == 58) {
      break;
     }
     __warnx(352, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $0, tempInt) | 0);
    }
   } while (0);
   HEAP32[68] = 0;
   $retval_0 = 63;
   STACKTOP = sp;
   return $retval_0 | 0;
  }
  function __warn($fmt, varrp) {
   $fmt = $fmt | 0;
   varrp = varrp | 0;
   var $ap = 0, $arraydecay1 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $ap = sp | 0;
   $arraydecay1 = $ap;
   HEAP32[$arraydecay1 >> 2] = varrp;
   HEAP32[$arraydecay1 + 4 >> 2] = 0;
   __vwarn($fmt, $ap | 0);
   STACKTOP = sp;
   return;
  }
  function __warnx($fmt, varrp) {
   $fmt = $fmt | 0;
   varrp = varrp | 0;
   var $ap = 0, $arraydecay1 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $ap = sp | 0;
   $arraydecay1 = $ap;
   HEAP32[$arraydecay1 >> 2] = varrp;
   HEAP32[$arraydecay1 + 4 >> 2] = 0;
   __vwarnx($fmt, $ap | 0);
   STACKTOP = sp;
   return;
  }
  function __vwarn($fmt, $ap) {
   $fmt = $fmt | 0;
   $ap = $ap | 0;
   var $0 = 0, $2 = 0, $3 = 0, $4 = 0, $6 = 0, $call4 = 0, sp = 0;
   sp = STACKTOP;
   $0 = HEAP32[(___errno_location() | 0) >> 2] | 0;
   $2 = HEAP32[___progname >> 2] | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 3136, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $2, tempInt) | 0) | 0;
   if (($fmt | 0) != 0) {
    $3 = HEAP32[_stderr >> 2] | 0;
    _vfprintf($3 | 0, $fmt | 0, $ap | 0) | 0;
    $4 = HEAP32[_stderr >> 2] | 0;
    _fwrite(4056, 2, 1, $4 | 0) | 0;
   }
   $6 = HEAP32[_stderr >> 2] | 0;
   $call4 = _strerror($0 | 0) | 0;
   _fprintf($6 | 0, 2832, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $call4, tempInt) | 0) | 0;
   STACKTOP = sp;
   return;
  }
  function __vwarnx($fmt, $ap) {
   $fmt = $fmt | 0;
   $ap = $ap | 0;
   var $1 = 0, $2 = 0, sp = 0;
   sp = STACKTOP;
   $1 = HEAP32[___progname >> 2] | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 2672, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $1, tempInt) | 0) | 0;
   if (($fmt | 0) != 0) {
    $2 = HEAP32[_stderr >> 2] | 0;
    _vfprintf($2 | 0, $fmt | 0, $ap | 0) | 0;
   }
   _fputc(10, HEAP32[_stderr >> 2] | 0) | 0;
   STACKTOP = sp;
   return;
  }
  function _strtod($string, $endPtr) {
   $string = $string | 0;
   $endPtr = $endPtr | 0;
   var $p_0 = 0, $add_ptr = 0, $1 = 0, $sign_0 = 0, $p_2 = 0, $p_3 = 0, $mantSize_0 = 0, $decPt_0 = 0, $2 = 0, $decPt_1 = 0, $add_ptr22 = 0, $cmp23 = 0, $mantSize_1 = 0, $cmp28 = 0, $fracExp_0 = 0, $mantSize_2 = 0, $p_4_lcssa91 = 0, $mantSize_3_lcssa90 = 0, $frac1_0_lcssa89 = 0.0, $frac1_081 = 0, $mantSize_380 = 0, $p_479 = 0, $4 = 0, $add_ptr43 = 0, $p_5 = 0, $c_0_in = 0, $add51 = 0, $sub53 = 0, $frac2_076 = 0, $mantSize_475 = 0, $p_674 = 0, $6 = 0, $add_ptr60 = 0, $p_7 = 0, $c_1_in = 0, $add69 = 0, $sub71 = 0, $frac1_0_lcssa88 = 0.0, $frac2_0_lcssa = 0.0, $add76 = 0.0, $add_ptr86 = 0, $8 = 0, $expSign_0_ph = 0, $p_9_ph = 0, $9 = 0, $10 = 0, $exp_070 = 0, $p_969 = 0, $add108 = 0, $add_ptr109 = 0, $11 = 0, $expSign_1 = 0, $p_10 = 0, $exp_1 = 0, $exp_2 = 0, $exp_3 = 0, $exp_565 = 0, $d_064 = 0, $dblExp_063 = 0.0, $dblExp_1 = 0.0, $shr = 0, $dblExp_0_lcssa = 0.0, $fraction_0 = 0.0, $p_11 = 0, $retval_0 = 0.0, label = 0;
   $p_0 = $string;
   while (1) {
    $add_ptr = $p_0 + 1 | 0;
    if ((_isspace(HEAP8[$p_0] | 0) | 0) == 0) {
     break;
    } else {
     $p_0 = $add_ptr;
    }
   }
   $1 = HEAP8[$p_0] | 0;
   if (($1 << 24 >> 24 | 0) == 45) {
    $p_2 = $add_ptr;
    $sign_0 = 1;
   } else if (($1 << 24 >> 24 | 0) == 43) {
    $p_2 = $add_ptr;
    $sign_0 = 0;
   } else {
    $p_2 = $p_0;
    $sign_0 = 0;
   }
   $decPt_0 = -1;
   $mantSize_0 = 0;
   $p_3 = $p_2;
   while (1) {
    $2 = HEAP8[$p_3] | 0;
    if ((($2 << 24 >> 24) - 48 | 0) >>> 0 < 10) {
     $decPt_1 = $decPt_0;
    } else {
     if ($2 << 24 >> 24 != 46 | ($decPt_0 | 0) > -1) {
      break;
     } else {
      $decPt_1 = $mantSize_0;
     }
    }
    $decPt_0 = $decPt_1;
    $mantSize_0 = $mantSize_0 + 1 | 0;
    $p_3 = $p_3 + 1 | 0;
   }
   $add_ptr22 = $p_3 + (-$mantSize_0 | 0) | 0;
   $cmp23 = ($decPt_0 | 0) < 0;
   $mantSize_1 = (($cmp23 ^ 1) << 31 >> 31) + $mantSize_0 | 0;
   $cmp28 = ($mantSize_1 | 0) > 18;
   $fracExp_0 = ($cmp28 ? -18 : -$mantSize_1 | 0) + ($cmp23 ? $mantSize_0 : $decPt_0) | 0;
   $mantSize_2 = $cmp28 ? 18 : $mantSize_1;
   do {
    if (($mantSize_2 | 0) == 0) {
     $p_11 = $string;
     $fraction_0 = 0.0;
    } else {
     if (($mantSize_2 | 0) > 9) {
      $p_479 = $add_ptr22;
      $mantSize_380 = $mantSize_2;
      $frac1_081 = 0;
      while (1) {
       $4 = HEAP8[$p_479] | 0;
       $add_ptr43 = $p_479 + 1 | 0;
       if ($4 << 24 >> 24 == 46) {
        $c_0_in = HEAP8[$add_ptr43] | 0;
        $p_5 = $p_479 + 2 | 0;
       } else {
        $c_0_in = $4;
        $p_5 = $add_ptr43;
       }
       $add51 = ($frac1_081 * 10 | 0) - 48 + ($c_0_in << 24 >> 24) | 0;
       $sub53 = $mantSize_380 - 1 | 0;
       if (($sub53 | 0) > 9) {
        $p_479 = $p_5;
        $mantSize_380 = $sub53;
        $frac1_081 = $add51;
       } else {
        break;
       }
      }
      $frac1_0_lcssa89 = +($add51 | 0) * 1.0e9;
      $mantSize_3_lcssa90 = 9;
      $p_4_lcssa91 = $p_5;
      label = 1776;
     } else {
      if (($mantSize_2 | 0) > 0) {
       $frac1_0_lcssa89 = 0.0;
       $mantSize_3_lcssa90 = $mantSize_2;
       $p_4_lcssa91 = $add_ptr22;
       label = 1776;
      } else {
       $frac2_0_lcssa = 0.0;
       $frac1_0_lcssa88 = 0.0;
      }
     }
     if ((label | 0) == 1776) {
      $p_674 = $p_4_lcssa91;
      $mantSize_475 = $mantSize_3_lcssa90;
      $frac2_076 = 0;
      while (1) {
       $6 = HEAP8[$p_674] | 0;
       $add_ptr60 = $p_674 + 1 | 0;
       if ($6 << 24 >> 24 == 46) {
        $c_1_in = HEAP8[$add_ptr60] | 0;
        $p_7 = $p_674 + 2 | 0;
       } else {
        $c_1_in = $6;
        $p_7 = $add_ptr60;
       }
       $add69 = ($frac2_076 * 10 | 0) - 48 + ($c_1_in << 24 >> 24) | 0;
       $sub71 = $mantSize_475 - 1 | 0;
       if (($sub71 | 0) > 0) {
        $p_674 = $p_7;
        $mantSize_475 = $sub71;
        $frac2_076 = $add69;
       } else {
        break;
       }
      }
      $frac2_0_lcssa = +($add69 | 0);
      $frac1_0_lcssa88 = $frac1_0_lcssa89;
     }
     $add76 = $frac1_0_lcssa88 + $frac2_0_lcssa;
     do {
      if (($2 << 24 >> 24 | 0) == 69 | ($2 << 24 >> 24 | 0) == 101) {
       $add_ptr86 = $p_3 + 1 | 0;
       $8 = HEAP8[$add_ptr86] | 0;
       if (($8 << 24 >> 24 | 0) == 43) {
        $p_9_ph = $p_3 + 2 | 0;
        $expSign_0_ph = 0;
       } else if (($8 << 24 >> 24 | 0) == 45) {
        $p_9_ph = $p_3 + 2 | 0;
        $expSign_0_ph = 1;
       } else {
        $p_9_ph = $add_ptr86;
        $expSign_0_ph = 0;
       }
       $9 = HEAP8[$p_9_ph] | 0;
       if ((($9 << 24 >> 24) - 48 | 0) >>> 0 < 10) {
        $p_969 = $p_9_ph;
        $exp_070 = 0;
        $10 = $9;
       } else {
        $exp_1 = 0;
        $p_10 = $p_9_ph;
        $expSign_1 = $expSign_0_ph;
        break;
       }
       while (1) {
        $add108 = ($exp_070 * 10 | 0) - 48 + ($10 << 24 >> 24) | 0;
        $add_ptr109 = $p_969 + 1 | 0;
        $11 = HEAP8[$add_ptr109] | 0;
        if ((($11 << 24 >> 24) - 48 | 0) >>> 0 < 10) {
         $p_969 = $add_ptr109;
         $exp_070 = $add108;
         $10 = $11;
        } else {
         $exp_1 = $add108;
         $p_10 = $add_ptr109;
         $expSign_1 = $expSign_0_ph;
         break;
        }
       }
      } else {
       $exp_1 = 0;
       $p_10 = $p_3;
       $expSign_1 = 0;
      }
     } while (0);
     $exp_2 = $fracExp_0 + (($expSign_1 | 0) == 0 ? $exp_1 : -$exp_1 | 0) | 0;
     $exp_3 = ($exp_2 | 0) < 0 ? -$exp_2 | 0 : $exp_2;
     if (($exp_3 | 0) > 511) {
      HEAP32[(___errno_location() | 0) >> 2] = 34;
      $dblExp_063 = 1.0;
      $d_064 = 192;
      $exp_565 = 511;
      label = 1793;
     } else {
      if (($exp_3 | 0) == 0) {
       $dblExp_0_lcssa = 1.0;
      } else {
       $dblExp_063 = 1.0;
       $d_064 = 192;
       $exp_565 = $exp_3;
       label = 1793;
      }
     }
     if ((label | 0) == 1793) {
      while (1) {
       label = 0;
       if (($exp_565 & 1 | 0) == 0) {
        $dblExp_1 = $dblExp_063;
       } else {
        $dblExp_1 = $dblExp_063 * +HEAPF64[$d_064 >> 3];
       }
       $shr = $exp_565 >> 1;
       if (($shr | 0) == 0) {
        $dblExp_0_lcssa = $dblExp_1;
        break;
       } else {
        $dblExp_063 = $dblExp_1;
        $d_064 = $d_064 + 8 | 0;
        $exp_565 = $shr;
        label = 1793;
       }
      }
     }
     if (($exp_2 | 0) > -1) {
      $p_11 = $p_10;
      $fraction_0 = $add76 * $dblExp_0_lcssa;
      break;
     } else {
      $p_11 = $p_10;
      $fraction_0 = $add76 / $dblExp_0_lcssa;
      break;
     }
    }
   } while (0);
   if (($endPtr | 0) != 0) {
    HEAP32[$endPtr >> 2] = $p_11;
   }
   if (($sign_0 | 0) == 0) {
    $retval_0 = $fraction_0;
    return +$retval_0;
   }
   $retval_0 = -0.0 - $fraction_0;
   return +$retval_0;
  }
  function _strtold($nptr, $endptr) {
   $nptr = $nptr | 0;
   $endptr = $endptr | 0;
   return +(+_strtod($nptr, $endptr));
  }
  function _strtof($nptr, $endptr) {
   $nptr = $nptr | 0;
   $endptr = $endptr | 0;
   return +(+_strtod($nptr, $endptr));
  }
  function _strtod_l($nptr, $endptr, $loc) {
   $nptr = $nptr | 0;
   $endptr = $endptr | 0;
   $loc = $loc | 0;
   return +(+_strtod($nptr, $endptr));
  }
  function _strtold_l($nptr, $endptr, $loc) {
   $nptr = $nptr | 0;
   $endptr = $endptr | 0;
   $loc = $loc | 0;
   return +(+_strtod($nptr, $endptr));
  }
  function _atof($str) {
   $str = $str | 0;
   return +(+_strtod($str, 0));
  }
  function __err($eval, $fmt, varrp) {
   $eval = $eval | 0;
   $fmt = $fmt | 0;
   varrp = varrp | 0;
   var $ap = 0, $arraydecay1 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $ap = sp | 0;
   $arraydecay1 = $ap;
   HEAP32[$arraydecay1 >> 2] = varrp;
   HEAP32[$arraydecay1 + 4 >> 2] = 0;
   __verr($eval, $fmt, $ap | 0);
  }
  function __errx($eval, $fmt, varrp) {
   $eval = $eval | 0;
   $fmt = $fmt | 0;
   varrp = varrp | 0;
   var $ap = 0, $arraydecay1 = 0, sp = 0;
   sp = STACKTOP;
   STACKTOP = STACKTOP + 16 | 0;
   $ap = sp | 0;
   $arraydecay1 = $ap;
   HEAP32[$arraydecay1 >> 2] = varrp;
   HEAP32[$arraydecay1 + 4 >> 2] = 0;
   __verrx($eval, $fmt, $ap | 0);
  }
  function __verr($eval, $fmt, $ap) {
   $eval = $eval | 0;
   $fmt = $fmt | 0;
   $ap = $ap | 0;
   var $0 = 0, $2 = 0, $3 = 0, $4 = 0, $6 = 0, $call4 = 0;
   $0 = HEAP32[(___errno_location() | 0) >> 2] | 0;
   $2 = HEAP32[___progname >> 2] | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 536, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $2, tempInt) | 0) | 0;
   if (($fmt | 0) != 0) {
    $3 = HEAP32[_stderr >> 2] | 0;
    _vfprintf($3 | 0, $fmt | 0, $ap | 0) | 0;
    $4 = HEAP32[_stderr >> 2] | 0;
    _fwrite(4248, 2, 1, $4 | 0) | 0;
   }
   $6 = HEAP32[_stderr >> 2] | 0;
   $call4 = _strerror($0 | 0) | 0;
   _fprintf($6 | 0, 2928, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $call4, tempInt) | 0) | 0;
   _exit($eval | 0);
  }
  function __verrx($eval, $fmt, $ap) {
   $eval = $eval | 0;
   $fmt = $fmt | 0;
   $ap = $ap | 0;
   var $1 = 0, $2 = 0;
   $1 = HEAP32[___progname >> 2] | 0;
   _fprintf(HEAP32[_stderr >> 2] | 0, 3520, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $1, tempInt) | 0) | 0;
   if (($fmt | 0) != 0) {
    $2 = HEAP32[_stderr >> 2] | 0;
    _vfprintf($2 | 0, $fmt | 0, $ap | 0) | 0;
   }
   _fputc(10, HEAP32[_stderr >> 2] | 0) | 0;
   _exit($eval | 0);
  }
  function _strcpy(pdest, psrc) {
   pdest = pdest | 0;
   psrc = psrc | 0;
   var i = 0;
   do {
    HEAP8[pdest + i | 0] = HEAP8[psrc + i | 0];
    i = i + 1 | 0;
   } while (HEAP8[psrc + (i - 1) | 0] | 0);
   return pdest | 0;
  }
  function _memset(ptr, value, num) {
   ptr = ptr | 0;
   value = value | 0;
   num = num | 0;
   var stop = 0, value4 = 0, stop4 = 0, unaligned = 0;
   stop = ptr + num | 0;
   if ((num | 0) >= 20) {
    value = value & 255;
    unaligned = ptr & 3;
    value4 = value | value << 8 | value << 16 | value << 24;
    stop4 = stop & ~3;
    if (unaligned) {
     unaligned = ptr + 4 - unaligned | 0;
     while ((ptr | 0) < (unaligned | 0)) {
      HEAP8[ptr] = value;
      ptr = ptr + 1 | 0;
     }
    }
    while ((ptr | 0) < (stop4 | 0)) {
     HEAP32[ptr >> 2] = value4;
     ptr = ptr + 4 | 0;
    }
   }
   while ((ptr | 0) < (stop | 0)) {
    HEAP8[ptr] = value;
    ptr = ptr + 1 | 0;
   }
  }
  function _memcpy(dest, src, num) {
   dest = dest | 0;
   src = src | 0;
   num = num | 0;
   var ret = 0;
   ret = dest | 0;
   if ((dest & 3) == (src & 3)) {
    while (dest & 3) {
     if ((num | 0) == 0) return ret | 0;
     HEAP8[dest] = HEAP8[src] | 0;
     dest = dest + 1 | 0;
     src = src + 1 | 0;
     num = num - 1 | 0;
    }
    while ((num | 0) >= 4) {
     HEAP32[dest >> 2] = HEAP32[src >> 2];
     dest = dest + 4 | 0;
     src = src + 4 | 0;
     num = num - 4 | 0;
    }
   }
   while ((num | 0) > 0) {
    HEAP8[dest] = HEAP8[src] | 0;
    dest = dest + 1 | 0;
    src = src + 1 | 0;
    num = num - 1 | 0;
   }
   return ret | 0;
  }
  function _strlen(ptr) {
   ptr = ptr | 0;
   var curr = 0;
   curr = ptr;
   while (HEAP8[curr] | 0) {
    curr = curr + 1 | 0;
   }
   return curr - ptr | 0;
  }
  function _strncpy(pdest, psrc, num) {
   pdest = pdest | 0;
   psrc = psrc | 0;
   num = num | 0;
   var padding = 0, i = 0;
   while ((i | 0) < (num | 0)) {
    HEAP8[pdest + i | 0] = padding ? 0 : HEAP8[psrc + i | 0] | 0;
    padding = padding ? 1 : (HEAP8[psrc + i | 0] | 0) == 0;
    i = i + 1 | 0;
   }
   return pdest | 0;
  }
  function _memcmp(p1, p2, num) {
   p1 = p1 | 0;
   p2 = p2 | 0;
   num = num | 0;
   var i = 0, v1 = 0, v2 = 0;
   while ((i | 0) < (num | 0)) {
    v1 = HEAPU8[p1 + i | 0] | 0;
    v2 = HEAPU8[p2 + i | 0] | 0;
    if ((v1 | 0) != (v2 | 0)) return ((v1 | 0) > (v2 | 0) ? 1 : -1) | 0;
    i = i + 1 | 0;
   }
   return 0;
  }
  function _memmove(dest, src, num) {
   dest = dest | 0;
   src = src | 0;
   num = num | 0;
   if ((src | 0) < (dest | 0) & (dest | 0) < (src + num | 0)) {
    src = src + num | 0;
    dest = dest + num | 0;
    while ((num | 0) > 0) {
     dest = dest - 1 | 0;
     src = src - 1 | 0;
     num = num - 1 | 0;
     HEAP8[dest] = HEAP8[src] | 0;
    }
   } else {
    _memcpy(dest, src, num) | 0;
   }
  }
  function _i64Add(a, b, c, d) {
   a = a | 0;
   b = b | 0;
   c = c | 0;
   d = d | 0;
   var l = 0;
   l = a + c >>> 0;
   return (tempRet0 = b + d + (l >>> 0 < a >>> 0 | 0) >>> 0, l | 0) | 0;
  }
  function _i64Subtract(a, b, c, d) {
   a = a | 0;
   b = b | 0;
   c = c | 0;
   d = d | 0;
   var h = 0;
   h = b - d >>> 0;
   h = b - d - (c >>> 0 > a >>> 0 | 0) >>> 0;
   return (tempRet0 = h, a - c >>> 0 | 0) | 0;
  }
  function _bitshift64Shl(low, high, bits) {
   low = low | 0;
   high = high | 0;
   bits = bits | 0;
   if ((bits | 0) < 32) {
    tempRet0 = high << bits | (low & (1 << bits) - 1 << 32 - bits) >>> 32 - bits;
    return low << bits;
   }
   tempRet0 = low << bits - 32;
   return 0;
  }
  function _bitshift64Lshr(low, high, bits) {
   low = low | 0;
   high = high | 0;
   bits = bits | 0;
   if ((bits | 0) < 32) {
    tempRet0 = high >>> bits;
    return low >>> bits | (high & (1 << bits) - 1) << 32 - bits;
   }
   tempRet0 = 0;
   return high >>> bits - 32 | 0;
  }
  function _bitshift64Ashr(low, high, bits) {
   low = low | 0;
   high = high | 0;
   bits = bits | 0;
   if ((bits | 0) < 32) {
    tempRet0 = high >> bits;
    return low >>> bits | (high & (1 << bits) - 1) << 32 - bits;
   }
   tempRet0 = (high | 0) < 0 ? -1 : 0;
   return high >> bits - 32 | 0;
  }
  function _llvm_ctlz_i32(x) {
   x = x | 0;
   var ret = 0;
   ret = HEAP8[ctlz_i8 + (x >>> 24) | 0] | 0;
   if ((ret | 0) < 8) return ret | 0;
   ret = HEAP8[ctlz_i8 + (x >> 16 & 255) | 0] | 0;
   if ((ret | 0) < 8) return ret + 8 | 0;
   ret = HEAP8[ctlz_i8 + (x >> 8 & 255) | 0] | 0;
   if ((ret | 0) < 8) return ret + 16 | 0;
   return (HEAP8[ctlz_i8 + (x & 255) | 0] | 0) + 24 | 0;
  }
  function _llvm_cttz_i32(x) {
   x = x | 0;
   var ret = 0;
   ret = HEAP8[cttz_i8 + (x & 255) | 0] | 0;
   if ((ret | 0) < 8) return ret | 0;
   ret = HEAP8[cttz_i8 + (x >> 8 & 255) | 0] | 0;
   if ((ret | 0) < 8) return ret + 8 | 0;
   ret = HEAP8[cttz_i8 + (x >> 16 & 255) | 0] | 0;
   if ((ret | 0) < 8) return ret + 16 | 0;
   return (HEAP8[cttz_i8 + (x >>> 24) | 0] | 0) + 24 | 0;
  }
  function ___muldsi3($a, $b) {
   $a = $a | 0;
   $b = $b | 0;
   var $1 = 0, $2 = 0, $3 = 0, $6 = 0, $8 = 0, $11 = 0, $12 = 0;
   $1 = $a & 65535;
   $2 = $b & 65535;
   $3 = Math_imul($2, $1) | 0;
   $6 = $a >>> 16;
   $8 = ($3 >>> 16) + (Math_imul($2, $6) | 0) | 0;
   $11 = $b >>> 16;
   $12 = Math_imul($11, $1) | 0;
   return (tempRet0 = ($8 >>> 16) + (Math_imul($11, $6) | 0) + ((($8 & 65535) + $12 | 0) >>> 16) | 0, $8 + $12 << 16 | $3 & 65535 | 0) | 0;
  }
  function ___divdi3($a$0, $a$1, $b$0, $b$1) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   var $1$0 = 0, $1$1 = 0, $2$0 = 0, $2$1 = 0, $4$0 = 0, $4$1 = 0, $7$0 = 0, $7$1 = 0, $10$0 = 0;
   $1$0 = $a$1 >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1;
   $1$1 = (($a$1 | 0) < 0 ? -1 : 0) >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1;
   $2$0 = $b$1 >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1;
   $2$1 = (($b$1 | 0) < 0 ? -1 : 0) >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1;
   $4$0 = _i64Subtract($1$0 ^ $a$0, $1$1 ^ $a$1, $1$0, $1$1) | 0;
   $4$1 = tempRet0;
   $7$0 = $2$0 ^ $1$0;
   $7$1 = $2$1 ^ $1$1;
   $10$0 = _i64Subtract((___udivmoddi4($4$0, $4$1, _i64Subtract($2$0 ^ $b$0, $2$1 ^ $b$1, $2$0, $2$1) | 0, tempRet0, 0) | 0) ^ $7$0, tempRet0 ^ $7$1, $7$0, $7$1) | 0;
   return (tempRet0 = tempRet0, $10$0) | 0;
  }
  function ___remdi3($a$0, $a$1, $b$0, $b$1) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   var $rem = 0, $1$0 = 0, $1$1 = 0, $2$0 = 0, $2$1 = 0, $4$0 = 0, $4$1 = 0, $6$0 = 0, $10$0 = 0, $10$1 = 0, __stackBase__ = 0;
   __stackBase__ = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $rem = __stackBase__ | 0;
   $1$0 = $a$1 >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1;
   $1$1 = (($a$1 | 0) < 0 ? -1 : 0) >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1;
   $2$0 = $b$1 >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1;
   $2$1 = (($b$1 | 0) < 0 ? -1 : 0) >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1;
   $4$0 = _i64Subtract($1$0 ^ $a$0, $1$1 ^ $a$1, $1$0, $1$1) | 0;
   $4$1 = tempRet0;
   $6$0 = _i64Subtract($2$0 ^ $b$0, $2$1 ^ $b$1, $2$0, $2$1) | 0;
   ___udivmoddi4($4$0, $4$1, $6$0, tempRet0, $rem) | 0;
   $10$0 = _i64Subtract(HEAP32[$rem >> 2] ^ $1$0, HEAP32[$rem + 4 >> 2] ^ $1$1, $1$0, $1$1) | 0;
   $10$1 = tempRet0;
   STACKTOP = __stackBase__;
   return (tempRet0 = $10$1, $10$0) | 0;
  }
  function ___muldi3($a$0, $a$1, $b$0, $b$1) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   var $x_sroa_0_0_extract_trunc = 0, $y_sroa_0_0_extract_trunc = 0, $1$0 = 0, $1$1 = 0;
   $x_sroa_0_0_extract_trunc = $a$0;
   $y_sroa_0_0_extract_trunc = $b$0;
   $1$0 = ___muldsi3($x_sroa_0_0_extract_trunc, $y_sroa_0_0_extract_trunc) | 0;
   $1$1 = tempRet0;
   return (tempRet0 = (Math_imul($a$1, $y_sroa_0_0_extract_trunc) | 0) + (Math_imul($b$1, $x_sroa_0_0_extract_trunc) | 0) + $1$1 | $1$1 & 0, $1$0 | 0 | 0) | 0;
  }
  function ___udivdi3($a$0, $a$1, $b$0, $b$1) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   var $1$0 = 0;
   $1$0 = ___udivmoddi4($a$0, $a$1, $b$0, $b$1, 0) | 0;
   return (tempRet0 = tempRet0, $1$0) | 0;
  }
  function ___uremdi3($a$0, $a$1, $b$0, $b$1) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   var $rem = 0, __stackBase__ = 0;
   __stackBase__ = STACKTOP;
   STACKTOP = STACKTOP + 8 | 0;
   $rem = __stackBase__ | 0;
   ___udivmoddi4($a$0, $a$1, $b$0, $b$1, $rem) | 0;
   STACKTOP = __stackBase__;
   return (tempRet0 = HEAP32[$rem + 4 >> 2] | 0, HEAP32[$rem >> 2] | 0) | 0;
  }
  function ___udivmoddi4($a$0, $a$1, $b$0, $b$1, $rem) {
   $a$0 = $a$0 | 0;
   $a$1 = $a$1 | 0;
   $b$0 = $b$0 | 0;
   $b$1 = $b$1 | 0;
   $rem = $rem | 0;
   var $n_sroa_0_0_extract_trunc = 0, $n_sroa_1_4_extract_shift$0 = 0, $n_sroa_1_4_extract_trunc = 0, $d_sroa_0_0_extract_trunc = 0, $d_sroa_1_4_extract_shift$0 = 0, $d_sroa_1_4_extract_trunc = 0, $4 = 0, $17 = 0, $37 = 0, $51 = 0, $57 = 0, $58 = 0, $66 = 0, $78 = 0, $88 = 0, $89 = 0, $91 = 0, $92 = 0, $95 = 0, $105 = 0, $119 = 0, $125 = 0, $126 = 0, $130 = 0, $q_sroa_1_1_ph = 0, $q_sroa_0_1_ph = 0, $r_sroa_1_1_ph = 0, $r_sroa_0_1_ph = 0, $sr_1_ph = 0, $d_sroa_0_0_insert_insert99$0 = 0, $d_sroa_0_0_insert_insert99$1 = 0, $137$0 = 0, $137$1 = 0, $carry_0203 = 0, $sr_1202 = 0, $r_sroa_0_1201 = 0, $r_sroa_1_1200 = 0, $q_sroa_0_1199 = 0, $q_sroa_1_1198 = 0, $147 = 0, $149 = 0, $r_sroa_0_0_insert_insert42$0 = 0, $r_sroa_0_0_insert_insert42$1 = 0, $150$1 = 0, $151$0 = 0, $152 = 0, $r_sroa_0_0_extract_trunc = 0, $r_sroa_1_4_extract_trunc = 0, $155 = 0, $carry_0_lcssa$0 = 0, $carry_0_lcssa$1 = 0, $r_sroa_0_1_lcssa = 0, $r_sroa_1_1_lcssa = 0, $q_sroa_0_1_lcssa = 0, $q_sroa_1_1_lcssa = 0, $q_sroa_0_0_insert_ext75$0 = 0, $q_sroa_0_0_insert_ext75$1 = 0, $_0$0 = 0, $_0$1 = 0;
   $n_sroa_0_0_extract_trunc = $a$0;
   $n_sroa_1_4_extract_shift$0 = $a$1;
   $n_sroa_1_4_extract_trunc = $n_sroa_1_4_extract_shift$0;
   $d_sroa_0_0_extract_trunc = $b$0;
   $d_sroa_1_4_extract_shift$0 = $b$1;
   $d_sroa_1_4_extract_trunc = $d_sroa_1_4_extract_shift$0;
   if (($n_sroa_1_4_extract_trunc | 0) == 0) {
    $4 = ($rem | 0) != 0;
    if (($d_sroa_1_4_extract_trunc | 0) == 0) {
     if ($4) {
      HEAP32[$rem >> 2] = ($n_sroa_0_0_extract_trunc >>> 0) % ($d_sroa_0_0_extract_trunc >>> 0);
      HEAP32[$rem + 4 >> 2] = 0;
     }
     $_0$1 = 0;
     $_0$0 = ($n_sroa_0_0_extract_trunc >>> 0) / ($d_sroa_0_0_extract_trunc >>> 0) >>> 0;
     return (tempRet0 = $_0$1, $_0$0) | 0;
    } else {
     if (!$4) {
      $_0$1 = 0;
      $_0$0 = 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     HEAP32[$rem >> 2] = $a$0 | 0;
     HEAP32[$rem + 4 >> 2] = $a$1 & 0;
     $_0$1 = 0;
     $_0$0 = 0;
     return (tempRet0 = $_0$1, $_0$0) | 0;
    }
   }
   $17 = ($d_sroa_1_4_extract_trunc | 0) == 0;
   do {
    if (($d_sroa_0_0_extract_trunc | 0) == 0) {
     if ($17) {
      if (($rem | 0) != 0) {
       HEAP32[$rem >> 2] = ($n_sroa_1_4_extract_trunc >>> 0) % ($d_sroa_0_0_extract_trunc >>> 0);
       HEAP32[$rem + 4 >> 2] = 0;
      }
      $_0$1 = 0;
      $_0$0 = ($n_sroa_1_4_extract_trunc >>> 0) / ($d_sroa_0_0_extract_trunc >>> 0) >>> 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     if (($n_sroa_0_0_extract_trunc | 0) == 0) {
      if (($rem | 0) != 0) {
       HEAP32[$rem >> 2] = 0;
       HEAP32[$rem + 4 >> 2] = ($n_sroa_1_4_extract_trunc >>> 0) % ($d_sroa_1_4_extract_trunc >>> 0);
      }
      $_0$1 = 0;
      $_0$0 = ($n_sroa_1_4_extract_trunc >>> 0) / ($d_sroa_1_4_extract_trunc >>> 0) >>> 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     $37 = $d_sroa_1_4_extract_trunc - 1 | 0;
     if (($37 & $d_sroa_1_4_extract_trunc | 0) == 0) {
      if (($rem | 0) != 0) {
       HEAP32[$rem >> 2] = $a$0 | 0;
       HEAP32[$rem + 4 >> 2] = $37 & $n_sroa_1_4_extract_trunc | $a$1 & 0;
      }
      $_0$1 = 0;
      $_0$0 = $n_sroa_1_4_extract_trunc >>> ((_llvm_cttz_i32($d_sroa_1_4_extract_trunc | 0) | 0) >>> 0);
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     $51 = (_llvm_ctlz_i32($d_sroa_1_4_extract_trunc | 0) | 0) - (_llvm_ctlz_i32($n_sroa_1_4_extract_trunc | 0) | 0) | 0;
     if ($51 >>> 0 <= 30) {
      $57 = $51 + 1 | 0;
      $58 = 31 - $51 | 0;
      $sr_1_ph = $57;
      $r_sroa_0_1_ph = $n_sroa_1_4_extract_trunc << $58 | $n_sroa_0_0_extract_trunc >>> ($57 >>> 0);
      $r_sroa_1_1_ph = $n_sroa_1_4_extract_trunc >>> ($57 >>> 0);
      $q_sroa_0_1_ph = 0;
      $q_sroa_1_1_ph = $n_sroa_0_0_extract_trunc << $58;
      break;
     }
     if (($rem | 0) == 0) {
      $_0$1 = 0;
      $_0$0 = 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     HEAP32[$rem >> 2] = $a$0 | 0;
     HEAP32[$rem + 4 >> 2] = $n_sroa_1_4_extract_shift$0 | $a$1 & 0;
     $_0$1 = 0;
     $_0$0 = 0;
     return (tempRet0 = $_0$1, $_0$0) | 0;
    } else {
     if (!$17) {
      $119 = (_llvm_ctlz_i32($d_sroa_1_4_extract_trunc | 0) | 0) - (_llvm_ctlz_i32($n_sroa_1_4_extract_trunc | 0) | 0) | 0;
      if ($119 >>> 0 <= 31) {
       $125 = $119 + 1 | 0;
       $126 = 31 - $119 | 0;
       $130 = $119 - 31 >> 31;
       $sr_1_ph = $125;
       $r_sroa_0_1_ph = $n_sroa_0_0_extract_trunc >>> ($125 >>> 0) & $130 | $n_sroa_1_4_extract_trunc << $126;
       $r_sroa_1_1_ph = $n_sroa_1_4_extract_trunc >>> ($125 >>> 0) & $130;
       $q_sroa_0_1_ph = 0;
       $q_sroa_1_1_ph = $n_sroa_0_0_extract_trunc << $126;
       break;
      }
      if (($rem | 0) == 0) {
       $_0$1 = 0;
       $_0$0 = 0;
       return (tempRet0 = $_0$1, $_0$0) | 0;
      }
      HEAP32[$rem >> 2] = $a$0 | 0;
      HEAP32[$rem + 4 >> 2] = $n_sroa_1_4_extract_shift$0 | $a$1 & 0;
      $_0$1 = 0;
      $_0$0 = 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
     $66 = $d_sroa_0_0_extract_trunc - 1 | 0;
     if (($66 & $d_sroa_0_0_extract_trunc | 0) != 0) {
      $88 = (_llvm_ctlz_i32($d_sroa_0_0_extract_trunc | 0) | 0) + 33 - (_llvm_ctlz_i32($n_sroa_1_4_extract_trunc | 0) | 0) | 0;
      $89 = 64 - $88 | 0;
      $91 = 32 - $88 | 0;
      $92 = $91 >> 31;
      $95 = $88 - 32 | 0;
      $105 = $95 >> 31;
      $sr_1_ph = $88;
      $r_sroa_0_1_ph = $91 - 1 >> 31 & $n_sroa_1_4_extract_trunc >>> ($95 >>> 0) | ($n_sroa_1_4_extract_trunc << $91 | $n_sroa_0_0_extract_trunc >>> ($88 >>> 0)) & $105;
      $r_sroa_1_1_ph = $105 & $n_sroa_1_4_extract_trunc >>> ($88 >>> 0);
      $q_sroa_0_1_ph = $n_sroa_0_0_extract_trunc << $89 & $92;
      $q_sroa_1_1_ph = ($n_sroa_1_4_extract_trunc << $89 | $n_sroa_0_0_extract_trunc >>> ($95 >>> 0)) & $92 | $n_sroa_0_0_extract_trunc << $91 & $88 - 33 >> 31;
      break;
     }
     if (($rem | 0) != 0) {
      HEAP32[$rem >> 2] = $66 & $n_sroa_0_0_extract_trunc;
      HEAP32[$rem + 4 >> 2] = 0;
     }
     if (($d_sroa_0_0_extract_trunc | 0) == 1) {
      $_0$1 = $n_sroa_1_4_extract_shift$0 | $a$1 & 0;
      $_0$0 = $a$0 | 0 | 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     } else {
      $78 = _llvm_cttz_i32($d_sroa_0_0_extract_trunc | 0) | 0;
      $_0$1 = $n_sroa_1_4_extract_trunc >>> ($78 >>> 0) | 0;
      $_0$0 = $n_sroa_1_4_extract_trunc << 32 - $78 | $n_sroa_0_0_extract_trunc >>> ($78 >>> 0) | 0;
      return (tempRet0 = $_0$1, $_0$0) | 0;
     }
    }
   } while (0);
   if (($sr_1_ph | 0) == 0) {
    $q_sroa_1_1_lcssa = $q_sroa_1_1_ph;
    $q_sroa_0_1_lcssa = $q_sroa_0_1_ph;
    $r_sroa_1_1_lcssa = $r_sroa_1_1_ph;
    $r_sroa_0_1_lcssa = $r_sroa_0_1_ph;
    $carry_0_lcssa$1 = 0;
    $carry_0_lcssa$0 = 0;
   } else {
    $d_sroa_0_0_insert_insert99$0 = $b$0 | 0 | 0;
    $d_sroa_0_0_insert_insert99$1 = $d_sroa_1_4_extract_shift$0 | $b$1 & 0;
    $137$0 = _i64Add($d_sroa_0_0_insert_insert99$0, $d_sroa_0_0_insert_insert99$1, -1, -1) | 0;
    $137$1 = tempRet0;
    $q_sroa_1_1198 = $q_sroa_1_1_ph;
    $q_sroa_0_1199 = $q_sroa_0_1_ph;
    $r_sroa_1_1200 = $r_sroa_1_1_ph;
    $r_sroa_0_1201 = $r_sroa_0_1_ph;
    $sr_1202 = $sr_1_ph;
    $carry_0203 = 0;
    while (1) {
     $147 = $q_sroa_0_1199 >>> 31 | $q_sroa_1_1198 << 1;
     $149 = $carry_0203 | $q_sroa_0_1199 << 1;
     $r_sroa_0_0_insert_insert42$0 = $r_sroa_0_1201 << 1 | $q_sroa_1_1198 >>> 31 | 0;
     $r_sroa_0_0_insert_insert42$1 = $r_sroa_0_1201 >>> 31 | $r_sroa_1_1200 << 1 | 0;
     _i64Subtract($137$0, $137$1, $r_sroa_0_0_insert_insert42$0, $r_sroa_0_0_insert_insert42$1) | 0;
     $150$1 = tempRet0;
     $151$0 = $150$1 >> 31 | (($150$1 | 0) < 0 ? -1 : 0) << 1;
     $152 = $151$0 & 1;
     $r_sroa_0_0_extract_trunc = _i64Subtract($r_sroa_0_0_insert_insert42$0, $r_sroa_0_0_insert_insert42$1, $151$0 & $d_sroa_0_0_insert_insert99$0, ((($150$1 | 0) < 0 ? -1 : 0) >> 31 | (($150$1 | 0) < 0 ? -1 : 0) << 1) & $d_sroa_0_0_insert_insert99$1) | 0;
     $r_sroa_1_4_extract_trunc = tempRet0;
     $155 = $sr_1202 - 1 | 0;
     if (($155 | 0) == 0) {
      break;
     } else {
      $q_sroa_1_1198 = $147;
      $q_sroa_0_1199 = $149;
      $r_sroa_1_1200 = $r_sroa_1_4_extract_trunc;
      $r_sroa_0_1201 = $r_sroa_0_0_extract_trunc;
      $sr_1202 = $155;
      $carry_0203 = $152;
     }
    }
    $q_sroa_1_1_lcssa = $147;
    $q_sroa_0_1_lcssa = $149;
    $r_sroa_1_1_lcssa = $r_sroa_1_4_extract_trunc;
    $r_sroa_0_1_lcssa = $r_sroa_0_0_extract_trunc;
    $carry_0_lcssa$1 = 0;
    $carry_0_lcssa$0 = $152;
   }
   $q_sroa_0_0_insert_ext75$0 = $q_sroa_0_1_lcssa;
   $q_sroa_0_0_insert_ext75$1 = 0;
   if (($rem | 0) != 0) {
    HEAP32[$rem >> 2] = $r_sroa_0_1_lcssa;
    HEAP32[$rem + 4 >> 2] = $r_sroa_1_1_lcssa;
   }
   $_0$1 = ($q_sroa_0_0_insert_ext75$0 | 0) >>> 31 | ($q_sroa_1_1_lcssa | $q_sroa_0_0_insert_ext75$1) << 1 | ($q_sroa_0_0_insert_ext75$1 << 1 | $q_sroa_0_0_insert_ext75$0 >>> 31) & 0 | $carry_0_lcssa$1;
   $_0$0 = ($q_sroa_0_0_insert_ext75$0 << 1 | 0 >>> 31) & -2 | $carry_0_lcssa$0;
   return (tempRet0 = $_0$1, $_0$0) | 0;
  }
  function ___cxa_pure_virtual__wrapper() {
   ___cxa_pure_virtual();
  }
  function dynCall_viiiii(index, a1, a2, a3, a4, a5) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   a5 = a5 | 0;
   FUNCTION_TABLE_viiiii[index & 7](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0);
  }
  function dynCall_vi(index, a1) {
   index = index | 0;
   a1 = a1 | 0;
   FUNCTION_TABLE_vi[index & 127](a1 | 0);
  }
  function dynCall_vii(index, a1, a2) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   FUNCTION_TABLE_vii[index & 15](a1 | 0, a2 | 0);
  }
  function dynCall_iiiiiii(index, a1, a2, a3, a4, a5, a6) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   a5 = a5 | 0;
   a6 = a6 | 0;
   return FUNCTION_TABLE_iiiiiii[index & 15](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0, a6 | 0) | 0;
  }
  function dynCall_iiiii(index, a1, a2, a3, a4) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   return FUNCTION_TABLE_iiiii[index & 31](a1 | 0, a2 | 0, a3 | 0, a4 | 0) | 0;
  }
  function dynCall_ii(index, a1) {
   index = index | 0;
   a1 = a1 | 0;
   return FUNCTION_TABLE_ii[index & 31](a1 | 0) | 0;
  }
  function dynCall_iiii(index, a1, a2, a3) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   return FUNCTION_TABLE_iiii[index & 15](a1 | 0, a2 | 0, a3 | 0) | 0;
  }
  function dynCall_viii(index, a1, a2, a3) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   FUNCTION_TABLE_viii[index & 15](a1 | 0, a2 | 0, a3 | 0);
  }
  function dynCall_v(index) {
   index = index | 0;
   FUNCTION_TABLE_v[index & 3]();
  }
  function dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   a5 = a5 | 0;
   a6 = a6 | 0;
   FUNCTION_TABLE_viiiiii[index & 7](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0, a6 | 0);
  }
  function dynCall_iii(index, a1, a2) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   return FUNCTION_TABLE_iii[index & 63](a1 | 0, a2 | 0) | 0;
  }
  function dynCall_iiiiii(index, a1, a2, a3, a4, a5) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   a5 = a5 | 0;
   return FUNCTION_TABLE_iiiiii[index & 15](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0) | 0;
  }
  function dynCall_viiii(index, a1, a2, a3, a4) {
   index = index | 0;
   a1 = a1 | 0;
   a2 = a2 | 0;
   a3 = a3 | 0;
   a4 = a4 | 0;
   FUNCTION_TABLE_viiii[index & 7](a1 | 0, a2 | 0, a3 | 0, a4 | 0);
  }
  function b0(p0, p1, p2, p3, p4) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   p4 = p4 | 0;
   abort(0);
  }
  function b1(p0) {
   p0 = p0 | 0;
   abort(1);
  }
  function b2(p0, p1) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   abort(2);
  }
  function b3(p0, p1, p2, p3, p4, p5) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   p4 = p4 | 0;
   p5 = p5 | 0;
   abort(3);
   return 0;
  }
  function b4(p0, p1, p2, p3) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   abort(4);
   return 0;
  }
  function b5(p0) {
   p0 = p0 | 0;
   abort(5);
   return 0;
  }
  function b6(p0, p1, p2) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   abort(6);
   return 0;
  }
  function b7(p0, p1, p2) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   abort(7);
  }
  function b8() {
   abort(8);
  }
  function b9(p0, p1, p2, p3, p4, p5) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   p4 = p4 | 0;
   p5 = p5 | 0;
   abort(9);
  }
  function b10(p0, p1) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   abort(10);
   return 0;
  }
  function b11(p0, p1, p2, p3, p4) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   p4 = p4 | 0;
   abort(11);
   return 0;
  }
  function b12(p0, p1, p2, p3) {
   p0 = p0 | 0;
   p1 = p1 | 0;
   p2 = p2 | 0;
   p3 = p3 | 0;
   abort(12);
  }
  // EMSCRIPTEN_END_FUNCS
    var FUNCTION_TABLE_viiiii = [b0,b0,__ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,b0,__ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,b0,__ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,b0];
    var FUNCTION_TABLE_vi = [b1,b1,__ZN10ime_pinyin8UserDictD0Ev,b1,__ZN10ime_pinyin5NGramD2Ev,b1,__ZNSt9bad_allocC2Ev,b1,__ZNSt9type_infoD0Ev,b1,__ZN10ime_pinyin11Utf16ReaderD2Ev
    ,b1,__ZN10ime_pinyin8DictTrieD0Ev,b1,__ZN10ime_pinyin4SyncC2Ev,b1,__ZN10ime_pinyin8LpiCacheC2Ev,b1,__ZN10ime_pinyin8DictTrie11flush_cacheEv,b1,__ZN10__cxxabiv117__array_type_infoD0Ev
    ,b1,__ZNK10__cxxabiv116__shim_type_info5noop2Ev,b1,__ZN10__cxxabiv123__fundamental_type_infoD0Ev,b1,__ZNSt10bad_typeidD2Ev,b1,__ZN10ime_pinyin8DictTrieC2Ev,b1,__ZN10ime_pinyin8UserDictD2Ev
    ,b1,__ZN10ime_pinyin13SpellingTableC2Ev,b1,__ZN10ime_pinyin12AtomDictBaseD0Ev,b1,__ZN10ime_pinyin8UserDictC2Ev,b1,__ZNSt9bad_allocD2Ev,b1,__ZN10ime_pinyin12SpellingTrieD2Ev
    ,b1,__ZN10ime_pinyin11DictBuilderC2Ev,b1,__ZNSt10bad_typeidC2Ev,b1,__ZN10__cxxabiv120__function_type_infoD0Ev,b1,__ZN10ime_pinyin8UserDict11flush_cacheEv,b1,__ZNSt8bad_castD0Ev
    ,b1,__ZN10ime_pinyin12SpellingTrieC2Ev,b1,__ZNSt20bad_array_new_lengthC2Ev,b1,__ZN10ime_pinyin11DictBuilderD2Ev,b1,__ZN10ime_pinyin4SyncD2Ev,b1,__ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev
    ,b1,__ZNSt9type_infoD2Ev,b1,__ZN10ime_pinyin8LpiCacheD2Ev,b1,__ZN10ime_pinyin12MatrixSearchD2Ev,b1,__ZN10ime_pinyin8DictTrieD2Ev,b1,__ZN10__cxxabiv117__pbase_type_infoD0Ev
    ,b1,__ZN10__cxxabiv116__shim_type_infoD0Ev,b1,__ZN10ime_pinyin12AtomDictBaseD1Ev,b1,__ZN10ime_pinyin8DictListC2Ev,b1,__ZNSt10bad_typeidD0Ev,b1,__ZN10ime_pinyin5NGramC2Ev
    ,b1,__ZNSt20bad_array_new_lengthD0Ev,b1,__ZNSt9bad_allocD0Ev,b1,__ZN10__cxxabiv117__class_type_infoD0Ev,b1,__ZN10__cxxabiv116__shim_type_infoD2Ev,b1,__ZN10ime_pinyin8DictListD2Ev
    ,b1,__ZNSt8bad_castC2Ev,b1,__ZNK10__cxxabiv116__shim_type_info5noop1Ev,b1,__ZN10__cxxabiv119__pointer_type_infoD0Ev,b1,__ZNSt8bad_castD2Ev,b1,__ZN10__cxxabiv116__enum_type_infoD0Ev
    ,b1,__ZN10ime_pinyin13SpellingTableD2Ev,b1,__ZN10ime_pinyin14SpellingParserC2Ev,b1,__ZN10__cxxabiv121__vmi_class_type_infoD0Ev,b1,__ZN10__cxxabiv120__si_class_type_infoD0Ev,b1,__ZN10ime_pinyin12MatrixSearchC2Ev,b1,__ZN10ime_pinyin11Utf16ReaderC2Ev,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1,b1];
    var FUNCTION_TABLE_vii = [b2,b2,__vwarnx,b2,__warnx,b2,__warn,b2,__ZN10ime_pinyin8DictTrie31set_total_lemma_count_of_othersEj,b2,__ZN10ime_pinyin8UserDict31set_total_lemma_count_of_othersEj,b2,__vwarn,b2,b2,b2];
    var FUNCTION_TABLE_iiiiiii = [b3,b3,__ZN10ime_pinyin8UserDict11extend_dictEtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj,b3,__ZN10ime_pinyin8DictTrie11extend_dictEtPKNS_11DictExtParaEPNS_10LmaPsbItemEjPj,b3,__ZN10ime_pinyin8DictTrie7predictEPKttPNS_12NPredictItemEjj,b3,__ZN10ime_pinyin8UserDict7predictEPKttPNS_12NPredictItemEjj,b3,b3,b3,b3,b3,b3,b3];
    var FUNCTION_TABLE_iiiii = [b4,b4,__ZN10ime_pinyin8UserDict9load_dictEPKcjj,b4,__ZN10ime_pinyin8DictTrie15get_lemma_scoreEPtS1_t,b4,__ZN10ime_pinyin8UserDict12update_lemmaEjsb,b4,__ZN10ime_pinyin8UserDict12get_lemma_idEPtS1_t,b4,__ZN10ime_pinyin8DictTrie12get_lemma_idEPtS1_t
    ,b4,__ZN10ime_pinyin8DictTrie9load_dictEPKcjj,b4,__ZN10ime_pinyin8DictTrie13get_lemma_strEjPtt,b4,__ZN10ime_pinyin8UserDict15get_lemma_scoreEPtS1_t,b4,__ZN10ime_pinyin8DictTrie12update_lemmaEjsb,b4,__ZN10ime_pinyin8UserDict13get_lemma_strEjPtt,b4,b4,b4,b4,b4,b4,b4,b4,b4,b4,b4];
    var FUNCTION_TABLE_ii = [b5,b5,__ZNKSt9bad_alloc4whatEv,b5,__ZNKSt8bad_cast4whatEv,b5,__ZN10ime_pinyin8DictTrie21get_total_lemma_countEv,b5,__ZN10ime_pinyin8DictTrie10close_dictEv,b5,__ZNKSt20bad_array_new_length4whatEv
    ,b5,__ZN10ime_pinyin8UserDict16number_of_lemmasEv,b5,__ZN10ime_pinyin8UserDict10close_dictEv,b5,__ZN10ime_pinyin8UserDict21get_total_lemma_countEv,b5,__ZN10ime_pinyin8DictTrie16number_of_lemmasEv,b5,__ZNKSt10bad_typeid4whatEv,b5,b5,b5,b5,b5,b5,b5,b5,b5,b5,b5];
    var FUNCTION_TABLE_iiii = [b6,b6,__ZNK10__cxxabiv117__array_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv116__enum_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv120__function_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv119__pointer_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6,__ZNK10__cxxabiv117__pbase_type_info9can_catchEPKNS_16__shim_type_infoERPv,b6];
    var FUNCTION_TABLE_viii = [b7,b7,__ZN10ime_pinyin8UserDict16reset_milestonesEtt,b7,__err,b7,__verr,b7,__verrx,b7,__ZN10ime_pinyin8DictTrie16reset_milestonesEtt,b7,__errx,b7,b7,b7];
    var FUNCTION_TABLE_v = [b8,b8,___cxa_pure_virtual__wrapper,b8];
    var FUNCTION_TABLE_viiiiii = [b9,b9,__ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,b9,__ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,b9,__ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,b9];
    var FUNCTION_TABLE_iii = [b10,b10,__ZN10ime_pinyin11comp_doubleEPKvS1_,b10,__ZN10ime_pinyin24cmp_npre_by_hislen_scoreEPKvS1_,b10,__ZN10ime_pinyin10compare_pyEPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_5EPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_3EPKvS1_
    ,b10,__ZN10ime_pinyin12cmp_hanzis_4EPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_1EPKvS1_,b10,__ZN10ime_pinyin23cmp_npre_by_hanzi_scoreEPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_2EPKvS1_,b10,__ZN10ime_pinyin24cmp_lpi_with_unified_psbEPKvS1_
    ,b10,__ZN10ime_pinyin19cmp_lemma_entry_hzsEPKvS1_,b10,__ZN10ime_pinyin14compare_char16EPKvS1_,b10,__ZN10ime_pinyin17cmp_lpsi_with_strEPKvS1_,b10,__ZN10ime_pinyin8DictTrie12remove_lemmaEj,b10,__ZN10ime_pinyin8UserDict15get_lemma_scoreEj
    ,b10,__ZN10ime_pinyin12cmp_hanzis_6EPKvS1_,b10,__ZN10ime_pinyin17cmp_scis_hz_splidEPKvS1_,b10,__ZN10ime_pinyin7compareEPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_8EPKvS1_,b10,__ZN10ime_pinyin18compare_raw_spl_ebEPKvS1_
    ,b10,__ZN10ime_pinyin8DictTrie15get_lemma_scoreEj,b10,__ZN10ime_pinyin11compare_splEPKvS1_,b10,__ZN10ime_pinyin12cmp_hanzis_7EPKvS1_,b10,__ZN10ime_pinyin8UserDict12remove_lemmaEj,b10,__ZN10ime_pinyin22cmp_scis_hz_splid_freqEPKvS1_,b10,b10,b10,b10,b10,b10,b10,b10,b10,b10,b10,b10,b10];
    var FUNCTION_TABLE_iiiiii = [b11,b11,__ZN10ime_pinyin8UserDict9put_lemmaEPtS1_tt,b11,__ZN10ime_pinyin8UserDict16get_lemma_splidsEjPttb,b11,__ZN10ime_pinyin8DictTrie8get_lpisEPKttPNS_10LmaPsbItemEj,b11,__ZN10ime_pinyin8DictTrie9put_lemmaEPtS1_tt,b11,__ZN10ime_pinyin8UserDict8get_lpisEPKttPNS_10LmaPsbItemEj,b11,__ZN10ime_pinyin8DictTrie16get_lemma_splidsEjPttb,b11,b11,b11];
    var FUNCTION_TABLE_viiii = [b12,b12,__ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,b12,__ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,b12,__ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,b12];
    return { _im_enable_ym_as_szm: _im_enable_ym_as_szm, _strlen: _strlen, _im_reset_search: _im_reset_search, _im_flush_cache: _im_flush_cache, _im_get_candidate_char: _im_get_candidate_char, _realloc: _realloc, _im_get_spl_start: _im_get_spl_start, _im_close_decoder: _im_close_decoder, _toUTF8: _toUTF8, _im_open_decoder_fd: _im_open_decoder_fd, _strncpy: _strncpy, _im_get_spl_start_at: _im_get_spl_start_at, _im_get_fixed_len: _im_get_fixed_len, _im_cancel_last_choice: _im_cancel_last_choice, _memset: _memset, _im_search: _im_search, _memcpy: _memcpy, _calloc: _calloc, _im_choose: _im_choose, _im_set_max_lens: _im_set_max_lens, _im_get_predict_at: _im_get_predict_at, _im_get_candidate: _im_get_candidate, _im_enable_shm_as_szm: _im_enable_shm_as_szm, _im_get_sps_str: _im_get_sps_str, _memcmp: _memcmp, _im_get_predicts: _im_get_predicts, _free: _free, _im_open_decoder: _im_open_decoder, _memmove: _memmove, _malloc: _malloc, _im_get_predicts_utf8: _im_get_predicts_utf8, _im_delsearch: _im_delsearch, _strcpy: _strcpy, 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_viiiii: dynCall_viiiii, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_iiiiiii: dynCall_iiiiiii, dynCall_iiiii: dynCall_iiiii, dynCall_ii: dynCall_ii, dynCall_iiii: dynCall_iiii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_iiiiii: dynCall_iiiiii, dynCall_viiii: dynCall_viiii };
  })
  // 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_viiiii": invoke_viiiii, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_iiiiiii": invoke_iiiiiii, "invoke_iiiii": invoke_iiiii, "invoke_ii": invoke_ii, "invoke_iiii": invoke_iiii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_viiiiii": invoke_viiiiii, "invoke_iii": invoke_iii, "invoke_iiiiii": invoke_iiiiii, "invoke_viiii": invoke_viiii, "_strncmp": _strncmp, "_lseek": _lseek, "___cxa_call_unexpected": ___cxa_call_unexpected, "_snprintf": _snprintf, "___cxa_free_exception": ___cxa_free_exception, "___cxa_throw": ___cxa_throw, "_fread": _fread, "_fclose": _fclose, "_strerror": _strerror, "___cxa_pure_virtual": ___cxa_pure_virtual, "_fprintf": _fprintf, "_sqrt": _sqrt, "_llvm_va_end": _llvm_va_end, "_pread": _pread, "_close": _close, "_feof": _feof, "_fopen": _fopen, "_open": _open, "_strchr": _strchr, "_fputc": _fputc, "___buildEnvironment": ___buildEnvironment, "_log": _log, "_puts": _puts, "_abort": _abort, "___setErrNo": ___setErrNo, "_recv": _recv, "_fseek": _fseek, "_qsort": _qsort, "_qsort2": _qsort2, "_send": _send, "_write": _write, "_fputs": _fputs, "_ftell": _ftell, "_llvm_umul_with_overflow_i32": _llvm_umul_with_overflow_i32, "_exit": _exit, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_strdup": _strdup, "___cxa_allocate_exception": ___cxa_allocate_exception, "_ferror": _ferror, "_printf": _printf, "_sysconf": _sysconf, "_sbrk": _sbrk, "_truncate": _truncate, "_read": _read, "___cxa_is_number_type": ___cxa_is_number_type, "__reallyNegative": __reallyNegative, "_time": _time, "__formatString": __formatString, "___cxa_does_inherit": ___cxa_does_inherit, "_getenv": _getenv, "__ZSt9terminatev": __ZSt9terminatev, "_gettimeofday": _gettimeofday, "_llvm_eh_exception": _llvm_eh_exception, "_vfprintf": _vfprintf, "___cxa_begin_catch": ___cxa_begin_catch, "_unlink": _unlink, "___assert_func": ___assert_func, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_pwrite": _pwrite, "_putchar": _putchar, "_fabs": _fabs, "_fsync": _fsync, "_strerror_r": _strerror_r, "___errno_location": ___errno_location, "___gxx_personality_v0": ___gxx_personality_v0, "_isspace": _isspace, "_fdopen": _fdopen, "_bsearch": _bsearch, "_fwrite": _fwrite, "_ftruncate": _ftruncate, "__exit": __exit, "___resumeException": ___resumeException, "_strcmp": _strcmp, "___cxa_end_catch": ___cxa_end_catch, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "cttz_i8": cttz_i8, "ctlz_i8": ctlz_i8, "NaN": NaN, "Infinity": Infinity, "__ZTIy": __ZTIy, "__ZTIx": __ZTIx, "__ZTIt": __ZTIt, "__ZTIs": __ZTIs, "__ZTIm": __ZTIm, "__ZTIl": __ZTIl, "__ZTIi": __ZTIi, "__ZTIh": __ZTIh, "__ZTIj": __ZTIj, "__ZTIe": __ZTIe, "__ZTId": __ZTId, "__ZTVN10__cxxabiv117__class_type_infoE": __ZTVN10__cxxabiv117__class_type_infoE, "__ZTIf": __ZTIf, "__ZTIa": __ZTIa, "__ZTIc": __ZTIc, "__ZTVN10__cxxabiv120__si_class_type_infoE": __ZTVN10__cxxabiv120__si_class_type_infoE, "_stderr": _stderr, "___progname": ___progname, "__ZTVN10__cxxabiv119__pointer_type_infoE": __ZTVN10__cxxabiv119__pointer_type_infoE }, buffer);
  var _im_enable_ym_as_szm = Module["_im_enable_ym_as_szm"] = asm["_im_enable_ym_as_szm"];
  var _strlen = Module["_strlen"] = asm["_strlen"];
  var _im_reset_search = Module["_im_reset_search"] = asm["_im_reset_search"];
  var _im_flush_cache = Module["_im_flush_cache"] = asm["_im_flush_cache"];
  var _im_get_candidate_char = Module["_im_get_candidate_char"] = asm["_im_get_candidate_char"];
  var _realloc = Module["_realloc"] = asm["_realloc"];
  var _im_get_spl_start = Module["_im_get_spl_start"] = asm["_im_get_spl_start"];
  var _im_close_decoder = Module["_im_close_decoder"] = asm["_im_close_decoder"];
  var _toUTF8 = Module["_toUTF8"] = asm["_toUTF8"];
  var _im_open_decoder_fd = Module["_im_open_decoder_fd"] = asm["_im_open_decoder_fd"];
  var _strncpy = Module["_strncpy"] = asm["_strncpy"];
  var _im_get_spl_start_at = Module["_im_get_spl_start_at"] = asm["_im_get_spl_start_at"];
  var _im_get_fixed_len = Module["_im_get_fixed_len"] = asm["_im_get_fixed_len"];
  var _im_cancel_last_choice = Module["_im_cancel_last_choice"] = asm["_im_cancel_last_choice"];
  var _memset = Module["_memset"] = asm["_memset"];
  var _im_search = Module["_im_search"] = asm["_im_search"];
  var _memcpy = Module["_memcpy"] = asm["_memcpy"];
  var _calloc = Module["_calloc"] = asm["_calloc"];
  var _im_choose = Module["_im_choose"] = asm["_im_choose"];
  var _im_set_max_lens = Module["_im_set_max_lens"] = asm["_im_set_max_lens"];
  var _im_get_predict_at = Module["_im_get_predict_at"] = asm["_im_get_predict_at"];
  var _im_get_candidate = Module["_im_get_candidate"] = asm["_im_get_candidate"];
  var _im_enable_shm_as_szm = Module["_im_enable_shm_as_szm"] = asm["_im_enable_shm_as_szm"];
  var _im_get_sps_str = Module["_im_get_sps_str"] = asm["_im_get_sps_str"];
  var _memcmp = Module["_memcmp"] = asm["_memcmp"];
  var _im_get_predicts = Module["_im_get_predicts"] = asm["_im_get_predicts"];
  var _free = Module["_free"] = asm["_free"];
  var _im_open_decoder = Module["_im_open_decoder"] = asm["_im_open_decoder"];
  var _memmove = Module["_memmove"] = asm["_memmove"];
  var _malloc = Module["_malloc"] = asm["_malloc"];
  var _im_get_predicts_utf8 = Module["_im_get_predicts_utf8"] = asm["_im_get_predicts_utf8"];
  var _im_delsearch = Module["_im_delsearch"] = asm["_im_delsearch"];
  var _strcpy = Module["_strcpy"] = asm["_strcpy"];
  var runPostSets = Module["runPostSets"] = asm["runPostSets"];
  var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
  var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
  var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"];
  var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = asm["dynCall_iiiiiii"];
  var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"];
  var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
  var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
  var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
  var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
  var dynCall_viiiiii = Module["dynCall_viiiiii"] = asm["dynCall_viiiiii"];
  var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
  var dynCall_iiiiii = Module["dynCall_iiiiii"] = asm["dynCall_iiiiii"];
  var dynCall_viiii = Module["dynCall_viiii"] = asm["dynCall_viiii"];
  Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
  Runtime.stackSave = function() { return asm['stackSave']() };
  Runtime.stackRestore = function(top) { asm['stackRestore'](top) };
  // 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 ===
  var initialStackTop;
  var inMain;
  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;
    inMain = true;
    var ret;
    try {
      ret = Module['_main'](argc, argv, 0);
    }
    catch(e) {
      if (e && typeof e == 'object' && e.type == 'ExitStatus') {
        // exit() throws this once it's done to make sure execution
        // has been stopped completely
        Module.print('Exit Status: ' + e.value);
        return e.value;
      } else if (e == 'SimulateInfiniteLoop') {
        // running an evented main loop, don't immediately exit
        Module['noExitRuntime'] = true;
      } else {
        throw e;
      }
    } finally {
      inMain = false;
    }
    // if we're not running an evented main loop, it's time to exit
    if (!Module['noExitRuntime']) {
      exit(ret);
    }
  }
  function run(args) {
    args = args || Module['arguments'];
    if (runDependencies > 0) {
      Module.printErr('run() called, but dependencies remain, so not running');
      return;
    }
    preRun();
    if (runDependencies > 0) {
      // a preRun added a dependency, run will be called later
      return;
    }
    function doRun() {
      ensureInitRuntime();
      preMain();
      calledRun = true;
      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;
    STACKTOP = initialStackTop;
    // TODO call externally added 'exit' callbacks with the status code.
    // It'd be nice to provide the same interface for all Module events (e.g.
    // prerun, premain, postmain). Perhaps an EventEmitter so we can do:
    // Module.on('exit', function (status) {});
    // exit the runtime
    exitRuntime();
    if (inMain) {
      // if we're still inside the callMain's try/catch, we need to throw an
      // exception in order to immediately terminate execution.
      throw { type: 'ExitStatus', value: status };
    }
  }
  Module['exit'] = Module.exit = exit;
  function abort(text) {
    if (text) {
      Module.print(text);
    }
    ABORT = true;
    throw 'abort() at ' + (new Error().stack);
  }
  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();
  // {{POST_RUN_ADDITIONS}}
  // {{MODULE_ADDITIONS}}
  })(Module);
  